eventix_test.gno
4.01 Kb ยท 155 lines
1package eventix
2
3import (
4 "chain"
5 "chain/runtime"
6 "testing"
7
8 "gno.land/p/demo/tokens/grc20"
9 "gno.land/p/demo/tokens/grc721"
10 "gno.land/p/nt/testutils"
11 "gno.land/p/nt/uassert"
12 "gno.land/p/nt/ufmt"
13 "gno.land/p/nt/urequire"
14)
15
16func TestCreateEvent(t *testing.T) {
17 // Test successful event creation
18 eventId := CreateEvent(
19 cross,
20 "Test Event",
21 "A test event",
22 "2024-12-31T23:59:59Z",
23 "ugnot",
24 100,
25 1000000,
26 )
27
28 // Convert eventId to int for comparison since CreateEvent returns uint64
29 uassert.Equal(t, uint64(1), eventId)
30
31 event, exists := getEvent(eventId)
32 urequire.True(t, exists, "Event was not created")
33 uassert.Equal(t, "Test Event", event.name)
34
35 // Test invalid date format
36 urequire.AbortsWithMessage(t, "Invalid date format. Use: YYYY-MM-DDThh:mm:ssZ", func() {
37 CreateEvent(cross, "Test", "Test", "invalid-date", "ugnot", 100, 1000000)
38 })
39}
40
41func TestBuyTicket(t *testing.T) {
42 // Setup test event
43 eventId := CreateEvent(
44 cross,
45 "Test Event",
46 "A test event",
47 "2024-12-31T23:59:59Z",
48 "ugnot",
49 2,
50 1000000,
51 )
52
53 // Setup test buyer
54 buyer := address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
55 testing.SetOriginCaller(buyer)
56
57 uassert.AbortsWithMessage(t, "Invalid payment amount: needs to be 1000000ugnot", func() {
58 BuyTicket(cross, eventId)
59 })
60
61 // Test successful purchase
62 testing.SetOriginSend(chain.NewCoins(chain.NewCoin("ugnot", 1000000)))
63 BuyTicket(cross, eventId)
64
65 event, _ := getEvent(eventId)
66 if event.ticketsSold != 1 {
67 t.Errorf("Expected 1 ticket sold, got %d", event.ticketsSold)
68 }
69
70 // Verify NFT ownership
71 tokenId := grc721.TokenID(ufmt.Sprintf("event_%d_ticket_%d", eventId, 1))
72 owner, err := tickets.OwnerOf(tokenId)
73 urequire.NoError(t, err)
74 urequire.Equal(t, buyer, owner)
75
76 // Test buying sold out event
77 testing.SetOriginSend(chain.NewCoins(chain.NewCoin("ugnot", 1000000)))
78 BuyTicket(cross, eventId) // Buy second ticket
79
80 uassert.AbortsWithMessage(t, "Event is sold out", func() {
81 BuyTicket(cross, eventId)
82 })
83}
84
85func TestBuyTicketWithGRC20(t *testing.T) {
86 pkgAddr := chain.PackageAddress("gno.land/r/jjoptimist/eventix")
87 alice := testutils.TestAddress("alice")
88 testing.SetRealm(testing.NewUserRealm(alice))
89
90 // Create a test GRC20 token and set up addresses
91 token, ledger := grc20.NewToken("Test Token", "TEST", 6)
92 buyer := address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
93 adminAddr := address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf6")
94
95 // Set up admin and mint tokens
96 testing.SetOriginCaller(adminAddr)
97 testing.SetRealm(testing.NewUserRealm(adminAddr))
98 err := ledger.Mint(buyer, 2000000) // Use ledger to mint
99 urequire.NoError(t, err)
100
101 // Create event with GRC20 token payment
102 testing.SetOriginCaller(buyer)
103 testing.SetRealm(testing.NewUserRealm(buyer))
104
105 var eventId uint64
106 crossThrough(testing.NewCodeRealm("gno.land/r/jjoptimist/eventix"), func() {
107 eventId = CreateEvent(
108 cross,
109 "GRC20 Event",
110 "An event with GRC20 payment",
111 "2024-12-31T23:59:59Z",
112 token,
113 2,
114 1000000,
115 )
116 })
117
118 // Set up for approval
119 testing.SetOriginCaller(buyer)
120 testing.SetRealm(testing.NewUserRealm(buyer))
121
122 // Approve using the ledger (following grc20factory_test pattern)
123 err = ledger.Approve(buyer, pkgAddr, 1000000)
124 urequire.NoError(t, err)
125
126 // Verify approval
127 allowance := token.Allowance(buyer, pkgAddr)
128 urequire.Equal(t, int64(1000000), allowance, "Approval should be set correctly")
129
130 testing.SetOriginCaller(buyer)
131 testing.SetRealm(testing.NewUserRealm(buyer))
132
133 // Buy ticket
134 BuyTicket(cross, eventId)
135
136 // Verify purchase
137 event, exists := getEvent(eventId)
138 urequire.True(t, exists)
139 urequire.Equal(t, 1, event.ticketsSold)
140
141 // Verify NFT ownership
142 tokenId := grc721.TokenID(ufmt.Sprintf("event_%d_ticket_%d", eventId, 1))
143 owner, err := tickets.OwnerOf(tokenId)
144 urequire.NoError(t, err)
145 urequire.Equal(t, buyer, owner)
146
147 // Verify GRC20 balance changes
148 buyerBalance := token.BalanceOf(buyer)
149 urequire.Equal(t, int64(1000000), buyerBalance) // Should have 1M left after spending 1M
150}
151
152func crossThrough(rlm runtime.Realm, cr func()) {
153 testing.SetRealm(rlm)
154 cr()
155}