server auth
This commit is contained in:
@@ -4,11 +4,13 @@ import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"errors"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"reflect"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/tim/cairnquire/apps/server/internal/database"
|
||||
"github.com/tim/cairnquire/apps/server/internal/markdown"
|
||||
@@ -110,6 +112,69 @@ func TestSaveSourcePageWithBaseHashAcceptsMatchingHash(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestSaveSourcePageWithBaseHashCanResolveWithLatestHash(t *testing.T) {
|
||||
service, sourceDir := setupDocsTestService(t)
|
||||
ctx := context.Background()
|
||||
|
||||
page, err := service.LoadSourcePage(ctx, "hello")
|
||||
if err != nil {
|
||||
t.Fatalf("LoadSourcePage() error = %v", err)
|
||||
}
|
||||
|
||||
serverContent := "# Hello\n\nServer edit"
|
||||
if err := os.WriteFile(filepath.Join(sourceDir, "hello.md"), []byte(serverContent), 0o644); err != nil {
|
||||
t.Fatalf("write server edit: %v", err)
|
||||
}
|
||||
|
||||
_, err = service.SaveSourcePageWithBaseHash(ctx, "hello", "# Hello\n\nQueued offline edit", page.Hash)
|
||||
var conflict *DocumentConflictError
|
||||
if !errors.As(err, &conflict) {
|
||||
t.Fatalf("SaveSourcePageWithBaseHash() error = %v, want DocumentConflictError", err)
|
||||
}
|
||||
|
||||
resolvedContent := conflict.CurrentContent + "\n\nResolved local addition"
|
||||
updated, err := service.SaveSourcePageWithBaseHash(ctx, "hello", resolvedContent, conflict.CurrentHash)
|
||||
if err != nil {
|
||||
t.Fatalf("SaveSourcePageWithBaseHash() latest hash error = %v", err)
|
||||
}
|
||||
if updated.Hash == conflict.CurrentHash {
|
||||
t.Fatal("expected resolved save to produce a new hash")
|
||||
}
|
||||
|
||||
content, err := os.ReadFile(filepath.Join(sourceDir, "hello.md"))
|
||||
if err != nil {
|
||||
t.Fatalf("read hello.md: %v", err)
|
||||
}
|
||||
if string(content) != resolvedContent {
|
||||
t.Fatalf("resolved content = %q, want %q", string(content), resolvedContent)
|
||||
}
|
||||
}
|
||||
|
||||
func TestSyncSourceDirHandles100FilesUnderTarget(t *testing.T) {
|
||||
service, sourceDir := setupDocsTestService(t)
|
||||
ctx := context.Background()
|
||||
|
||||
for i := 0; i < 100; i++ {
|
||||
name := filepath.Join(sourceDir, fmt.Sprintf("note-%03d.md", i))
|
||||
content := fmt.Sprintf("# Note %03d\n\nDeterministic body %03d\n", i, i)
|
||||
if err := os.WriteFile(name, []byte(content), 0o644); err != nil {
|
||||
t.Fatalf("create %s: %v", name, err)
|
||||
}
|
||||
}
|
||||
|
||||
start := time.Now()
|
||||
changes, err := service.SyncSourceDir(ctx)
|
||||
if err != nil {
|
||||
t.Fatalf("SyncSourceDir() error = %v", err)
|
||||
}
|
||||
if elapsed := time.Since(start); elapsed > 10*time.Second {
|
||||
t.Fatalf("SyncSourceDir() took %s, want <= 10s", elapsed)
|
||||
}
|
||||
if len(changes) != 101 {
|
||||
t.Fatalf("changes = %d, want 101", len(changes))
|
||||
}
|
||||
}
|
||||
|
||||
func setupDocsTestService(t *testing.T) (*Service, string) {
|
||||
t.Helper()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user