this repo has no description
1package rbac2_test
2
3import (
4 "database/sql"
5 "testing"
6
7 "github.com/bluesky-social/indigo/atproto/syntax"
8 _ "github.com/mattn/go-sqlite3"
9 "github.com/stretchr/testify/assert"
10 "tangled.org/core/rbac2"
11)
12
13func setup(t *testing.T) *rbac2.Enforcer {
14 enforcer, err := rbac2.NewEnforcer(":memory:")
15 assert.NoError(t, err)
16
17 return enforcer
18}
19
20func TestNewEnforcer(t *testing.T) {
21 db, err := sql.Open("sqlite3", "/tmp/test/test.db?_foreign_keys=1")
22 assert.NoError(t, err)
23
24 enforcer1, err := rbac2.NewEnforcerWithDB(db)
25 assert.NoError(t, err)
26 enforcer1.AddRepo(syntax.ATURI("at://did:plc:foo/sh.tangled.repo/reporkey"))
27 model1 := enforcer1.CaptureModel()
28
29 enforcer2, err := rbac2.NewEnforcerWithDB(db)
30 assert.NoError(t, err)
31 model2 := enforcer2.CaptureModel()
32
33 // model1.GetLogger().EnableLog(true)
34 // model1.PrintModel()
35 // model1.PrintPolicy()
36 // model1.GetLogger().EnableLog(false)
37
38 model2.GetLogger().EnableLog(true)
39 model2.PrintModel()
40 model2.PrintPolicy()
41 model2.GetLogger().EnableLog(false)
42
43 assert.Equal(t, model1, model2)
44}
45
46func TestRepoOwnerPermissions(t *testing.T) {
47 var (
48 e = setup(t)
49 ok bool
50 err error
51 fooRepo = syntax.ATURI("at://did:plc:foo/sh.tangled.repo/reporkey")
52 fooUser = syntax.DID("did:plc:foo")
53 )
54
55 assert.NoError(t, e.AddRepo(fooRepo))
56
57 ok, err = e.IsRepoOwner(fooUser, fooRepo)
58 assert.NoError(t, err)
59 assert.True(t, ok, "repo author should be repo owner")
60
61 ok, err = e.IsRepoWriteAllowed(fooUser, fooRepo)
62 assert.NoError(t, err)
63 assert.True(t, ok, "repo owner should be able to modify the repo itself")
64
65 ok, err = e.IsRepoCollaborator(fooUser, fooRepo)
66 assert.NoError(t, err)
67 assert.True(t, ok, "repo owner should inherit role role:collaborator")
68
69 ok, err = e.IsRepoSettingsWriteAllowed(fooUser, fooRepo)
70 assert.NoError(t, err)
71 assert.True(t, ok, "repo owner should inherit collaborator permissions")
72}
73
74func TestRepoCollaboratorPermissions(t *testing.T) {
75 var (
76 e = setup(t)
77 ok bool
78 err error
79 fooRepo = syntax.ATURI("at://did:plc:foo/sh.tangled.repo/reporkey")
80 barUser = syntax.DID("did:plc:bar")
81 )
82
83 assert.NoError(t, e.AddRepo(fooRepo))
84 assert.NoError(t, e.AddRepoCollaborator(barUser, fooRepo))
85
86 ok, err = e.IsRepoCollaborator(barUser, fooRepo)
87 assert.NoError(t, err)
88 assert.True(t, ok, "should set repo collaborator")
89
90 ok, err = e.IsRepoSettingsWriteAllowed(barUser, fooRepo)
91 assert.NoError(t, err)
92 assert.True(t, ok, "repo collaborator should be able to edit repo settings")
93
94 ok, err = e.IsRepoWriteAllowed(barUser, fooRepo)
95 assert.NoError(t, err)
96 assert.False(t, ok, "repo collaborator shouldn't be able to modify the repo itself")
97}
98
99func TestGetByRole(t *testing.T) {
100 var (
101 e = setup(t)
102 err error
103 fooRepo = syntax.ATURI("at://did:plc:foo/sh.tangled.repo/reporkey")
104 owner = syntax.DID("did:plc:foo")
105 collaborator1 = syntax.DID("did:plc:bar")
106 collaborator2 = syntax.DID("did:plc:baz")
107 )
108
109 assert.NoError(t, e.AddRepo(fooRepo))
110 assert.NoError(t, e.AddRepoCollaborator(collaborator1, fooRepo))
111 assert.NoError(t, e.AddRepoCollaborator(collaborator2, fooRepo))
112
113 collaborators, err := e.GetRepoCollaborators(fooRepo)
114 assert.NoError(t, err)
115 assert.ElementsMatch(t, []syntax.DID{
116 owner,
117 collaborator1,
118 collaborator2,
119 }, collaborators)
120}
121
122func TestSpindleOwnerPermissions(t *testing.T) {
123 var (
124 e = setup(t)
125 ok bool
126 err error
127 spindle = syntax.DID("did:web:spindle.example.com")
128 owner = syntax.DID("did:plc:foo")
129 member = syntax.DID("did:plc:bar")
130 )
131
132 assert.NoError(t, e.SetSpindleOwner(owner, spindle))
133 assert.NoError(t, e.AddSpindleMember(member, spindle))
134
135 ok, err = e.IsSpindleMember(owner, spindle)
136 assert.NoError(t, err)
137 assert.True(t, ok, "spindle owner is spindle member")
138
139 ok, err = e.IsSpindleMember(member, spindle)
140 assert.NoError(t, err)
141 assert.True(t, ok, "spindle member is spindle member")
142
143 ok, err = e.IsSpindleMemberInviteAllowed(owner, spindle)
144 assert.NoError(t, err)
145 assert.True(t, ok, "spindle owner can invite members")
146
147 ok, err = e.IsSpindleMemberInviteAllowed(member, spindle)
148 assert.NoError(t, err)
149 assert.False(t, ok, "spindle member cannot invite members")
150}