mirror of
https://github.com/1f349/go-webdav.git
synced 2024-10-18 08:51:50 +01:00
7dd64908d2
It seems like the Reminders app in iOS/macOS does this request as the first thing when setting up an account, so it seems reasonable to handle it for us. This just returns the most basic current-user-principal now, but that should hopefully be enough to continue the process.
119 lines
3.5 KiB
Go
119 lines
3.5 KiB
Go
package caldav
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
"io/ioutil"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/emersion/go-ical"
|
|
)
|
|
|
|
var propFindSupportedCalendarComponentRequest = `
|
|
<d:propfind xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:caldav">
|
|
<d:prop>
|
|
<c:supported-calendar-component-set />
|
|
</d:prop>
|
|
</d:propfind>
|
|
`
|
|
|
|
var testPropFindSupportedCalendarComponentCases = map[*Calendar][]string{
|
|
&Calendar{Path: "/user/calendars/cal"}: []string{"VEVENT"},
|
|
&Calendar{Path: "/user/calendars/cal", SupportedComponentSet: []string{"VTODO"}}: []string{"VTODO"},
|
|
&Calendar{Path: "/user/calendars/cal", SupportedComponentSet: []string{"VEVENT", "VTODO"}}: []string{"VEVENT", "VTODO"},
|
|
}
|
|
|
|
func TestPropFindSupportedCalendarComponent(t *testing.T) {
|
|
for calendar, expected := range testPropFindSupportedCalendarComponentCases {
|
|
req := httptest.NewRequest("PROPFIND", calendar.Path, nil)
|
|
req.Body = io.NopCloser(strings.NewReader(propFindSupportedCalendarComponentRequest))
|
|
req.Header.Set("Content-Type", "application/xml")
|
|
w := httptest.NewRecorder()
|
|
handler := Handler{Backend: testBackend{calendar: calendar}}
|
|
handler.ServeHTTP(w, req)
|
|
|
|
res := w.Result()
|
|
defer res.Body.Close()
|
|
data, err := ioutil.ReadAll(res.Body)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
resp := string(data)
|
|
for _, comp := range expected {
|
|
// Would be nicer to do a proper XML-decoding here, but this is probably good enough for now.
|
|
if !strings.Contains(resp, comp) {
|
|
t.Errorf("Expected component: %v not found in response:\n%v", comp, resp)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
var propFindUserPrincipal = `
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<A:propfind xmlns:A="DAV:">
|
|
<A:prop>
|
|
<A:current-user-principal/>
|
|
<A:principal-URL/>
|
|
<A:resourcetype/>
|
|
</A:prop>
|
|
</A:propfind>
|
|
`
|
|
|
|
func TestPropFindRoot(t *testing.T) {
|
|
req := httptest.NewRequest("PROPFIND", "/", strings.NewReader(propFindUserPrincipal))
|
|
req.Header.Set("Content-Type", "application/xml")
|
|
w := httptest.NewRecorder()
|
|
calendar := &Calendar{}
|
|
handler := Handler{Backend: testBackend{calendar: calendar}}
|
|
handler.ServeHTTP(w, req)
|
|
|
|
res := w.Result()
|
|
defer res.Body.Close()
|
|
data, err := ioutil.ReadAll(res.Body)
|
|
if err != nil {
|
|
t.Error(err)
|
|
}
|
|
resp := string(data)
|
|
if !strings.Contains(resp, `<current-user-principal xmlns="DAV:"><href>/user/</href></current-user-principal>`) {
|
|
t.Errorf("No user-principal returned when doing a PROPFIND against root, response:\n%s", resp)
|
|
}
|
|
}
|
|
|
|
type testBackend struct {
|
|
calendar *Calendar
|
|
}
|
|
|
|
func (t testBackend) Calendar(ctx context.Context) (*Calendar, error) {
|
|
return t.calendar, nil
|
|
}
|
|
|
|
func (t testBackend) CalendarHomeSetPath(ctx context.Context) (string, error) {
|
|
return "/user/calendars/", nil
|
|
}
|
|
|
|
func (t testBackend) CurrentUserPrincipal(ctx context.Context) (string, error) {
|
|
return "/user/", nil
|
|
}
|
|
|
|
func (t testBackend) DeleteCalendarObject(ctx context.Context, path string) error {
|
|
return nil
|
|
}
|
|
|
|
func (t testBackend) GetCalendarObject(ctx context.Context, path string, req *CalendarCompRequest) (*CalendarObject, error) {
|
|
return nil, nil
|
|
}
|
|
|
|
func (t testBackend) PutCalendarObject(ctx context.Context, path string, calendar *ical.Calendar, opts *PutCalendarObjectOptions) (string, error) {
|
|
return "", nil
|
|
}
|
|
|
|
func (t testBackend) ListCalendarObjects(ctx context.Context, req *CalendarCompRequest) ([]CalendarObject, error) {
|
|
return nil, nil
|
|
}
|
|
|
|
func (t testBackend) QueryCalendarObjects(ctx context.Context, query *CalendarQuery) ([]CalendarObject, error) {
|
|
return nil, nil
|
|
}
|