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\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)
}
}