permissions_test.go
1package abac
2
3import (
4 "testing"
5
6 "github.com/stretchr/testify/assert"
7)
8
9func p(p ...Permission) []Permission {
10 return p
11}
12
13func TestAdd(t *testing.T) {
14 tt := []struct {
15 name string
16 set Permission
17 can []Permission
18 cannot []Permission
19 }{
20 {"private", Private, nil, p(Read, Write, Delete, Admin)},
21 {"read", Read, p(Read), p(Write, Delete, Admin)},
22 {"write", Write, p(Read, Write), p(Delete, Admin)},
23 {"delete", Delete, p(Read, Write, Delete), nil},
24 {"admin", Admin, p(Read, Write, Delete, Admin), nil},
25 {"R&W", Read | Write, p(Read, Write), p(Delete, Admin)},
26 {"R&A", Read | Admin, p(Read, Write, Delete, Admin), nil},
27 {"Ban", Ban, nil, p(Read, Write, Delete, Admin)},
28 {"God", God, p(Read, Write, Delete, Admin, God, Ban), nil},
29 }
30
31 for _, tc := range tt {
32 t.Run(tc.name, func(t *testing.T) {
33 a := Add(None, tc.set)
34 for _, p := range tc.can {
35 assert.True(t, Has(a, p))
36 }
37 for _, p := range tc.cannot {
38 assert.False(t, Has(a, p))
39 }
40 })
41 }
42}
43
44func TestRemove(t *testing.T) {
45 tt := []struct {
46 name string
47 set Permission
48 remove Permission
49 can []Permission
50 cannot []Permission
51 }{
52 {"read/read", Read, Read, nil, p(Read, Write, Delete, Admin)},
53 {"write/read", Write, Read, nil, p(Read, Write, Delete, Admin)},
54 {"write/write", Write, Write, p(Read), p(Write, Delete, Admin)},
55 {"admin/write", Admin, Write, p(Read), p(Write, Delete, Admin)},
56 {"read/admin", Read, Admin, p(Read), p(Write, Delete, Admin)},
57 {"write/admin", Write, Admin, p(Read, Write), p(Delete, Admin)},
58 {"private/write", Private, Write, nil, p(Read, Write, Delete, Admin)},
59 }
60
61 for _, tc := range tt {
62 t.Run(tc.name, func(t *testing.T) {
63 a := Add(None, tc.set)
64 a = Remove(a, tc.remove)
65 for _, p := range tc.can {
66 assert.True(t, Has(a, p))
67 }
68 for _, p := range tc.cannot {
69 assert.False(t, Has(a, p))
70 }
71 })
72 }
73}