1package theme23import (4 "encoding/base64"5 "strings"6 "testing"78 "gno.land/p/nt/uassert/v0"9 "gno.land/r/g1lnkytfqcjwllws63gvf0mv9yt04aswy4y9amhm/home"10)1112const self = "gno.land/r/g1lnkytfqcjwllws63gvf0mv9yt04aswy4y9amhm/home/theme/v0"1314// install stands in for the deploy-and-accept sequence: the harness does not15// deliver this realm's init as a transaction, so the registration is redone16// here, then accepted by the authority.17func install(cur realm) {18 testing.SetRealm(testing.NewCodeRealm(self))19 home.Register(cross(cur), instance)20 testing.SetRealm(testing.NewUserRealm(home.Admin))21 home.Accept(cross(cur), self)22}2324func set(cur realm, slug, body string) {25 testing.SetRealm(testing.NewUserRealm(home.Admin))26 home.Set(cross(cur), slug, body)27}2829// decodeCard pulls the SVG back out of the first data: image in out.30func decodeCard(t *testing.T, out string) string {31 const marker = "data:image/svg+xml;base64,"32 i := strings.Index(out, marker)33 if i < 0 {34 t.Fatalf("no svg image in output:\n%s", out)35 }36 rest := out[i+len(marker):]37 end := strings.Index(rest, ")")38 raw, err := base64.StdEncoding.DecodeString(rest[:end])39 uassert.NoError(t, err)40 return string(raw)41}4243func TestRenderProfilePage(cur realm, t *testing.T) {44 if home.LivePath() != self {45 install(cur)46 }47 set(cur, "name", "Clockwork")48 set(cur, "tagline", "Lead Frontend Engineer <at> AiB")49 set(cur, "handle", "@clockworkgr")50 set(cur, "now", "shipping")5152 out := home.Render("")53 uassert.True(t, strings.HasPrefix(out, ", out)54 uassert.True(t, strings.Contains(out, "## Now\n\nshipping\n"), out)55 uassert.True(t, strings.Contains(out, "<gno-columns>"), out)56 uassert.True(t, strings.Contains(out, ":intro:"), "an unset slot stays visible: "+out)57 uassert.True(t, strings.Contains(out, "theme `"+self+"`"), out)58 uassert.True(t, strings.Contains(out, "[edit](/r/g1lnkytfqcjwllws63gvf0mv9yt04aswy4y9amhm/home:edit)"), out)5960 svg := decodeCard(t, out)61 uassert.True(t, strings.Contains(svg, ">Clockwork</text>"), svg)62 uassert.True(t, strings.Contains(svg, "Lead Frontend Engineer <at> AiB"), "text is escaped: "+svg)63 uassert.True(t, strings.Contains(svg, "@clockworkgr · rev "), svg)64 uassert.True(t, strings.Contains(svg, `fill="#D9A441"`), "default accent: "+svg)65}6667func TestStyleKnobs(cur realm, t *testing.T) {68 if home.LivePath() != self {69 install(cur)70 }71 set(cur, "name", "Clockwork")72 set(cur, "layout", ":header:\n\n:divider:\n")7374 set(cur, "style.accent", "#00AAFF")75 svg := decodeCard(t, home.Render(""))76 uassert.True(t, strings.Contains(svg, `fill="#00AAFF"`), svg)7778 set(cur, "style.accent", "red; injected")79 svg = decodeCard(t, home.Render(""))80 uassert.True(t, strings.Contains(svg, `fill="#D9A441"`), "a malformed color falls back: "+svg)81 uassert.False(t, strings.Contains(svg, "injected"))8283 set(cur, "style.header", "plain")84 out := home.Render("")85 uassert.True(t, strings.HasPrefix(out, "# Clockwork\n"), out)86 uassert.True(t, strings.Contains(out, "data:image/svg+xml"), "the divider is still an image")8788 set(cur, "style.header", "none")89 out = home.Render("")90 uassert.True(t, strings.HasPrefix(out, "\n\n, out)91}9293func TestOtherPathsDelegate(cur realm, t *testing.T) {94 if home.LivePath() != self {95 install(cur)96 }97 uassert.True(t, strings.Contains(home.Render("slots"), "# Slots"))98 uassert.True(t, strings.Contains(home.Render("system"), "["+self+"]"))99 uassert.True(t, strings.Contains(home.Render("edit"), "<gno-form exec=\"Set\">"))100}101102func TestHexColor(t *testing.T) {103 uassert.True(t, isHexColor("#abcdef"))104 uassert.True(t, isHexColor("#ABCDEF"))105 uassert.False(t, isHexColor("abcdef"))106 uassert.False(t, isHexColor("#abc"))107 uassert.False(t, isHexColor("#abcdeg"))108 uassert.False(t, isHexColor("#abcdef\" onload=\"x"))109}110Instance() interface {Render func(string) string}
Signatures reconstructed verbatim from vm/qfuncs — interface params keep their inline definitions.
Render unavailable
rate limit exceeded — the render query is served by the Gnoland archive RPC.
vm/qrender output, sanitized (docs/render-security.md) and displayed in an empty-sandbox iframe — scripts, forms and popups cannot run. Links stay inert in-preview; right-click to open.