member_storage_test.gno
7.24 Kb · 292 lines
1package storage_test
2
3import (
4 "testing"
5
6 "gno.land/p/nt/commondao/v0"
7 "gno.land/p/nt/urequire/v0"
8
9 "gno.land/p/nt/commondao/v0/exts/storage"
10)
11
12func TestMemberStorageGroupingMemberAdd(t *testing.T) {
13 tests := []struct {
14 name string
15 setup func() commondao.MemberStorage
16 group string
17 member address
18 }{
19 {
20 name: "empty group",
21 setup: func() commondao.MemberStorage {
22 s := storage.NewMemberStorage()
23 s.Grouping().Add("foo")
24 return s
25 },
26 group: "foo",
27 member: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
28 },
29 {
30 name: "group with members",
31 setup: func() commondao.MemberStorage {
32 s := storage.NewMemberStorage()
33 group, _ := s.Grouping().Add("foo")
34 group.Members().Add("g16jpf0puufcpcjkph5nxueec8etpcldz7zwgydq")
35 group.Members().Add("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj")
36 return s
37 },
38 group: "foo",
39 member: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
40 },
41 {
42 name: "multiple groups with members",
43 setup: func() commondao.MemberStorage {
44 s := storage.NewMemberStorage()
45 group, _ := s.Grouping().Add("foo")
46 group.Members().Add("g16jpf0puufcpcjkph5nxueec8etpcldz7zwgydq")
47 group, _ = s.Grouping().Add("bar")
48 group.Members().Add("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj")
49 return s
50 },
51 group: "bar",
52 member: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
53 },
54 }
55
56 for _, tt := range tests {
57 t.Run(tt.name, func(t *testing.T) {
58 // Arrange
59 s := tt.setup()
60 group, _ := s.Grouping().Get(tt.group)
61
62 // Act
63 group.Members().Add(tt.member)
64
65 // Assert
66 urequire.True(t, s.Has(tt.member), "expect member to also be added to parent storage")
67 })
68 }
69}
70
71func TestMemberStorageGroupingMemberRemove(t *testing.T) {
72 tests := []struct {
73 name string
74 setup func() commondao.MemberStorage
75 group string
76 member address
77 }{
78 {
79 name: "one group one member",
80 setup: func() commondao.MemberStorage {
81 s := storage.NewMemberStorage()
82 group, _ := s.Grouping().Add("foo")
83 group.Members().Add("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
84 return s
85 },
86 group: "foo",
87 member: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
88 },
89 {
90 name: "one group multiple members",
91 setup: func() commondao.MemberStorage {
92 s := storage.NewMemberStorage()
93 group, _ := s.Grouping().Add("foo")
94 group.Members().Add("g16jpf0puufcpcjkph5nxueec8etpcldz7zwgydq")
95 group.Members().Add("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
96 group.Members().Add("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj")
97 return s
98 },
99 group: "foo",
100 member: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
101 },
102 {
103 name: "multiple groups multiple members",
104 setup: func() commondao.MemberStorage {
105 s := storage.NewMemberStorage()
106 group, _ := s.Grouping().Add("foo")
107 group.Members().Add("g16jpf0puufcpcjkph5nxueec8etpcldz7zwgydq")
108 group.Members().Add("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
109 group, _ = s.Grouping().Add("bar")
110 group.Members().Add("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj")
111 return s
112 },
113 group: "foo",
114 member: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
115 },
116 }
117
118 for _, tt := range tests {
119 t.Run(tt.name, func(t *testing.T) {
120 // Arrange
121 s := tt.setup()
122 group, _ := s.Grouping().Get(tt.group)
123
124 // Act
125 group.Members().Remove(tt.member)
126
127 // Assert
128 urequire.False(t, s.Has(tt.member), "expect member to also be removed from parent storage")
129 })
130 }
131}
132
133func TestMemberStorageSize(t *testing.T) {
134 tests := []struct {
135 name string
136 setup func() commondao.MemberStorage
137 size int
138 }{
139 {
140 name: "empty",
141 setup: func() commondao.MemberStorage {
142 return storage.NewMemberStorage()
143 },
144 size: 0,
145 },
146 {
147 name: "member without group",
148 setup: func() commondao.MemberStorage {
149 s := storage.NewMemberStorage()
150 s.Add("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
151 return s
152 },
153 size: 1,
154 },
155 {
156 name: "multiple members without group",
157 setup: func() commondao.MemberStorage {
158 s := storage.NewMemberStorage()
159 s.Add("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
160 s.Add("g16jpf0puufcpcjkph5nxueec8etpcldz7zwgydq")
161 return s
162 },
163 size: 2,
164 },
165 {
166 name: "member in group",
167 setup: func() commondao.MemberStorage {
168 s := storage.NewMemberStorage()
169 group, _ := s.Grouping().Add("foo")
170 group.Members().Add("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
171 return s
172 },
173 size: 1,
174 },
175 {
176 name: "multiple members in group",
177 setup: func() commondao.MemberStorage {
178 s := storage.NewMemberStorage()
179 group, _ := s.Grouping().Add("foo")
180 group.Members().Add("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
181 group.Members().Add("g16jpf0puufcpcjkph5nxueec8etpcldz7zwgydq")
182 return s
183 },
184 size: 2,
185 },
186 {
187 name: "multiple members in different groups",
188 setup: func() commondao.MemberStorage {
189 s := storage.NewMemberStorage()
190 group, _ := s.Grouping().Add("foo")
191 group.Members().Add("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
192 group, _ = s.Grouping().Add("bar")
193 group.Members().Add("g16jpf0puufcpcjkph5nxueec8etpcldz7zwgydq")
194 return s
195 },
196 size: 2,
197 },
198 }
199
200 for _, tt := range tests {
201 t.Run(tt.name, func(t *testing.T) {
202 // Arrange
203 s := tt.setup()
204
205 // Act
206 size := s.Size()
207
208 // Assert
209 urequire.Equal(t, tt.size, size)
210 })
211 }
212}
213
214func TestMemberStorageIterateByOffset(t *testing.T) {
215 tests := []struct {
216 name string
217 setup func() commondao.MemberStorage
218 members []address
219 }{
220 {
221 name: "empty",
222 setup: func() commondao.MemberStorage {
223 return storage.NewMemberStorage()
224 },
225 },
226 {
227 name: "without group",
228 setup: func() commondao.MemberStorage {
229 s := storage.NewMemberStorage()
230 s.Add("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
231 s.Add("g16jpf0puufcpcjkph5nxueec8etpcldz7zwgydq")
232 return s
233 },
234 members: []address{
235 "g16jpf0puufcpcjkph5nxueec8etpcldz7zwgydq",
236 "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
237 },
238 },
239 {
240 name: "single group",
241 setup: func() commondao.MemberStorage {
242 s := storage.NewMemberStorage()
243 group, _ := s.Grouping().Add("foo")
244 group.Members().Add("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
245 group.Members().Add("g16jpf0puufcpcjkph5nxueec8etpcldz7zwgydq")
246 return s
247 },
248 members: []address{
249 "g16jpf0puufcpcjkph5nxueec8etpcldz7zwgydq",
250 "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
251 },
252 },
253 {
254 name: "multiple groups",
255 setup: func() commondao.MemberStorage {
256 s := storage.NewMemberStorage()
257 group, _ := s.Grouping().Add("foo")
258 group.Members().Add("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
259 group, _ = s.Grouping().Add("bar")
260 group.Members().Add("g16jpf0puufcpcjkph5nxueec8etpcldz7zwgydq")
261 return s
262 },
263 members: []address{
264 "g16jpf0puufcpcjkph5nxueec8etpcldz7zwgydq",
265 "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
266 },
267 },
268 }
269
270 for _, tt := range tests {
271 t.Run(tt.name, func(t *testing.T) {
272 // Arrange
273 var i int
274 s := tt.setup()
275 members := make([]address, s.Size())
276
277 // Act
278 s.IterateByOffset(0, s.Size(), func(addr address) bool {
279 members[i] = addr
280 i++
281 return false
282 })
283
284 // Assert
285 urequire.Equal(t, len(tt.members), len(members), "expect iterated members to match")
286
287 for i, member := range members {
288 urequire.Equal(t, tt.members[i], member, "expect member to match")
289 }
290 })
291 }
292}