diff --git a/examples/basecoin/app/app_test.go b/examples/basecoin/app/app_test.go index 9bcd1e7748..b3677301f1 100644 --- a/examples/basecoin/app/app_test.go +++ b/examples/basecoin/app/app_test.go @@ -2,6 +2,7 @@ package app import ( "encoding/json" + "fmt" "os" "testing" @@ -28,7 +29,7 @@ func newBasecoinApp() *BasecoinApp { func TestSendMsg(t *testing.T) { bapp := newBasecoinApp() - // Construct a SendMsg. + // Construct a SendMsg var msg = bank.SendMsg{ Inputs: []bank.Input{ { @@ -65,7 +66,7 @@ func TestSendMsg(t *testing.T) { func TestGenesis(t *testing.T) { bapp := newBasecoinApp() - // construct some genesis bytes to reflect basecoin/types/AppAccount + // Construct some genesis bytes to reflect basecoin/types/AppAccount pk := crypto.GenPrivKeyEd25519().PubKey() addr := pk.Address() coins, err := sdk.ParseCoins("77foocoin,99barcoin") @@ -86,9 +87,93 @@ func TestGenesis(t *testing.T) { vals := []abci.Validator{} bapp.InitChain(abci.RequestInitChain{vals, stateBytes}) - // a checkTx context + // A checkTx context ctx := bapp.BaseApp.NewContext(true, abci.Header{}) res1 := bapp.accountMapper.GetAccount(ctx, baseAcc.Address) assert.Equal(t, acc, res1) } + +func TestSendMsgWithAccounts(t *testing.T) { + bapp := newBasecoinApp() + + // Construct some genesis bytes to reflect basecoin/types/AppAccount + // First key goes in genesis, used for sending + priv1 := crypto.GenPrivKeyEd25519() + pk1 := priv1.PubKey() + addr1 := pk1.Address() + + // Second key receies + pk2 := crypto.GenPrivKeyEd25519().PubKey() + addr2 := pk2.Address() + + // Give 77 foocoin to the first key + coins, err := sdk.ParseCoins("77foocoin") + require.Nil(t, err) + baseAcc := auth.BaseAccount{ + Address: addr1, + Coins: coins, + } + acc1 := &types.AppAccount{baseAcc, "foobart"} + + // Construct genesis state + genesisState := types.GenesisState{ + Accounts: []*types.GenesisAccount{ + types.NewGenesisAccount(acc1), + }, + } + stateBytes, err := json.MarshalIndent(genesisState, "", "\t") + + // Initialize the chain + vals := []abci.Validator{} + bapp.InitChain(abci.RequestInitChain{vals, stateBytes}) + + // A checkTx context (true) + ctxCheck := bapp.BaseApp.NewContext(true, abci.Header{}) + + res1 := bapp.accountMapper.GetAccount(ctxCheck, addr1) + assert.Equal(t, acc1, res1) + + // Construct a SendMsg + var msg = bank.SendMsg{ + Inputs: []bank.Input{ + { + Address: crypto.Address(addr1), + Coins: sdk.Coins{{"foocoin", 10}}, + Sequence: 1, + }, + }, + Outputs: []bank.Output{ + { + Address: crypto.Address(addr2), + Coins: sdk.Coins{{"foocoin", 10}}, + }, + }, + } + + // Sign the tx + sig := priv1.Sign(msg.GetSignBytes()) + tx := sdk.NewStdTx(msg, []sdk.StdSignature{{ + PubKey: priv1.PubKey(), + Signature: sig, + }}) + + // Run a Check + res := bapp.Check(tx) + assert.Equal(t, sdk.CodeOK, res.Code, res.Log) + + // Simulate a Block + bapp.BeginBlock(abci.RequestBeginBlock{}) + res = bapp.Deliver(tx) + assert.Equal(t, sdk.CodeOK, res.Code, res.Log) + + // A deliverTx context + ctxDeliver := bapp.BaseApp.NewContext(false, abci.Header{}) + + // Check balances + res2 := bapp.accountMapper.GetAccount(ctxDeliver, addr1) + res3 := bapp.accountMapper.GetAccount(ctxDeliver, addr2) + + assert.Equal(t, fmt.Sprintf("%v", res2.GetCoins()), "67foocoin") + assert.Equal(t, fmt.Sprintf("%v", res3.GetCoins()), "10foocoin") +}