github.com/nspcc-dev/neo-go@v0.105.2-0.20240517133400-6be757af3eba/pkg/rpcclient/nep11/divisible_test.go (about)

     1  package nep11
     2  
     3  import (
     4  	"errors"
     5  	"math/big"
     6  	"testing"
     7  
     8  	"github.com/google/uuid"
     9  	"github.com/nspcc-dev/neo-go/pkg/core/transaction"
    10  	"github.com/nspcc-dev/neo-go/pkg/neorpc/result"
    11  	"github.com/nspcc-dev/neo-go/pkg/util"
    12  	"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
    13  	"github.com/stretchr/testify/require"
    14  )
    15  
    16  func TestDivisibleBalanceOf(t *testing.T) {
    17  	ta := new(testAct)
    18  	tr := NewDivisibleReader(ta, util.Uint160{1, 2, 3})
    19  	tt := NewDivisible(ta, util.Uint160{1, 2, 3})
    20  
    21  	for name, fun := range map[string]func(util.Uint160, []byte) (*big.Int, error){
    22  		"Reader": tr.BalanceOfD,
    23  		"Full":   tt.BalanceOfD,
    24  	} {
    25  		t.Run(name, func(t *testing.T) {
    26  			ta.err = errors.New("")
    27  			_, err := fun(util.Uint160{3, 2, 1}, []byte{1, 2, 3})
    28  			require.Error(t, err)
    29  
    30  			ta.err = nil
    31  			ta.res = &result.Invoke{
    32  				State: "HALT",
    33  				Stack: []stackitem.Item{
    34  					stackitem.Make(100500),
    35  				},
    36  			}
    37  			bal, err := fun(util.Uint160{3, 2, 1}, []byte{1, 2, 3})
    38  			require.NoError(t, err)
    39  			require.Equal(t, big.NewInt(100500), bal)
    40  
    41  			ta.res = &result.Invoke{
    42  				State: "HALT",
    43  				Stack: []stackitem.Item{
    44  					stackitem.Make([]stackitem.Item{}),
    45  				},
    46  			}
    47  			_, err = fun(util.Uint160{3, 2, 1}, []byte{1, 2, 3})
    48  			require.Error(t, err)
    49  		})
    50  	}
    51  }
    52  
    53  func TestDivisibleOwnerOfExpanded(t *testing.T) {
    54  	ta := new(testAct)
    55  	tr := NewDivisibleReader(ta, util.Uint160{1, 2, 3})
    56  	tt := NewDivisible(ta, util.Uint160{1, 2, 3})
    57  
    58  	for name, fun := range map[string]func([]byte, int) ([]util.Uint160, error){
    59  		"Reader": tr.OwnerOfExpanded,
    60  		"Full":   tt.OwnerOfExpanded,
    61  	} {
    62  		t.Run(name, func(t *testing.T) {
    63  			ta.err = errors.New("")
    64  			_, err := fun([]byte{1, 2, 3}, 1)
    65  			require.Error(t, err)
    66  
    67  			ta.err = nil
    68  			ta.res = &result.Invoke{
    69  				State: "HALT",
    70  				Stack: []stackitem.Item{
    71  					stackitem.Make(100500),
    72  				},
    73  			}
    74  			_, err = fun([]byte{1, 2, 3}, 1)
    75  			require.Error(t, err)
    76  
    77  			h := util.Uint160{3, 2, 1}
    78  			ta.res = &result.Invoke{
    79  				State: "HALT",
    80  				Stack: []stackitem.Item{
    81  					stackitem.Make([]stackitem.Item{stackitem.Make(h.BytesBE())}),
    82  				},
    83  			}
    84  			owls, err := fun([]byte{1, 2, 3}, 1)
    85  			require.NoError(t, err)
    86  			require.Equal(t, []util.Uint160{h}, owls)
    87  		})
    88  	}
    89  }
    90  
    91  func TestDivisibleOwnerOf(t *testing.T) {
    92  	ta := new(testAct)
    93  	tr := NewDivisibleReader(ta, util.Uint160{1, 2, 3})
    94  	tt := NewDivisible(ta, util.Uint160{1, 2, 3})
    95  
    96  	for name, fun := range map[string]func([]byte) (*OwnerIterator, error){
    97  		"Reader": tr.OwnerOf,
    98  		"Full":   tt.OwnerOf,
    99  	} {
   100  		t.Run(name, func(t *testing.T) {
   101  			ta.err = errors.New("")
   102  			_, err := fun([]byte{1})
   103  			require.Error(t, err)
   104  
   105  			iid := uuid.New()
   106  			ta.err = nil
   107  			ta.res = &result.Invoke{
   108  				Session: uuid.New(),
   109  				State:   "HALT",
   110  				Stack: []stackitem.Item{
   111  					stackitem.NewInterop(result.Iterator{
   112  						ID: &iid,
   113  					}),
   114  				},
   115  			}
   116  			iter, err := fun([]byte{1})
   117  			require.NoError(t, err)
   118  
   119  			ta.res = &result.Invoke{
   120  				Stack: []stackitem.Item{
   121  					stackitem.Make([]stackitem.Item{}),
   122  				},
   123  			}
   124  			_, err = iter.Next(10)
   125  			require.Error(t, err)
   126  
   127  			ta.res = &result.Invoke{
   128  				Stack: []stackitem.Item{
   129  					stackitem.Make("not uint160"),
   130  				},
   131  			}
   132  			_, err = iter.Next(10)
   133  			require.Error(t, err)
   134  
   135  			h1 := util.Uint160{1, 2, 3}
   136  			h2 := util.Uint160{3, 2, 1}
   137  			ta.res = &result.Invoke{
   138  				Stack: []stackitem.Item{
   139  					stackitem.Make(h1.BytesBE()),
   140  					stackitem.Make(h2.BytesBE()),
   141  				},
   142  			}
   143  			vals, err := iter.Next(10)
   144  			require.NoError(t, err)
   145  			require.Equal(t, []util.Uint160{h1, h2}, vals)
   146  
   147  			ta.err = errors.New("")
   148  			_, err = iter.Next(1)
   149  			require.Error(t, err)
   150  
   151  			err = iter.Terminate()
   152  			require.Error(t, err)
   153  
   154  			// Value-based iterator.
   155  			ta.err = nil
   156  			ta.res = &result.Invoke{
   157  				State: "HALT",
   158  				Stack: []stackitem.Item{
   159  					stackitem.NewInterop(result.Iterator{
   160  						Values: []stackitem.Item{
   161  							stackitem.Make(h1.BytesBE()),
   162  							stackitem.Make(h2.BytesBE()),
   163  						},
   164  					}),
   165  				},
   166  			}
   167  			iter, err = fun([]byte{1})
   168  			require.NoError(t, err)
   169  
   170  			ta.err = errors.New("")
   171  			err = iter.Terminate()
   172  			require.NoError(t, err)
   173  		})
   174  	}
   175  }
   176  
   177  func TestDivisibleTransfer(t *testing.T) {
   178  	ta := new(testAct)
   179  	tok := NewDivisible(ta, util.Uint160{1, 2, 3})
   180  
   181  	ta.err = errors.New("")
   182  	_, _, err := tok.TransferD(util.Uint160{1, 2, 3}, util.Uint160{3, 2, 1}, big.NewInt(10), []byte{3, 2, 1}, nil)
   183  	require.Error(t, err)
   184  
   185  	ta.err = nil
   186  	ta.txh = util.Uint256{1, 2, 3}
   187  	ta.vub = 42
   188  	h, vub, err := tok.TransferD(util.Uint160{1, 2, 3}, util.Uint160{3, 2, 1}, big.NewInt(10), []byte{3, 2, 1}, nil)
   189  	require.NoError(t, err)
   190  	require.Equal(t, ta.txh, h)
   191  	require.Equal(t, ta.vub, vub)
   192  
   193  	ta.err = nil
   194  	ta.txh = util.Uint256{1, 2, 3}
   195  	ta.vub = 42
   196  	h, vub, err = tok.TransferD(util.Uint160{1, 2, 3}, util.Uint160{3, 2, 1}, big.NewInt(10), []byte{3, 2, 1}, &tData{
   197  		someInt:    5,
   198  		someString: "ur",
   199  	})
   200  	require.NoError(t, err)
   201  	require.Equal(t, ta.txh, h)
   202  	require.Equal(t, ta.vub, vub)
   203  
   204  	_, _, err = tok.TransferD(util.Uint160{1, 2, 3}, util.Uint160{3, 2, 1}, big.NewInt(10), []byte{3, 2, 1}, stackitem.NewInterop(nil))
   205  	require.Error(t, err)
   206  }
   207  
   208  func TestDivisibleTransferTransaction(t *testing.T) {
   209  	ta := new(testAct)
   210  	tok := NewDivisible(ta, util.Uint160{1, 2, 3})
   211  
   212  	for _, fun := range []func(from util.Uint160, to util.Uint160, amount *big.Int, id []byte, data any) (*transaction.Transaction, error){
   213  		tok.TransferDTransaction,
   214  		tok.TransferDUnsigned,
   215  	} {
   216  		ta.err = errors.New("")
   217  		_, err := fun(util.Uint160{1, 2, 3}, util.Uint160{3, 2, 1}, big.NewInt(10), []byte{3, 2, 1}, nil)
   218  		require.Error(t, err)
   219  
   220  		ta.err = nil
   221  		ta.tx = &transaction.Transaction{Nonce: 100500, ValidUntilBlock: 42}
   222  		tx, err := fun(util.Uint160{1, 2, 3}, util.Uint160{3, 2, 1}, big.NewInt(10), []byte{3, 2, 1}, nil)
   223  		require.NoError(t, err)
   224  		require.Equal(t, ta.tx, tx)
   225  
   226  		ta.err = nil
   227  		ta.tx = &transaction.Transaction{Nonce: 100500, ValidUntilBlock: 42}
   228  		tx, err = fun(util.Uint160{1, 2, 3}, util.Uint160{3, 2, 1}, big.NewInt(10), []byte{3, 2, 1}, &tData{
   229  			someInt:    5,
   230  			someString: "ur",
   231  		})
   232  		require.NoError(t, err)
   233  		require.Equal(t, ta.tx, tx)
   234  
   235  		_, err = fun(util.Uint160{1, 2, 3}, util.Uint160{3, 2, 1}, big.NewInt(10), []byte{3, 2, 1}, stackitem.NewInterop(nil))
   236  		require.Error(t, err)
   237  	}
   238  }