Skip to content

Commit

Permalink
Merge pull request #250 from simelo/stdevAntiD2ta_t136_Backend_unit_t…
Browse files Browse the repository at this point in the history
…ests

Fixes #136 - Backend unit tests
  • Loading branch information
olemis committed Nov 18, 2019
2 parents cf51f10 + 68eb98f commit 1f0de6c
Show file tree
Hide file tree
Showing 10 changed files with 441 additions and 33 deletions.
247 changes: 233 additions & 14 deletions src/coin/skycoin/models/account_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,16 +55,16 @@ func TestWalletListPendingTransactions(t *testing.T) {

for wallets.Next() {
txns, err := wallets.Value().GetCryptoAccount().ListPendingTransactions()
require.Nil(t, err)
require.NoError(t, err)
for txns.Next() {
iter := NewSkycoinTransactionOutputIterator(txns.Value().GetOutputs())
for iter.Next() {
output := iter.Value()
val, err3 := output.GetCoins(Sky)
require.Nil(t, err3)
require.NoError(t, err3)
require.Equal(t, val, uint64(1000000))
val, err3 = output.GetCoins(CoinHour)
require.Nil(t, err3)
require.NoError(t, err3)
require.Equal(t, val, uint64(2000))
}
}
Expand All @@ -78,11 +78,14 @@ func TestSkycoinAddressGetBalance(t *testing.T) {

addr := &SkycoinAddress{address: "addr1"}
val, err := addr.GetBalance(Sky)
require.Nil(t, err)
require.NoError(t, err)
require.Equal(t, val, uint64(42000000))
val, err = addr.GetBalance(CoinHour)
require.Nil(t, err)
require.NoError(t, err)
require.Equal(t, val, uint64(200))
val, err = addr.GetBalance("INVALID_TICKER")
require.Error(t, err)
require.Equal(t, val, uint64(0))
}

func TestSkycoinAddressScanUnspentOutputs(t *testing.T) {
Expand All @@ -107,10 +110,10 @@ func TestSkycoinAddressScanUnspentOutputs(t *testing.T) {
require.Equal(t, output.GetId(), "hash1")
require.Equal(t, output.GetAddress().String(), "addr1")
val, err := output.GetCoins(Sky)
require.Nil(t, err)
require.NoError(t, err)
require.Equal(t, val, uint64(42000000))
val, err = output.GetCoins(CoinHour)
require.Nil(t, err)
require.NoError(t, err)
require.Equal(t, val, uint64(42))
}
}
Expand Down Expand Up @@ -171,11 +174,227 @@ func TestLocalWalletGetBalance(t *testing.T) {
"6gnBM5gMSSb7XRUEap7q3WxFnuvbN9usTq",
},
).Return(response, nil)
addr := &LocalWallet{WalletDir: "./testdata", Id: "test.wlt"}
val, err := addr.GetBalance(Sky)
require.Nil(t, err)
require.Equal(t, val, uint64(84000000))
val, err = addr.GetBalance(CoinHour)
require.Nil(t, err)
require.Equal(t, val, uint64(84))
wlt := &LocalWallet{WalletDir: "./testdata", Id: "test.wlt"}
val, err := wlt.GetBalance(Sky)
require.NoError(t, err)
require.Equal(t, uint64(84000000), val)
val, err = wlt.GetBalance(CoinHour)
require.NoError(t, err)
require.Equal(t, uint64(84), val)
val, err = wlt.GetBalance("INVALID_TICKER")
require.Error(t, err)
require.Equal(t, uint64(0), val)
}

func TestRemoteWalletGetBalance(t *testing.T) {
CleanGlobalMock()
response := new(api.BalanceResponse)
response.Confirmed = readable.Balance{Coins: uint64(42000000), Hours: uint64(200)}
global_mock.On("WalletBalance", "wallet").Return(response, nil)

wlt := &RemoteWallet{
Id: "wallet",
poolSection: PoolSection,
}
val, err := wlt.GetBalance(Sky)
require.NoError(t, err)
require.Equal(t, val, uint64(42000000))
val, err = wlt.GetBalance(CoinHour)
require.NoError(t, err)
require.Equal(t, val, uint64(200))
val, err = wlt.GetBalance("INVALID_TICKER")
require.Error(t, err)
require.Equal(t, val, uint64(0))
}

func TestRemoteWalletScanUnspentOutputs(t *testing.T) {
CleanGlobalMock()

global_mock.On("Wallet", "wallet").Return(
&api.WalletResponse{
Meta: readable.WalletMeta{
Coin: "Sky",
Filename: "FiberCrypto",
Label: "wallet",
Encrypted: true,
},
Entries: []readable.WalletEntry{
readable.WalletEntry{Address: "addr"},
},
},
nil)

global_mock.On("Wallet", "wallet_no_outputs").Return(
&api.WalletResponse{
Meta: readable.WalletMeta{
Coin: "Sky",
Filename: "FiberCrypto",
Label: "wallet_no_outputs",
Encrypted: true,
},
},
nil)

usOut := readable.UnspentOutput{
Hash: "hash1",
Coins: "42",
Hours: uint64(42),
CalculatedHours: uint64(42),
Address: "addr",
}
response := &readable.UnspentOutputsSummary{
HeadOutputs: readable.UnspentOutputs{usOut},
}

global_mock.On("OutputsForAddresses", []string{"addr"}).Return(response, nil)

global_mock.On("OutputsForAddresses", []string{"no_outputs"}).Return(&readable.UnspentOutputsSummary{}, nil)

wlt := &RemoteWallet{
Id: "wallet",
poolSection: PoolSection,
}
iter := wlt.ScanUnspentOutputs()
items := 0
for iter.Next() {
to := iter.Value()
items++
require.Equal(t, "addr", to.GetAddress().String())
}
require.Equal(t, 1, items)

//No outputs
wlt = &RemoteWallet{
Id: "wallet_no_outputs",
poolSection: PoolSection,
}
iter = wlt.ScanUnspentOutputs()
items = 0
for iter.Next() {
to := iter.Value()
items++
require.Nil(t, to)
}
require.Equal(t, 0, items)
}

func TestRemoteWalletListTransactions(t *testing.T) {
CleanGlobalMock()

response := readable.TransactionWithStatusVerbose{
Status: readable.TransactionStatus{
Confirmed: false,
},
}
response.Transaction.Hash = "hash1"

global_mock.On("TransactionsVerbose", []string{"addr"}).Return(
[]readable.TransactionWithStatusVerbose{
response,
},
nil,
)

global_mock.On("Wallet", "wallet").Return(
&api.WalletResponse{
Meta: readable.WalletMeta{
Coin: "Sky",
Filename: "FiberCrypto",
Label: "wallet",
Encrypted: true,
},
Entries: []readable.WalletEntry{
readable.WalletEntry{Address: "addr"},
},
},
nil)

wlt := &RemoteWallet{
Id: "wallet",
poolSection: PoolSection,
}
iter := wlt.ListTransactions()
items := 0
for iter.Next() {
tx := iter.Value()
items++
require.Equal(t, "hash1", tx.GetId())
}
require.Equal(t, 1, items)
}

func TestLocalWalletScanUnspentOutputs(t *testing.T) {
CleanGlobalMock()

global_mock.On("Wallet", "test.wlt").Return(
&api.WalletResponse{
Meta: readable.WalletMeta{
Coin: "Sky",
Filename: "FiberCrypto",
Label: "test.wlt",
Encrypted: true,
},
Entries: []readable.WalletEntry{
readable.WalletEntry{Address: "addr"},
},
},
nil)

addresses := []string{
"2HPiZkMTD2pB9FZ6HbCxFSXa1FGeNkLeEbP",
"7wqRjpVwg5uSsz72oAZcDrBevHQRHQudyj",
"2G9wDPX14WsbZuZU1f7MveYc9vpLxj2qNsz",
"6gnBM5gMSSb7XRUEap7q3WxFnuvbN9usTq",
}

mockSkyApiOutputsForAddresses(global_mock, addresses)

wlt := &LocalWallet{WalletDir: "./testdata", Id: "test.wlt"}

iter := wlt.ScanUnspentOutputs()
items := 0
for iter.Next() {
to := iter.Value()
items++
require.Equal(t, "2HPiZkMTD2pB9FZ6HbCxFSXa1FGeNkLeEbP", to.GetAddress().String())
}
require.Equal(t, 8, items)
}

func TestLocalWalletListTransactions(t *testing.T) {
CleanGlobalMock()

global_mock.On("Wallet", "test.wlt").Return(
&api.WalletResponse{
Meta: readable.WalletMeta{
Coin: "Sky",
Filename: "FiberCrypto",
Label: "test.wlt",
Encrypted: true,
},
Entries: []readable.WalletEntry{
readable.WalletEntry{Address: "addr"},
},
},
nil)

addresses := []string{
"2HPiZkMTD2pB9FZ6HbCxFSXa1FGeNkLeEbP",
"7wqRjpVwg5uSsz72oAZcDrBevHQRHQudyj",
"2G9wDPX14WsbZuZU1f7MveYc9vpLxj2qNsz",
"6gnBM5gMSSb7XRUEap7q3WxFnuvbN9usTq",
}

mockSkyApiTransactionsVerbose(global_mock, addresses)

wlt := &LocalWallet{WalletDir: "./testdata", Id: "test.wlt"}

iter := wlt.ListTransactions()
items := 0
for iter.Next() {
tx := iter.Value()
items++
require.Equal(t, "hash1", tx.GetId())
}
require.Equal(t, 4, items)
}
2 changes: 1 addition & 1 deletion src/coin/skycoin/models/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ func (m *SkycoinApiMock) Wallet(id string) (*api.WalletResponse, error) {
}
func (m *SkycoinApiMock) UpdateWallet(id, label string) error {
args := m.Called(id, label)
return args.Error(1)
return args.Error(0)
}
func (m *SkycoinApiMock) NewWalletAddress(id string, n int, password string) ([]string, error) {
args := m.Called(id, n, password)
Expand Down
14 changes: 7 additions & 7 deletions src/coin/skycoin/models/blockchain_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,16 @@ func TestSkycoinBlockchainStatusGetCoinValue(t *testing.T) {

block := &SkycoinBlockchainStatus{CacheTime: 20}
val, err := block.GetCoinValue(core.CoinCurrentSupply, Sky)
require.Nil(t, err)
require.NoError(t, err)
require.Equal(t, val, uint64(200111111))
val, err = block.GetCoinValue(core.CoinCurrentSupply, CoinHour)
require.Nil(t, err)
require.NoError(t, err)
require.Equal(t, val, uint64(200))
val, err = block.GetCoinValue(core.CoinTotalSupply, Sky)
require.Nil(t, err)
require.NoError(t, err)
require.Equal(t, val, uint64(300000000))
val, err = block.GetCoinValue(core.CoinTotalSupply, CoinHour)
require.Nil(t, err)
require.NoError(t, err)
require.Equal(t, val, uint64(300))
}

Expand All @@ -58,7 +58,7 @@ func TestSkycoinBlockchainStatusGetNumberOfBlocks(t *testing.T) {

block := &SkycoinBlockchainStatus{CacheTime: 20}
val, err := block.GetNumberOfBlocks()
require.Nil(t, err)
require.NoError(t, err)
require.Equal(t, val, uint64(20))
}

Expand All @@ -78,8 +78,8 @@ func TestSkycoinBlockchainStatusGetLastBlock(t *testing.T) {

status := &SkycoinBlockchainStatus{CacheTime: 20}
block, err := status.GetLastBlock()
require.Nil(t, err)
require.NoError(t, err)
val, err2 := block.GetVersion()
require.Nil(t, err2)
require.NoError(t, err2)
require.Equal(t, val, uint32(3))
}
5 changes: 4 additions & 1 deletion src/coin/skycoin/models/coin.go
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,7 @@ func (skyTxn *SkycoinUninjectedTransaction) GetInputs() []core.TransactionInput
if skyTxn.inputs == nil {
inputs, err := getSkycoinTransactionInputsFromInputsHashes(skyTxn.txn.In)
if err != nil {
//TODO: This method should also returns error
return nil
}
skyTxn.inputs = inputs
Expand Down Expand Up @@ -629,8 +630,9 @@ func (in *SkycoinTransactionInput) GetCoins(ticker string) (uint64, error) {
} else if ticker == CalculatedHour {
return in.skyIn.CalculatedHours * accuracy, nil
}
//TODO: The program never reach here because util.AltcoinQuotient(ticker) throws an error when a invalid ticker is supplied
logCoin.Errorf("Invalid ticker %v\n", ticker)
return uint64(0), errors.ErrInvalidAltcoinTicker
return uint64(0), errors.ErrInvalidAltcoinTicker
}

/**
Expand Down Expand Up @@ -704,6 +706,7 @@ func (out *SkycoinTransactionOutput) GetCoins(ticker string) (uint64, error) {
} else if ticker == CalculatedHour {
return out.calculatedHours * accuracy, nil
}
//TODO: The program never reach here because util.AltcoinQuotient(ticker) throws an error when a invalid ticker is supplied
logCoin.Errorf("Invalid ticker %v\n", ticker)
return uint64(0), errors.ErrInvalidAltcoinTicker
}
Expand Down
Loading

0 comments on commit 1f0de6c

Please sign in to comment.