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

render_test.gno

3.25 Kb · 84 lines
 1package lotto
 2
 3import (
 4	"net/url"
 5	"strconv"
 6	"strings"
 7	"testing"
 8
 9	"gno.land/p/nt/testutils/v0"
10	"gno.land/p/nt/uassert/v0"
11)
12
13func TestRenderInput(cur realm, t *testing.T) {
14	setupLotto(cross(cur))
15	home := Render("")
16	uassert.True(t, strings.Contains(home, "# AKKADIA Lotto"))
17	uassert.True(t, strings.Contains(home, `<gno-form path="number">`))
18	uassert.True(t, strings.Contains(home, `name="number"`))
19	for _, tc := range []struct{ path, message string }{
20		{"%", "Invalid URL"},
21		{"number?number=%zz", "Invalid query"},
22		{"unknown", "Page not found"},
23		{"number", "Number is required"},
24		{"number?number=-1", "Invalid number"},
25		{"number?number=1.5", "Invalid number"},
26		{"number?number=18446744073709551616", "Invalid number"},
27		{"number?number=" + url.QueryEscape(`<script>alert(1)</script>`), "Invalid number"},
28		{"number?number=1&afterOwner=" + url.QueryEscape(`[x](javascript:alert(1))`), "Invalid cursor address"},
29		{"number?number=1&afterOwner=invalid", "Invalid cursor address"},
30	} {
31		result := Render(tc.path)
32		uassert.True(t, strings.Contains(result, tc.message))
33		uassert.True(t, strings.Contains(result, `<gno-form path="number">`))
34		uassert.False(t, strings.Contains(result, "<script>"))
35		uassert.False(t, strings.Contains(result, "javascript:"))
36	}
37	for _, number := range []string{"0", "18446744073709551615"} {
38		result := Render("number?number=" + number)
39		uassert.True(t, strings.Contains(result, "## Number "+number+"\n"))
40		uassert.True(t, strings.Contains(result, "No owners on this page."))
41		uassert.False(t, strings.Contains(result, "[Next]"))
42	}
43	uassert.Equal(t, holdings.Size(), 0)
44}
45
46func TestRenderPagination(cur realm, t *testing.T) {
47	setupLotto(cross(cur))
48	for i := 0; i < 41; i++ {
49		testing.SetRealm(testing.NewUserRealm(testAdmin))
50		owner := testutils.TestAddress("lottoRender" + strconv.Itoa(i))
51		AddNumber(cross(cur), owner, 123)
52		AddNumber(cross(cur), owner, 123)
53	}
54	testing.SetRealm(testing.NewUserRealm(testAdmin))
55	AddNumber(cross(cur), testOther, 1234)
56	route := "number?number=000123"
57	afterOwner := ""
58	for _, expectedCount := range []int{20, 20, 1} {
59		expected := ListOwnersByNumber(123, afterOwner, 20)
60		result := Render(route)
61		uassert.True(t, strings.Contains(result, "## Number 123\n"))
62		uassert.True(t, strings.Contains(result, "[Home](./lotto:)"))
63		uassert.False(t, strings.Contains(result, testOther.String()))
64		uassert.Equal(t, strings.Count(result, " | 2 |\n"), expectedCount)
65		uassert.Equal(t, strings.Contains(result, "[First page]"), afterOwner != "")
66		previous := -1
67		for _, item := range expected {
68			position := strings.Index(result, "| "+item["owner"]+" | 2 |")
69			uassert.True(t, position > previous)
70			previous = position
71			uassert.Equal(t, GetNumberCount(123, address(item["owner"])), uint64(2))
72		}
73		if expected[0]["nextOwner"] != "" {
74			route = "number?number=123&afterOwner=" + url.QueryEscape(expected[0]["nextOwner"])
75			uassert.True(t, strings.Contains(result, "[Next](./lotto:"+route+")"))
76			afterOwner = expected[0]["nextOwner"]
77		} else {
78			uassert.False(t, strings.Contains(result, "[Next]"))
79			last := expected[len(expected)-1]["owner"]
80			uassert.True(t, strings.Contains(Render("number?number=123&afterOwner="+url.QueryEscape(last)), "No owners on this page."))
81		}
82	}
83	uassert.Equal(t, holdings.Size(), 42)
84}