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