github.com/lino-network/lino@v0.6.11/x/account/model/storage_test.go (about)

     1  package model
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  
     7  	wire "github.com/cosmos/cosmos-sdk/codec"
     8  	sdk "github.com/cosmos/cosmos-sdk/types"
     9  	"github.com/stretchr/testify/suite"
    10  	"github.com/tendermint/tendermint/crypto"
    11  
    12  	"github.com/lino-network/lino/testsuites"
    13  	"github.com/lino-network/lino/testutils"
    14  	linotypes "github.com/lino-network/lino/types"
    15  	"github.com/lino-network/lino/x/account/types"
    16  )
    17  
    18  var (
    19  	storeKeyStr = "testAccountStore"
    20  	kvStoreKey  = sdk.NewKVStoreKey(storeKeyStr)
    21  )
    22  
    23  type AccountStoreDumper struct{}
    24  
    25  func (dumper AccountStoreDumper) NewDumper() *testutils.Dumper {
    26  	return NewAccountDumper(NewAccountStorage(kvStoreKey))
    27  }
    28  
    29  type accountStoreTestSuite struct {
    30  	testsuites.GoldenTestSuite
    31  	store AccountStorage
    32  }
    33  
    34  func NewAccountStoreTestSuite() *accountStoreTestSuite {
    35  	return &accountStoreTestSuite{
    36  		GoldenTestSuite: testsuites.NewGoldenTestSuite(AccountStoreDumper{}, kvStoreKey),
    37  	}
    38  }
    39  
    40  func (suite *accountStoreTestSuite) SetupTest() {
    41  	suite.SetupCtx(0, time.Unix(0, 0), kvStoreKey)
    42  	suite.store = NewAccountStorage(kvStoreKey)
    43  }
    44  
    45  func TestAccountStoreSuite(t *testing.T) {
    46  	suite.Run(t, NewAccountStoreTestSuite())
    47  }
    48  
    49  func (suite *accountStoreTestSuite) TestInfo() {
    50  	user1 := linotypes.AccountKey("user1")
    51  	user2 := linotypes.AccountKey("user2")
    52  
    53  	store := suite.store
    54  	ctx := suite.Ctx
    55  	keys := sampleKeys()
    56  
    57  	info1 := &AccountInfo{
    58  		Username:       user1,
    59  		CreatedAt:      123,
    60  		SigningKey:     keys[9],
    61  		TransactionKey: keys[0],
    62  		Address:        sdk.AccAddress(keys[0].Address()),
    63  	}
    64  	info2 := &AccountInfo{
    65  		Username:       user2,
    66  		CreatedAt:      456,
    67  		SigningKey:     keys[8],
    68  		TransactionKey: keys[1],
    69  		Address:        sdk.AccAddress(keys[1].Address()),
    70  	}
    71  
    72  	suite.False(store.DoesAccountExist(ctx, user1))
    73  	suite.False(store.DoesAccountExist(ctx, user2))
    74  
    75  	_, err := store.GetInfo(ctx, user1)
    76  	suite.Equal(types.ErrAccountNotFound(user1), err)
    77  
    78  	suite.store.SetInfo(ctx, info1)
    79  	suite.store.SetInfo(ctx, info2)
    80  
    81  	r1, err := store.GetInfo(ctx, user1)
    82  	suite.Nil(err)
    83  	suite.Equal(info1, r1)
    84  
    85  	r2, err := store.GetInfo(ctx, user2)
    86  	suite.Nil(err)
    87  	suite.Equal(info2, r2)
    88  
    89  	suite.True(store.DoesAccountExist(ctx, user1))
    90  	suite.True(store.DoesAccountExist(ctx, user2))
    91  
    92  	suite.Golden()
    93  }
    94  
    95  func (suite *accountStoreTestSuite) TestBank() {
    96  	user1 := linotypes.AccountKey("user1")
    97  	user2 := linotypes.AccountKey("user2")
    98  
    99  	store := suite.store
   100  	ctx := suite.Ctx
   101  	keys := sampleKeys()
   102  
   103  	key1 := keys[0]
   104  	addr1 := sdk.AccAddress(key1.Address())
   105  	bank1 := &AccountBank{
   106  		Saving:          linotypes.NewCoinFromInt64(1234),
   107  		FrozenMoneyList: nil,
   108  		PubKey:          key1,
   109  		Sequence:        123,
   110  		Username:        user1,
   111  	}
   112  
   113  	key2 := keys[1]
   114  	addr2 := sdk.AccAddress(key2.Address())
   115  	bank2 := &AccountBank{
   116  		Saving: linotypes.NewCoinFromInt64(2345),
   117  		FrozenMoneyList: []FrozenMoney{
   118  			{
   119  				Amount:   linotypes.NewCoinFromInt64(99),
   120  				StartAt:  123,
   121  				Times:    1,
   122  				Interval: 77,
   123  			},
   124  		},
   125  		PubKey:   key2,
   126  		Sequence: 456,
   127  		Username: user2,
   128  	}
   129  
   130  	_, err := store.GetBank(ctx, addr1)
   131  	suite.Equal(types.ErrAccountBankNotFound(addr1), err)
   132  	_, err = store.GetBank(ctx, addr2)
   133  	suite.Equal(types.ErrAccountBankNotFound(addr2), err)
   134  
   135  	suite.store.SetBank(ctx, addr1, bank1)
   136  	suite.store.SetBank(ctx, addr2, bank2)
   137  
   138  	r1, err := store.GetBank(ctx, addr1)
   139  	suite.Nil(err)
   140  	suite.Equal(bank1, r1)
   141  
   142  	r2, err := store.GetBank(ctx, addr2)
   143  	suite.Nil(err)
   144  	suite.Equal(bank2, r2)
   145  
   146  	suite.Golden()
   147  }
   148  
   149  func (suite *accountStoreTestSuite) TestMeta() {
   150  	user1 := linotypes.AccountKey("user1")
   151  	user2 := linotypes.AccountKey("user2")
   152  
   153  	store := suite.store
   154  	ctx := suite.Ctx
   155  
   156  	meta1 := &AccountMeta{
   157  		JSONMeta: "lol",
   158  	}
   159  	meta2 := &AccountMeta{
   160  		JSONMeta: "dota",
   161  	}
   162  	store.SetMeta(ctx, user1, meta1)
   163  	store.SetMeta(ctx, user2, meta2)
   164  
   165  	r1 := store.GetMeta(ctx, user1)
   166  	suite.Equal(meta1, r1)
   167  
   168  	r2 := store.GetMeta(ctx, user2)
   169  	suite.Equal(meta2, r2)
   170  
   171  	suite.Equal(&AccountMeta{
   172  		JSONMeta: "",
   173  	}, store.GetMeta(ctx, "others"))
   174  
   175  	suite.Golden()
   176  }
   177  
   178  func (suite *accountStoreTestSuite) TestPool() {
   179  	store := suite.store
   180  	ctx := suite.Ctx
   181  
   182  	_, err := store.GetPool(ctx, linotypes.InflationConsumptionPool)
   183  	suite.NotNil(err)
   184  
   185  	pool1 := &Pool{
   186  		Name:    linotypes.InflationValidatorPool,
   187  		Balance: linotypes.NewCoinFromInt64(1234),
   188  	}
   189  	pool2 := &Pool{
   190  		Name:    linotypes.InflationDeveloperPool,
   191  		Balance: linotypes.NewCoinFromInt64(45567),
   192  	}
   193  
   194  	store.SetPool(ctx, pool1)
   195  	store.SetPool(ctx, pool2)
   196  
   197  	r1, err := store.GetPool(ctx, linotypes.InflationValidatorPool)
   198  	suite.Nil(err)
   199  	suite.Equal(pool1, r1)
   200  
   201  	r2, err := store.GetPool(ctx, linotypes.InflationDeveloperPool)
   202  	suite.Nil(err)
   203  	suite.Equal(pool2, r2)
   204  
   205  	suite.Golden()
   206  }
   207  
   208  func (suite *accountStoreTestSuite) TestSupply() {
   209  	store := suite.store
   210  	ctx := suite.Ctx
   211  
   212  	suite.Panics(func() { store.GetSupply(ctx) })
   213  
   214  	supply := &Supply{
   215  		LastYearTotal:     linotypes.NewCoinFromInt64(10000),
   216  		Total:             linotypes.NewCoinFromInt64(512354),
   217  		ChainStartTime:    123,
   218  		LastInflationTime: 3245,
   219  	}
   220  
   221  	store.SetSupply(ctx, supply)
   222  
   223  	suite.Equal(store.GetSupply(ctx), supply)
   224  
   225  	suite.Golden()
   226  }
   227  
   228  // cdc := wire.New()
   229  // wire.RegisterCrypto(cdc)
   230  // keys := make([]crypto.PubKey, 0)
   231  // for i := 0 ; i < 10; i++ {
   232  // keys = append(keys, secp256k1.GenPrivKey().PubKey())
   233  // }
   234  // fmt.Print(string(cdc.MustMarshalJSON(keys)))
   235  func sampleKeys() []crypto.PubKey {
   236  	json := `
   237  [{"type":"tendermint/PubKeySecp256k1","value":"Aot3u5m7vuxUOszkS6IZW5XYVu6ATvZsfSQIjtQo9tML"},{"type":"tendermint/PubKeySecp256k1","value":"AoFqbXKmblwKVggqb8Cqo30gRKs9EfqwhOhuyOKlGCuD"},{"type":"tendermint/PubKeySecp256k1","value":"Aj/1EOLKUKUPhp+mx3fLNoZOEEsY+tjPeTW4nOPbqwwq"},{"type":"tendermint/PubKeySecp256k1","value":"A1SxTVyDiXljmHeimniCQiNZQ3dcDsgppP0gDCMgJtdp"},{"type":"tendermint/PubKeySecp256k1","value":"Ax8b6HzTh9el9/NfE8fI4awCvMZWGQkjl+rYOGWeGJc9"},{"type":"tendermint/PubKeySecp256k1","value":"A4r+RjYEc2V9p43J4CovoktRTXNY9vvcQbx0aOW9bhoq"},{"type":"tendermint/PubKeySecp256k1","value":"AwFSpofxlQGAQv167WveHyeUvTh/3fukkJU7gkEW+iMm"},{"type":"tendermint/PubKeySecp256k1","value":"AjglddkWGGlMZck7uvWMDCtyqpNWSBy9HmnJV9vPnu2k"},{"type":"tendermint/PubKeySecp256k1","value":"A+KW7obJ0BpKqUWmY33svTBxGdTfRhmOym7A5imWWwGm"},{"type":"tendermint/PubKeySecp256k1","value":"A6P8IUdt9DKrYCe3/Tflt7DBdgFokRcCKkixt+UbhjZ8"}]
   238  `
   239  
   240  	keys := make([]crypto.PubKey, 0)
   241  	cdc := wire.New()
   242  	wire.RegisterCrypto(cdc)
   243  	cdc.MustUnmarshalJSON([]byte(json), &keys)
   244  	return keys
   245  }