github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/examples/gno.land/p/demo/grc/grc721/basic_nft_test.gno (about) 1 package grc721 2 3 import ( 4 "std" 5 "testing" 6 7 "gno.land/p/demo/testutils" 8 "gno.land/p/demo/users" 9 ) 10 11 var ( 12 dummyNFTName = "DummyNFT" 13 dummyNFTSymbol = "DNFT" 14 ) 15 16 func TestNewBasicNFT(t *testing.T) { 17 dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol) 18 if dummy == nil { 19 t.Errorf("should not be nil") 20 } 21 } 22 23 func TestName(t *testing.T) { 24 dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol) 25 if dummy == nil { 26 t.Errorf("should not be nil") 27 } 28 name := dummy.Name() 29 if name != dummyNFTName { 30 t.Errorf("expected: (%s), got: (%s)", dummyNFTName, name) 31 } 32 } 33 34 func TestSymbol(t *testing.T) { 35 dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol) 36 if dummy == nil { 37 t.Errorf("should not be nil") 38 } 39 symbol := dummy.Symbol() 40 if symbol != dummyNFTSymbol { 41 t.Errorf("expected: (%s), got: (%s)", dummyNFTSymbol, symbol) 42 } 43 } 44 45 func TestTokenCount(t *testing.T) { 46 dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol) 47 if dummy == nil { 48 t.Errorf("should not be nil") 49 } 50 51 count := dummy.TokenCount() 52 if count != 0 { 53 t.Errorf("expected: (%d), got: (%d)", 0, count) 54 } 55 56 dummy.mint("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm", TokenID("1")) 57 dummy.mint("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm", TokenID("2")) 58 59 count = dummy.TokenCount() 60 if count != 2 { 61 t.Errorf("expected: (%d), got: (%d)", 2, count) 62 } 63 } 64 65 func TestBalanceOf(t *testing.T) { 66 dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol) 67 if dummy == nil { 68 t.Errorf("should not be nil") 69 } 70 71 addr1 := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm") 72 addr2 := std.Address("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj") 73 74 balanceAddr1, err := dummy.BalanceOf(addr1) 75 if err != nil { 76 t.Errorf("should not result in error") 77 } 78 if balanceAddr1 != 0 { 79 t.Errorf("expected: (%d), got: (%d)", 0, balanceAddr1) 80 } 81 82 dummy.mint(addr1, TokenID("1")) 83 dummy.mint(addr1, TokenID("2")) 84 dummy.mint(addr2, TokenID("3")) 85 86 balanceAddr1, err = dummy.BalanceOf(addr1) 87 if err != nil { 88 t.Errorf("should not result in error") 89 } 90 balanceAddr2, err := dummy.BalanceOf(addr2) 91 if err != nil { 92 t.Errorf("should not result in error") 93 } 94 95 if balanceAddr1 != 2 { 96 t.Errorf("expected: (%d), got: (%d)", 2, balanceAddr1) 97 } 98 if balanceAddr2 != 1 { 99 t.Errorf("expected: (%d), got: (%d)", 1, balanceAddr2) 100 } 101 } 102 103 func TestOwnerOf(t *testing.T) { 104 dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol) 105 if dummy == nil { 106 t.Errorf("should not be nil") 107 } 108 109 addr1 := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm") 110 addr2 := std.Address("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj") 111 112 owner, err := dummy.OwnerOf(TokenID("invalid")) 113 if err == nil { 114 t.Errorf("should result in error") 115 } 116 117 dummy.mint(addr1, TokenID("1")) 118 dummy.mint(addr2, TokenID("2")) 119 120 // Checking for token id "1" 121 owner, err = dummy.OwnerOf(TokenID("1")) 122 if err != nil { 123 t.Errorf("should not result in error") 124 } 125 if owner != addr1 { 126 t.Errorf("expected: (%s), got: (%s)", addr1.String(), owner.String()) 127 } 128 129 // Checking for token id "2" 130 owner, err = dummy.OwnerOf(TokenID("2")) 131 if err != nil { 132 t.Errorf("should not result in error") 133 } 134 if owner != addr2 { 135 t.Errorf("expected: (%s), got: (%s)", addr2.String(), owner.String()) 136 } 137 } 138 139 func TestIsApprovedForAll(t *testing.T) { 140 dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol) 141 if dummy == nil { 142 t.Errorf("should not be nil") 143 } 144 145 addr1 := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm") 146 addr2 := std.Address("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj") 147 148 isApprovedForAll := dummy.IsApprovedForAll(addr1, addr2) 149 if isApprovedForAll != false { 150 t.Errorf("expected: (%v), got: (%v)", false, isApprovedForAll) 151 } 152 } 153 154 func TestSetApprovalForAll(t *testing.T) { 155 dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol) 156 if dummy == nil { 157 t.Errorf("should not be nil") 158 } 159 160 caller := std.PrevRealm().Addr() 161 addr := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm") 162 163 isApprovedForAll := dummy.IsApprovedForAll(caller, addr) 164 if isApprovedForAll != false { 165 t.Errorf("expected: (%v), got: (%v)", false, isApprovedForAll) 166 } 167 168 err := dummy.SetApprovalForAll(addr, true) 169 if err != nil { 170 t.Errorf("should not result in error") 171 } 172 173 isApprovedForAll = dummy.IsApprovedForAll(caller, addr) 174 if isApprovedForAll != true { 175 t.Errorf("expected: (%v), got: (%v)", false, isApprovedForAll) 176 } 177 } 178 179 func TestGetApproved(t *testing.T) { 180 dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol) 181 if dummy == nil { 182 t.Errorf("should not be nil") 183 } 184 185 approvedAddr, err := dummy.GetApproved(TokenID("invalid")) 186 if err == nil { 187 t.Errorf("should result in error") 188 } 189 } 190 191 func TestApprove(t *testing.T) { 192 dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol) 193 if dummy == nil { 194 t.Errorf("should not be nil") 195 } 196 197 caller := std.PrevRealm().Addr() 198 addr := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm") 199 200 dummy.mint(caller, TokenID("1")) 201 202 _, err := dummy.GetApproved(TokenID("1")) 203 if err == nil { 204 t.Errorf("should result in error") 205 } 206 207 err = dummy.Approve(addr, TokenID("1")) 208 if err != nil { 209 t.Errorf("should not result in error") 210 } 211 212 approvedAddr, err := dummy.GetApproved(TokenID("1")) 213 if err != nil { 214 t.Errorf("should not result in error") 215 } 216 if approvedAddr != addr { 217 t.Errorf("expected: (%s), got: (%s)", addr.String(), approvedAddr.String()) 218 } 219 } 220 221 func TestTransferFrom(t *testing.T) { 222 dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol) 223 if dummy == nil { 224 t.Errorf("should not be nil") 225 } 226 227 caller := std.PrevRealm().Addr() 228 addr := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm") 229 230 dummy.mint(caller, TokenID("1")) 231 dummy.mint(caller, TokenID("2")) 232 233 err := dummy.TransferFrom(caller, addr, TokenID("1")) 234 if err != nil { 235 t.Errorf("should not result in error") 236 } 237 238 // Check balance of caller after transfer 239 balanceOfCaller, err := dummy.BalanceOf(caller) 240 if err != nil { 241 t.Errorf("should not result in error") 242 } 243 if balanceOfCaller != 1 { 244 t.Errorf("expected: (%d), got: (%d)", 1, balanceOfCaller) 245 } 246 247 // Check balance of addr after transfer 248 balanceOfAddr, err := dummy.BalanceOf(addr) 249 if err != nil { 250 t.Errorf("should not result in error") 251 } 252 if balanceOfAddr != 1 { 253 t.Errorf("expected: (%d), got: (%d)", 1, balanceOfAddr) 254 } 255 256 // Check Owner of transferred Token id 257 owner, err := dummy.OwnerOf(TokenID("1")) 258 if err != nil { 259 t.Errorf("should not result in error") 260 } 261 if owner != addr { 262 t.Errorf("expected: (%s), got: (%s)", addr.String(), owner.String()) 263 } 264 } 265 266 func TestSafeTransferFrom(t *testing.T) { 267 dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol) 268 if dummy == nil { 269 t.Errorf("should not be nil") 270 } 271 272 caller := std.PrevRealm().Addr() 273 addr := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm") 274 275 dummy.mint(caller, TokenID("1")) 276 dummy.mint(caller, TokenID("2")) 277 278 err := dummy.SafeTransferFrom(caller, addr, TokenID("1")) 279 if err != nil { 280 t.Errorf("should not result in error") 281 } 282 283 // Check balance of caller after transfer 284 balanceOfCaller, err := dummy.BalanceOf(caller) 285 if err != nil { 286 t.Errorf("should not result in error") 287 } 288 if balanceOfCaller != 1 { 289 t.Errorf("expected: (%d), got: (%d)", 1, balanceOfCaller) 290 } 291 292 // Check balance of addr after transfer 293 balanceOfAddr, err := dummy.BalanceOf(addr) 294 if err != nil { 295 t.Errorf("should not result in error") 296 } 297 if balanceOfAddr != 1 { 298 t.Errorf("expected: (%d), got: (%d)", 1, balanceOfAddr) 299 } 300 301 // Check Owner of transferred Token id 302 owner, err := dummy.OwnerOf(TokenID("1")) 303 if err != nil { 304 t.Errorf("should not result in error") 305 } 306 if owner != addr { 307 t.Errorf("expected: (%s), got: (%s)", addr.String(), owner.String()) 308 } 309 } 310 311 func TestMint(t *testing.T) { 312 dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol) 313 if dummy == nil { 314 t.Errorf("should not be nil") 315 } 316 317 addr1 := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm") 318 addr2 := std.Address("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj") 319 320 err := dummy.Mint(addr1, TokenID("1")) 321 if err != nil { 322 t.Errorf("should not result in error") 323 } 324 err = dummy.Mint(addr1, TokenID("2")) 325 if err != nil { 326 t.Errorf("should not result in error") 327 } 328 err = dummy.Mint(addr2, TokenID("3")) 329 if err != nil { 330 t.Errorf("should not result in error") 331 } 332 333 // Try minting duplicate token id 334 err = dummy.Mint(addr2, TokenID("1")) 335 if err == nil { 336 t.Errorf("should result in error") 337 } 338 339 // Check Owner of Token id 340 owner, err := dummy.OwnerOf(TokenID("1")) 341 if err != nil { 342 t.Errorf("should not result in error") 343 } 344 if owner != addr1 { 345 t.Errorf("expected: (%s), got: (%s)", addr1.String(), owner.String()) 346 } 347 } 348 349 func TestBurn(t *testing.T) { 350 dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol) 351 if dummy == nil { 352 t.Errorf("should not be nil") 353 } 354 355 addr := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm") 356 357 dummy.mint(addr, TokenID("1")) 358 dummy.mint(addr, TokenID("2")) 359 360 err := dummy.Burn(TokenID("1")) 361 if err != nil { 362 t.Errorf("should not result in error") 363 } 364 365 // Check Owner of Token id 366 owner, err := dummy.OwnerOf(TokenID("1")) 367 if err == nil { 368 t.Errorf("should result in error") 369 } 370 } 371 372 func TestSetTokenURI(t *testing.T) { 373 dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol) 374 if dummy == nil { 375 t.Errorf("should not be nil") 376 } 377 378 addr1 := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm") 379 addr2 := std.Address("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj") 380 tokenURI := "http://example.com/token" 381 382 std.TestSetOrigCaller(std.Address(addr1)) // addr1 383 384 dummy.mint(addr1, TokenID("1")) 385 _, derr := dummy.SetTokenURI(TokenID("1"), TokenURI(tokenURI)) 386 387 if derr != nil { 388 t.Errorf("Should not result in error ", derr.Error()) 389 } 390 391 // Test case: Invalid token ID 392 _, err := dummy.SetTokenURI(TokenID("3"), TokenURI(tokenURI)) 393 if err != ErrInvalidTokenId { 394 t.Errorf("Expected error %v, got %v", ErrInvalidTokenId, err) 395 } 396 397 std.TestSetOrigCaller(std.Address(addr2)) // addr2 398 399 _, cerr := dummy.SetTokenURI(TokenID("1"), TokenURI(tokenURI)) // addr2 trying to set URI for token 1 400 if cerr != ErrCallerIsNotOwner { 401 t.Errorf("Expected error %v, got %v", ErrCallerIsNotOwner, err) 402 } 403 404 // Test case: Retrieving TokenURI 405 std.TestSetOrigCaller(std.Address(addr1)) // addr1 406 407 dummyTokenURI, err := dummy.TokenURI(TokenID("1")) 408 if err != nil { 409 t.Errorf("TokenURI error: %v, ", err.Error()) 410 } 411 if dummyTokenURI != tokenURI { 412 t.Errorf("Expected URI %v, got %v", tokenURI, dummyTokenURI) 413 } 414 }