package export import ( "os" "path/filepath" "strings" "testing" ) func TestExport_WritesPageAndAssets(t *testing.T) { srcDir := t.TempDir() writeFile(t, srcDir, "010-intro.md", "---\ntitle: Intro\n---\n# Hallo\n") writeFile(t, srcDir, "020-hidden.md", "---\nskip: true\n---\n# Hidden\n") outDir := t.TempDir() if err := Export(srcDir, outDir, "deck.html"); err != nil { t.Fatalf("Export() error = %v", err) } tests := []struct { name string path string wantContains string wantNotContain string }{ {name: "html page", path: "deck.html", wantContains: "

Hallo

"}, {name: "html excludes skipped slide", path: "deck.html", wantNotContain: "Hidden"}, {name: "html excludes dev live-reload script", path: "deck.html", wantNotContain: "live-reload.js"}, {name: "style.css copied", path: filepath.Join("vendor", "style.css"), wantContains: ":root"}, {name: "chroma.css copied", path: filepath.Join("vendor", "chroma.css"), wantContains: ".chroma"}, {name: "nav.js copied", path: filepath.Join("vendor", "nav.js"), wantContains: "mermaid.run"}, {name: "vendor mermaid copied", path: filepath.Join("vendor", "mermaid.min.js")}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { data, err := os.ReadFile(filepath.Join(outDir, tt.path)) if err != nil { t.Fatalf("reading %s: %v", tt.path, err) } if tt.wantContains != "" && !strings.Contains(string(data), tt.wantContains) { t.Errorf("%s does not contain %q", tt.path, tt.wantContains) } if tt.wantNotContain != "" && strings.Contains(string(data), tt.wantNotContain) { t.Errorf("%s unexpectedly contains %q", tt.path, tt.wantNotContain) } if len(data) == 0 { t.Errorf("%s is empty", tt.path) } }) } if _, err := os.Stat(filepath.Join(outDir, "vendor", "live-reload.js")); !os.IsNotExist(err) { t.Errorf("live-reload.js should not be part of a static export, stat err = %v", err) } } func TestExport_CopiesUserAssets(t *testing.T) { srcDir := t.TempDir() writeFile(t, srcDir, "010-intro.md", "# Hallo\n![Bild](img/foto.png)\n") if err := os.MkdirAll(filepath.Join(srcDir, "img"), 0o755); err != nil { t.Fatalf("MkdirAll: %v", err) } writeFile(t, filepath.Join(srcDir, "img"), "foto.png", "fake-png-bytes") writeFile(t, srcDir, ".DS_Store", "should-not-be-copied") outDir := t.TempDir() if err := Export(srcDir, outDir, "deck.html"); err != nil { t.Fatalf("Export() error = %v", err) } data, err := os.ReadFile(filepath.Join(outDir, "img", "foto.png")) if err != nil { t.Fatalf("reading exported image: %v", err) } if string(data) != "fake-png-bytes" { t.Errorf("exported image content = %q, want %q", data, "fake-png-bytes") } if _, err := os.Stat(filepath.Join(outDir, ".DS_Store")); !os.IsNotExist(err) { t.Errorf(".DS_Store should not be exported, stat err = %v", err) } } func TestExport_InvalidSourceDir(t *testing.T) { outDir := t.TempDir() err := Export(filepath.Join(outDir, "does-not-exist"), outDir, "deck.html") if err == nil { t.Fatal("Export() error = nil, want error for missing source dir") } } func writeFile(t *testing.T, dir, name, content string) { t.Helper() if err := os.WriteFile(filepath.Join(dir, name), []byte(content), 0o644); err != nil { t.Fatalf("WriteFile(%s): %v", name, err) } }