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}