106 lines
2.7 KiB
Go
106 lines
2.7 KiB
Go
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)
|
|
}
|
|
}
|