Phase 1 Wiki Template refactor
This commit is contained in:
@@ -141,6 +141,111 @@ func TestWikiClassNamePrefersFullNameInsteadOfShortCode(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestWikiTemplateRendersFieldsFormattersAndPreservedTopSection(t *testing.T) {
|
||||
ctx := &wikiContext{}
|
||||
page := wikiTemplatePage{
|
||||
PageID: "classes:acolyte",
|
||||
Category: "classes",
|
||||
Key: "classes:acolyte",
|
||||
Title: "Acolyte",
|
||||
Status: wikiStatusNew,
|
||||
Row: map[string]any{
|
||||
"HitDie": 6,
|
||||
"SkillPointBase": 4,
|
||||
"Description": map[string]any{"tlk": map[string]any{
|
||||
"text": "Acolyte description.",
|
||||
}},
|
||||
},
|
||||
ManualSections: []wikiManualSection{
|
||||
{ID: "user_top", Alias: "UserTopSection", InitialHTML: "<p></p>"},
|
||||
{ID: "notes", Alias: "UserBottomSection", InitialHTML: "<h2>Notes</h2><p></p>"},
|
||||
},
|
||||
}
|
||||
|
||||
got, err := ctx.renderWikiTemplateString("classes.html", `<h1>{{title}}</h1>
|
||||
{{UserTopSection}}
|
||||
<p>Hit Die: {{HitDie}}</p>
|
||||
<p>Skill Points: {{SkillPointBase}}</p>
|
||||
{{format:StatusCallout}}
|
||||
{{format:Description}}
|
||||
{{UserBottomSection}}`, page)
|
||||
if err != nil {
|
||||
t.Fatalf("render template: %v", err)
|
||||
}
|
||||
|
||||
if !strings.Contains(got, "<h1>Acolyte</h1>\n<!-- sow-topdata-wiki:manual:start id=\"user_top\" -->") {
|
||||
t.Fatalf("expected preserved top section directly after title, got:\n%s", got)
|
||||
}
|
||||
for _, expected := range []string{
|
||||
"<p>Hit Die: 6</p>",
|
||||
"<p>Skill Points: 4</p>",
|
||||
"This is a new class!",
|
||||
"<p>Acolyte description.</p>",
|
||||
`<!-- sow-topdata-wiki:manual:start id="notes" -->`,
|
||||
} {
|
||||
if !strings.Contains(got, expected) {
|
||||
t.Fatalf("expected %q in rendered template:\n%s", expected, got)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestWikiTemplateMissingFieldFailsUnlessDefaultProvided(t *testing.T) {
|
||||
ctx := &wikiContext{}
|
||||
page := wikiTemplatePage{PageID: "classes:acolyte", Category: "classes", Title: "Acolyte", Row: map[string]any{}}
|
||||
|
||||
if _, err := ctx.renderWikiTemplateString("classes.html", `<p>{{HitDie}}</p>`, page); err == nil || !strings.Contains(err.Error(), `missing field "HitDie"`) {
|
||||
t.Fatalf("expected missing field error, got %v", err)
|
||||
}
|
||||
|
||||
got, err := ctx.renderWikiTemplateString("classes.html", `<p>{{field:HitDie|default=unknown}}</p>`, page)
|
||||
if err != nil {
|
||||
t.Fatalf("expected defaulted field to render, got %v", err)
|
||||
}
|
||||
if got != "<p>unknown</p>" {
|
||||
t.Fatalf("expected default value, got %q", got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestWikiManagedHashIgnoresPreservedSectionBody(t *testing.T) {
|
||||
first := strings.Join([]string{
|
||||
`<!-- sow-topdata-wiki:page=classes:acolyte -->`,
|
||||
`<!-- sow-topdata-wiki:managed:start hash="sha256:first" -->`,
|
||||
`<h1>Acolyte</h1>`,
|
||||
`<!-- sow-topdata-wiki:manual:start id="user_top" -->`,
|
||||
`<p>Original user edit.</p>`,
|
||||
`<!-- sow-topdata-wiki:manual:end id="user_top" -->`,
|
||||
`<p>Generated.</p>`,
|
||||
`<!-- sow-topdata-wiki:managed:end -->`,
|
||||
}, "\n")
|
||||
second := strings.Replace(first, "<p>Original user edit.</p>", "<p>Changed by a user.</p>", 1)
|
||||
|
||||
if computeManagedHash(first) != computeManagedHash(second) {
|
||||
t.Fatalf("expected preserved section body not to affect managed hash")
|
||||
}
|
||||
}
|
||||
|
||||
func TestWikiSourceDigestIncludesTemplates(t *testing.T) {
|
||||
root := t.TempDir()
|
||||
mkdirAll(t, filepath.Join(root, "data", "skills"))
|
||||
mkdirAll(t, filepath.Join(root, "wiki", "templates", "pages"))
|
||||
writeFile(t, filepath.Join(root, "data", "skills", "base.json"), `{"rows":[]}`+"\n")
|
||||
templatePath := filepath.Join(root, "wiki", "templates", "pages", "skills.html")
|
||||
writeFile(t, templatePath, `<h1>{{title}}</h1>`+"\n")
|
||||
|
||||
before, err := computeWikiSourceDigest(root)
|
||||
if err != nil {
|
||||
t.Fatalf("compute initial digest: %v", err)
|
||||
}
|
||||
writeFile(t, templatePath, `<h1>{{title}}</h1><p>Changed</p>`+"\n")
|
||||
after, err := computeWikiSourceDigest(root)
|
||||
if err != nil {
|
||||
t.Fatalf("compute changed digest: %v", err)
|
||||
}
|
||||
if before == after {
|
||||
t.Fatalf("expected template edit to change wiki source digest")
|
||||
}
|
||||
}
|
||||
|
||||
func TestWikiPageIDForKeyNormalizesSlashAndUnderscoreSeparators(t *testing.T) {
|
||||
got := wikiPageIDForKey("feat:special/attacks_bull_rush")
|
||||
if want := "feat:special:attacks:bull:rush"; got != want {
|
||||
|
||||
Reference in New Issue
Block a user