cosmos-sdk/x/accounts/genesis_test.go
2024-12-09 14:50:11 +00:00

130 lines
4.2 KiB
Go

package accounts
import (
"testing"
"github.com/cosmos/gogoproto/types"
"github.com/stretchr/testify/require"
"cosmossdk.io/x/accounts/internal/implementation"
v1 "cosmossdk.io/x/accounts/v1"
)
func TestGenesis(t *testing.T) {
const testAccountType = "test"
k, ctx := newKeeper(t, func(deps implementation.Dependencies) (string, implementation.Account, error) {
acc, err := NewTestAccount(deps)
return testAccountType, acc, err
})
// we init two accounts of the same type
// we set counter to 10
_, addr1, err := k.Init(ctx, testAccountType, []byte("sender"), &types.Empty{}, nil, nil)
require.NoError(t, err)
_, err = k.Execute(ctx, addr1, []byte("sender"), &types.UInt64Value{Value: 10}, nil)
require.NoError(t, err)
// we set counter to 20
_, addr2, err := k.Init(ctx, testAccountType, []byte("sender"), &types.Empty{}, nil, nil)
require.NoError(t, err)
_, err = k.Execute(ctx, addr2, []byte("sender"), &types.UInt64Value{Value: 20}, nil)
require.NoError(t, err)
// export state
state, err := k.ExportState(ctx)
require.NoError(t, err)
// reset state
k, ctx = newKeeper(t, func(deps implementation.Dependencies) (string, implementation.Account, error) {
acc, err := NewTestAccount(deps)
return testAccountType, acc, err
})
// add to state a genesis account init msg.
initMsg, err := implementation.PackAny(&types.Empty{})
require.NoError(t, err)
state.InitAccountMsgs = append(state.InitAccountMsgs, &v1.MsgInit{
Sender: "sender-2",
AccountType: testAccountType,
Message: initMsg,
Funds: nil,
})
err = k.ImportState(ctx, state)
require.NoError(t, err)
// if genesis import went fine, we should be able to query the accounts
// and get the expected values.
resp, err := k.Query(ctx, addr1, &types.DoubleValue{})
require.NoError(t, err)
require.Equal(t, &types.UInt64Value{Value: 10}, resp)
resp, err = k.Query(ctx, addr2, &types.DoubleValue{})
require.NoError(t, err)
require.Equal(t, &types.UInt64Value{Value: 20}, resp)
// check initted on genesis account
addr3, err := k.makeAddress([]byte("sender-2"), 2, nil)
require.NoError(t, err)
resp, err = k.Query(ctx, addr3, &types.DoubleValue{})
require.NoError(t, err)
require.Equal(t, &types.UInt64Value{Value: 0}, resp)
// reset state
k, ctx = newKeeper(t, func(deps implementation.Dependencies) (string, implementation.Account, error) {
acc, err := NewTestAccount(deps)
return testAccountType, acc, err
})
// modify the accounts account number
state.Accounts[0].AccountNumber = 99
err = k.ImportState(ctx, state)
require.NoError(t, err)
currentAccNum, err := k.AccountNumber.Peek(ctx)
require.NoError(t, err)
// AccountNumber should be set to the highest account number in the genesis state + 2
// (one is the sequence offset, the other is the genesis account being added through init msg)
require.Equal(t, state.Accounts[0].AccountNumber+2, currentAccNum)
// Test when init with empty accounts list, account number is not modified
// make genesis state accounts empty
state.Accounts = []*v1.GenesisAccount{}
// set another value for account number
err = k.AccountNumber.Set(ctx, uint64(10))
require.NoError(t, err)
err = k.ImportState(ctx, state)
require.NoError(t, err)
currentAccNum, err = k.AccountNumber.Peek(ctx)
require.NoError(t, err)
// AccountNumber should be 10 + 1
// (one is the genesis account being added through init msg)
require.Equal(t, uint64(11), currentAccNum)
}
func TestImportAccountError(t *testing.T) {
// Initialize the keeper and context for testing
k, ctx := newKeeper(t, func(deps implementation.Dependencies) (string, implementation.Account, error) {
acc, err := NewTestAccount(deps)
return "test", acc, err
})
// Define a mock GenesisAccount with a non-existent account type
acc := &v1.GenesisAccount{
Address: "test-address",
AccountType: "non-existent-type",
AccountNumber: 1,
State: nil,
}
// Attempt to import the mock GenesisAccount into the state
err := k.importAccount(ctx, acc)
// Assert that an error is returned
require.Error(t, err)
// Assert that the error message contains the expected substring
require.Contains(t, err.Error(), "account type non-existent-type not found in the registered accounts")
}