diff --git a/internal/topdata/wiki_deploy.go b/internal/topdata/wiki_deploy.go index 628b738..09f259a 100644 --- a/internal/topdata/wiki_deploy.go +++ b/internal/topdata/wiki_deploy.go @@ -123,10 +123,10 @@ func DeployWikiWithOptions(p *project.Project, opts DeployWikiOptions, progress return deployResult{}, err } } - } - currentHashes := computePageHashes(localPages, notesDelimiter) - saveDeployManifest(manifestPath, currentHashes) + currentHashes := computePageHashes(localPages, notesDelimiter) + saveDeployManifest(manifestPath, currentHashes) + } updated := len(deployments) deleted := len(stalePages) diff --git a/internal/topdata/wiki_deploy_test.go b/internal/topdata/wiki_deploy_test.go new file mode 100644 index 0000000..46e0e2f --- /dev/null +++ b/internal/topdata/wiki_deploy_test.go @@ -0,0 +1,79 @@ +package topdata + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "os" + "path/filepath" + "testing" + + "gitea.westgate.pw/ShadowsOverWestgate/sow-tools/internal/project" +) + +func TestDeployWikiDryRunDoesNotWriteRemoteOrManifest(t *testing.T) { + root := t.TempDir() + sourceDir := filepath.Join(root, "pages") + if err := os.MkdirAll(filepath.Join(sourceDir, "skills"), 0755); err != nil { + t.Fatalf("create source dir: %v", err) + } + if err := os.WriteFile(filepath.Join(sourceDir, "skills", "athletics.txt"), []byte("Generated athletics page\n"), 0644); err != nil { + t.Fatalf("write source page: %v", err) + } + + putPageCalls := 0 + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + var req struct { + Method string `json:"method"` + } + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + t.Fatalf("decode rpc request: %v", err) + } + + var result any + switch req.Method { + case "wiki.getPage": + result = "Existing athletics page\n" + case "dokuwiki.getPagelist": + result = []any{} + case "wiki.putPage": + putPageCalls++ + result = true + default: + t.Fatalf("unexpected rpc method %q", req.Method) + } + + w.Header().Set("Content-Type", "application/json") + if err := json.NewEncoder(w).Encode(map[string]any{ + "jsonrpc": "2.0", + "id": 1, + "result": result, + }); err != nil { + t.Fatalf("encode rpc response: %v", err) + } + })) + defer server.Close() + + manifestPath := filepath.Join(root, "deploy-manifest.json") + result, err := DeployWikiWithOptions(&project.Project{}, DeployWikiOptions{ + SourceDir: sourceDir, + Endpoint: server.URL, + Username: "wiki-user", + Password: "wiki-pass", + ManifestPath: manifestPath, + DryRun: true, + }, nil) + if err != nil { + t.Fatalf("DeployWikiWithOptions dry run failed: %v", err) + } + + if result.Updated != 1 { + t.Fatalf("expected one planned update, got %d", result.Updated) + } + if putPageCalls != 0 { + t.Fatalf("expected dry run not to call wiki.putPage, got %d calls", putPageCalls) + } + if _, err := os.Stat(manifestPath); !os.IsNotExist(err) { + t.Fatalf("expected dry run not to write manifest, got %v", err) + } +}