github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/wasm/genesis_test.go (about)

     1  package wasm
     2  
     3  import (
     4  	"encoding/json"
     5  	"testing"
     6  
     7  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     8  	"github.com/fibonacci-chain/fbc/libs/tendermint/types"
     9  	"github.com/stretchr/testify/require"
    10  )
    11  
    12  func TestInitGenesis(t *testing.T) {
    13  	types.UnittestOnlySetMilestoneEarthHeight(1)
    14  	data := setupTest(t)
    15  
    16  	deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000))
    17  	topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 5000))
    18  	creator := data.faucet.NewFundedAccount(data.ctx, deposit.Add(deposit...)...)
    19  	fred := data.faucet.NewFundedAccount(data.ctx, topUp...)
    20  
    21  	_ = data.module.Route()
    22  	h := data.module.NewHandler()
    23  	q := data.module.NewQuerierHandler()
    24  
    25  	msg := MsgStoreCode{
    26  		Sender:       creator.String(),
    27  		WASMByteCode: testContract,
    28  	}
    29  	err := msg.ValidateBasic()
    30  	require.NoError(t, err)
    31  
    32  	res, err := h(data.ctx, &msg)
    33  	require.NoError(t, err)
    34  	assertStoreCodeResponse(t, res.Data, 1)
    35  
    36  	_, _, bob := keyPubAddr()
    37  	initMsg := initMsg{
    38  		Verifier:    fred,
    39  		Beneficiary: bob,
    40  	}
    41  	initMsgBz, err := json.Marshal(initMsg)
    42  	require.NoError(t, err)
    43  
    44  	initCmd := MsgInstantiateContract{
    45  		Sender: creator.String(),
    46  		CodeID: firstCodeID,
    47  		Msg:    initMsgBz,
    48  		Funds:  sdk.CoinsToCoinAdapters(deposit),
    49  	}
    50  	res, err = h(data.ctx, &initCmd)
    51  	require.NoError(t, err)
    52  	contractBech32Addr := parseInitResponse(t, res.Data)
    53  
    54  	execCmd := MsgExecuteContract{
    55  		Sender:   fred.String(),
    56  		Contract: contractBech32Addr,
    57  		Msg:      []byte(`{"release":{}}`),
    58  		Funds:    sdk.CoinsToCoinAdapters(topUp),
    59  	}
    60  	res, err = h(data.ctx, &execCmd)
    61  	require.NoError(t, err)
    62  	// from https://github.com/CosmWasm/cosmwasm/blob/master/contracts/hackatom/src/contract.rs#L167
    63  	assertExecuteResponse(t, res.Data, []byte{0xf0, 0x0b, 0xaa})
    64  
    65  	// ensure all contract state is as after init
    66  	assertCodeList(t, q, data.ctx, 1)
    67  	assertCodeBytes(t, q, data.ctx, 1, testContract)
    68  
    69  	assertContractList(t, q, data.ctx, 1, []string{contractBech32Addr})
    70  	assertContractInfo(t, q, data.ctx, contractBech32Addr, 1, creator)
    71  	assertContractState(t, q, data.ctx, contractBech32Addr, state{
    72  		Verifier:    fred.String(),
    73  		Beneficiary: bob.String(),
    74  		Funder:      creator.String(),
    75  	})
    76  
    77  	// export into genstate
    78  	genState := ExportGenesis(data.ctx, &data.keeper)
    79  
    80  	// create new app to import genstate into
    81  	newData := setupTest(t)
    82  	q2 := newData.module.NewQuerierHandler()
    83  
    84  	// initialize new app with genstate
    85  	InitGenesis(newData.ctx, &newData.keeper, *genState, newData.module.NewHandler())
    86  
    87  	// run same checks again on newdata, to make sure it was reinitialized correctly
    88  	assertCodeList(t, q2, newData.ctx, 1)
    89  	assertCodeBytes(t, q2, newData.ctx, 1, testContract)
    90  
    91  	assertContractList(t, q2, newData.ctx, 1, []string{contractBech32Addr})
    92  	assertContractInfo(t, q2, newData.ctx, contractBech32Addr, 1, creator)
    93  	assertContractState(t, q2, newData.ctx, contractBech32Addr, state{
    94  		Verifier:    fred.String(),
    95  		Beneficiary: bob.String(),
    96  		Funder:      creator.String(),
    97  	})
    98  }