From b704262bddad0135b139e9a49103cb5285745e10 Mon Sep 17 00:00:00 2001 From: Alvaro Denis Date: Fri, 6 Dec 2019 19:36:20 -0500 Subject: [PATCH] add unit tests for LookupWallet ref #139 --- src/coin/mocks/PersistibleSet.go | 127 +++++++++++++++++++++++++ src/coin/skycoin/models/wallet.go | 6 +- src/coin/skycoin/models/wallet_test.go | 48 ++++++++++ src/core/wallet.go | 5 + 4 files changed, 185 insertions(+), 1 deletion(-) create mode 100644 src/coin/mocks/PersistibleSet.go diff --git a/src/coin/mocks/PersistibleSet.go b/src/coin/mocks/PersistibleSet.go new file mode 100644 index 00000000..87125a38 --- /dev/null +++ b/src/coin/mocks/PersistibleSet.go @@ -0,0 +1,127 @@ +// Code generated by mockery v1.0.0. DO NOT EDIT. + +package mocks + +import core "github.com/fibercrypto/fibercryptowallet/src/core" +import mock "github.com/stretchr/testify/mock" + +// PersistibleSet is an autogenerated mock type for the PersistibleSet type +type PersistibleSet struct { + mock.Mock +} + +// CreateWallet provides a mock function with given fields: name, seed, walletType, isEncryptrd, pwd, scanAddressesN +func (_m *PersistibleSet) CreateWallet(name string, seed string, walletType string, isEncryptrd bool, pwd core.PasswordReader, scanAddressesN int) (core.Wallet, error) { + ret := _m.Called(name, seed, walletType, isEncryptrd, pwd, scanAddressesN) + + var r0 core.Wallet + if rf, ok := ret.Get(0).(func(string, string, string, bool, core.PasswordReader, int) core.Wallet); ok { + r0 = rf(name, seed, walletType, isEncryptrd, pwd, scanAddressesN) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(core.Wallet) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(string, string, string, bool, core.PasswordReader, int) error); ok { + r1 = rf(name, seed, walletType, isEncryptrd, pwd, scanAddressesN) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// Decrypt provides a mock function with given fields: walletName, password +func (_m *PersistibleSet) Decrypt(walletName string, password core.PasswordReader) { + _m.Called(walletName, password) +} + +// DefaultWalletType provides a mock function with given fields: +func (_m *PersistibleSet) DefaultWalletType() string { + ret := _m.Called() + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// Encrypt provides a mock function with given fields: walletName, password +func (_m *PersistibleSet) Encrypt(walletName string, password core.PasswordReader) { + _m.Called(walletName, password) +} + +// GetWallet provides a mock function with given fields: id +func (_m *PersistibleSet) GetWallet(id string) core.Wallet { + ret := _m.Called(id) + + var r0 core.Wallet + if rf, ok := ret.Get(0).(func(string) core.Wallet); ok { + r0 = rf(id) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(core.Wallet) + } + } + + return r0 +} + +// IsEncrypted provides a mock function with given fields: walletName +func (_m *PersistibleSet) IsEncrypted(walletName string) (bool, error) { + ret := _m.Called(walletName) + + var r0 bool + if rf, ok := ret.Get(0).(func(string) bool); ok { + r0 = rf(walletName) + } else { + r0 = ret.Get(0).(bool) + } + + var r1 error + if rf, ok := ret.Get(1).(func(string) error); ok { + r1 = rf(walletName) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ListWallets provides a mock function with given fields: +func (_m *PersistibleSet) ListWallets() core.WalletIterator { + ret := _m.Called() + + var r0 core.WalletIterator + if rf, ok := ret.Get(0).(func() core.WalletIterator); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(core.WalletIterator) + } + } + + return r0 +} + +// SupportedWalletTypes provides a mock function with given fields: +func (_m *PersistibleSet) SupportedWalletTypes() []string { + ret := _m.Called() + + var r0 []string + if rf, ok := ret.Get(0).(func() []string); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]string) + } + } + + return r0 +} diff --git a/src/coin/skycoin/models/wallet.go b/src/coin/skycoin/models/wallet.go index cb907d9f..b7e182b4 100644 --- a/src/coin/skycoin/models/wallet.go +++ b/src/coin/skycoin/models/wallet.go @@ -741,7 +741,11 @@ func NewWalletDirectory(dirPath string) *WalletDirectory { type WalletDirectory struct { //Implements WallentEnv interface WalletDir string - wltService *SkycoinLocalWallet + wltService core.PersistibleSet +} + +func (wd *WalletDirectory) SetWltService(wltSrv core.PersistibleSet) { + wd.wltService = wltSrv } func lookupWallet(env core.WalletEnv, firstAddr string) (core.Wallet, error) { diff --git a/src/coin/skycoin/models/wallet_test.go b/src/coin/skycoin/models/wallet_test.go index d643428c..8684c1a4 100644 --- a/src/coin/skycoin/models/wallet_test.go +++ b/src/coin/skycoin/models/wallet_test.go @@ -1,7 +1,10 @@ package skycoin import ( + mocks2 "github.com/fibercrypto/fibercryptowallet/src/coin/mocks" + "github.com/fibercrypto/fibercryptowallet/src/errors" "math" + "os" "strconv" "testing" @@ -1043,3 +1046,48 @@ func TestSkycoinWalletTypes(t *testing.T) { require.Equal(t, wallet.WalletTypeBip44, wltSet.DefaultWalletType()) require.Equal(t, []string{wallet.WalletTypeDeterministic, wallet.WalletTypeBip44}, wltSet.SupportedWalletTypes()) } + +func TestLookupWalletOk(t *testing.T) { + // Giving + ws := &mocks2.PersistibleSet{} + _, kd, err := makeUxOutWithSecret(t) + require.NoError(t, err) + wallets := makeLocalWalletsFromKeyData(t, []KeyData{*kd}) + ws.On("ListWallets").Return(NewSkycoinWalletIterator(wallets)) + we := NewWalletDirectory(os.TempDir()) + we.SetWltService(ws) + addrs := wallets[0].GenAddresses(core.AccountAddress, 0, 1, nil) + require.True(t, addrs.Next()) + addr1 := addrs.Value() + + // When + wltFound, err := we.LookupWallet(addr1.String()) + + // Then + require.NoError(t, err) + require.Equal(t, wallets[0], wltFound) +} + +func TestLookupWalletFailAsExpected(t *testing.T) { + // Giving + ws := &mocks2.PersistibleSet{} + _, kd, err := makeUxOutWithSecret(t) + require.NoError(t, err) + wallets := makeLocalWalletsFromKeyData(t, []KeyData{*kd}) + ws.On("ListWallets").Return(NewSkycoinWalletIterator(wallets)) + we := NewWalletDirectory(os.TempDir()) + we.SetWltService(ws) + addrs := wallets[0].GenAddresses(core.AccountAddress, 0, 1, nil) + require.True(t, addrs.Next()) + addr1 := addrs.Value() + strAddr := addr1.String() + strAddr = strAddr[len(strAddr)/2:] + strAddr[:len(strAddr)/2] + + // When + wltFound, err := we.LookupWallet(strAddr) + + // Then + require.Error(t, err) + require.Equal(t, errors.ErrWltFromAddrNotFound, err) + require.Equal(t, nil, wltFound) +} \ No newline at end of file diff --git a/src/core/wallet.go b/src/core/wallet.go index 35b55bae..e12dcf01 100644 --- a/src/core/wallet.go +++ b/src/core/wallet.go @@ -24,6 +24,11 @@ type WalletSet interface { SupportedWalletTypes() []string } +type PersistibleSet interface { + WalletSet + WalletStorage +} + // WalletStorage provides access to the underlying wallets data store type WalletStorage interface { // Encrypt protects wallet data using cryptography