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

Community realm. Read the code first. Community realm, deployed by its author. Read the code before you interact or send coins.

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}