basic_nft_test.gno
11.49 Kb ยท 377 lines
1package grc721
2
3import (
4 "std"
5 "testing"
6
7 "gno.land/p/nt/testutils"
8 "gno.land/p/nt/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 // set beyond origin caller
124 testing.SetRealm(std.NewCodeRealm("gno.land/r/test/test"))
125 err := dummy.SetApprovalForAll(addr, true)
126 uassert.NoError(t, err, "should not result in error")
127
128 isApprovedForAll = dummy.IsApprovedForAll(caller, addr)
129 uassert.True(t, isApprovedForAll)
130
131 // Test setting approval to false
132 err = dummy.SetApprovalForAll(addr, false)
133 uassert.NoError(t, err, "should not result in error")
134
135 isApprovedForAll = dummy.IsApprovedForAll(caller, addr)
136 uassert.False(t, isApprovedForAll)
137}
138
139func TestGetApproved(t *testing.T) {
140 dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)
141 uassert.True(t, dummy != nil, "should not be nil")
142
143 _, err := dummy.GetApproved(TokenID("invalid"))
144 uassert.Error(t, err, "should result in error")
145}
146
147func TestApprove(t *testing.T) {
148 alice := testutils.TestAddress("alice")
149 testing.SetOriginCaller(alice)
150
151 dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)
152 uassert.True(t, dummy != nil, "should not be nil")
153
154 caller := std.CurrentRealm().Address()
155 addr := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm")
156
157 err := dummy.mint(caller, TokenID("1"))
158 uassert.NoError(t, err, "failed to mint")
159
160 _, err = dummy.GetApproved(TokenID("1"))
161 uassert.Error(t, err, "should result in error")
162
163 testing.SetRealm(std.NewUserRealm(alice))
164 func() {
165 testing.SetRealm(std.NewCodeRealm("gno.land/r/test/test"))
166 err = dummy.Approve(addr, TokenID("1"))
167 uassert.NoError(t, err, "should not result in error")
168
169 approvedAddr, err := dummy.GetApproved(TokenID("1"))
170 uassert.NoError(t, err, "should result in error")
171 uassert.Equal(t, addr.String(), approvedAddr.String())
172 }()
173}
174
175func TestTransferFrom(t *testing.T) {
176 alice := testutils.TestAddress("alice")
177 testing.SetOriginCaller(alice)
178
179 dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)
180 uassert.True(t, dummy != nil, "should not be nil")
181
182 caller := std.CurrentRealm().Address()
183 addr := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm")
184
185 dummy.mint(caller, TokenID("1"))
186 dummy.mint(caller, TokenID("2"))
187
188 testing.SetRealm(std.NewUserRealm(alice))
189 func() {
190 testing.SetRealm(std.NewCodeRealm("gno.land/r/test/test"))
191
192 err := dummy.TransferFrom(caller, addr, TokenID("1"))
193 uassert.NoError(t, err, "should result in error")
194
195 // Check balance of caller after transfer
196 balanceOfCaller, err := dummy.BalanceOf(caller)
197 uassert.NoError(t, err, "should result in error")
198 uassert.Equal(t, int64(1), balanceOfCaller)
199
200 // Check balance of addr after transfer
201 balanceOfAddr, err := dummy.BalanceOf(addr)
202 uassert.NoError(t, err, "should not result in error")
203 uassert.Equal(t, int64(1), balanceOfAddr)
204
205 // Check Owner of transferred Token id
206 owner, err := dummy.OwnerOf(TokenID("1"))
207 uassert.NoError(t, err, "should result in error")
208 uassert.Equal(t, addr.String(), owner.String())
209 }()
210}
211
212func TestSafeTransferFrom(t *testing.T) {
213 alice := testutils.TestAddress("alice")
214 testing.SetOriginCaller(alice)
215
216 dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)
217 uassert.True(t, dummy != nil, "should not be nil")
218
219 caller := std.CurrentRealm().Address()
220 addr := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm")
221
222 dummy.mint(caller, TokenID("1"))
223 dummy.mint(caller, TokenID("2"))
224
225 testing.SetRealm(std.NewUserRealm(alice))
226 func() {
227 testing.SetRealm(std.NewCodeRealm("gno.land/r/test/test"))
228
229 err := dummy.SafeTransferFrom(caller, addr, TokenID("1"))
230 uassert.NoError(t, err, "should not result in error")
231
232 // Check balance of caller after transfer
233 balanceOfCaller, err := dummy.BalanceOf(caller)
234 uassert.NoError(t, err, "should not result in error")
235 uassert.Equal(t, int64(1), balanceOfCaller)
236
237 // Check balance of addr after transfer
238 balanceOfAddr, err := dummy.BalanceOf(addr)
239 uassert.NoError(t, err, "should not result in error")
240 uassert.Equal(t, int64(1), balanceOfAddr)
241
242 // Check Owner of transferred Token id
243 owner, err := dummy.OwnerOf(TokenID("1"))
244 uassert.NoError(t, err, "should not result in error")
245 uassert.Equal(t, addr.String(), owner.String())
246 }()
247}
248
249func TestMint(t *testing.T) {
250 dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)
251 uassert.True(t, dummy != nil, "should not be nil")
252
253 addr1 := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm")
254 addr2 := std.Address("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj")
255
256 err := dummy.Mint(addr1, TokenID("1"))
257 uassert.NoError(t, err, "should not result in error")
258 err = dummy.Mint(addr1, TokenID("2"))
259 uassert.NoError(t, err, "should not result in error")
260 err = dummy.Mint(addr2, TokenID("3"))
261 uassert.NoError(t, err, "should not result in error")
262
263 // Try minting duplicate token id
264 err = dummy.Mint(addr2, TokenID("1"))
265 uassert.Error(t, err, "should not result in error")
266
267 // Check Owner of Token id
268 owner, err := dummy.OwnerOf(TokenID("1"))
269 uassert.NoError(t, err, "should not result in error")
270 uassert.Equal(t, addr1.String(), owner.String())
271}
272
273func TestBurn(t *testing.T) {
274 dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)
275 uassert.True(t, dummy != nil, "should not be nil")
276
277 addr := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm")
278
279 dummy.mint(addr, TokenID("1"))
280 dummy.mint(addr, TokenID("2"))
281
282 err := dummy.Burn(TokenID("1"))
283 uassert.NoError(t, err, "should not result in error")
284
285 // Check Owner of Token id
286 _, err = dummy.OwnerOf(TokenID("1"))
287 uassert.Error(t, err, "should result in error")
288}
289
290func TestSetTokenURI(t *testing.T) {
291 dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)
292 uassert.True(t, dummy != nil, "should not be nil")
293
294 addr1 := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm")
295 addr2 := std.Address("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj")
296 tokenURI := "http://example.com/token"
297
298 testing.SetOriginCaller(addr1) // addr1
299
300 dummy.mint(addr1, TokenID("1"))
301
302 testing.SetRealm(std.NewUserRealm(addr1))
303 func() {
304 testing.SetRealm(std.NewCodeRealm("gno.land/r/test/test"))
305
306 _, derr := dummy.SetTokenURI(TokenID("1"), TokenURI(tokenURI))
307 uassert.NoError(t, derr, "should not result in error")
308
309 // Test case: Invalid token ID
310 _, err := dummy.SetTokenURI(TokenID("3"), TokenURI(tokenURI))
311 uassert.ErrorIs(t, err, ErrInvalidTokenId)
312
313 testing.SetOriginCaller(addr2) // addr2
314 func() {
315 testing.SetRealm(std.NewCodeRealm("gno.land/r/test/test"))
316 _, cerr := dummy.SetTokenURI(TokenID("1"), TokenURI(tokenURI)) // addr2 trying to set URI for token 1
317 uassert.ErrorIs(t, cerr, ErrCallerIsNotOwner)
318
319 // Test case: Retrieving TokenURI
320 testing.SetOriginCaller(addr1) // addr1
321
322 dummyTokenURI, err := dummy.TokenURI(TokenID("1"))
323 uassert.NoError(t, err, "TokenURI error")
324 uassert.Equal(t, string(tokenURI), string(dummyTokenURI))
325 }()
326 }()
327}
328
329func TestIsApprovedOrOwner(t *testing.T) {
330 dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)
331 uassert.True(t, dummy != nil, "should not be nil")
332
333 var (
334 owner = testutils.TestAddress("owner")
335 operator = testutils.TestAddress("operator")
336 approved = testutils.TestAddress("approved")
337 other = testutils.TestAddress("other")
338 )
339
340 tid := TokenID("1")
341
342 err := dummy.mint(owner, tid)
343 uassert.NoError(t, err)
344
345 // check owner
346 isApprovedOrOwner := dummy.isApprovedOrOwner(owner, tid)
347 uassert.True(t, isApprovedOrOwner, "owner should be approved")
348
349 // check operator
350 testing.SetOriginCaller(owner)
351 func() {
352 testing.SetRealm(std.NewCodeRealm("gno.land/r/test/test"))
353
354 err = dummy.SetApprovalForAll(operator, true)
355 uassert.NoError(t, err)
356 isApprovedOrOwner = dummy.isApprovedOrOwner(operator, tid)
357 uassert.True(t, isApprovedOrOwner, "operator should be approved")
358
359 // check approved
360 testing.SetOriginCaller(owner)
361 func() {
362 testing.SetRealm(std.NewCodeRealm("gno.land/r/test/test"))
363 err = dummy.Approve(approved, tid)
364 uassert.NoError(t, err)
365 isApprovedOrOwner = dummy.isApprovedOrOwner(approved, tid)
366 uassert.True(t, isApprovedOrOwner, "approved address should be approved")
367
368 // check other
369 isApprovedOrOwner = dummy.isApprovedOrOwner(other, tid)
370 uassert.False(t, isApprovedOrOwner, "other address should not be approved")
371
372 // check non-existent token
373 isApprovedOrOwner = dummy.isApprovedOrOwner(owner, TokenID("999"))
374 uassert.False(t, isApprovedOrOwner, "non-existent token should not be approved")
375 }()
376 }()
377}