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

theme_test.gno

3.73 Kb · 109 lines
  1package theme
  2
  3import (
  4	"encoding/base64"
  5	"strings"
  6	"testing"
  7
  8	"gno.land/p/nt/uassert/v0"
  9	"gno.land/r/g1lnkytfqcjwllws63gvf0mv9yt04aswy4y9amhm/home"
 10)
 11
 12const self = "gno.land/r/g1lnkytfqcjwllws63gvf0mv9yt04aswy4y9amhm/home/theme/v0"
 13
 14// install stands in for the deploy-and-accept sequence: the harness does not
 15// deliver this realm's init as a transaction, so the registration is redone
 16// 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}
 23
 24func set(cur realm, slug, body string) {
 25	testing.SetRealm(testing.NewUserRealm(home.Admin))
 26	home.Set(cross(cur), slug, body)
 27}
 28
 29// 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}
 42
 43func 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")
 51
 52	out := home.Render("")
 53	uassert.True(t, strings.HasPrefix(out, "![Clockwork](data:image/svg+xml;base64,"), 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)
 59
 60	svg := decodeCard(t, out)
 61	uassert.True(t, strings.Contains(svg, ">Clockwork</text>"), svg)
 62	uassert.True(t, strings.Contains(svg, "Lead Frontend Engineer &lt;at&gt; 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}
 66
 67func 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")
 73
 74	set(cur, "style.accent", "#00AAFF")
 75	svg := decodeCard(t, home.Render(""))
 76	uassert.True(t, strings.Contains(svg, `fill="#00AAFF"`), svg)
 77
 78	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"))
 82
 83	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")
 87
 88	set(cur, "style.header", "none")
 89	out = home.Render("")
 90	uassert.True(t, strings.HasPrefix(out, "\n\n![](data:image/svg+xml"), out)
 91}
 92
 93func 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}
101
102func 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}