guestbook_test.gno
2.70 Kb ยท 121 lines
1package guestbook
2
3import (
4 "std"
5 "strings"
6 "testing"
7
8 "gno.land/p/demo/avl"
9 "gno.land/p/demo/ownable"
10)
11
12func TestSign(t *testing.T) {
13 guestbook = avl.Tree{}
14 hasSigned = avl.Tree{}
15
16 testing.SetRealm(std.NewUserRealm("g1user"))
17 Sign(cross, "Hello!")
18
19 testing.SetRealm(std.NewUserRealm("g1user2"))
20 Sign(cross, "Hello2!")
21
22 res := Render("")
23 t.Log(res)
24 if !strings.Contains(res, "> Hello!\n>\n> _Written by g1user ") {
25 t.Error("does not contain first user's message")
26 }
27 if !strings.Contains(res, "> Hello2!\n>\n> _Written by g1user2 ") {
28 t.Error("does not contain second user's message")
29 }
30 if guestbook.Size() != 2 {
31 t.Error("invalid guestbook size")
32 }
33}
34
35func TestSign_FromRealm(t *testing.T) {
36 testing.SetRealm(std.NewCodeRealm("gno.land/r/gnoland/users/v1"))
37
38 rec := revive(func() { Sign(cross, "Hey!") })
39 if rec == nil {
40 t.Fatal("expected panic")
41 }
42 recString, ok := rec.(string)
43 if !ok {
44 t.Fatal("not a string", rec)
45 } else if recString != errNotAUser {
46 t.Fatal("invalid error", recString)
47 }
48}
49
50func TestSign_Double(t *testing.T) {
51 // Should not allow signing twice.
52 guestbook = avl.Tree{}
53 hasSigned = avl.Tree{}
54
55 testing.SetRealm(std.NewUserRealm("g1user"))
56 Sign(cross, "Hello!")
57
58 rec := revive(func() { Sign(cross, "Hello again!") })
59 if rec == nil {
60 t.Fatal("expected panic")
61 }
62 recString, ok := rec.(string)
63 if !ok {
64 t.Error("type assertion failed", rec)
65 } else if recString != errAlreadySigned {
66 t.Error("invalid error message", recString)
67 }
68}
69
70func TestSign_InvalidMessage(t *testing.T) {
71 // Should not allow control characters in message.
72 guestbook = avl.Tree{}
73 hasSigned = avl.Tree{}
74
75 testing.SetRealm(std.NewUserRealm("g1user"))
76
77 rec := revive(func() { Sign(cross, "\x00Hello!") })
78 if rec == nil {
79 t.Fatal("expected panic")
80 }
81 recString, ok := rec.(string)
82 if !ok {
83 t.Error("type assertion failed", rec)
84 } else if recString != errInvalidCharacterInMessage {
85 t.Error("invalid error message", recString)
86 }
87}
88
89func TestAdminDelete(t *testing.T) {
90 const (
91 userAddr std.Address = "g1user"
92 adminAddr std.Address = "g1admin"
93 )
94
95 guestbook = avl.Tree{}
96 hasSigned = avl.Tree{}
97 owner = ownable.NewWithAddress(adminAddr)
98 signatureID = 0
99
100 testing.SetRealm(std.NewUserRealm(userAddr))
101
102 const bad = "Very Bad Message! Nyeh heh heh!"
103 Sign(cross, bad)
104
105 if rnd := Render(""); !strings.Contains(rnd, bad) {
106 t.Fatal("render does not contain bad message", rnd)
107 }
108
109 testing.SetRealm(std.NewUserRealm(adminAddr))
110 AdminDelete(cross, signatureID.String())
111
112 if rnd := Render(""); strings.Contains(rnd, bad) {
113 t.Error("render contains bad message", rnd)
114 }
115 if guestbook.Size() != 0 {
116 t.Error("invalid guestbook size")
117 }
118 if hasSigned.Size() != 1 {
119 t.Error("invalid hasSigned size")
120 }
121}