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  }