basic_nft_test.gno

10.63 Kb ยท 346 lines
  1package grc721
  2
  3import (
  4	"std"
  5	"testing"
  6
  7	"gno.land/p/demo/testutils"
  8	"gno.land/p/demo/uassert"
  9)
 10
 11var (
 12	dummyNFTName   = "DummyNFT"
 13	dummyNFTSymbol = "DNFT"
 14)
 15
 16func TestNewBasicNFT(t *testing.T) {
 17	dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)
 18	uassert.True(t, dummy != nil, "should not be nil")
 19}
 20
 21func TestName(t *testing.T) {
 22	dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)
 23	uassert.True(t, dummy != nil, "should not be nil")
 24
 25	name := dummy.Name()
 26	uassert.Equal(t, dummyNFTName, name)
 27}
 28
 29func TestSymbol(t *testing.T) {
 30	dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)
 31	uassert.True(t, dummy != nil, "should not be nil")
 32
 33	symbol := dummy.Symbol()
 34	uassert.Equal(t, dummyNFTSymbol, symbol)
 35}
 36
 37func TestTokenCount(t *testing.T) {
 38	dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)
 39	uassert.True(t, dummy != nil, "should not be nil")
 40
 41	count := dummy.TokenCount()
 42	uassert.Equal(t, int64(0), count)
 43
 44	dummy.mint("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm", TokenID("1"))
 45	dummy.mint("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm", TokenID("2"))
 46
 47	count = dummy.TokenCount()
 48	uassert.Equal(t, int64(2), count)
 49}
 50
 51func TestBalanceOf(t *testing.T) {
 52	dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)
 53	uassert.True(t, dummy != nil, "should not be nil")
 54
 55	addr1 := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm")
 56	addr2 := std.Address("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj")
 57
 58	balanceAddr1, err := dummy.BalanceOf(addr1)
 59	uassert.NoError(t, err, "should not result in error")
 60	uassert.Equal(t, int64(0), balanceAddr1)
 61
 62	dummy.mint(addr1, TokenID("1"))
 63	dummy.mint(addr1, TokenID("2"))
 64	dummy.mint(addr2, TokenID("3"))
 65
 66	balanceAddr1, err = dummy.BalanceOf(addr1)
 67	uassert.NoError(t, err, "should not result in error")
 68
 69	balanceAddr2, err := dummy.BalanceOf(addr2)
 70	uassert.NoError(t, err, "should not result in error")
 71
 72	uassert.Equal(t, int64(2), balanceAddr1)
 73	uassert.Equal(t, int64(1), balanceAddr2)
 74}
 75
 76func TestOwnerOf(t *testing.T) {
 77	dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)
 78	uassert.True(t, dummy != nil, "should not be nil")
 79
 80	addr1 := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm")
 81	addr2 := std.Address("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj")
 82
 83	owner, err := dummy.OwnerOf(TokenID("invalid"))
 84	uassert.Error(t, err, "should not result in error")
 85
 86	dummy.mint(addr1, TokenID("1"))
 87	dummy.mint(addr2, TokenID("2"))
 88
 89	// Checking for token id "1"
 90	owner, err = dummy.OwnerOf(TokenID("1"))
 91	uassert.NoError(t, err, "should not result in error")
 92	uassert.Equal(t, addr1.String(), owner.String())
 93
 94	// Checking for token id "2"
 95	owner, err = dummy.OwnerOf(TokenID("2"))
 96	uassert.NoError(t, err, "should not result in error")
 97	uassert.Equal(t, addr2.String(), owner.String())
 98}
 99
100func TestIsApprovedForAll(t *testing.T) {
101	dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)
102	uassert.True(t, dummy != nil, "should not be nil")
103
104	addr1 := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm")
105	addr2 := std.Address("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj")
106
107	isApprovedForAll := dummy.IsApprovedForAll(addr1, addr2)
108	uassert.False(t, isApprovedForAll)
109}
110
111func TestSetApprovalForAll(t *testing.T) {
112	dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)
113	uassert.True(t, dummy != nil, "should not be nil")
114
115	caller := std.CurrentRealm().Address()
116	testing.SetOriginCaller(caller)
117	addr := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm")
118
119	// Test setting approval to true
120	isApprovedForAll := dummy.IsApprovedForAll(caller, addr)
121	uassert.False(t, isApprovedForAll)
122
123	err := dummy.SetApprovalForAll(addr, true)
124	uassert.NoError(t, err, "should not result in error")
125
126	isApprovedForAll = dummy.IsApprovedForAll(caller, addr)
127	uassert.True(t, isApprovedForAll)
128
129	// Test setting approval to false
130	err = dummy.SetApprovalForAll(addr, false)
131	uassert.NoError(t, err, "should not result in error")
132
133	isApprovedForAll = dummy.IsApprovedForAll(caller, addr)
134	uassert.False(t, isApprovedForAll)
135}
136
137func TestGetApproved(t *testing.T) {
138	dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)
139	uassert.True(t, dummy != nil, "should not be nil")
140
141	_, err := dummy.GetApproved(TokenID("invalid"))
142	uassert.Error(t, err, "should result in error")
143}
144
145func TestApprove(t *testing.T) {
146	alice := testutils.TestAddress("alice")
147	testing.SetOriginCaller(alice)
148
149	dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)
150	uassert.True(t, dummy != nil, "should not be nil")
151
152	caller := std.CurrentRealm().Address()
153	addr := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm")
154
155	err := dummy.mint(caller, TokenID("1"))
156	uassert.NoError(t, err, "failed to mint")
157
158	_, err = dummy.GetApproved(TokenID("1"))
159	uassert.Error(t, err, "should result in error")
160
161	err = dummy.Approve(addr, TokenID("1"))
162	uassert.NoError(t, err, "should not result in error")
163
164	approvedAddr, err := dummy.GetApproved(TokenID("1"))
165	uassert.NoError(t, err, "should result in error")
166	uassert.Equal(t, addr.String(), approvedAddr.String())
167}
168
169func TestTransferFrom(t *testing.T) {
170	alice := testutils.TestAddress("alice")
171	testing.SetOriginCaller(alice)
172
173	dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)
174	uassert.True(t, dummy != nil, "should not be nil")
175
176	caller := std.CurrentRealm().Address()
177	addr := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm")
178
179	dummy.mint(caller, TokenID("1"))
180	dummy.mint(caller, TokenID("2"))
181
182	err := dummy.TransferFrom(caller, addr, TokenID("1"))
183	uassert.NoError(t, err, "should result in error")
184
185	// Check balance of caller after transfer
186	balanceOfCaller, err := dummy.BalanceOf(caller)
187	uassert.NoError(t, err, "should result in error")
188	uassert.Equal(t, int64(1), balanceOfCaller)
189
190	// Check balance of addr after transfer
191	balanceOfAddr, err := dummy.BalanceOf(addr)
192	uassert.NoError(t, err, "should not result in error")
193	uassert.Equal(t, int64(1), balanceOfAddr)
194
195	// Check Owner of transferred Token id
196	owner, err := dummy.OwnerOf(TokenID("1"))
197	uassert.NoError(t, err, "should result in error")
198	uassert.Equal(t, addr.String(), owner.String())
199}
200
201func TestSafeTransferFrom(t *testing.T) {
202	alice := testutils.TestAddress("alice")
203	testing.SetOriginCaller(alice)
204
205	dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)
206	uassert.True(t, dummy != nil, "should not be nil")
207
208	caller := std.CurrentRealm().Address()
209	addr := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm")
210
211	dummy.mint(caller, TokenID("1"))
212	dummy.mint(caller, TokenID("2"))
213
214	err := dummy.SafeTransferFrom(caller, addr, TokenID("1"))
215	uassert.NoError(t, err, "should not result in error")
216
217	// Check balance of caller after transfer
218	balanceOfCaller, err := dummy.BalanceOf(caller)
219	uassert.NoError(t, err, "should not result in error")
220	uassert.Equal(t, int64(1), balanceOfCaller)
221
222	// Check balance of addr after transfer
223	balanceOfAddr, err := dummy.BalanceOf(addr)
224	uassert.NoError(t, err, "should not result in error")
225	uassert.Equal(t, int64(1), balanceOfAddr)
226
227	// Check Owner of transferred Token id
228	owner, err := dummy.OwnerOf(TokenID("1"))
229	uassert.NoError(t, err, "should not result in error")
230	uassert.Equal(t, addr.String(), owner.String())
231}
232
233func TestMint(t *testing.T) {
234	dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)
235	uassert.True(t, dummy != nil, "should not be nil")
236
237	addr1 := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm")
238	addr2 := std.Address("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj")
239
240	err := dummy.Mint(addr1, TokenID("1"))
241	uassert.NoError(t, err, "should not result in error")
242	err = dummy.Mint(addr1, TokenID("2"))
243	uassert.NoError(t, err, "should not result in error")
244	err = dummy.Mint(addr2, TokenID("3"))
245	uassert.NoError(t, err, "should not result in error")
246
247	// Try minting duplicate token id
248	err = dummy.Mint(addr2, TokenID("1"))
249	uassert.Error(t, err, "should not result in error")
250
251	// Check Owner of Token id
252	owner, err := dummy.OwnerOf(TokenID("1"))
253	uassert.NoError(t, err, "should not result in error")
254	uassert.Equal(t, addr1.String(), owner.String())
255}
256
257func TestBurn(t *testing.T) {
258	dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)
259	uassert.True(t, dummy != nil, "should not be nil")
260
261	addr := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm")
262
263	dummy.mint(addr, TokenID("1"))
264	dummy.mint(addr, TokenID("2"))
265
266	err := dummy.Burn(TokenID("1"))
267	uassert.NoError(t, err, "should not result in error")
268
269	// Check Owner of Token id
270	_, err = dummy.OwnerOf(TokenID("1"))
271	uassert.Error(t, err, "should result in error")
272}
273
274func TestSetTokenURI(t *testing.T) {
275	dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)
276	uassert.True(t, dummy != nil, "should not be nil")
277
278	addr1 := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm")
279	addr2 := std.Address("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj")
280	tokenURI := "http://example.com/token"
281
282	testing.SetOriginCaller(addr1) // addr1
283
284	dummy.mint(addr1, TokenID("1"))
285	_, derr := dummy.SetTokenURI(TokenID("1"), TokenURI(tokenURI))
286	uassert.NoError(t, derr, "should not result in error")
287
288	// Test case: Invalid token ID
289	_, err := dummy.SetTokenURI(TokenID("3"), TokenURI(tokenURI))
290	uassert.ErrorIs(t, err, ErrInvalidTokenId)
291
292	testing.SetOriginCaller(addr2) // addr2
293
294	_, cerr := dummy.SetTokenURI(TokenID("1"), TokenURI(tokenURI)) // addr2 trying to set URI for token 1
295	uassert.ErrorIs(t, cerr, ErrCallerIsNotOwner)
296
297	// Test case: Retrieving TokenURI
298	testing.SetOriginCaller(addr1) // addr1
299
300	dummyTokenURI, err := dummy.TokenURI(TokenID("1"))
301	uassert.NoError(t, err, "TokenURI error")
302	uassert.Equal(t, string(tokenURI), string(dummyTokenURI))
303}
304
305func TestIsApprovedOrOwner(t *testing.T) {
306	dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)
307	uassert.True(t, dummy != nil, "should not be nil")
308
309	var (
310		owner    = testutils.TestAddress("owner")
311		operator = testutils.TestAddress("operator")
312		approved = testutils.TestAddress("approved")
313		other    = testutils.TestAddress("other")
314	)
315
316	tid := TokenID("1")
317
318	err := dummy.mint(owner, tid)
319	uassert.NoError(t, err)
320
321	// check owner
322	isApprovedOrOwner := dummy.isApprovedOrOwner(owner, tid)
323	uassert.True(t, isApprovedOrOwner, "owner should be approved")
324
325	// check operator
326	testing.SetOriginCaller(owner)
327	err = dummy.SetApprovalForAll(operator, true)
328	uassert.NoError(t, err)
329	isApprovedOrOwner = dummy.isApprovedOrOwner(operator, tid)
330	uassert.True(t, isApprovedOrOwner, "operator should be approved")
331
332	// check approved
333	testing.SetOriginCaller(owner)
334	err = dummy.Approve(approved, tid)
335	uassert.NoError(t, err)
336	isApprovedOrOwner = dummy.isApprovedOrOwner(approved, tid)
337	uassert.True(t, isApprovedOrOwner, "approved address should be approved")
338
339	// check other
340	isApprovedOrOwner = dummy.isApprovedOrOwner(other, tid)
341	uassert.False(t, isApprovedOrOwner, "other address should not be approved")
342
343	// check non-existent token
344	isApprovedOrOwner = dummy.isApprovedOrOwner(owner, TokenID("999"))
345	uassert.False(t, isApprovedOrOwner, "non-existent token should not be approved")
346}