Skip to content

Commit ffefecf

Browse files
authored
feat(templates): unit tests for indexed type (ignite#1105)
* feat(templates): unit tests for indexed type * Improve msg server tests
1 parent 1145856 commit ffefecf

File tree

3 files changed

+269
-0
lines changed

3 files changed

+269
-0
lines changed
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package keeper
2+
3+
import (
4+
"testing"
5+
6+
sdk "github.com/cosmos/cosmos-sdk/types"
7+
"github.com/cosmos/cosmos-sdk/types/query"
8+
"github.com/stretchr/testify/assert"
9+
"github.com/stretchr/testify/require"
10+
"google.golang.org/grpc/codes"
11+
"google.golang.org/grpc/status"
12+
13+
"<%= ModulePath %>/x/<%= ModuleName %>/types"
14+
)
15+
16+
func Test<%= title(TypeName) %>QuerySingle(t *testing.T) {
17+
keeper, ctx := setupKeeper(t)
18+
wctx := sdk.WrapSDKContext(ctx)
19+
msgs := createN<%= title(TypeName) %>(keeper, ctx, 2)
20+
for _, tc := range []struct {
21+
desc string
22+
request *types.QueryGet<%= title(TypeName) %>Request
23+
response *types.QueryGet<%= title(TypeName) %>Response
24+
err error
25+
}{
26+
{
27+
desc: "First",
28+
request: &types.QueryGet<%= title(TypeName) %>Request{Index: msgs[0].Index},
29+
response: &types.QueryGet<%= title(TypeName) %>Response{<%= title(TypeName) %>: &msgs[0]},
30+
},
31+
{
32+
desc: "Second",
33+
request: &types.QueryGet<%= title(TypeName) %>Request{Index: msgs[1].Index},
34+
response: &types.QueryGet<%= title(TypeName) %>Response{<%= title(TypeName) %>: &msgs[1]},
35+
},
36+
{
37+
desc: "KeyNotFound",
38+
request: &types.QueryGet<%= title(TypeName) %>Request{Index: "missing"},
39+
err: status.Error(codes.InvalidArgument, "not found"),
40+
},
41+
{
42+
desc: "InvalidRequest",
43+
err: status.Error(codes.InvalidArgument, "invalid request"),
44+
},
45+
} {
46+
tc := tc
47+
t.Run(tc.desc, func(t *testing.T) {
48+
response, err := keeper.<%= title(TypeName) %>(wctx, tc.request)
49+
if tc.err != nil {
50+
require.ErrorIs(t, err, tc.err)
51+
} else {
52+
require.Equal(t, tc.response, response)
53+
}
54+
})
55+
}
56+
}
57+
58+
func Test<%= title(TypeName) %>QueryPaginated(t *testing.T) {
59+
keeper, ctx := setupKeeper(t)
60+
wctx := sdk.WrapSDKContext(ctx)
61+
msgs := createN<%= title(TypeName) %>(keeper, ctx, 5)
62+
63+
request := func(next []byte, offset, limit uint64, total bool) *types.QueryAll<%= title(TypeName) %>Request {
64+
return &types.QueryAll<%= title(TypeName) %>Request{
65+
Pagination: &query.PageRequest{
66+
Key: next,
67+
Offset: offset,
68+
Limit: limit,
69+
CountTotal: total,
70+
},
71+
}
72+
}
73+
t.Run("ByOffset", func(t *testing.T) {
74+
step := 2
75+
for i := 0; i < len(msgs); i += step {
76+
resp, err := keeper.<%= title(TypeName) %>All(wctx, request(nil, uint64(i), uint64(step), false))
77+
require.NoError(t, err)
78+
for j := i; j < len(msgs) && j < i+step; j++ {
79+
assert.Equal(t, &msgs[j], resp.<%= title(TypeName) %>[j-i])
80+
}
81+
}
82+
})
83+
t.Run("ByKey", func(t *testing.T) {
84+
step := 2
85+
var next []byte
86+
for i := 0; i < len(msgs); i += step {
87+
resp, err := keeper.<%= title(TypeName) %>All(wctx, request(next, 0, uint64(step), false))
88+
require.NoError(t, err)
89+
for j := i; j < len(msgs) && j < i+step; j++ {
90+
assert.Equal(t, &msgs[j], resp.<%= title(TypeName) %>[j-i])
91+
}
92+
next = resp.Pagination.NextKey
93+
}
94+
})
95+
t.Run("Total", func(t *testing.T) {
96+
resp, err := keeper.<%= title(TypeName) %>All(wctx, request(nil, 0, 0, true))
97+
require.NoError(t, err)
98+
require.Equal(t, len(msgs), int(resp.Pagination.Total))
99+
})
100+
t.Run("InvalidRequest", func(t *testing.T) {
101+
_, err := keeper.<%= title(TypeName) %>All(wctx, nil)
102+
require.ErrorIs(t, err, status.Error(codes.InvalidArgument, "invalid request"))
103+
})
104+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package keeper
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
sdk "github.com/cosmos/cosmos-sdk/types"
8+
"github.com/stretchr/testify/assert"
9+
10+
"<%= ModulePath %>/x/<%= ModuleName %>/types"
11+
)
12+
13+
func createN<%= title(TypeName) %>(keeper *Keeper, ctx sdk.Context, n int) []types.<%= title(TypeName) %> {
14+
items := make([]types.<%= title(TypeName) %>, n)
15+
for i := range items {
16+
items[i].Creator = "any"
17+
items[i].Index = fmt.Sprintf("%d", i)
18+
keeper.Set<%= title(TypeName) %>(ctx, items[i])
19+
}
20+
return items
21+
}
22+
23+
func Test<%= title(TypeName) %>Get(t *testing.T) {
24+
keeper, ctx := setupKeeper(t)
25+
items := createN<%= title(TypeName) %>(keeper, ctx, 10)
26+
for _, item := range items {
27+
rst, found := keeper.Get<%= title(TypeName) %>(ctx, item.Index)
28+
assert.True(t, found)
29+
assert.Equal(t, item, rst)
30+
}
31+
}
32+
func Test<%= title(TypeName) %>Remove(t *testing.T) {
33+
keeper, ctx := setupKeeper(t)
34+
items := createN<%= title(TypeName) %>(keeper, ctx, 10)
35+
for _, item := range items {
36+
keeper.Remove<%= title(TypeName) %>(ctx, item.Index)
37+
_, found := keeper.Get<%= title(TypeName) %>(ctx, item.Index)
38+
assert.False(t, found)
39+
}
40+
}
41+
42+
func Test<%= title(TypeName) %>GetAll(t *testing.T) {
43+
keeper, ctx := setupKeeper(t)
44+
items := createN<%= title(TypeName) %>(keeper, ctx, 10)
45+
assert.Equal(t, items, keeper.GetAll<%= title(TypeName) %>(ctx))
46+
}
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package keeper
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
sdk "github.com/cosmos/cosmos-sdk/types"
8+
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
9+
"github.com/stretchr/testify/assert"
10+
"github.com/stretchr/testify/require"
11+
12+
"<%= ModulePath %>/x/<%= ModuleName %>/types"
13+
)
14+
15+
func Test<%= title(TypeName) %>MsgServerCreate(t *testing.T) {
16+
keeper, ctx := setupKeeper(t)
17+
srv := NewMsgServerImpl(*keeper)
18+
wctx := sdk.WrapSDKContext(ctx)
19+
creator := "A"
20+
for i := 0; i < 5; i++ {
21+
idx := fmt.Sprintf("%d", i)
22+
expected := &types.MsgCreate<%= title(TypeName) %>{Creator: creator, Index: idx}
23+
_, err := srv.Create<%= title(TypeName) %>(wctx, expected)
24+
require.NoError(t, err)
25+
rst, found := keeper.Get<%= title(TypeName) %>(ctx, expected.Index)
26+
require.True(t, found)
27+
assert.Equal(t, expected.Creator, rst.Creator)
28+
}
29+
}
30+
31+
func Test<%= title(TypeName) %>MsgServerUpdate(t *testing.T) {
32+
creator := "A"
33+
index := "any"
34+
35+
for _, tc := range []struct {
36+
desc string
37+
request *types.MsgUpdate<%= title(TypeName) %>
38+
err error
39+
}{
40+
{
41+
desc: "Completed",
42+
request: &types.MsgUpdate<%= title(TypeName) %>{Creator: creator, Index: index},
43+
},
44+
{
45+
desc: "Unauthorized",
46+
request: &types.MsgUpdate<%= title(TypeName) %>{Creator: "B", Index: index},
47+
err: sdkerrors.ErrUnauthorized,
48+
},
49+
{
50+
desc: "KeyNotFound",
51+
request: &types.MsgUpdate<%= title(TypeName) %>{Creator: creator, Index: "missing"},
52+
err: sdkerrors.ErrKeyNotFound,
53+
},
54+
} {
55+
tc := tc
56+
t.Run(tc.desc, func(t *testing.T) {
57+
keeper, ctx := setupKeeper(t)
58+
srv := NewMsgServerImpl(*keeper)
59+
wctx := sdk.WrapSDKContext(ctx)
60+
expected := &types.MsgCreate<%= title(TypeName) %>{Creator: creator, Index: index}
61+
_, err := srv.Create<%= title(TypeName) %>(wctx, expected)
62+
require.NoError(t, err)
63+
64+
_, err = srv.Update<%= title(TypeName) %>(wctx, tc.request)
65+
if tc.err != nil {
66+
require.ErrorIs(t, err, tc.err)
67+
} else {
68+
require.NoError(t, err)
69+
rst, found := keeper.Get<%= title(TypeName) %>(ctx, expected.Index)
70+
require.True(t, found)
71+
assert.Equal(t, expected.Creator, rst.Creator)
72+
}
73+
})
74+
}
75+
}
76+
77+
func Test<%= title(TypeName) %>MsgServerDelete(t *testing.T) {
78+
creator := "A"
79+
index := "any"
80+
81+
for _, tc := range []struct {
82+
desc string
83+
request *types.MsgDelete<%= title(TypeName) %>
84+
err error
85+
}{
86+
{
87+
desc: "Completed",
88+
request: &types.MsgDelete<%= title(TypeName) %>{Creator: creator, Index: index},
89+
},
90+
{
91+
desc: "Unauthorized",
92+
request: &types.MsgDelete<%= title(TypeName) %>{Creator: "B", Index: index},
93+
err: sdkerrors.ErrUnauthorized,
94+
},
95+
{
96+
desc: "KeyNotFound",
97+
request: &types.MsgDelete<%= title(TypeName) %>{Creator: creator, Index: "missing"},
98+
err: sdkerrors.ErrKeyNotFound,
99+
},
100+
} {
101+
tc := tc
102+
t.Run(tc.desc, func(t *testing.T) {
103+
keeper, ctx := setupKeeper(t)
104+
srv := NewMsgServerImpl(*keeper)
105+
wctx := sdk.WrapSDKContext(ctx)
106+
107+
_, err := srv.Create<%= title(TypeName) %>(wctx, &types.MsgCreate<%= title(TypeName) %>{Creator: creator, Index: index})
108+
require.NoError(t, err)
109+
_, err = srv.Delete<%= title(TypeName) %>(wctx, tc.request)
110+
if tc.err != nil {
111+
require.ErrorIs(t, err, tc.err)
112+
} else {
113+
require.NoError(t, err)
114+
_, found := keeper.Get<%= title(TypeName) %>(ctx, tc.request.Index)
115+
require.False(t, found)
116+
}
117+
})
118+
}
119+
}

0 commit comments

Comments
 (0)