package docs_test import ( "archive/zip" "encoding/json" "os" "os/exec" "path/filepath" "testing" ) type docsPackageManifest struct { Version string `json:"version"` Revision string `json:"revision"` Files []struct { Path string `json:"path"` SHA256 string `json:"sha256"` } `json:"files"` } func TestPackageDocsCreatesTraceableArchive(t *testing.T) { pwsh, err := exec.LookPath("pwsh") if err != nil { t.Skip("pwsh is required to exercise the documentation packaging script") } repositoryRoot := repositoryRoot(t) outputPath := filepath.Join(t.TempDir(), "proxy-pool-docs-v1.0.zip") if err := os.WriteFile(outputPath, []byte("incomplete"), 0o600); err != nil { t.Fatalf("seed old documentation archive: %v", err) } command := exec.Command(pwsh, "-NoProfile", "-NonInteractive", "-File", filepath.Join(repositoryRoot, "scripts", "package-docs.ps1"), "-OutputPath", outputPath) command.Dir = repositoryRoot if output, err := command.CombinedOutput(); err != nil { t.Fatalf("package docs: %v\n%s", err, output) } archive, err := zip.OpenReader(outputPath) if err != nil { t.Fatalf("open documentation archive: %v", err) } defer archive.Close() entries := make(map[string]*zip.File, len(archive.File)) for _, entry := range archive.File { entries[entry.Name] = entry } for _, required := range []string{ "README.md", "docs/design/architecture.md", "docs/operations/runbook.md", "diagrams/README.md", "api/openapi/proxy-pool.yaml", "api/proto/controlplane/v1/controlplane.proto", "manifest.json", } { if _, exists := entries[required]; !exists { t.Errorf("documentation archive does not contain %s", required) } } manifestEntry, exists := entries["manifest.json"] if !exists { return } reader, err := manifestEntry.Open() if err != nil { t.Fatalf("open manifest: %v", err) } defer reader.Close() var manifest docsPackageManifest if err := json.NewDecoder(reader).Decode(&manifest); err != nil { t.Fatalf("decode manifest: %v", err) } if manifest.Version != "v1.0" || manifest.Revision == "" || len(manifest.Files) < 20 { t.Fatalf("manifest = %+v", manifest) } for _, file := range manifest.Files { if file.Path == "" || file.SHA256 == "" { t.Fatalf("invalid manifest file = %+v", file) } } }