Files
go-nc-files/visit_webdav_test.go
T
2026-09-28 14:03:53 +02:00

127 lines
3.9 KiB
Go

package goncfiles_test
import (
"encoding/base64"
"encoding/json"
"io"
"net/http"
"net/http/httptest"
"strings"
"testing"
gonexapp "gitea.neitzel.de/konrad/go-nc-exapp"
"gitea.neitzel.de/konrad/go-nc-files"
)
const testPrefKey = "savedDefault"
// appAPIPathStore adapts go-nc-exapp AppAPIPreferences to DefaultPathStore (ExApp wiring pattern).
type appAPIPathStore struct {
gonexapp.AppAPIPreferences
}
func (a appAPIPathStore) GetDefault() (string, error) { return a.Get() }
func (a appAPIPathStore) SetDefault(v string) error { return a.Set(v) }
func TestWebDAVModeUsesPreferencesNotSettingsFile(t *testing.T) {
dirs := map[string]bool{}
prefsVals := map[string]string{}
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
switch {
case strings.Contains(r.URL.Path, "ex-app/preference/get-values"):
_ = json.NewEncoder(w).Encode(map[string]any{
"ocs": map[string]any{
"data": []map[string]string{{
"configkey": testPrefKey,
"configvalue": prefsVals[testPrefKey],
}},
},
})
case strings.HasSuffix(r.URL.Path, "ex-app/preference") && r.Method == http.MethodPost:
var body struct {
ConfigKey string `json:"configKey"`
ConfigValue string `json:"configValue"`
}
_ = json.NewDecoder(r.Body).Decode(&body)
prefsVals[body.ConfigKey] = body.ConfigValue
w.WriteHeader(http.StatusOK)
_ = json.NewEncoder(w).Encode(map[string]string{"status": "ok"})
case r.Method == "MKCOL":
dirs[strings.TrimSuffix(r.URL.Path, "/")] = true
w.WriteHeader(http.StatusCreated)
case r.Method == "PROPFIND":
p := strings.TrimSuffix(r.URL.Path, "/")
if !dirs[p] {
http.NotFound(w, r)
return
}
w.WriteHeader(http.StatusMultiStatus)
_, _ = io.WriteString(w, `<?xml version="1.0"?><d:multistatus xmlns:d="DAV:"><d:response><d:href>`+r.URL.Path+`</d:href><d:propstat><d:prop><d:resourcetype><d:collection/></d:resourcetype></d:prop></d:propstat></d:response></d:multistatus>`)
default:
http.Error(w, "unhandled "+r.Method+" "+r.URL.Path, 500)
}
}))
t.Cleanup(srv.Close)
cred := gonexapp.Credentials{
BaseURL: srv.URL, AppID: "myexapp", AppVersion: "0.1.0", AAVersion: "1.0.0", AppSecret: "s", UserID: "alice",
}
root := goncfiles.WebDAVRoot{Cred: cred, Client: srv.Client()}
prefs := gonexapp.NewAppAPIPreferences(cred, "myexapp", testPrefKey)
prefs.Client = srv.Client()
prefs.OCS.Client = srv.Client()
store := appAPIPathStore{AppAPIPreferences: prefs}
visit, err := goncfiles.Open(root, store, testInitialFolder, "")
if err != nil {
t.Fatal(err)
}
if visit.SavedDefault != testInitialFolder {
t.Fatalf("saved %s", visit.SavedDefault)
}
if err := visit.SetDefault("Zones"); err != nil {
t.Fatal(err)
}
if prefsVals[testPrefKey] != "Zones" {
t.Fatalf("prefs not written: %#v", prefsVals)
}
again, err := goncfiles.Open(root, store, testInitialFolder, "")
if err != nil {
t.Fatal(err)
}
if again.SavedDefault != "Zones" {
t.Fatalf("got %s", again.SavedDefault)
}
}
func TestWebDAVVisitForbiddenFailsClosed(t *testing.T) {
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
http.Error(w, "no", http.StatusForbidden)
}))
t.Cleanup(srv.Close)
cred := gonexapp.Credentials{
BaseURL: srv.URL, AppID: "myexapp", AppVersion: "0.1.0", AAVersion: "1.0.0", AppSecret: "s", UserID: "alice",
}
_, err := goncfiles.Open(
goncfiles.WebDAVRoot{Cred: cred, Client: srv.Client()},
&goncfiles.Memory{},
testInitialFolder,
"Secret",
)
if err == nil || !goncfiles.IsForbidden(err) {
t.Fatalf("got %v", err)
}
}
func TestUserFromRequestRoundTrip(t *testing.T) {
token := base64.StdEncoding.EncodeToString([]byte("alice:secret"))
r := httptest.NewRequest(http.MethodGet, "/", nil)
r.Header.Set("AUTHORIZATION-APP-API", token)
user, err := gonexapp.UserFromRequest(r)
if err != nil || user != "alice" {
t.Fatalf("user=%q err=%v", user, err)
}
}