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}