e2e/effectiveaccess_test.go
68 lines · 2605 bytes
1package e2e
2
3import (
4 "strings"
5 "testing"
6)
7
8// repo access list reports effective access with its source, and an
9// outsider gets one answer about an org: it exists and has members;
10// its teams are not theirs to see (#200).
11func TestEffectiveAccessAndOutsiders(t *testing.T) {
12 inst := startInstance(t)
13 keys := map[string]string{}
14 for _, u := range []string{"alice", "bob", "carol", "dave", "eve"} {
15 keys[u] = inst.newKey(t, u)
16 inst.admin(t, "admin", "user", "create", u, "--key", keys[u]+".pub")
17 }
18 for _, args := range [][]string{
19 {"org", "create", "acme"},
20 {"org", "members", "add", "acme", "bob"},
21 {"org", "members", "add", "acme", "carol"},
22 {"org", "members", "add", "acme", "dave"},
23 {"org", "settings", "members-role", "acme", "read"},
24 {"repo", "create", "acme/core", "--private"},
25 {"org", "team", "create", "acme", "core"},
26 {"org", "team", "add", "acme", "core", "bob"},
27 {"org", "team", "grant", "acme", "core", "acme/core", "write"},
28 {"repo", "access", "grant", "acme/core", "carol", "admin"},
29 } {
30 if _, errOut, code := inst.ssh(t, keys["alice"], "", args...); code != 0 {
31 t.Fatalf("%v: %s", args, errOut)
32 }
33 }
34 out, _, code := inst.ssh(t, keys["alice"], "", "repo", "access", "list", "acme/core", "--json")
35 if code != 0 {
36 t.Fatalf("access list: %s", out)
37 }
38 for _, want := range []string{
39 `{"user":"alice","role":"admin","source":"org admin"}`,
40 `{"user":"bob","role":"write","source":"team core"}`,
41 `{"user":"carol","role":"admin","source":"direct"}`,
42 `{"user":"dave","role":"read","source":"org member"}`,
43 } {
44 if !strings.Contains(out, want) {
45 t.Errorf("access list missing %s:\n%s", want, out)
46 }
47 }
48 if strings.Contains(out, `"eve"`) {
49 t.Errorf("outsider listed:\n%s", out)
50 }
51
52 // eve: the org and its members are public, the teams are not.
53 if _, errOut, code := inst.ssh(t, keys["eve"], "", "org", "show", "acme"); code != 0 {
54 t.Fatalf("org show for an outsider: %d %s", code, errOut)
55 }
56 if _, errOut, code := inst.ssh(t, keys["eve"], "", "org", "members", "list", "acme"); code != 0 {
57 t.Fatalf("org members list for an outsider: %d %s", code, errOut)
58 }
59 if _, errOut, code := inst.ssh(t, keys["eve"], "", "org", "team", "list", "acme"); code != 4 {
60 t.Fatalf("org team list for an outsider: %d %s", code, errOut)
61 }
62 if _, errOut, code := inst.ssh(t, keys["eve"], "", "org", "team", "show", "acme", "core"); code != 4 {
63 t.Fatalf("org team show for an outsider: %d %s", code, errOut)
64 }
65 if _, _, code := inst.ssh(t, keys["eve"], "", "org", "team", "list", "nosuch"); code != 3 {
66 t.Fatalf("missing org: %d", code)
67 }
68}