denom_test.gno
5.01 Kb · 181 lines
1package transfer_test
2
3import (
4 "fmt"
5 "strings"
6 "testing"
7
8 "gno.land/p/nt/uassert/v0"
9 "gno.land/p/nt/ufmt/v0"
10 "gno.land/p/nt/urequire/v0"
11 "gno.land/r/aib/ibc/apps/transfer"
12)
13
14func TestDenomsValidate(t *testing.T) {
15 testCases := []struct {
16 name string
17 denom transfer.Denom
18 expError string
19 }{
20 {
21 "valid trace with client id",
22 transfer.NewDenom("uatone",
23 transfer.NewHop("transfer", "07-tendermint-0"),
24 ),
25 "",
26 },
27 {
28 "valid multiple trace info",
29 transfer.NewDenom("ugnot",
30 transfer.NewHop("transfer", "channel-1"),
31 transfer.NewHop("transfer", "channel-2"),
32 ),
33 "",
34 },
35 {
36 "empty base denom with trace",
37 transfer.NewDenom("", transfer.NewHop("transfer", "channel-1")),
38 "base denomination cannot be blank",
39 },
40 }
41
42 for _, tc := range testCases {
43 t.Run(tc.name, func(t *testing.T) {
44
45 err := tc.denom.ValidateBasic()
46
47 if tc.expError == "" {
48 urequire.NoError(t, err)
49 return
50 }
51 urequire.ErrorContains(t, err, tc.expError)
52 })
53 }
54}
55
56func TestExtractDenomFromPath(t *testing.T) {
57 testCases := []struct {
58 name string
59 fullPath string
60 expDenom transfer.Denom
61 }{
62 {
63 name: "empty denom",
64 fullPath: "",
65 expDenom: transfer.NewDenom(""),
66 },
67 {
68 name: "base denom no slashes",
69 fullPath: "gnot",
70 expDenom: transfer.NewDenom("gnot"),
71 },
72 {
73 name: "base denom with trailing slash",
74 fullPath: "gnot/",
75 expDenom: transfer.NewDenom("gnot/"),
76 },
77 {
78 name: "base denom multiple trailing slash",
79 fullPath: "foo///bar//baz/gnot/",
80 expDenom: transfer.NewDenom("foo///bar//baz/gnot/"),
81 },
82 {
83 name: "ibc denom one hop",
84 fullPath: "transfer/channel-0/gnot",
85 expDenom: transfer.NewDenom("gnot", transfer.NewHop("transfer", "channel-0")),
86 },
87 {
88 name: "ibc denom one hop with client id",
89 fullPath: "transfer/07-tendermint-0/gnot",
90 expDenom: transfer.NewDenom("gnot", transfer.NewHop("transfer", "07-tendermint-0")),
91 },
92 {
93 name: "ibc denom one hop trailing slash",
94 fullPath: "transfer/channel-0/gnot/",
95 expDenom: transfer.NewDenom("gnot/", transfer.NewHop("transfer", "channel-0")),
96 },
97 {
98 name: "ibc denom one hop multiple slashes",
99 fullPath: "transfer/channel-0//at/om/",
100 expDenom: transfer.NewDenom("/at/om/", transfer.NewHop("transfer", "channel-0")),
101 },
102 {
103 name: "ibc denom two hops",
104 fullPath: "transfer/channel-0/transfer/channel-60/gnot",
105 expDenom: transfer.NewDenom("gnot", transfer.NewHop("transfer", "channel-0"), transfer.NewHop("transfer", "channel-60")),
106 },
107 {
108 name: "ibc denom two hops trailing slash",
109 fullPath: "transfer/channel-0/transfer/channel-60/gnot/",
110 expDenom: transfer.NewDenom("gnot/", transfer.NewHop("transfer", "channel-0"), transfer.NewHop("transfer", "channel-60")),
111 },
112 {
113 name: "empty prefix",
114 fullPath: "/ugnot",
115 expDenom: transfer.NewDenom("/ugnot"),
116 },
117 {
118 name: "empty identifiers",
119 fullPath: "//ugnot",
120 expDenom: transfer.NewDenom("//ugnot"),
121 },
122 {
123 name: "base denom with single '/'",
124 fullPath: "erc20/0x85bcBCd7e79Ec36f4fBBDc54F90C643d921151AA",
125 expDenom: transfer.NewDenom("erc20/0x85bcBCd7e79Ec36f4fBBDc54F90C643d921151AA"),
126 },
127 {
128 name: "trace info and base denom with single '/'",
129 fullPath: "transfer/channel-1/erc20/0x85bcBCd7e79Ec36f4fBBDc54F90C643d921151AA",
130 expDenom: transfer.NewDenom("erc20/0x85bcBCd7e79Ec36f4fBBDc54F90C643d921151AA", transfer.NewHop("transfer", "channel-1")),
131 },
132 {
133 name: "single trace identifier",
134 fullPath: "transfer/",
135 expDenom: transfer.NewDenom("transfer/"),
136 },
137 {
138 name: "trace info with custom port",
139 fullPath: "customtransfer/channel-1/ugnot",
140 expDenom: transfer.NewDenom("ugnot", transfer.NewHop("customtransfer", "channel-1")),
141 },
142 {
143 name: "invalid path (1)",
144 fullPath: "channel-1/transfer/ugnot",
145 expDenom: transfer.NewDenom("channel-1/transfer/ugnot"),
146 },
147 {
148 name: "invalid path (2)",
149 fullPath: "transfer/channel-1",
150 expDenom: transfer.NewDenom("transfer/channel-1"),
151 },
152 {
153 name: "invalid path (3)",
154 fullPath: "transfer/channel-1/transfer/channel-2",
155 expDenom: transfer.NewDenom("", transfer.NewHop("transfer", "channel-1"), transfer.NewHop("transfer", "channel-2")),
156 },
157 {
158 name: "invalid path (4)",
159 fullPath: "transfer/channelToA/ugnot",
160 expDenom: transfer.NewDenom("transfer/channelToA/ugnot"),
161 },
162 }
163 for _, tc := range testCases {
164 t.Run(tc.name, func(t *testing.T) {
165
166 denom := transfer.ExtractDenomFromPath(tc.fullPath)
167
168 fmt.Println(tc.fullPath, strings.Contains(denom.Base, "/"))
169
170 uassert.Equal(t, tc.expDenom.Base, denom.Base)
171 if uassert.Equal(t, len(tc.expDenom.Trace), len(denom.Trace), "trace: unexpected number of hops") {
172 for i := range tc.expDenom.Trace {
173 uassert.Equal(t, tc.expDenom.Trace[i].PortId, denom.Trace[i].PortId,
174 ufmt.Sprintf("unexpected hop #%d portId", i))
175 uassert.Equal(t, tc.expDenom.Trace[i].ClientId, denom.Trace[i].ClientId,
176 ufmt.Sprintf("unexpected hop #%d channelId", i))
177 }
178 }
179 })
180 }
181}