package baseapp import ( "fmt" "testing" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" ) // Test that we can only query from the latest committed state. func TestQuery(t *testing.T) { key, value := []byte("hello"), []byte("goodbye") anteOpt := func(bapp *BaseApp) { bapp.SetAnteHandler(func(ctx sdk.Context, tx sdk.Tx, simulate bool) (newCtx sdk.Context, res sdk.Result, abort bool) { store := ctx.KVStore(capKey1) store.Set(key, value) return }) } routerOpt := func(bapp *BaseApp) { bapp.Router().AddRoute(routeMsgCounter, func(ctx sdk.Context, msg sdk.Msg) sdk.Result { store := ctx.KVStore(capKey1) store.Set(key, value) return sdk.Result{} }) } app := setupBaseApp(t, anteOpt, routerOpt) app.InitChain(abci.RequestInitChain{}) // NOTE: "/store/key1" tells us KVStore // and the final "/key" says to use the data as the // key in the given KVStore ... query := abci.RequestQuery{ Path: "/store/key1/key", Data: key, } tx := newTxCounter(0, 0) // query is empty before we do anything res := app.Query(query) require.Equal(t, 0, len(res.Value)) // query is still empty after a CheckTx resTx := app.Check(tx) require.True(t, resTx.IsOK(), fmt.Sprintf("%v", resTx)) res = app.Query(query) require.Equal(t, 0, len(res.Value)) // query is still empty after a DeliverTx before we commit app.BeginBlock(abci.RequestBeginBlock{}) resTx = app.Deliver(tx) require.True(t, resTx.IsOK(), fmt.Sprintf("%v", resTx)) res = app.Query(query) require.Equal(t, 0, len(res.Value)) // query returns correct value after Commit app.Commit() res = app.Query(query) require.Equal(t, value, res.Value) } // Test p2p filter queries func TestP2PQuery(t *testing.T) { addrPeerFilterOpt := func(bapp *BaseApp) { bapp.SetAddrPeerFilter(func(addrport string) abci.ResponseQuery { require.Equal(t, "1.1.1.1:8000", addrport) return abci.ResponseQuery{Code: uint32(3)} }) } pubkeyPeerFilterOpt := func(bapp *BaseApp) { bapp.SetPubKeyPeerFilter(func(pubkey string) abci.ResponseQuery { require.Equal(t, "testpubkey", pubkey) return abci.ResponseQuery{Code: uint32(4)} }) } app := setupBaseApp(t, addrPeerFilterOpt, pubkeyPeerFilterOpt) addrQuery := abci.RequestQuery{ Path: "/p2p/filter/addr/1.1.1.1:8000", } res := app.Query(addrQuery) require.Equal(t, uint32(3), res.Code) pubkeyQuery := abci.RequestQuery{ Path: "/p2p/filter/pubkey/testpubkey", } res = app.Query(pubkeyQuery) require.Equal(t, uint32(4), res.Code) }