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 }