Search Apps Documentation Source Content File Folder Download Copy Actions Download

permissions_test.gno

14.41 Kb ยท 571 lines
  1package permissions
  2
  3import (
  4	"testing"
  5
  6	"gno.land/p/gnoland/boards"
  7	"gno.land/p/nt/uassert"
  8	"gno.land/p/nt/urequire"
  9)
 10
 11var _ boards.Permissions = (*Permissions)(nil)
 12
 13func TestBasicPermissionsWithPermission(t *testing.T) {
 14	cases := []struct {
 15		name       string
 16		user       address
 17		permission boards.Permission
 18		args       boards.Args
 19		setup      func() *Permissions
 20		err        string
 21		called     bool
 22	}{
 23		{
 24			name:       "ok",
 25			user:       "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
 26			permission: "bar",
 27			setup: func() *Permissions {
 28				perms := 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:       boards.Args{"a", "b"},
 40			setup: func() *Permissions {
 41				perms := 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() *Permissions {
 53				perms := 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() *Permissions {
 65				return 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 TestBasicPermissionsSetPublicPermissions(t *testing.T) {
 95	user := address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
 96	perms := New()
 97
 98	// Add a new role with permissions
 99	perms.AddRole("adminRole", "fooPerm", "barPerm", "bazPerm")
100	urequire.False(t, perms.HasPermission(user, "fooPerm"))
101	urequire.False(t, perms.HasPermission(user, "barPerm"))
102	urequire.False(t, perms.HasPermission(user, "bazPerm"))
103
104	// Assign a couple of public permissions
105	perms.SetPublicPermissions("fooPerm", "bazPerm")
106	urequire.True(t, perms.HasPermission(user, "fooPerm"))
107	urequire.False(t, perms.HasPermission(user, "barPerm"))
108	urequire.True(t, perms.HasPermission(user, "bazPerm"))
109
110	// Clear all public permissions
111	perms.SetPublicPermissions()
112	urequire.False(t, perms.HasPermission(user, "fooPerm"))
113	urequire.False(t, perms.HasPermission(user, "barPerm"))
114	urequire.False(t, perms.HasPermission(user, "bazPerm"))
115}
116
117func TestBasicPermissionsGetUserRoles(t *testing.T) {
118	cases := []struct {
119		name  string
120		user  address
121		roles []string
122		setup func() *Permissions
123	}{
124		{
125			name:  "single role",
126			user:  "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
127			roles: []string{"admin"},
128			setup: func() *Permissions {
129				perms := New()
130				perms.AddRole("admin", "x")
131				perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", "admin")
132				return perms
133			},
134		},
135		{
136			name:  "multiple roles",
137			user:  "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
138			roles: []string{"admin", "bar", "foo"},
139			setup: func() *Permissions {
140				perms := New()
141				perms.AddRole("admin", "x")
142				perms.AddRole("foo", "x")
143				perms.AddRole("bar", "x")
144				perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", "admin", "foo", "bar")
145				return perms
146			},
147		},
148		{
149			name: "without roles",
150			user: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
151			setup: func() *Permissions {
152				perms := New()
153				perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
154				return perms
155			},
156		},
157		{
158			name: "not a user",
159			user: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
160			setup: func() *Permissions {
161				return New()
162			},
163		},
164		{
165			name:  "multiple users",
166			user:  "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
167			roles: []string{"admin"},
168			setup: func() *Permissions {
169				perms := New()
170				perms.AddRole("admin", "x")
171				perms.AddRole("bar", "x")
172				perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", "admin")
173				perms.SetUserRoles(cross, "g1w4ek2u33ta047h6lta047h6lta047h6ldvdwpn", "admin")
174				perms.SetUserRoles(cross, "g1w4ek2u3jta047h6lta047h6lta047h6l9huexc", "admin", "bar")
175				return perms
176			},
177		},
178	}
179
180	for _, tc := range cases {
181		t.Run(tc.name, func(t *testing.T) {
182			perms := tc.setup()
183			roles := perms.GetUserRoles(tc.user)
184
185			urequire.Equal(t, len(tc.roles), len(roles), "user role count")
186			for i, r := range roles {
187				uassert.Equal(t, tc.roles[i], string(r))
188			}
189		})
190	}
191}
192
193func TestBasicPermissionsHasRole(t *testing.T) {
194	cases := []struct {
195		name  string
196		user  address
197		role  boards.Role
198		setup func() *Permissions
199		want  bool
200	}{
201		{
202			name: "ok",
203			user: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
204			role: "admin",
205			setup: func() *Permissions {
206				perms := New()
207				perms.AddRole("admin", "x")
208				perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", "admin")
209				return perms
210			},
211			want: true,
212		},
213		{
214			name: "ok with multiple roles",
215			user: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
216			role: "foo",
217			setup: func() *Permissions {
218				perms := New()
219				perms.AddRole("admin", "x")
220				perms.AddRole("foo", "x")
221				perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", "admin", "foo")
222				return perms
223			},
224			want: true,
225		},
226		{
227			name: "user without roles",
228			user: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
229			setup: func() *Permissions {
230				perms := New()
231				perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
232				return perms
233			},
234		},
235		{
236			name: "has no role",
237			user: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
238			role: "bar",
239			setup: func() *Permissions {
240				perms := New()
241				perms.AddRole("foo", "x")
242				perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", "foo")
243				return perms
244			},
245		},
246	}
247
248	for _, tc := range cases {
249		t.Run(tc.name, func(t *testing.T) {
250			perms := tc.setup()
251			got := perms.HasRole(tc.user, tc.role)
252			uassert.Equal(t, got, tc.want)
253		})
254	}
255}
256
257func TestBasicPermissionsHasPermission(t *testing.T) {
258	cases := []struct {
259		name       string
260		user       address
261		permission boards.Permission
262		setup      func() *Permissions
263		want       bool
264	}{
265		{
266			name:       "ok",
267			user:       "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
268			permission: "bar",
269			setup: func() *Permissions {
270				perms := New()
271				perms.AddRole("foo", "bar")
272				perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", "foo")
273				return perms
274			},
275			want: true,
276		},
277		{
278			name:       "ok with multiple users",
279			user:       "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
280			permission: "bar",
281			setup: func() *Permissions {
282				perms := New()
283				perms.AddRole("foo", "bar")
284				perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", "foo")
285				perms.SetUserRoles(cross, "g1w4ek2u33ta047h6lta047h6lta047h6ldvdwpn", "foo")
286				return perms
287			},
288			want: true,
289		},
290		{
291			name:       "ok with multiple roles",
292			user:       "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
293			permission: "other",
294			setup: func() *Permissions {
295				perms := New()
296				perms.AddRole("foo", "bar")
297				perms.AddRole("baz", "other")
298				perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", "foo", "baz")
299				return perms
300			},
301			want: true,
302		},
303		{
304			name:       "no permission",
305			user:       "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
306			permission: "other",
307			setup: func() *Permissions {
308				perms := New()
309				perms.AddRole("foo", "bar")
310				perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", "foo")
311				return perms
312			},
313		},
314	}
315
316	for _, tc := range cases {
317		t.Run(tc.name, func(t *testing.T) {
318			perms := tc.setup()
319			got := perms.HasPermission(tc.user, tc.permission)
320			uassert.Equal(t, tc.want, got)
321		})
322	}
323}
324
325func TestBasicPermissionsSetUserRoles(t *testing.T) {
326	cases := []struct {
327		name          string
328		user          address
329		expectedRoles []boards.Role
330		setup         func() *Permissions
331		err           string
332	}{
333		{
334			name:          "add user",
335			user:          address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"),
336			expectedRoles: []boards.Role{"a"},
337			setup: func() *Permissions {
338				perms := New()
339				perms.AddRole("a", "permission1")
340				return perms
341			},
342		},
343		{
344			name:          "add user with multiple roles",
345			user:          address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"),
346			expectedRoles: []boards.Role{"a", "b"},
347			setup: func() *Permissions {
348				perms := New()
349				perms.AddRole("a", "permission1")
350				perms.AddRole("b", "permission2")
351				return perms
352			},
353		},
354		{
355			name:          "add when other users exists",
356			user:          address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"),
357			expectedRoles: []boards.Role{"a"},
358			setup: func() *Permissions {
359				perms := New()
360				perms.AddRole("a", "permission1")
361				perms.SetUserRoles(cross, "g1w4ek2u33ta047h6lta047h6lta047h6ldvdwpn", "a")
362				perms.SetUserRoles(cross, "g1w4ek2u3jta047h6lta047h6lta047h6l9huexc")
363				return perms
364			},
365		},
366		{
367			name:          "add user using single role",
368			user:          address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"),
369			expectedRoles: []boards.Role{"a"},
370			setup: func() *Permissions {
371				perms := New(UseSingleUserRole())
372				perms.AddRole("a", "permission1")
373				return perms
374			},
375		},
376		{
377			name:          "update user roles",
378			user:          address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"),
379			expectedRoles: []boards.Role{"a", "b"},
380			setup: func() *Permissions {
381				perms := New()
382				perms.AddRole("a", "permission1")
383				perms.AddRole("b", "permission2")
384				perms.AddRole("c", "permission2")
385				perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", "c")
386				return perms
387			},
388		},
389		{
390			name:          "update user roles using single role",
391			user:          address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"),
392			expectedRoles: []boards.Role{"b"},
393			setup: func() *Permissions {
394				perms := New(UseSingleUserRole())
395				perms.AddRole("a", "permission1")
396				perms.AddRole("b", "permission2")
397				perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", "a")
398				return perms
399			},
400		},
401		{
402			name:          "clear user roles",
403			user:          address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"),
404			expectedRoles: []boards.Role{},
405			setup: func() *Permissions {
406				perms := New()
407				perms.AddRole("a", "permission1")
408				perms.AddRole("b", "permission2")
409				perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", "a", "b")
410				return perms
411			},
412		},
413		{
414			name:          "set invalid role",
415			user:          address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"),
416			expectedRoles: []boards.Role{"a", "foo"},
417			setup: func() *Permissions {
418				perms := New()
419				perms.AddRole("a", "permission1")
420				return perms
421			},
422			err: "invalid role: foo",
423		},
424		{
425			name:          "use single role error",
426			user:          address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"),
427			expectedRoles: []boards.Role{"a", "b"},
428			setup: func() *Permissions {
429				perms := New(UseSingleUserRole())
430				perms.AddRole("a", "permission1")
431				perms.AddRole("b", "permission2")
432				return perms
433			},
434			err: "user can only have one role",
435		},
436	}
437
438	for _, tc := range cases {
439		t.Run(tc.name, func(t *testing.T) {
440			perms := tc.setup()
441
442			setUserRoles := func() {
443				perms.SetUserRoles(cross, tc.user, tc.expectedRoles...)
444			}
445
446			if tc.err != "" {
447				urequire.AbortsWithMessage(t, tc.err, setUserRoles, "expected an error")
448				return
449			} else {
450				urequire.NotAborts(t, setUserRoles, "expected no error")
451			}
452
453			roles := perms.GetUserRoles(tc.user)
454			uassert.Equal(t, len(tc.expectedRoles), len(roles))
455			for i, r := range roles {
456				urequire.Equal(t, string(tc.expectedRoles[i]), string(r))
457			}
458		})
459	}
460}
461
462func TestBasicPermissionsRemoveUser(t *testing.T) {
463	cases := []struct {
464		name  string
465		user  address
466		setup func() *Permissions
467		want  bool
468	}{
469		{
470			name: "ok",
471			user: address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"),
472			setup: func() *Permissions {
473				perms := New()
474				perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
475				return perms
476			},
477			want: true,
478		},
479		{
480			name: "user not found",
481			user: address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"),
482			setup: func() *Permissions {
483				return New()
484			},
485		},
486	}
487
488	for _, tc := range cases {
489		t.Run(tc.name, func(t *testing.T) {
490			perms := tc.setup()
491			got := perms.RemoveUser(cross, tc.user)
492			uassert.Equal(t, tc.want, got)
493		})
494	}
495}
496
497func TestBasicPermissionsIterateUsers(t *testing.T) {
498	users := []boards.User{
499		{
500			Address: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
501			Roles:   []boards.Role{"foo"},
502		},
503		{
504			Address: "g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj",
505			Roles:   []boards.Role{"bar", "foo"},
506		},
507		{
508			Address: "g1vh7krmmzfua5xjmkatvmx09z37w34lsvd2mxa5",
509			Roles:   []boards.Role{"bar"},
510		},
511	}
512
513	perms := New()
514	perms.AddRole("foo", "perm1")
515	perms.AddRole("bar", "perm2")
516	for _, u := range users {
517		perms.SetUserRoles(cross, u.Address, u.Roles...)
518	}
519
520	cases := []struct {
521		name               string
522		start, count, want int
523	}{
524		{
525			name:  "exceed users count",
526			count: 50,
527			want:  3,
528		},
529		{
530			name:  "exact users count",
531			count: 3,
532			want:  3,
533		},
534		{
535			name:  "two users",
536			start: 1,
537			count: 2,
538			want:  2,
539		},
540		{
541			name:  "one user",
542			start: 1,
543			count: 1,
544			want:  1,
545		},
546		{
547			name:  "no iteration",
548			start: 50,
549		},
550	}
551
552	for _, tc := range cases {
553		t.Run(tc.name, func(t *testing.T) {
554			var i int
555			perms.IterateUsers(0, len(users), func(u boards.User) bool {
556				urequire.True(t, i < len(users), "expect iterator to respect number of users")
557				uassert.Equal(t, users[i].Address, u.Address)
558
559				urequire.Equal(t, len(users[i].Roles), len(u.Roles), "expect number of roles to match")
560				for j := range u.Roles {
561					uassert.Equal(t, string(users[i].Roles[j]), string(u.Roles[j]))
562				}
563
564				i++
565				return false
566			})
567
568			uassert.Equal(t, i, len(users), "expect iterator to iterate all users")
569		})
570	}
571}