internal/store/effectiveaccess_test.go

v1.28.0
gitbay/internal/store/effectiveaccess_test.go history · blame · raw

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}