PathrockNetwork Gno Explorer
HomeBlocksTransactionsTokensRealmsPackagesValidatorsAnalytics

PathrockNetwork Gno Explorer — an independent explorer for Gno.land Mainnet (gnoland-1), operated by PathrockNetwork. Not an official Gno.land service.

gnowebarchive RPC

gno.land/p/moul/x/wiki/v0

Package
Open in gnoweb ↗

Overview

Kind
Pure package
Name
v0
Namespace
moul / x / wiki
Files
18 (README)(gnomod.toml)
Exported functions
n/a — not supported for pure packages by the node (vm/qfuncs)
Module
gno.land/p/moul/x/wiki/v0
gno
0.9

Files (18)

  • README.mdmarkdown
  • gnomod.tomltoml
  • diff.gnogno
  • doc.gnogno
  • links.gnogno
  • page.gnogno
  • render.gnogno
  • revision.gnogno
  • talk.gnogno
  • title.gnogno
  • wiki.gnogno
  • diff_test.gnogno
  • limits_test.gnogno
  • links_test.gnogno
  • render_test.gnogno
  • talk_test.gnogno
  • title_test.gnogno
  • wiki_test.gnogno
  • render_test.gnogno
    1package wiki23import (4	"strings"5	"testing"67	"gno.land/p/nt/uassert/v0"8

    Functions

    not supported for pure packages by the node (vm/qfuncs)

    Signatures reconstructed verbatim from vm/qfuncs — interface params keep their inline definitions.

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