internal/store/effectiveaccess_test.go
83 lines · 1957 bytes
1package store
2
3import "testing"
4
5// EffectiveAccess folds owner, org roles, team grants and direct grants
6// into one row per account carrying the highest role and its source
7// (#200).
8func TestEffectiveAccess(t *testing.T) {
9 s := open(t)
10 if err := s.MigrateUp(); err != nil {
11 t.Fatal(err)
12 }
13 mk := func(name string) int64 {
14 id, err := s.CreateUser(name, false)
15 if err != nil {
16 t.Fatal(err)
17 }
18 return id
19 }
20 alice, bob, carol, dave, eve := mk("alice"), mk("bob"), mk("carol"), mk("dave"), mk("eve")
21 oid, err := s.CreateOrg("acme", alice)
22 if err != nil {
23 t.Fatal(err)
24 }
25 for _, u := range []int64{bob, carol, dave} {
26 if err := s.SetOrgMember(oid, u, "member"); err != nil {
27 t.Fatal(err)
28 }
29 }
30 if err := s.SetOrgMembersRole(oid, "read"); err != nil {
31 t.Fatal(err)
32 }
33 repo, err := s.CreateRepo("org", oid, "core", "private")
34 if err != nil {
35 t.Fatal(err)
36 }
37 team, err := s.CreateTeam(oid, "core")
38 if err != nil {
39 t.Fatal(err)
40 }
41 if err := s.AddTeamMember(team, bob); err != nil {
42 t.Fatal(err)
43 }
44 if err := s.GrantTeamRepo(team, repo, "write"); err != nil {
45 t.Fatal(err)
46 }
47 if err := s.GrantAccess(repo, carol, "admin"); err != nil {
48 t.Fatal(err)
49 }
50 _ = eve
51
52 got, err := s.EffectiveAccess(repo)
53 if err != nil {
54 t.Fatal(err)
55 }
56 want := []EffectiveEntry{
57 {"alice", "admin", "org admin"},
58 {"bob", "write", "team core"},
59 {"carol", "admin", "direct"},
60 {"dave", "read", "org member"},
61 }
62 if len(got) != len(want) {
63 t.Fatalf("got %v, want %v", got, want)
64 }
65 for i := range want {
66 if got[i] != want[i] {
67 t.Errorf("row %d: got %v, want %v", i, got[i], want[i])
68 }
69 }
70
71 // A user-owned repository: the owner, and nobody else.
72 own, err := s.CreateRepo("user", eve, "mine", "public")
73 if err != nil {
74 t.Fatal(err)
75 }
76 got, err = s.EffectiveAccess(own)
77 if err != nil {
78 t.Fatal(err)
79 }
80 if len(got) != 1 || got[0] != (EffectiveEntry{"eve", "admin", "owner"}) {
81 t.Fatalf("owner row: %v", got)
82 }
83}