Search Apps Documentation Source Content File Folder Download Copy Actions Download

permissions_basic_test.gno

13.68 Kb · 536 lines
  1package boards2
  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 = (*BasicPermissions)(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() *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()
 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() *BasicPermissions {
 41				perms := NewBasicPermissions()
 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()
 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()
 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 := NewBasicPermissions()
 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() *BasicPermissions
123	}{
124		{
125			name:  "single role",
126			user:  "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
127			roles: []string{"admin"},
128			setup: func() *BasicPermissions {
129				perms := NewBasicPermissions()
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() *BasicPermissions {
140				perms := NewBasicPermissions()
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() *BasicPermissions {
152				perms := NewBasicPermissions()
153				perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
154				return perms
155			},
156		},
157		{
158			name: "not a user",
159			user: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
160			setup: func() *BasicPermissions {
161				return NewBasicPermissions()
162			},
163		},
164		{
165			name:  "multiple users",
166			user:  "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
167			roles: []string{"admin"},
168			setup: func() *BasicPermissions {
169				perms := NewBasicPermissions()
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() *BasicPermissions
199		want  bool
200	}{
201		{
202			name: "ok",
203			user: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
204			role: "admin",
205			setup: func() *BasicPermissions {
206				perms := NewBasicPermissions()
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() *BasicPermissions {
218				perms := NewBasicPermissions()
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() *BasicPermissions {
230				perms := NewBasicPermissions()
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() *BasicPermissions {
240				perms := NewBasicPermissions()
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() *BasicPermissions
263		want       bool
264	}{
265		{
266			name:       "ok",
267			user:       "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
268			permission: "bar",
269			setup: func() *BasicPermissions {
270				perms := NewBasicPermissions()
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() *BasicPermissions {
282				perms := NewBasicPermissions()
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() *BasicPermissions {
295				perms := NewBasicPermissions()
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() *BasicPermissions {
308				perms := NewBasicPermissions()
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		roles []boards.Role
330		setup func() *BasicPermissions
331		err   string
332	}{
333		{
334			name:  "add user",
335			user:  address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"),
336			roles: []boards.Role{"a"},
337			setup: func() *BasicPermissions {
338				perms := NewBasicPermissions()
339				perms.AddRole("a", "permission1")
340				return perms
341			},
342		},
343		{
344			name:  "add user with multiple roles",
345			user:  address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"),
346			roles: []boards.Role{"a", "b"},
347			setup: func() *BasicPermissions {
348				perms := NewBasicPermissions()
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			roles: []boards.Role{"a"},
358			setup: func() *BasicPermissions {
359				perms := NewBasicPermissions()
360				perms.AddRole("a", "permission1")
361				perms.SetUserRoles(cross, "g1w4ek2u33ta047h6lta047h6lta047h6ldvdwpn", "a")
362				perms.SetUserRoles(cross, "g1w4ek2u3jta047h6lta047h6lta047h6l9huexc")
363				return perms
364			},
365		},
366		{
367			name:  "update user roles",
368			user:  address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"),
369			roles: []boards.Role{"a", "b"},
370			setup: func() *BasicPermissions {
371				perms := NewBasicPermissions()
372				perms.AddRole("a", "permission1")
373				perms.AddRole("b", "permission2")
374				perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", "a")
375				return perms
376			},
377		},
378		{
379			name:  "clear user roles",
380			user:  address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"),
381			roles: []boards.Role{},
382			setup: func() *BasicPermissions {
383				perms := NewBasicPermissions()
384				perms.AddRole("a", "permission1")
385				perms.AddRole("b", "permission2")
386				perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", "a", "b")
387				return perms
388			},
389		},
390		{
391			name:  "set invalid role",
392			user:  address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"),
393			roles: []boards.Role{"a", "foo"},
394			setup: func() *BasicPermissions {
395				perms := NewBasicPermissions()
396				perms.AddRole("a", "permission1")
397				return perms
398			},
399			err: "invalid role: foo",
400		},
401	}
402
403	for _, tc := range cases {
404		t.Run(tc.name, func(t *testing.T) {
405			perms := tc.setup()
406
407			setUserRoles := func() {
408				perms.SetUserRoles(cross, tc.user, tc.roles...)
409			}
410
411			if tc.err != "" {
412				urequire.AbortsWithMessage(t, tc.err, setUserRoles, "expected an error")
413				return
414			} else {
415				urequire.NotAborts(t, setUserRoles, "expected no error")
416			}
417
418			roles := perms.GetUserRoles(tc.user)
419			uassert.Equal(t, len(tc.roles), len(roles))
420			for i, r := range roles {
421				urequire.Equal(t, string(tc.roles[i]), string(r))
422			}
423		})
424	}
425}
426
427func TestBasicPermissionsRemoveUser(t *testing.T) {
428	cases := []struct {
429		name  string
430		user  address
431		setup func() *BasicPermissions
432		want  bool
433	}{
434		{
435			name: "ok",
436			user: address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"),
437			setup: func() *BasicPermissions {
438				perms := NewBasicPermissions()
439				perms.SetUserRoles(cross, "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5")
440				return perms
441			},
442			want: true,
443		},
444		{
445			name: "user not found",
446			user: address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"),
447			setup: func() *BasicPermissions {
448				return NewBasicPermissions()
449			},
450		},
451	}
452
453	for _, tc := range cases {
454		t.Run(tc.name, func(t *testing.T) {
455			perms := tc.setup()
456			got := perms.RemoveUser(cross, tc.user)
457			uassert.Equal(t, tc.want, got)
458		})
459	}
460}
461
462func TestBasicPermissionsIterateUsers(t *testing.T) {
463	users := []boards.User{
464		{
465			Address: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",
466			Roles:   []boards.Role{"foo"},
467		},
468		{
469			Address: "g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj",
470			Roles:   []boards.Role{"bar", "foo"},
471		},
472		{
473			Address: "g1vh7krmmzfua5xjmkatvmx09z37w34lsvd2mxa5",
474			Roles:   []boards.Role{"bar"},
475		},
476	}
477
478	perms := NewBasicPermissions()
479	perms.AddRole("foo", "perm1")
480	perms.AddRole("bar", "perm2")
481	for _, u := range users {
482		perms.SetUserRoles(cross, u.Address, u.Roles...)
483	}
484
485	cases := []struct {
486		name               string
487		start, count, want int
488	}{
489		{
490			name:  "exceed users count",
491			count: 50,
492			want:  3,
493		},
494		{
495			name:  "exact users count",
496			count: 3,
497			want:  3,
498		},
499		{
500			name:  "two users",
501			start: 1,
502			count: 2,
503			want:  2,
504		},
505		{
506			name:  "one user",
507			start: 1,
508			count: 1,
509			want:  1,
510		},
511		{
512			name:  "no iteration",
513			start: 50,
514		},
515	}
516
517	for _, tc := range cases {
518		t.Run(tc.name, func(t *testing.T) {
519			var i int
520			perms.IterateUsers(0, len(users), func(u boards.User) bool {
521				urequire.True(t, i < len(users), "expect iterator to respect number of users")
522				uassert.Equal(t, users[i].Address, u.Address)
523
524				urequire.Equal(t, len(users[i].Roles), len(u.Roles), "expect number of roles to match")
525				for j := range u.Roles {
526					uassert.Equal(t, string(users[i].Roles[j]), string(u.Roles[j]))
527				}
528
529				i++
530				return false
531			})
532
533			uassert.Equal(t, i, len(users), "expect iterator to iterate all users")
534		})
535	}
536}