Skip to content

Commit

Permalink
fix: add missing args field to gnoclient Call (#1616)
Browse files Browse the repository at this point in the history
## Description

This PR fixes the Gnoclient Call function that left out the MsgCall
arguments when parsing, and introduces integration tests to test this.

<details><summary>Contributors' checklist...</summary>

- [x] Added new tests, or not needed, or not feasible
- [x] Provided an example (e.g. screenshot) to aid review or the PR is
self-explanatory
- [x] Updated the official documentation or not needed
- [x] No breaking changes were made, or a `BREAKING CHANGE: xxx` message
was included in the description
- [x] Added references to related issues and PRs
- [x] Provided any useful hints for running manual tests
- [ ] Added new benchmarks to [generated
graphs](https://gnoland.github.io/benchmarks), if any. More info
[here](https://github.com/gnolang/gno/blob/master/.benchmarks/README.md).
</details>
  • Loading branch information
leohhhn authored and thehowl committed Feb 2, 2024
1 parent 0215275 commit 0651b5a
Show file tree
Hide file tree
Showing 3 changed files with 129 additions and 1 deletion.
2 changes: 1 addition & 1 deletion gno.land/pkg/gnoclient/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ func TestClient_CallMultiple(t *testing.T) {
{
PkgPath: "gno.land/r/demo/tamagotchi",
FuncName: "Feed",
Args: []string{},
Args: []string{""},
Send: "",
},
}
Expand Down
1 change: 1 addition & 0 deletions gno.land/pkg/gnoclient/client_txs.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ func (c *Client) Call(cfg BaseTxCfg, msgs ...MsgCall) (*ctypes.ResultBroadcastTx
Caller: c.Signer.Info().GetAddress(),
PkgPath: msg.PkgPath,
Func: msg.FuncName,
Args: msg.Args,
Send: send,
})
}
Expand Down
127 changes: 127 additions & 0 deletions gno.land/pkg/gnoclient/integration_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
package gnoclient

import (
"testing"

"github.com/gnolang/gno/gno.land/pkg/integration"
"github.com/gnolang/gno/gnovm/pkg/gnoenv"
rpcclient "github.com/gnolang/gno/tm2/pkg/bft/rpc/client"
"github.com/gnolang/gno/tm2/pkg/crypto/keys"
"github.com/gnolang/gno/tm2/pkg/log"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

func TestClient_Call_Single_Integration(t *testing.T) {
// Set up in-memory node
config, _ := integration.TestingNodeConfig(t, gnoenv.RootDir())
node, remoteAddr := integration.TestingInMemoryNode(t, log.NewNoopLogger(), config)
defer node.Stop()

// Init Signer & RPCClient
signer := newInMemorySigner(t, "tendermint_test")
rpcClient := rpcclient.NewHTTP(remoteAddr, "/websocket")

// Setup Client
client := Client{
Signer: signer,
RPCClient: rpcClient,
}

// Make Tx config
baseCfg := BaseTxCfg{
GasFee: "10000ugnot",
GasWanted: 8000000,
AccountNumber: 0,
SequenceNumber: 0,
Memo: "",
}

// Make Msg config
msg := MsgCall{
PkgPath: "gno.land/r/demo/deep/very/deep",
FuncName: "Render",
Args: []string{"test argument"},
Send: "",
}

// Execute call
res, err := client.Call(baseCfg, msg)

expected := "(\"hi test argument\" string)"
got := string(res.DeliverTx.Data)

assert.Nil(t, err)
assert.Equal(t, expected, got)
}

func TestClient_Call_Multiple_Integration(t *testing.T) {
// Set up in-memory node
config, _ := integration.TestingNodeConfig(t, gnoenv.RootDir())
node, remoteAddr := integration.TestingInMemoryNode(t, log.NewNoopLogger(), config)
defer node.Stop()

// Init Signer & RPCClient
signer := newInMemorySigner(t, "tendermint_test")
rpcClient := rpcclient.NewHTTP(remoteAddr, "/websocket")

// Setup Client
client := Client{
Signer: signer,
RPCClient: rpcClient,
}

// Make Tx config
baseCfg := BaseTxCfg{
GasFee: "10000ugnot",
GasWanted: 8000000,
AccountNumber: 0,
SequenceNumber: 0,
Memo: "",
}

// Make Msg configs
msg1 := MsgCall{
PkgPath: "gno.land/r/demo/deep/very/deep",
FuncName: "Render",
Args: []string{""},
Send: "",
}

// Same call, different argument
msg2 := MsgCall{
PkgPath: "gno.land/r/demo/deep/very/deep",
FuncName: "Render",
Args: []string{"test argument"},
Send: "",
}

expected := "(\"it works!\" string)(\"hi test argument\" string)"

// Execute call
res, err := client.Call(baseCfg, msg1, msg2)

got := string(res.DeliverTx.Data)
assert.Nil(t, err)
assert.Equal(t, expected, got)
}

// todo add more integration tests.

func newInMemorySigner(t *testing.T, chainid string) *SignerFromKeybase {
t.Helper()

mnemonic := integration.DefaultAccount_Seed
name := integration.DefaultAccount_Name

kb := keys.NewInMemory()
_, err := kb.CreateAccount(name, mnemonic, "", "", uint32(0), uint32(0))
require.NoError(t, err)

return &SignerFromKeybase{
Keybase: kb, // Stores keys in memory or on disk
Account: name, // Account name or bech32 format
Password: "", // Password for encryption
ChainID: chainid, // Chain ID for transaction signing
}
}

0 comments on commit 0651b5a

Please sign in to comment.