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, ", 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 <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}
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, 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}