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

goldenticket_test.gno

2.78 Kb · 99 lines
 1package goldenticket
 2
 3import (
 4	"strings"
 5	"testing"
 6
 7	"gno.land/p/nt/grc721/v0"
 8	"gno.land/p/nt/testutils/v0"
 9	"gno.land/p/nt/uassert/v0"
10)
11
12var (
13	aliceAddr = testutils.TestAddress("alice")
14	bobAddr   = testutils.TestAddress("bob")
15)
16
17// reset redoes what init does on chain, with alice as the publisher.
18func reset(cur realm) {
19	func(cur realm) {
20		bootstrap(aliceAddr, cur)
21	}(cross(cur))
22}
23
24// The reads, called as Adena calls them: the id a quoted string, two values.
25func TestReads(cur realm, t *testing.T) {
26	reset(cur)
27
28	owner, err := OwnerOf("1")
29	uassert.NoError(t, err)
30	uassert.Equal(t, aliceAddr, owner)
31
32	n, err := BalanceOf(aliceAddr)
33	uassert.NoError(t, err)
34	uassert.Equal(t, int64(1), n)
35	n, err = BalanceOf(bobAddr)
36	uassert.NoError(t, err)
37	uassert.Equal(t, int64(0), n)
38
39	uri, err := TokenURI("1")
40	uassert.NoError(t, err)
41	uassert.Equal(t, image, uri)
42	uassert.True(t, strings.HasPrefix(uri, "https://"))
43
44	meta, err := TokenMetadata("1")
45	uassert.NoError(t, err)
46	uassert.Equal(t, `{"name":"Golden Ticket #1","description":"A 1/1 on gno.land, minted to check that collections show in Adena.",`+
47		`"image":"`+image+`","attributes":[{"traitType":"edition","value":"1 of 1"},{"traitType":"metal","value":"gold"}]}`, meta)
48
49	uassert.Equal(t, int64(1), Token.TotalSupply())
50	uassert.Equal(t, "Golden Ticket", Name())
51	uassert.Equal(t, "GOLD", Symbol())
52
53	// Any other id is an error, not a panic.
54	for _, bad := range []grc721.TokenID{"", "0", "2", "01", " 1"} {
55		_, err = OwnerOf(bad)
56		uassert.ErrorContains(t, err, errNoTicket, string(bad))
57		_, err = TokenURI(bad)
58		uassert.ErrorContains(t, err, errNoTicket, string(bad))
59		_, err = TokenMetadata(bad)
60		uassert.ErrorContains(t, err, errNoTicket, string(bad))
61	}
62}
63
64func TestTransfer(cur realm, t *testing.T) {
65	reset(cur)
66
67	// Only the holder moves the ticket.
68	testing.SetRealm(testing.NewUserRealm(bobAddr))
69	uassert.AbortsWithMessage(t, cur, errNotOwner, func() {
70		Transfer(cross(cur), bobAddr)
71	})
72
73	testing.SetRealm(testing.NewUserRealm(aliceAddr))
74	uassert.AbortsWithMessage(t, cur, errBadOwner, func() {
75		Transfer(cross(cur), address("nope"))
76	})
77	Transfer(cross(cur), bobAddr)
78	owner, err := OwnerOf("1")
79	uassert.NoError(t, err)
80	uassert.Equal(t, bobAddr, owner)
81	n, _ := BalanceOf(aliceAddr)
82	uassert.Equal(t, int64(0), n)
83	n, _ = BalanceOf(bobAddr)
84	uassert.Equal(t, int64(1), n)
85
86	// Not through another realm.
87	testing.SetRealm(testing.NewCodeRealm("gno.land/r/demo/relay"))
88	uassert.AbortsWithMessage(t, cur, errNotOwner, func() {
89		Transfer(cross(cur), aliceAddr)
90	})
91}
92
93func TestRender(cur realm, t *testing.T) {
94	reset(cur)
95	out := Render("")
96	uassert.True(t, strings.Contains(out, "# Golden Ticket\n"))
97	uassert.True(t, strings.Contains(out, "!["+tokenName+"]("+image+")"))
98	uassert.True(t, strings.Contains(out, "Held by `"+aliceAddr.String()+"`."))
99}