package webdav import ( "bytes" "io" "net/http" "net/http/httptest" "testing" ) func TestClientOpenDownloadsRemoteVault(t *testing.T) { t.Parallel() server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodGet { t.Fatalf("method = %s, want GET", r.Method) } if user, pass, ok := r.BasicAuth(); !ok || user != "rustyryan" || pass != "secret" { t.Fatalf("basic auth = %q/%q ok=%v, want rustyryan/secret true", user, pass, ok) } w.Header().Set("ETag", `"etag-1"`) _, _ = io.WriteString(w, "vault-bytes") })) defer server.Close() client := Client{ HTTPClient: server.Client(), BaseURL: server.URL, Username: "rustyryan", Password: "secret", } content, version, err := client.Open("keepass.kdbx") if err != nil { t.Fatalf("Open() error = %v", err) } if string(content) != "vault-bytes" { t.Fatalf("Open() content = %q, want %q", string(content), "vault-bytes") } if version.ETag != `"etag-1"` { t.Fatalf("Open() ETag = %q, want %q", version.ETag, `"etag-1"`) } } func TestClientSaveUploadsVaultWithIfMatch(t *testing.T) { t.Parallel() server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodPut { t.Fatalf("method = %s, want PUT", r.Method) } if got := r.Header.Get("If-Match"); got != `"etag-1"` { t.Fatalf("If-Match = %q, want %q", got, `"etag-1"`) } body, err := io.ReadAll(r.Body) if err != nil { t.Fatalf("ReadAll() error = %v", err) } if string(body) != "updated-vault" { t.Fatalf("PUT body = %q, want %q", string(body), "updated-vault") } w.Header().Set("ETag", `"etag-2"`) w.WriteHeader(http.StatusNoContent) })) defer server.Close() client := Client{ HTTPClient: server.Client(), BaseURL: server.URL, Username: "rustyryan", Password: "secret", } version, err := client.Save("keepass.kdbx", bytes.NewBufferString("updated-vault"), Version{ETag: `"etag-1"`}) if err != nil { t.Fatalf("Save() error = %v", err) } if version.ETag != `"etag-2"` { t.Fatalf("Save() ETag = %q, want %q", version.ETag, `"etag-2"`) } } func TestClientSaveReturnsConflictOnVersionMismatch(t *testing.T) { t.Parallel() server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusPreconditionFailed) })) defer server.Close() client := Client{ HTTPClient: server.Client(), BaseURL: server.URL, Username: "rustyryan", Password: "secret", } _, err := client.Save("keepass.kdbx", bytes.NewBufferString("updated-vault"), Version{ETag: `"etag-1"`}) if err != ErrConflict { t.Fatalf("Save() error = %v, want %v", err, ErrConflict) } }