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

     1  package erc20_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/s7techlab/cckit/examples/erc20"
     7  	idtestdata "github.com/s7techlab/cckit/identity/testdata"
     8  	testcc "github.com/s7techlab/cckit/testing"
     9  	expectcc "github.com/s7techlab/cckit/testing/expect"
    10  
    11  	. "github.com/onsi/ginkgo"
    12  	. "github.com/onsi/gomega"
    13  )
    14  
    15  func TestErc20(t *testing.T) {
    16  	RegisterFailHandler(Fail)
    17  	RunSpecs(t, "ERC-20 Suite")
    18  }
    19  
    20  var (
    21  	ids = idtestdata.MustIdentities(idtestdata.Certificates, idtestdata.DefaultMSP)
    22  
    23  	// load actor certificates
    24  	TokenOwner     = ids[0]
    25  	AccountHolder1 = ids[1]
    26  	Spender1       = ids[2]
    27  )
    28  var _ = Describe(`ERC-20`, func() {
    29  
    30  	const TokenSymbol = `HLF`
    31  	const TokenName = `HLFCoin`
    32  	const TotalSupply = 10000
    33  	const Decimals = 3
    34  
    35  	//Create chaincode mock
    36  	erc20fs := testcc.NewMockStub(`erc20`, erc20.NewErc20FixedSupply())
    37  
    38  	BeforeSuite(func() {
    39  		// init token haincode
    40  		expectcc.ResponseOk(erc20fs.From(TokenOwner).Init(TokenSymbol, TokenName, TotalSupply, Decimals))
    41  	})
    42  
    43  	Describe("ERC-20 creation", func() {
    44  
    45  		It("Allow everyone to get token symbol", func() {
    46  			expectcc.PayloadString(erc20fs.Query(`symbol`), TokenSymbol)
    47  		})
    48  
    49  		It("Allow everyone to get token name", func() {
    50  			expectcc.PayloadString(erc20fs.Query(`name`), TokenName)
    51  		})
    52  
    53  		It("Allow everyone to get token total supply", func() {
    54  			expectcc.PayloadInt(erc20fs.Query(`totalSupply`), TotalSupply)
    55  		})
    56  
    57  		It("Allow everyone to get owner's token balance", func() {
    58  			expectcc.PayloadInt(
    59  				erc20fs.Query(
    60  					`balanceOf`, TokenOwner.MspID, TokenOwner.GetID()), TotalSupply)
    61  		})
    62  
    63  		It("Allow everyone to get holder's token balance", func() {
    64  			expectcc.PayloadInt(
    65  				erc20fs.Query(
    66  					`balanceOf`, AccountHolder1.MspID, AccountHolder1.GetID()), 0)
    67  		})
    68  	})
    69  
    70  	Describe("ERC-20 transfer", func() {
    71  
    72  		It("Disallow to transfer token to same account", func() {
    73  			expectcc.ResponseError(
    74  				erc20fs.From(TokenOwner).Invoke(
    75  					`transfer`, TokenOwner.MspID, TokenOwner.GetID(), 100),
    76  				erc20.ErrForbiddenToTransferToSameAccount)
    77  		})
    78  
    79  		It("Disallow token holder with zero balance to transfer tokens", func() {
    80  			expectcc.ResponseError(
    81  				erc20fs.From(AccountHolder1).Invoke(
    82  					`transfer`, TokenOwner.MspID, TokenOwner.GetID(), 100),
    83  				erc20.ErrNotEnoughFunds)
    84  		})
    85  
    86  		It("Allow token holder with non zero balance to transfer tokens", func() {
    87  			expectcc.PayloadInt(
    88  				erc20fs.From(TokenOwner).Invoke(
    89  					`transfer`, AccountHolder1.MspID, AccountHolder1.GetID(), 100),
    90  				TotalSupply-100)
    91  
    92  			expectcc.PayloadInt(
    93  				erc20fs.Query(
    94  					`balanceOf`, TokenOwner.MspID, TokenOwner.GetID()), TotalSupply-100)
    95  
    96  			expectcc.PayloadInt(
    97  				erc20fs.Query(
    98  					`balanceOf`, AccountHolder1.MspID, AccountHolder1.GetID()), 100)
    99  		})
   100  
   101  	})
   102  
   103  	Describe("ERC-20 transfer allowance", func() {
   104  
   105  		It("Allow everyone to check token transfer allowance - zero initially", func() {
   106  			expectcc.PayloadInt(
   107  				erc20fs.Query(
   108  					`allowance`,
   109  					TokenOwner.MspID, TokenOwner.GetID(),
   110  					Spender1.MspID, Spender1.GetID()), 0)
   111  		})
   112  
   113  		It("Allow token owner to set transfer allowance", func() {
   114  			expectcc.ResponseOk(
   115  				erc20fs.From(TokenOwner).Invoke(
   116  					`approve`, Spender1.MspID, Spender1.GetID(), 10))
   117  		})
   118  
   119  		It("Allow everyone to check token transfer allowance", func() {
   120  			expectcc.PayloadInt(
   121  				erc20fs.Query(
   122  					`allowance`,
   123  					TokenOwner.MspID, TokenOwner.GetID(),
   124  					Spender1.MspID, Spender1.GetID()), 10)
   125  		})
   126  
   127  		It("Allow everyone to check token transfer allowance", func() {
   128  			expectcc.PayloadInt(
   129  				erc20fs.Query(
   130  					`allowance`,
   131  					TokenOwner.MspID, TokenOwner.GetID(),
   132  					Spender1.MspID, Spender1.GetID()), 10)
   133  		})
   134  
   135  		It("Disallow nonspender to initiate payment from owner waller", func() {
   136  			expectcc.ResponseError(
   137  				erc20fs.From(AccountHolder1).Invoke(
   138  					`transferFrom`,
   139  					TokenOwner.MspID, TokenOwner.GetID(),
   140  					AccountHolder1.MspID, AccountHolder1.GetID(), 10), erc20.ErrSpenderNotHaveAllowance)
   141  		})
   142  
   143  		It("Disallow spender to initiate payment more than allowance from wallet owner", func() {
   144  			expectcc.ResponseError(
   145  				erc20fs.From(AccountHolder1).Invoke(
   146  					`transferFrom`,
   147  					TokenOwner.MspID, TokenOwner.GetID(),
   148  					AccountHolder1.MspID, AccountHolder1.GetID(), 11), erc20.ErrSpenderNotHaveAllowance)
   149  		})
   150  
   151  		It("Allow spender to initiate payment from owner waller", func() {
   152  			expectcc.PayloadInt(
   153  				erc20fs.From(Spender1).Invoke(
   154  					`transferFrom`,
   155  					TokenOwner.MspID, TokenOwner.GetID(),
   156  					AccountHolder1.MspID, AccountHolder1.GetID(), 9), TotalSupply-100-9)
   157  
   158  			expectcc.PayloadInt(
   159  				erc20fs.Query(
   160  					`balanceOf`, AccountHolder1.MspID, AccountHolder1.GetID()), 100+9)
   161  
   162  			expectcc.PayloadInt(
   163  				erc20fs.Query(
   164  					`balanceOf`, TokenOwner.MspID, TokenOwner.GetID()), TotalSupply-100-9)
   165  
   166  			expectcc.PayloadInt(
   167  				erc20fs.Query(
   168  					`allowance`,
   169  					TokenOwner.MspID, TokenOwner.GetID(),
   170  					Spender1.MspID, Spender1.GetID()), 1)
   171  
   172  		})
   173  	})
   174  })