permissions_basic_test.gno
13.03 Kb · 513 lines
1package boards2
2
3import (
4 "testing"
5
6 "gno.land/p/nt/commondao"
7 "gno.land/p/nt/uassert"
8 "gno.land/p/nt/urequire"
9)
10
11var _ Permissions = (*BasicPermissions)(nil)
12
13func TestBasicPermissionsWithPermission(t *testing.T) {
14 cases := []struct {
15 name string
16 user address
17 permission Permission
18 args Args
19 setup func() *BasicPermissions
20 err string
21 called bool
22 }{
23 {
24 name: "ok",
25 user: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
26 permission: "bar",
27 setup: func() *BasicPermissions {
28 perms := NewBasicPermissions(commondao.New())
29 perms.AddRole("foo", "bar")
30 perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", "foo")
31 return perms
32 },
33 called: true,
34 },
35 {
36 name: "ok with arguments",
37 user: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
38 permission: "bar",
39 args: Args{"a", "b"},
40 setup: func() *BasicPermissions {
41 perms := NewBasicPermissions(commondao.New())
42 perms.AddRole("foo", "bar")
43 perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", "foo")
44 return perms
45 },
46 called: true,
47 },
48 {
49 name: "no permission",
50 user: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
51 permission: "bar",
52 setup: func() *BasicPermissions {
53 perms := NewBasicPermissions(commondao.New())
54 perms.AddRole("foo", "bar")
55 perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
56 return perms
57 },
58 err: "unauthorized",
59 },
60 {
61 name: "is not a DAO member",
62 user: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
63 permission: "bar",
64 setup: func() *BasicPermissions {
65 return NewBasicPermissions(commondao.New())
66 },
67 err: "unauthorized",
68 },
69 }
70
71 for _, tc := range cases {
72 t.Run(tc.name, func(t *testing.T) {
73 var called bool
74
75 perms := tc.setup()
76 callback := func(realm) { called = true }
77
78 testCaseFn := func() {
79 perms.WithPermission(cross, tc.user, tc.permission, tc.args, callback)
80 }
81
82 if tc.err != "" {
83 urequire.AbortsWithMessage(t, tc.err, testCaseFn, "expect panic with message")
84 return
85 } else {
86 urequire.NotAborts(t, testCaseFn, "expect no panic")
87 }
88
89 urequire.Equal(t, tc.called, called, "expect callback to be called")
90 })
91 }
92}
93
94func TestBasicPermissionsGetUserRoles(t *testing.T) {
95 cases := []struct {
96 name string
97 user address
98 roles []string
99 setup func() *BasicPermissions
100 }{
101 {
102 name: "single role",
103 user: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
104 roles: []string{"admin"},
105 setup: func() *BasicPermissions {
106 perms := NewBasicPermissions(commondao.New())
107 perms.AddRole("admin", "x")
108 perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", "admin")
109 return perms
110 },
111 },
112 {
113 name: "multiple roles",
114 user: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
115 roles: []string{"admin", "foo", "bar"},
116 setup: func() *BasicPermissions {
117 perms := NewBasicPermissions(commondao.New())
118 perms.AddRole("admin", "x")
119 perms.AddRole("foo", "x")
120 perms.AddRole("bar", "x")
121 perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", "admin", "foo", "bar")
122 return perms
123 },
124 },
125 {
126 name: "without roles",
127 user: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
128 setup: func() *BasicPermissions {
129 perms := NewBasicPermissions(commondao.New())
130 perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
131 return perms
132 },
133 },
134 {
135 name: "not a user",
136 user: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
137 setup: func() *BasicPermissions {
138 return NewBasicPermissions(commondao.New())
139 },
140 },
141 {
142 name: "multiple users",
143 user: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
144 roles: []string{"admin"},
145 setup: func() *BasicPermissions {
146 perms := NewBasicPermissions(commondao.New())
147 perms.AddRole("admin", "x")
148 perms.AddRole("bar", "x")
149 perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", "admin")
150 perms.SetUserRoles(cross, "g1w4ek2u33ta047h6lta047h6lta047h6ldvdwpn", "admin")
151 perms.SetUserRoles(cross, "g1w4ek2u3jta047h6lta047h6lta047h6l9huexc", "admin", "bar")
152 return perms
153 },
154 },
155 }
156
157 for _, tc := range cases {
158 t.Run(tc.name, func(t *testing.T) {
159 perms := tc.setup()
160 roles := perms.GetUserRoles(tc.user)
161
162 urequire.Equal(t, len(tc.roles), len(roles), "user role count")
163 for i, r := range roles {
164 uassert.Equal(t, tc.roles[i], string(r))
165 }
166 })
167 }
168}
169
170func TestBasicPermissionsHasRole(t *testing.T) {
171 cases := []struct {
172 name string
173 user address
174 role Role
175 setup func() *BasicPermissions
176 want bool
177 }{
178 {
179 name: "ok",
180 user: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
181 role: "admin",
182 setup: func() *BasicPermissions {
183 perms := NewBasicPermissions(commondao.New())
184 perms.AddRole("admin", "x")
185 perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", "admin")
186 return perms
187 },
188 want: true,
189 },
190 {
191 name: "ok with multiple roles",
192 user: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
193 role: "foo",
194 setup: func() *BasicPermissions {
195 perms := NewBasicPermissions(commondao.New())
196 perms.AddRole("admin", "x")
197 perms.AddRole("foo", "x")
198 perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", "admin", "foo")
199 return perms
200 },
201 want: true,
202 },
203 {
204 name: "user without roles",
205 user: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
206 setup: func() *BasicPermissions {
207 perms := NewBasicPermissions(commondao.New())
208 perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
209 return perms
210 },
211 },
212 {
213 name: "has no role",
214 user: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
215 role: "bar",
216 setup: func() *BasicPermissions {
217 perms := NewBasicPermissions(commondao.New())
218 perms.AddRole("foo", "x")
219 perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", "foo")
220 return perms
221 },
222 },
223 }
224
225 for _, tc := range cases {
226 t.Run(tc.name, func(t *testing.T) {
227 perms := tc.setup()
228 got := perms.HasRole(tc.user, tc.role)
229 uassert.Equal(t, got, tc.want)
230 })
231 }
232}
233
234func TestBasicPermissionsHasPermission(t *testing.T) {
235 cases := []struct {
236 name string
237 user address
238 permission Permission
239 setup func() *BasicPermissions
240 want bool
241 }{
242 {
243 name: "ok",
244 user: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
245 permission: "bar",
246 setup: func() *BasicPermissions {
247 perms := NewBasicPermissions(commondao.New())
248 perms.AddRole("foo", "bar")
249 perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", "foo")
250 return perms
251 },
252 want: true,
253 },
254 {
255 name: "ok with multiple users",
256 user: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
257 permission: "bar",
258 setup: func() *BasicPermissions {
259 perms := NewBasicPermissions(commondao.New())
260 perms.AddRole("foo", "bar")
261 perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", "foo")
262 perms.SetUserRoles(cross, "g1w4ek2u33ta047h6lta047h6lta047h6ldvdwpn", "foo")
263 return perms
264 },
265 want: true,
266 },
267 {
268 name: "ok with multiple roles",
269 user: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
270 permission: "other",
271 setup: func() *BasicPermissions {
272 perms := NewBasicPermissions(commondao.New())
273 perms.AddRole("foo", "bar")
274 perms.AddRole("baz", "other")
275 perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", "foo", "baz")
276 return perms
277 },
278 want: true,
279 },
280 {
281 name: "no permission",
282 user: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
283 permission: "other",
284 setup: func() *BasicPermissions {
285 perms := NewBasicPermissions(commondao.New())
286 perms.AddRole("foo", "bar")
287 perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", "foo")
288 return perms
289 },
290 },
291 }
292
293 for _, tc := range cases {
294 t.Run(tc.name, func(t *testing.T) {
295 perms := tc.setup()
296 got := perms.HasPermission(tc.user, tc.permission)
297 uassert.Equal(t, got, tc.want)
298 })
299 }
300}
301
302func TestBasicPermissionsSetUserRoles(t *testing.T) {
303 cases := []struct {
304 name string
305 user address
306 roles []Role
307 setup func() *BasicPermissions
308 err string
309 }{
310 {
311 name: "add user",
312 user: address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"),
313 roles: []Role{"a"},
314 setup: func() *BasicPermissions {
315 perms := NewBasicPermissions(commondao.New())
316 perms.AddRole("a", "permission1")
317 return perms
318 },
319 },
320 {
321 name: "add user with multiple roles",
322 user: address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"),
323 roles: []Role{"a", "b"},
324 setup: func() *BasicPermissions {
325 perms := NewBasicPermissions(commondao.New())
326 perms.AddRole("a", "permission1")
327 perms.AddRole("b", "permission2")
328 return perms
329 },
330 },
331 {
332 name: "add when other users exists",
333 user: address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"),
334 roles: []Role{"a"},
335 setup: func() *BasicPermissions {
336 perms := NewBasicPermissions(commondao.New())
337 perms.AddRole("a", "permission1")
338 perms.SetUserRoles(cross, "g1w4ek2u33ta047h6lta047h6lta047h6ldvdwpn", "a")
339 perms.SetUserRoles(cross, "g1w4ek2u3jta047h6lta047h6lta047h6l9huexc")
340 return perms
341 },
342 },
343 {
344 name: "update user roles",
345 user: address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"),
346 roles: []Role{"a", "b"},
347 setup: func() *BasicPermissions {
348 perms := NewBasicPermissions(commondao.New())
349 perms.AddRole("a", "permission1")
350 perms.AddRole("b", "permission2")
351 perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", "a")
352 return perms
353 },
354 },
355 {
356 name: "clear user roles",
357 user: address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"),
358 roles: []Role{},
359 setup: func() *BasicPermissions {
360 perms := NewBasicPermissions(commondao.New())
361 perms.AddRole("a", "permission1")
362 perms.AddRole("b", "permission2")
363 perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", "a", "b")
364 return perms
365 },
366 },
367 {
368 name: "set invalid role",
369 user: address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"),
370 roles: []Role{"a", "foo"},
371 setup: func() *BasicPermissions {
372 perms := NewBasicPermissions(commondao.New())
373 perms.AddRole("a", "permission1")
374 return perms
375 },
376 err: "invalid role: foo",
377 },
378 }
379
380 for _, tc := range cases {
381 t.Run(tc.name, func(t *testing.T) {
382 perms := tc.setup()
383
384 setUserRoles := func() {
385 perms.SetUserRoles(cross, tc.user, tc.roles...)
386 }
387
388 if tc.err != "" {
389 urequire.AbortsWithMessage(t, tc.err, setUserRoles, "expected an error")
390 return
391 } else {
392 urequire.NotAborts(t, setUserRoles, "expected no error")
393 }
394
395 roles := perms.GetUserRoles(tc.user)
396 uassert.Equal(t, len(tc.roles), len(roles))
397 for i, r := range roles {
398 urequire.Equal(t, string(tc.roles[i]), string(r))
399 }
400 })
401 }
402}
403
404func TestBasicPermissionsRemoveUser(t *testing.T) {
405 cases := []struct {
406 name string
407 user address
408 setup func() *BasicPermissions
409 want bool
410 }{
411 {
412 name: "ok",
413 user: address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"),
414 setup: func() *BasicPermissions {
415 perms := NewBasicPermissions(commondao.New())
416 perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
417 return perms
418 },
419 want: true,
420 },
421 {
422 name: "user not found",
423 user: address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"),
424 setup: func() *BasicPermissions {
425 return NewBasicPermissions(commondao.New())
426 },
427 },
428 }
429
430 for _, tc := range cases {
431 t.Run(tc.name, func(t *testing.T) {
432 perms := tc.setup()
433 got := perms.RemoveUser(cross, tc.user)
434 uassert.Equal(t, tc.want, got)
435 })
436 }
437}
438
439func TestBasicPermissionsIterateUsers(t *testing.T) {
440 users := []User{
441 {
442 Address: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
443 Roles: []Role{"foo"},
444 },
445 {
446 Address: "g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj",
447 Roles: []Role{"foo", "bar"},
448 },
449 {
450 Address: "g1vh7krmmzfua5xjmkatvmx09z37w34lsvd2mxa5",
451 Roles: []Role{"bar"},
452 },
453 }
454
455 perms := NewBasicPermissions(commondao.New())
456 perms.AddRole("foo", "perm1")
457 perms.AddRole("bar", "perm2")
458 for _, u := range users {
459 perms.SetUserRoles(cross, u.Address, u.Roles...)
460 }
461
462 cases := []struct {
463 name string
464 start, count, want int
465 }{
466 {
467 name: "exceed users count",
468 count: 50,
469 want: 3,
470 },
471 {
472 name: "exact users count",
473 count: 3,
474 want: 3,
475 },
476 {
477 name: "two users",
478 start: 1,
479 count: 2,
480 want: 2,
481 },
482 {
483 name: "one user",
484 start: 1,
485 count: 1,
486 want: 1,
487 },
488 {
489 name: "no iteration",
490 start: 50,
491 },
492 }
493
494 for _, tc := range cases {
495 t.Run(tc.name, func(t *testing.T) {
496 var i int
497 perms.IterateUsers(0, len(users), func(u User) bool {
498 urequire.True(t, i < len(users), "expect iterator to respect number of users")
499 uassert.Equal(t, users[i].Address, u.Address)
500
501 urequire.Equal(t, len(users[i].Roles), len(u.Roles), "expect number of roles to match")
502 for j := range u.Roles {
503 uassert.Equal(t, string(users[i].Roles[j]), string(u.Roles[j]))
504 }
505
506 i++
507 return false
508 })
509
510 uassert.Equal(t, i, len(users), "expect iterator to iterate all users")
511 })
512 }
513}