-
Notifications
You must be signed in to change notification settings - Fork 3.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
test: migrate e2e/distribution to system tests #21908
Changes from 25 commits
31aa851
de098de
5a85f11
977f45b
aadce22
2a17147
926b01c
43d34a7
9f83e3f
3e9e8ca
ce7655c
5fb43c9
e0b3ecf
4e48f8b
3edaedd
621723c
2ce8237
ffdfd2a
2d99740
228ed90
3c99fde
81ab8b9
2fca8c4
32ae1f2
12def9e
4a056ba
d748c46
95cc7c4
1cf1862
9c261aa
ccf100f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,349 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
package systemtests | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
import ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"fmt" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"net/http" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"os" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"path/filepath" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"regexp" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"strings" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"testing" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/stretchr/testify/assert" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/stretchr/testify/require" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/tidwall/gjson" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/tidwall/sjson" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
func TestWithdrawAllRewardsCmd(t *testing.T) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
// scenario: test distribution withdraw all rewards command | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
// given a running chain | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
sut.ResetChain(t) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
cli := NewCLIWrapper(t, sut, verbose) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
newAddr := cli.AddKey("newAddr") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
require.NotEmpty(t, newAddr) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
testDenom := "stake" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
var initialAmount int64 = 10000000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Define 'initialAmount' as a constant Since Apply this diff: -var initialAmount int64 = 10000000
+const initialAmount int64 = 10_000_000 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
initialBalance := fmt.Sprintf("%d%s", initialAmount, testDenom) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
sut.ModifyGenesisCLI(t, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
[]string{"genesis", "add-genesis-account", newAddr, initialBalance}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
sut.StartChain(t) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// query balance | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
newAddrBal := cli.QueryBalance(newAddr, testDenom) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
require.Equal(t, initialAmount, newAddrBal) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// query validator operator address | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
rsp := cli.CustomQuery("q", "staking", "validators") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
validators := gjson.Get(rsp, "validators.#.operator_address").Array() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
require.GreaterOrEqual(t, len(validators), 2) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
val1Addr := validators[0].String() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
val2Addr := validators[1].String() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
var delegationAmount int64 = 100000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Define 'delegationAmount' as a constant The Apply this diff: -var delegationAmount int64 = 100000
+const delegationAmount int64 = 100_000 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
delegation := fmt.Sprintf("%d%s", delegationAmount, testDenom) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// delegate tokens to validator1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
rsp = cli.RunAndWait("tx", "staking", "delegate", val1Addr, delegation, "--from="+newAddr, "--fees=1"+testDenom) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
RequireTxSuccess(t, rsp) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// delegate tokens to validator2 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
rsp = cli.RunAndWait("tx", "staking", "delegate", val2Addr, delegation, "--from="+newAddr, "--fees=1"+testDenom) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
RequireTxSuccess(t, rsp) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// check updated balance: newAddrBal - delegatedBal - fees | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
expBal := newAddrBal - (delegationAmount * 2) - 2 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
newAddrBal = cli.QueryBalance(newAddr, testDenom) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
require.Equal(t, expBal, newAddrBal) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
withdrawCmdArgs := []string{"tx", "distribution", "withdraw-all-rewards", "--from=" + newAddr, "--fees=1" + testDenom} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// test with --max-msgs | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
testCases := []struct { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
name string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
maxMsgs int | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
expTxLen int | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
}{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"--max-msgs value is 1", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
1, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
2, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"--max-msgs value is 2", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
2, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
1, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
for _, tc := range testCases { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
t.Run(tc.name, func(t *testing.T) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
assertGenOnlyOutput := func(_ assert.TestingT, gotErr error, gotOutputs ...interface{}) bool { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
require.Len(t, gotOutputs, 1) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
// gets output combining two objects without any space or new line | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
splitOutput := strings.Split(gotOutputs[0].(string), "}{") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
require.Len(t, splitOutput, tc.expTxLen) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
return false | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
cmd := append(withdrawCmdArgs, fmt.Sprintf("--max-msgs=%d", tc.maxMsgs), "--generate-only") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
_ = cli.WithRunErrorMatcher(assertGenOnlyOutput).Run(cmd...) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+88
to
+100
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Simplify the test case loop by extracting common logic In the loop over test cases, the construction of You can extract the assertion function and command construction outside the loop: for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
+ cmd := append(withdrawCmdArgs, fmt.Sprintf("--max-msgs=%d", tc.maxMsgs), "--generate-only")
assertGenOnlyOutput := func(_ assert.TestingT, gotErr error, gotOutputs ...interface{}) bool {
require.Len(t, gotOutputs, 1)
// gets output combining two objects without any space or new line
splitOutput := strings.Split(gotOutputs[0].(string), "}{")
require.Len(t, splitOutput, tc.expTxLen)
return false
}
- cmd := append(withdrawCmdArgs, fmt.Sprintf("--max-msgs=%d", tc.maxMsgs), "--generate-only")
_ = cli.WithRunErrorMatcher(assertGenOnlyOutput).Run(cmd...)
})
} 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// test withdraw-all-rewards transaction | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
rsp = cli.RunAndWait(withdrawCmdArgs...) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
RequireTxSuccess(t, rsp) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
func TestDistrValidatorGRPCQueries(t *testing.T) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
// scenario: test distribution validator gsrpc gateway queries | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
akhilkumarpilli marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// given a running chain | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
sut.ResetChain(t) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
cli := NewCLIWrapper(t, sut, verbose) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
// get validator address | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
valAddr := cli.GetKeyAddr("node0") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
require.NotEmpty(t, valAddr) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
valOperAddr := cli.GetKeyAddrPrefix("node0", "val") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
require.NotEmpty(t, valOperAddr) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
denom := "stake" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
sut.StartChain(t) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
sut.AwaitNBlocks(t, 3) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
baseurl := sut.APIAddress() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
expectedAmountOutput := fmt.Sprintf(`{"denom":"%s","amount":"203.105000000000000000"}`, denom) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Avoid hardcoding amounts in expected outputs The Calculate the expected amount based on initial conditions: -expectedAmountOutput := fmt.Sprintf(`{"denom":"%s","amount":"203.105000000000000000"}`, denom)
+commissionAmount := calculateExpectedCommissionAmount()
+expectedAmountOutput := fmt.Sprintf(`{"denom":"%s","amount":"%s"}`, denom, commissionAmount) Where
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// test params grpc endpoint | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
paramsURL := baseurl + "/cosmos/distribution/v1beta1/params" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
paramsTestCases := []RestTestCase{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"gRPC request params", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
paramsURL, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
http.StatusOK, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
`{"params":{"community_tax":"0.020000000000000000","base_proposer_reward":"0.000000000000000000","bonus_proposer_reward":"0.000000000000000000","withdraw_addr_enabled":true}}`, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
RunRestQueries(t, paramsTestCases) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// test validator distribution info grpc endpoint | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
validatorsURL := baseurl + `/cosmos/distribution/v1beta1/validators/%s` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
decodingFailedOutput := `{"code":2, "message":"decoding bech32 failed: invalid separator index -1", "details":[]}` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
validatorsOutput := fmt.Sprintf(`{"operator_address":"%s","self_bond_rewards":[],"commission":[%s]}`, valAddr, expectedAmountOutput) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
validatorsTestCases := []RestTestCase{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"invalid validator gRPC request with wrong validator address", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
fmt.Sprintf(validatorsURL, "wrongaddress"), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
http.StatusInternalServerError, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
decodingFailedOutput, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"gRPC request validator with valid validator address", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
fmt.Sprintf(validatorsURL, valOperAddr), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
http.StatusOK, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
validatorsOutput, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
TestRestQueryIgnoreNumbers(t, validatorsTestCases) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// test outstanding rewards grpc endpoint | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
outstandingRewardsURL := baseurl + `/cosmos/distribution/v1beta1/validators/%s/outstanding_rewards` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
rewardsTestCases := []RestTestCase{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"invalid outstanding rewards gRPC request with wrong validator address", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
fmt.Sprintf(outstandingRewardsURL, "wrongaddress"), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
http.StatusInternalServerError, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
decodingFailedOutput, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"gRPC request outstanding rewards with valid validator address", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
fmt.Sprintf(outstandingRewardsURL, valOperAddr), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
http.StatusOK, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
fmt.Sprintf(`{"rewards":{"rewards":[%s]}}`, expectedAmountOutput), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
TestRestQueryIgnoreNumbers(t, rewardsTestCases) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// test validator commission grpc endpoint | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
commissionURL := baseurl + `/cosmos/distribution/v1beta1/validators/%s/commission` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
commissionTestCases := []RestTestCase{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"invalid commission gRPC request with wrong validator address", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
fmt.Sprintf(commissionURL, "wrongaddress"), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
http.StatusInternalServerError, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
decodingFailedOutput, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"gRPC request commission with valid validator address", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
fmt.Sprintf(commissionURL, valOperAddr), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
http.StatusOK, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
fmt.Sprintf(`{"commission":{"commission":[%s]}}`, expectedAmountOutput), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
TestRestQueryIgnoreNumbers(t, commissionTestCases) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// test validator slashes grpc endpoint | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
slashURL := baseurl + `/cosmos/distribution/v1beta1/validators/%s/slashes` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
invalidHeightOutput := `{"code":3, "message":"strconv.ParseUint: parsing \"-3\": invalid syntax", "details":[]}` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
slashTestCases := []RestTestCase{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"invalid slashes gRPC request with wrong validator address", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ditto |
||||||||||||||||||||||||||||||||||||||||||||||||||||||
fmt.Sprintf(slashURL, "wrongaddress"), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
http.StatusBadRequest, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
`{"code":3, "message":"invalid validator address", "details":[]}`, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"invalid start height", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
fmt.Sprintf(slashURL+`?starting_height=%s&ending_height=%s`, valOperAddr, "-3", "3"), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
http.StatusBadRequest, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
invalidHeightOutput, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"invalid end height", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
fmt.Sprintf(slashURL+`?starting_height=%s&ending_height=%s`, valOperAddr, "1", "-3"), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
http.StatusBadRequest, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
invalidHeightOutput, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"valid request get slashes", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
fmt.Sprintf(slashURL+`?starting_height=%s&ending_height=%s`, valOperAddr, "1", "3"), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
http.StatusOK, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
`{"slashes":[],"pagination":{"next_key":null,"total":"0"}}`, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
RunRestQueries(t, slashTestCases) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
func TestDistrDelegatorGRPCQueries(t *testing.T) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
// scenario: test distribution validator gsrpc gateway queries | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
// given a running chain | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
sut.ResetChain(t) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
cli := NewCLIWrapper(t, sut, verbose) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
denom := "stake" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// get validator address | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
valAddr := cli.GetKeyAddr("node0") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
require.NotEmpty(t, valAddr) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
valOperAddr := cli.GetKeyAddrPrefix("node0", "val") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
require.NotEmpty(t, valOperAddr) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// update commission rate of node0 validator | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
// generate new gentx and copy it to genesis.json before starting network | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
rsp := cli.RunCommandWithArgs("genesis", "gentx", "node0", "100000000"+denom, "--chain-id="+cli.chainID, "--commission-rate=0.01", "--home", sut.nodePath(0), "--keyring-backend=test") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
// extract gentx path from above command output | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
re := regexp.MustCompile(`"(.*?\.json)"`) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
match := re.FindStringSubmatch(rsp) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
require.GreaterOrEqual(t, len(match), 1) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
updatedGentx := filepath.Join(WorkDir, match[1]) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
updatedGentxBz, err := os.ReadFile(updatedGentx) // #nosec G304 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
require.NoError(t, err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
sut.ModifyGenesisJSON(t, func(genesis []byte) []byte { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
state, err := sjson.SetRawBytes(genesis, "app_state.genutil.gen_txs.0", updatedGentxBz) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
require.NoError(t, err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
return state | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+222
to
+235
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Handle errors from 'regexp.MustCompile' and improve error checking Using Apply this diff: -re := regexp.MustCompile(`"(.*?\.json)"`)
+re, err := regexp.Compile(`"(.*?\.json)"`)
+require.NoError(t, err)
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// create new address which will be used as delegator address | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
delAddr := cli.AddKey("delAddr") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
require.NotEmpty(t, delAddr) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
var initialAmount int64 = 1000000000 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
initialBalance := fmt.Sprintf("%d%s", initialAmount, denom) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
sut.ModifyGenesisCLI(t, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
[]string{"genesis", "add-genesis-account", delAddr, initialBalance}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
sut.StartChain(t) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// delegate some tokens to valOperAddr | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
rsp = cli.RunAndWait("tx", "staking", "delegate", valOperAddr, "100000000"+denom, "--from="+delAddr) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
RequireTxSuccess(t, rsp) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
sut.AwaitNBlocks(t, 5) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
baseurl := sut.APIAddress() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
decodingFailedOutput := `{"code":2, "message":"decoding bech32 failed: invalid separator index -1", "details":[]}` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Reuse 'decodingFailedOutput' variable The Move +const decodingFailedOutput = `{"code":2, "message":"decoding bech32 failed: invalid separator index -1", "details":[]}`
func TestDistrValidatorGRPCQueries(t *testing.T) {
// ...
- decodingFailedOutput := `{"code":2, "message":"decoding bech32 failed: invalid separator index -1", "details":[]}`
// ...
}
func TestDistrDelegatorGRPCQueries(t *testing.T) {
// ...
- decodingFailedOutput := `{"code":2, "message":"decoding bech32 failed: invalid separator index -1", "details":[]}`
// ...
}
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// test delegator rewards grpc endpoint | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
delegatorRewardsURL := baseurl + `/cosmos/distribution/v1beta1/delegators/%s/rewards` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
expectedAmountOutput := `{"denom":"stake","amount":"0.121275000000000000"}` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
rewardsOutput := fmt.Sprintf(`{"rewards":[{"validator_address":"%s","reward":[%s]}],"total":[%s]}`, valOperAddr, expectedAmountOutput, expectedAmountOutput) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
delegatorRewardsTestCases := []RestTestCase{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ditto |
||||||||||||||||||||||||||||||||||||||||||||||||||||||
"wrong delegator address", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
fmt.Sprintf(delegatorRewardsURL, "wrongdeladdress"), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
http.StatusInternalServerError, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
decodingFailedOutput, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"valid rewards request with valid delegator address", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
fmt.Sprintf(delegatorRewardsURL, delAddr), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
http.StatusOK, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
rewardsOutput, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"wrong validator address (specific validator rewards)", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
fmt.Sprintf(delegatorRewardsURL+`/%s`, delAddr, "wrongvaladdress"), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ditto |
||||||||||||||||||||||||||||||||||||||||||||||||||||||
http.StatusInternalServerError, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
decodingFailedOutput, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"valid request(specific validator rewards)", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
fmt.Sprintf(delegatorRewardsURL+`/%s`, delAddr, valOperAddr), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
http.StatusOK, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
fmt.Sprintf(`{"rewards":[%s]}`, expectedAmountOutput), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
TestRestQueryIgnoreNumbers(t, delegatorRewardsTestCases) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// test delegator validators grpc endpoint | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
delegatorValsURL := baseurl + `/cosmos/distribution/v1beta1/delegators/%s/validators` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
valsTestCases := []RestTestCase{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"invalid delegator validators gRPC request with wrong delegator address", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ditto |
||||||||||||||||||||||||||||||||||||||||||||||||||||||
fmt.Sprintf(delegatorValsURL, "wrongaddress"), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
http.StatusInternalServerError, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
decodingFailedOutput, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"gRPC request delegator validators with valid delegator address", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
fmt.Sprintf(delegatorValsURL, delAddr), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
http.StatusOK, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
fmt.Sprintf(`{"validators":["%s"]}`, valOperAddr), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
RunRestQueries(t, valsTestCases) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// test withdraw address grpc endpoint | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
withdrawAddrURL := baseurl + `/cosmos/distribution/v1beta1/delegators/%s/withdraw_address` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
withdrawAddrTestCases := []RestTestCase{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. i think we can remove those cases, this is catched by unit tests |
||||||||||||||||||||||||||||||||||||||||||||||||||||||
"invalid withdraw address gRPC request with wrong delegator address", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
fmt.Sprintf(withdrawAddrURL, "wrongaddress"), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
http.StatusInternalServerError, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
decodingFailedOutput, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"gRPC request withdraw address with valid delegator address", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
fmt.Sprintf(withdrawAddrURL, delAddr), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
http.StatusOK, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
fmt.Sprintf(`{"withdraw_address":"%s"}`, delAddr), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
RunRestQueries(t, withdrawAddrTestCases) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Define 'testDenom' as a constant
The variable
testDenom
is a constant value throughout the tests. Defining it as a constant improves code readability and conveys that its value does not change.Apply this diff:
📝 Committable suggestion