permissions_basic_test.gno

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