Search Apps Documentation Source Content File Folder Download Copy Actions Download State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

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}