render_test.gno
6.02 Kb · 161 lines
1package wiki
2
3import (
4 "strings"
5 "testing"
6
7 "gno.land/p/nt/uassert/v0"
8)
9
10func fixture(t *testing.T) (*Wiki, Ctx) {
11 t.Helper()
12 w := New(2, DefaultMaxBody)
13 edit(t, w, 1, alice, "Gno land", "A chain.\n\nSee [[Tendermint2]] and [[Absent page]].\n\n[[Category:Chains]]\n", "create")
14 edit(t, w, 2, bob, "Gno land", "A smart-contract chain.\n\nSee [[Tendermint2]].\n\n[[Category:Chains]]\n", "tighten")
15 edit(t, w, 3, alice, "Tendermint2", "The consensus engine.\n", "create")
16 return w, Ctx{Base: "/r/moul/x/wiki/v0", Exists: w.Exists}
17}
18
19func act(fn string, args ...string) string {
20 out := "/r/moul/x/wiki/v0$help&func=" + fn
21 for i := 0; i+1 < len(args); i += 2 {
22 out += "&" + args[i] + "=" + args[i+1]
23 }
24 return out
25}
26
27func TestRenderArticle(t *testing.T) {
28 w, c := fixture(t)
29 p, _ := w.Page("Gno land")
30 out := RenderArticle(c, w, p, act)
31
32 uassert.True(t, strings.Contains(out, "# Gno land"), "heading")
33 uassert.True(t, strings.Contains(out, "A smart-contract chain."), "body text")
34 uassert.True(t, strings.Contains(out, "[Tendermint2](/r/moul/x/wiki/v0:Tendermint2)"), "resolved wikilink")
35 uassert.False(t, strings.Contains(out, "[[Tendermint2]]"), "no raw wikilink survives")
36 uassert.True(t, strings.Contains(out, "**Categories:**"), "category footer")
37 uassert.True(t, strings.Contains(out, "[Chains](/r/moul/x/wiki/v0:Category:Chains)"), "category link")
38 uassert.True(t, strings.Contains(out, "func=Edit"), "edit action")
39 uassert.True(t, strings.Contains(out, "GNOT of storage deposit"), "cost is shown to the reader")
40}
41
42func TestRenderArticleWithoutActionsHasNoEditControls(t *testing.T) {
43 w, c := fixture(t)
44 p, _ := w.Page("Gno land")
45 out := RenderArticle(c, w, p, nil)
46 uassert.False(t, strings.Contains(out, "func=Edit"), "a nil Action renders a read-only page")
47}
48
49func TestRenderArticleEscapesHostileMarkdown(t *testing.T) {
50 w := New(2, DefaultMaxBody)
51 body := "<script>alert(1)</script>\n\n# Fake realm heading\n"
52 edit(t, w, 1, alice, "Hostile", body, "")
53 p, _ := w.Page("Hostile")
54 out := RenderArticle(Ctx{Base: "/r/moul/x/wiki/v0"}, w, p, nil)
55
56 uassert.True(t, strings.Contains(out, `\<script>`),
57 "an HTML block is escaped, not dropped: the reader still sees what was written")
58 uassert.False(t, strings.Contains(out, "\n<script>"),
59 "no unescaped HTML block reaches the renderer")
60 // The realm's own footer must still be there: a CommonMark HTML block of
61 // type 1-5 does not close on a blank line, so an unescaped one would
62 // swallow every byte the realm appends after the body.
63 uassert.True(t, strings.Contains(out, "GNOT of storage deposit"),
64 "user content cannot absorb the realm chrome that follows it")
65}
66
67func TestRenderMissing(t *testing.T) {
68 w, c := fixture(t)
69 out := RenderMissing(c, w, MustParseTitle("Absent page"), act)
70 uassert.True(t, strings.Contains(out, "does not exist yet"))
71 uassert.True(t, strings.Contains(out, "func=Edit"))
72 // The first revision of Gno land linked here; the second dropped the link,
73 // so nothing should be listed.
74 uassert.True(t, strings.Contains(out, "does not exist yet"))
75}
76
77func TestRenderHistory(t *testing.T) {
78 w, c := fixture(t)
79 p, _ := w.Page("Gno land")
80 out := RenderHistory(c, p, 0, 10, act)
81
82 uassert.True(t, strings.Contains(out, "# History of Gno land"))
83 uassert.True(t, strings.Contains(out, "**rev 2**"))
84 uassert.True(t, strings.Contains(out, "**rev 1**"))
85 uassert.True(t, strings.Contains(out, "from=1&to=2"), "consecutive revisions get a diff link")
86 uassert.True(t, strings.Contains(out, "func=Revert"))
87}
88
89func TestRenderDiff(t *testing.T) {
90 w, c := fixture(t)
91 p, _ := w.Page("Gno land")
92 h := p.History(0, 2)
93 out := RenderDiff(c, p, h[1], h[0])
94
95 uassert.True(t, strings.Contains(out, "rev 1 → rev 2"))
96 uassert.True(t, strings.Contains(out, "-A chain."))
97 uassert.True(t, strings.Contains(out, "+A smart-contract chain."))
98 uassert.True(t, strings.Contains(out, "```diff"))
99}
100
101func TestRenderDiffRefusesEvictedBodies(t *testing.T) {
102 w := New(1, DefaultMaxBody)
103 edit(t, w, 1, alice, "A", "one\n", "")
104 edit(t, w, 2, alice, "A", "two\n", "")
105 p, _ := w.Page("A")
106 h := p.History(0, 2)
107 out := RenderDiff(Ctx{Base: "/r/moul/x/wiki/v0"}, p, h[1], h[0])
108 uassert.True(t, strings.Contains(out, "no longer held on chain"),
109 "an evicted body must be explained, not rendered as an empty diff")
110}
111
112func TestRenderRawShowsTheHashAReaderNeeds(t *testing.T) {
113 w, c := fixture(t)
114 p, _ := w.Page("Gno land")
115 out := RenderRaw(c, p, p.Head())
116 uassert.True(t, strings.Contains(out, p.Head().Hash), "the full hash, so the bytes can be verified")
117 uassert.True(t, strings.Contains(out, "[[Tendermint2]]"), "raw view shows the source, unrewritten")
118}
119
120func TestRenderIndexAndSpecials(t *testing.T) {
121 w, c := fixture(t)
122
123 idx := RenderIndex(c, w, 10)
124 uassert.True(t, strings.Contains(idx, "2 pages"))
125 uassert.True(t, strings.Contains(idx, "Recent changes"))
126
127 all := RenderAllPages(c, w, NSMain, 0, 10)
128 uassert.True(t, strings.Contains(all, "[Gno land]"))
129 uassert.True(t, strings.Contains(all, "[Tendermint2]"))
130
131 cats := RenderCategories(c, w)
132 uassert.True(t, strings.Contains(cats, "[Chains](/r/moul/x/wiki/v0:Category:Chains) (1)"))
133
134 cat := RenderCategory(c, w, MustParseTitle("Category:Chains"), nil, nil)
135 uassert.True(t, strings.Contains(cat, "no description page"))
136 uassert.True(t, strings.Contains(cat, "Pages in this category (1)"))
137
138 back := RenderBacklinks(c, w, MustParseTitle("Tendermint2"))
139 uassert.True(t, strings.Contains(back, "[Gno land]"))
140
141 stats := RenderStats(c, w)
142 uassert.True(t, strings.Contains(stats, "bodies kept per page: 2"))
143}
144
145func TestRenderBlankedPage(t *testing.T) {
146 w, c := fixture(t)
147 now, h := at(9)
148 w.Blank(mod, now, h, "Gno land", "policy")
149 p, _ := w.Page("Gno land")
150 out := RenderArticle(c, w, p, nil)
151 uassert.True(t, strings.Contains(out, "was blanked"))
152 uassert.True(t, strings.Contains(out, "view history"))
153}
154
155func TestRenderRedirect(t *testing.T) {
156 w, c := fixture(t)
157 edit(t, w, 4, alice, "Gno", "#REDIRECT [[Gno land]]\n", "")
158 p, _ := w.Page("Gno")
159 out := RenderArticle(c, w, p, nil)
160 uassert.True(t, strings.Contains(out, "Redirects to [Gno land](/r/moul/x/wiki/v0:Gno_land)"))
161}