flag_storage_test.gno
4.91 Kb · 237 lines
1package boards_test
2
3import (
4 "testing"
5
6 "gno.land/p/nt/urequire/v0"
7
8 "gno.land/p/gnoland/boards/v0"
9)
10
11func TestFlagStorageExists(t *testing.T) {
12 tests := []struct {
13 name string
14 setup func() boards.FlagStorage
15 user address
16 exists bool
17 }{
18 {
19 name: "found",
20 setup: func() boards.FlagStorage {
21 s := boards.NewFlagStorage()
22 s.Add(boards.Flag{User: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"})
23 return s
24 },
25 user: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
26 exists: true,
27 },
28 {
29 name: "not found",
30 setup: func() boards.FlagStorage {
31 return boards.NewFlagStorage()
32 },
33 user: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
34 exists: false,
35 },
36 }
37
38 for _, tt := range tests {
39 t.Run(tt.name, func(t *testing.T) {
40 s := tt.setup()
41
42 urequire.Equal(t, tt.exists, s.Exists(tt.user))
43 })
44 }
45}
46
47func TestFlagStorageAdd(t *testing.T) {
48 tests := []struct {
49 name string
50 setup func() boards.FlagStorage
51 flag boards.Flag
52 errMsg string
53 }{
54 {
55 name: "ok",
56 setup: func() boards.FlagStorage {
57 return boards.NewFlagStorage()
58 },
59 flag: boards.Flag{User: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"},
60 },
61 {
62 name: "flag exists",
63 setup: func() boards.FlagStorage {
64 s := boards.NewFlagStorage()
65 s.Add(boards.Flag{User: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"})
66 return s
67 },
68 flag: boards.Flag{User: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"},
69 errMsg: "flag from user already exists: g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
70 },
71 {
72 name: "invalid user address",
73 setup: func() boards.FlagStorage {
74 return boards.NewFlagStorage()
75 },
76 flag: boards.Flag{User: "foo"},
77 errMsg: "post flagging error, invalid user address: foo",
78 },
79 }
80
81 for _, tt := range tests {
82 t.Run(tt.name, func(t *testing.T) {
83 s := tt.setup()
84
85 err := s.Add(tt.flag)
86
87 if tt.errMsg != "" {
88 urequire.Error(t, err, "expect an error")
89 urequire.ErrorContains(t, err, tt.errMsg, "expect error to match")
90 return
91 }
92
93 urequire.NoError(t, err, "expect no error")
94 urequire.True(t, s.Exists(tt.flag.User), "expect flag to be added")
95 })
96 }
97}
98
99func TestFlagStorageRemove(t *testing.T) {
100 tests := []struct {
101 name string
102 setup func() boards.FlagStorage
103 address address
104 removed bool
105 }{
106 {
107 name: "ok",
108 setup: func() boards.FlagStorage {
109 s := boards.NewFlagStorage()
110 s.Add(boards.Flag{User: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"})
111 return s
112 },
113 address: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
114 removed: true,
115 },
116 {
117 name: "not found",
118 setup: func() boards.FlagStorage {
119 return boards.NewFlagStorage()
120 },
121 address: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
122 },
123 }
124
125 for _, tt := range tests {
126 t.Run(tt.name, func(t *testing.T) {
127 s := tt.setup()
128
129 urequire.Equal(t, tt.removed, s.Remove(tt.address))
130 })
131 }
132}
133
134func TestFlagStorageSize(t *testing.T) {
135 tests := []struct {
136 name string
137 setup func() boards.FlagStorage
138 size int
139 }{
140 {
141 name: "empty",
142 setup: func() boards.FlagStorage {
143 return boards.NewFlagStorage()
144 },
145 size: 0,
146 },
147 {
148 name: "one flag",
149 setup: func() boards.FlagStorage {
150 s := boards.NewFlagStorage()
151 s.Add(boards.Flag{User: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"})
152 return s
153 },
154 size: 1,
155 },
156 {
157 name: "multiple flags",
158 setup: func() boards.FlagStorage {
159 s := boards.NewFlagStorage()
160 s.Add(boards.Flag{User: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"})
161 s.Add(boards.Flag{User: "g1skl80cuz8zq3lul9pgz5pc35l2pfzgxgfpsqkx"})
162 return s
163 },
164 size: 2,
165 },
166 }
167
168 for _, tt := range tests {
169 t.Run(tt.name, func(t *testing.T) {
170 s := tt.setup()
171
172 urequire.Equal(t, tt.size, s.Size())
173 })
174 }
175}
176
177func TestFlagStorageIterate(t *testing.T) {
178 // Listed in sorted (bech32-string) user order, which is the order
179 // Iterate yields them in.
180 flags := []boards.Flag{
181 {
182 User: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
183 Reason: "a",
184 },
185 {
186 User: "g1skl80cuz8zq3lul9pgz5pc35l2pfzgxgfpsqkx",
187 Reason: "b",
188 },
189 }
190 tests := []struct {
191 name string
192 setup func() boards.FlagStorage
193 reverse bool
194 flags []boards.Flag
195 }{
196 {
197 name: "default",
198 setup: func() boards.FlagStorage {
199 s := boards.NewFlagStorage()
200 s.Add(flags[0])
201 s.Add(flags[1])
202 return s
203 },
204 flags: flags,
205 },
206 {
207 name: "reverse",
208 setup: func() boards.FlagStorage {
209 s := boards.NewFlagStorage()
210 s.Add(flags[0])
211 s.Add(flags[1])
212 return s
213 },
214 reverse: true,
215 flags: []boards.Flag{flags[1], flags[0]},
216 },
217 }
218
219 for _, tt := range tests {
220 t.Run(tt.name, func(t *testing.T) {
221 s := tt.setup()
222 count := s.Size()
223 if tt.reverse {
224 count = -count
225 }
226
227 var i int
228 s.Iterate(0, count, func(f boards.Flag) bool {
229 urequire.Equal(t, tt.flags[i].User, f.User, "expect user to match")
230 urequire.Equal(t, tt.flags[i].Reason, f.Reason, "expect reason to match")
231
232 i++
233 return false
234 })
235 })
236 }
237}