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 })