github.com/s7techlab/cckit@v0.10.5/examples/token/chaincode/erc20/erc20_test.go (about)

     1  package erc20_test
     2  
     3  import (
     4  	"encoding/base64"
     5  	"testing"
     6  
     7  	. "github.com/onsi/ginkgo"
     8  	. "github.com/onsi/gomega"
     9  
    10  	"github.com/s7techlab/cckit/examples/token/chaincode/erc20"
    11  	"github.com/s7techlab/cckit/examples/token/service/account"
    12  	"github.com/s7techlab/cckit/examples/token/service/allowance"
    13  	"github.com/s7techlab/cckit/examples/token/service/balance"
    14  	"github.com/s7techlab/cckit/examples/token/service/config_erc20"
    15  	"github.com/s7techlab/cckit/identity"
    16  	"github.com/s7techlab/cckit/identity/testdata"
    17  	testcc "github.com/s7techlab/cckit/testing"
    18  	expectcc "github.com/s7techlab/cckit/testing/expect"
    19  )
    20  
    21  func TestERC20(t *testing.T) {
    22  	RegisterFailHandler(Fail)
    23  	RunSpecs(t, "ERC20 Test suite")
    24  }
    25  
    26  var (
    27  	ownerIdentity = testdata.Certificates[0].MustIdentity(testdata.DefaultMSP)
    28  	user1Identity = testdata.Certificates[1].MustIdentity(testdata.DefaultMSP)
    29  	user2Identity = testdata.Certificates[2].MustIdentity(testdata.DefaultMSP)
    30  
    31  	ownerAddress = base64.StdEncoding.EncodeToString(identity.MarshalPublicKey(ownerIdentity.Cert.PublicKey))
    32  	user1Address = base64.StdEncoding.EncodeToString(identity.MarshalPublicKey(user1Identity.Cert.PublicKey))
    33  	user2Address = base64.StdEncoding.EncodeToString(identity.MarshalPublicKey(user2Identity.Cert.PublicKey))
    34  
    35  	cc *testcc.MockStub
    36  )
    37  
    38  var _ = Describe(`ERC`, func() {
    39  
    40  	BeforeSuite(func() {
    41  		chaincode, err := erc20.New()
    42  		Expect(err).NotTo(HaveOccurred())
    43  		cc = testcc.NewMockStub(`erc20`, chaincode)
    44  
    45  		expectcc.ResponseOk(cc.From(ownerIdentity).Init())
    46  	})
    47  
    48  	It(`Allow to call init once more time `, func() {
    49  		expectcc.ResponseOk(cc.From(ownerIdentity).Init())
    50  	})
    51  
    52  	Context(`token info`, func() {
    53  
    54  		It(`Allow to get token name`, func() {
    55  			name := expectcc.PayloadIs(
    56  				cc.From(user1Identity).
    57  					Query(config_erc20.ConfigERC20ServiceChaincode_GetName, nil),
    58  				&config_erc20.NameResponse{}).(*config_erc20.NameResponse)
    59  
    60  			Expect(name.Name).To(Equal(erc20.Token.Name))
    61  		})
    62  	})
    63  
    64  	Context(`initial balance`, func() {
    65  
    66  		It(`Allow to know invoker address `, func() {
    67  			address := expectcc.PayloadIs(
    68  				cc.From(user1Identity).
    69  					Query(account.AccountServiceChaincode_GetInvokerAddress, nil),
    70  				&account.AddressId{}).(*account.AddressId)
    71  
    72  			Expect(address.Address).To(Equal(user1Address))
    73  
    74  			address = expectcc.PayloadIs(
    75  				cc.From(user2Identity).
    76  					Query(account.AccountServiceChaincode_GetInvokerAddress, nil),
    77  				&account.AddressId{}).(*account.AddressId)
    78  
    79  			Expect(address.Address).To(Equal(user2Address))
    80  		})
    81  
    82  		It(`Allow to get owner balance`, func() {
    83  			b := expectcc.PayloadIs(
    84  				cc.From(user1Identity). // call by any user
    85  							Query(balance.BalanceServiceChaincode_GetBalance,
    86  						&balance.BalanceId{Address: ownerAddress, Token: []string{erc20.Token.Name}}),
    87  				&balance.Balance{}).(*balance.Balance)
    88  
    89  			Expect(b.Address).To(Equal(ownerAddress))
    90  			Expect(b.Amount).To(Equal(uint64(erc20.Token.TotalSupply)))
    91  		})
    92  
    93  		It(`Allow to get zero balance`, func() {
    94  			b := expectcc.PayloadIs(
    95  				cc.From(user1Identity).
    96  					Query(balance.BalanceServiceChaincode_GetBalance,
    97  						&balance.BalanceId{Address: user1Address, Token: []string{erc20.Token.Name}}),
    98  				&balance.Balance{}).(*balance.Balance)
    99  
   100  			Expect(b.Amount).To(Equal(uint64(0)))
   101  		})
   102  
   103  	})
   104  
   105  	Context(`transfer`, func() {
   106  		var transferAmount uint64 = 100
   107  
   108  		It(`Disallow to transfer balance by user with zero balance`, func() {
   109  			expectcc.ResponseError(
   110  				cc.From(user1Identity).
   111  					Invoke(balance.BalanceServiceChaincode_Transfer,
   112  						&balance.TransferRequest{
   113  							RecipientAddress: user2Address,
   114  							Token:            []string{erc20.Token.Name},
   115  							Amount:           transferAmount,
   116  						}), balance.ErrAmountInsuficcient)
   117  
   118  		})
   119  
   120  		It(`Allow to transfer balance by owner`, func() {
   121  			r := expectcc.PayloadIs(
   122  				cc.From(ownerIdentity).
   123  					Invoke(balance.BalanceServiceChaincode_Transfer,
   124  						&balance.TransferRequest{
   125  							RecipientAddress: user1Address,
   126  							Token:            []string{erc20.Token.Name},
   127  							Amount:           transferAmount,
   128  						}),
   129  				&balance.TransferResponse{}).(*balance.TransferResponse)
   130  
   131  			Expect(r.SenderAddress).To(Equal(ownerAddress))
   132  			Expect(r.Amount).To(Equal(transferAmount))
   133  		})
   134  
   135  		It(`Allow to get new non zero balance`, func() {
   136  			b := expectcc.PayloadIs(
   137  				cc.From(user1Identity).
   138  					Query(balance.BalanceServiceChaincode_GetBalance,
   139  						&balance.BalanceId{Address: user1Address, Token: []string{erc20.Token.Name}}),
   140  				&balance.Balance{}).(*balance.Balance)
   141  
   142  			Expect(b.Amount).To(Equal(transferAmount))
   143  		})
   144  
   145  	})
   146  
   147  	Context(`Allowance`, func() {
   148  
   149  		var allowAmount uint64 = 50
   150  
   151  		It(`Allow to approve amount by owner for spender even if balance is zero`, func() {
   152  			a := expectcc.PayloadIs(
   153  				cc.From(user2Identity).
   154  					Invoke(allowance.AllowanceServiceChaincode_Approve,
   155  						&allowance.ApproveRequest{
   156  							OwnerAddress:   user2Address,
   157  							SpenderAddress: user1Address,
   158  							Token:          []string{erc20.Token.Name},
   159  							Amount:         allowAmount,
   160  						}),
   161  				&allowance.Allowance{}).(*allowance.Allowance)
   162  
   163  			Expect(a.OwnerAddress).To(Equal(user2Address))
   164  			Expect(a.SpenderAddress).To(Equal(user1Address))
   165  			Expect(a.Amount).To(Equal(allowAmount))
   166  		})
   167  		It(`Disallow to approve amount by non owner`, func() {
   168  			expectcc.ResponseError(
   169  				cc.From(user2Identity).
   170  					Invoke(allowance.AllowanceServiceChaincode_Approve,
   171  						&allowance.ApproveRequest{
   172  							OwnerAddress:   ownerAddress,
   173  							SpenderAddress: user1Address,
   174  							Token:          []string{erc20.Token.Name},
   175  							Amount:         allowAmount,
   176  						}), allowance.ErrOwnerOnly)
   177  		})
   178  
   179  		It(`Allow to approve amount by owner for spender if amount is sufficient`, func() {
   180  			a := expectcc.PayloadIs(
   181  				cc.From(ownerIdentity).
   182  					Invoke(allowance.AllowanceServiceChaincode_Approve,
   183  						&allowance.ApproveRequest{
   184  							OwnerAddress:   ownerAddress,
   185  							SpenderAddress: user2Address,
   186  							Token:          []string{erc20.Token.Name},
   187  							Amount:         allowAmount,
   188  						}),
   189  				&allowance.Allowance{}).(*allowance.Allowance)
   190  
   191  			Expect(a.OwnerAddress).To(Equal(ownerAddress))
   192  			Expect(a.SpenderAddress).To(Equal(user2Address))
   193  			Expect(a.Amount).To(Equal(allowAmount))
   194  		})
   195  
   196  		It(`Allow to transfer from`, func() {
   197  			spenderIdentity := user2Identity
   198  			spenderAddress := user2Address
   199  
   200  			t := expectcc.PayloadIs(
   201  				cc.From(spenderIdentity).
   202  					Invoke(allowance.AllowanceServiceChaincode_TransferFrom,
   203  						&allowance.TransferFromRequest{
   204  							OwnerAddress:     ownerAddress,
   205  							RecipientAddress: spenderAddress,
   206  							Token:            []string{erc20.Token.Name},
   207  							Amount:           allowAmount,
   208  						}),
   209  				&allowance.TransferFromResponse{}).(*allowance.TransferFromResponse)
   210  
   211  			Expect(t.OwnerAddress).To(Equal(ownerAddress))
   212  			Expect(t.RecipientAddress).To(Equal(spenderAddress))
   213  			Expect(t.Amount).To(Equal(allowAmount))
   214  		})
   215  	})
   216  })