Skip to content

Commit f157056

Browse files
test(nfttx): increase unit test coverage to 80% (#1518)
Signed-off-by: Shashank <yshashank959@gmail.com>
1 parent 3fa509d commit f157056

16 files changed

Lines changed: 2170 additions & 1 deletion
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
/*
2+
Copyright IBM Corp. All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package nfttx_test
8+
9+
import (
10+
"errors"
11+
"testing"
12+
13+
"github.com/hyperledger-labs/fabric-token-sdk/token/services/nfttx"
14+
"github.com/hyperledger-labs/fabric-token-sdk/token/services/nfttx/mock"
15+
token2 "github.com/hyperledger-labs/fabric-token-sdk/token/token"
16+
"github.com/stretchr/testify/assert"
17+
"github.com/stretchr/testify/require"
18+
)
19+
20+
type dummyIterator struct {
21+
tokens []*token2.UnspentToken
22+
index int
23+
err error
24+
}
25+
26+
func (d *dummyIterator) Next() (*token2.UnspentToken, error) {
27+
if d.err != nil {
28+
return nil, d.err
29+
}
30+
if d.index >= len(d.tokens) {
31+
return nil, nil
32+
}
33+
t := d.tokens[d.index]
34+
d.index++
35+
36+
return t, nil
37+
}
38+
39+
func (d *dummyIterator) Close() {}
40+
41+
type testFilter struct {
42+
pass bool
43+
}
44+
45+
func (f *testFilter) ContainsToken(token *token2.UnspentToken) bool {
46+
return f.pass
47+
}
48+
49+
func TestNewFilter(t *testing.T) {
50+
fakeQS := &mock.QueryService{}
51+
f := nfttx.NewFilter("my-wallet", fakeQS, 64)
52+
assert.NotNil(t, f)
53+
}
54+
55+
func TestFilterNilFilter(t *testing.T) {
56+
f := nfttx.NewFilter("my-wallet", nil, 64)
57+
ids, err := f.Filter(nil, "1")
58+
require.Error(t, err)
59+
assert.Nil(t, ids)
60+
assert.Contains(t, err.Error(), "filter is nil")
61+
}
62+
63+
func TestFilterIteratorError(t *testing.T) {
64+
fakeQS := &mock.QueryService{}
65+
fakeQS.UnspentTokensIteratorByReturns(nil, errors.New("iterator error"))
66+
67+
f := nfttx.NewFilter("my-wallet", fakeQS, 64)
68+
ids, err := f.Filter(&testFilter{pass: true}, "1")
69+
require.Error(t, err)
70+
assert.Nil(t, ids)
71+
assert.Contains(t, err.Error(), "token selection failed")
72+
}
73+
74+
func TestFilterNextError(t *testing.T) {
75+
fakeQS := &mock.QueryService{}
76+
fakeQS.UnspentTokensIteratorByReturns(&dummyIterator{err: errors.New("next error"), tokens: nil}, nil)
77+
78+
f := nfttx.NewFilter("my-wallet", fakeQS, 64)
79+
ids, err := f.Filter(&testFilter{pass: true}, "1")
80+
require.Error(t, err)
81+
assert.Nil(t, ids)
82+
assert.Contains(t, err.Error(), "token selection failed")
83+
}
84+
85+
func TestFilterBadQuantityTarget(t *testing.T) {
86+
f := nfttx.NewFilter("my-wallet", nil, 64)
87+
ids, err := f.Filter(&testFilter{pass: true}, "xyz")
88+
require.Error(t, err)
89+
assert.Nil(t, ids)
90+
assert.Contains(t, err.Error(), "failed to select tokens: failed to convert quantity")
91+
}
92+
93+
func TestFilterSuccess(t *testing.T) {
94+
fakeQS := &mock.QueryService{}
95+
tokens := []*token2.UnspentToken{
96+
{Id: token2.ID{TxId: "tx1", Index: 0}, Quantity: "1"},
97+
{Id: token2.ID{TxId: "tx2", Index: 0}, Quantity: "1"},
98+
}
99+
fakeQS.UnspentTokensIteratorByReturns(&dummyIterator{tokens: tokens}, nil)
100+
101+
f := nfttx.NewFilter("my-wallet", fakeQS, 64)
102+
103+
ids, err := f.Filter(&testFilter{pass: true}, "2")
104+
require.NoError(t, err)
105+
assert.Len(t, ids, 2)
106+
107+
// Filter returning false should be ignored
108+
fakeQS.UnspentTokensIteratorByReturns(&dummyIterator{tokens: tokens}, nil)
109+
ids, err = f.Filter(&testFilter{pass: false}, "1")
110+
require.Error(t, err)
111+
assert.Nil(t, ids)
112+
assert.ErrorIs(t, err, nfttx.ErrNoResults) // Note here we use unwrapping since err could be "failed to select tokens: no results found"
113+
}
114+
115+
func TestFilterInsufficientTokens(t *testing.T) {
116+
fakeQS := &mock.QueryService{}
117+
tokens := []*token2.UnspentToken{
118+
{Id: token2.ID{TxId: "tx1", Index: 0}, Quantity: "1"},
119+
}
120+
fakeQS.UnspentTokensIteratorByReturns(&dummyIterator{tokens: tokens}, nil)
121+
122+
f := nfttx.NewFilter("my-wallet", fakeQS, 64)
123+
ids, err := f.Filter(&testFilter{pass: true}, "2")
124+
require.Error(t, err)
125+
assert.Nil(t, ids)
126+
assert.ErrorIs(t, err, nfttx.ErrNoResults)
127+
}

token/services/nfttx/generate.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/*
2+
Copyright IBM Corp. All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package nfttx
8+
9+
//go:generate counterfeiter -o mock/query_service.go -fake-name QueryService . QueryService
10+
//go:generate counterfeiter -o mock/vault.go -fake-name Vault . vault
11+
//go:generate counterfeiter -o mock/selector.go -fake-name Selector . selector
12+
//go:generate counterfeiter -o mock/view_context.go -fake-name Context github.com/hyperledger-labs/fabric-smart-client/platform/view/view.Context

0 commit comments

Comments
 (0)