-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathadapter_test.go
More file actions
135 lines (113 loc) · 3.06 KB
/
Copy pathadapter_test.go
File metadata and controls
135 lines (113 loc) · 3.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package pgxadapter
import (
"os"
"sort"
"strings"
"testing"
"github.com/casbin/casbin/v3"
"github.com/casbin/casbin/v3/util"
)
func TestAdapter(t *testing.T) {
// Use env var or default
connString := os.Getenv("PG_CONN_STR")
if connString == "" {
connString = "postgres://postgres:password@localhost:5432/test"
}
// Create adapter
a, err := NewAdapter(connString)
if err != nil {
t.Skipf("Skipping test, failed to connect to database: %v", err)
}
defer a.Close()
// Initialize basic enforcer
e, err := casbin.NewEnforcer("rbac_model.conf", a)
if err != nil {
t.Fatalf("Failed to create enforcer: %v", err)
}
// Clear existing policies
if err := a.SavePolicy(e.GetModel()); err != nil {
t.Fatalf("Failed to clear policy: %v", err)
}
// Test SavePolicy
e.AddPolicy("alice", "data1", "read")
e.AddPolicy("bob", "data2", "write")
e.AddGroupingPolicy("alice", "data2_admin")
if err := e.SavePolicy(); err != nil {
t.Fatalf("Failed to save policy: %v", err)
}
e.ClearPolicy()
if err := e.LoadPolicy(); err != nil {
t.Fatalf("Failed to load policy: %v", err)
}
testGetPolicy(t, e, [][]string{
{"alice", "data1", "read"},
{"bob", "data2", "write"},
{"alice", "data2_admin"},
})
// Test AddPolicy
if _, err := e.AddPolicy("charlie", "data3", "read"); err != nil {
t.Fatalf("Failed to add policy: %v", err)
}
e.ClearPolicy()
if err := e.LoadPolicy(); err != nil {
t.Fatalf("Failed to load policy: %v", err)
}
testGetPolicy(t, e, [][]string{
{"alice", "data1", "read"},
{"bob", "data2", "write"},
{"charlie", "data3", "read"},
{"alice", "data2_admin"},
})
// Test RemovePolicy
if _, err := e.RemovePolicy("charlie", "data3", "read"); err != nil {
t.Fatalf("Failed to remove policy: %v", err)
}
e.ClearPolicy()
if err := e.LoadPolicy(); err != nil {
t.Fatalf("Failed to load policy: %v", err)
}
testGetPolicy(t, e, [][]string{
{"alice", "data1", "read"},
{"bob", "data2", "write"},
{"alice", "data2_admin"},
})
// Test RemoveFilteredPolicy
if _, err := e.RemoveFilteredPolicy(0, "alice"); err != nil {
t.Fatalf("Failed to remove filtered policy: %v", err)
}
e.ClearPolicy()
if err := e.LoadPolicy(); err != nil {
t.Fatalf("Failed to load policy: %v", err)
}
testGetPolicy(t, e, [][]string{
{"bob", "data2", "write"},
{"alice", "data2_admin"},
})
}
func testGetPolicy(t *testing.T, e *casbin.Enforcer, res [][]string) {
t.Helper()
myRes, err := e.GetPolicy()
if err != nil {
t.Errorf("Failed to get policy: %v", err)
}
// append grouping policies
groupingPolicies, err := e.GetGroupingPolicy()
if err != nil {
t.Errorf("Failed to get grouping policy: %v", err)
}
myRes = append(myRes, groupingPolicies...)
if !util.Array2DEquals(res, myRes) {
// try sorting
// simple sort based on string representation
sortPolicies(res)
sortPolicies(myRes)
if !util.Array2DEquals(res, myRes) {
t.Errorf("Policy check failed: expected %v, got %v", res, myRes)
}
}
}
func sortPolicies(pol [][]string) {
sort.Slice(pol, func(i, j int) bool {
return strings.Join(pol[i], ",") < strings.Join(pol[j], ",")
})
}