e2e/effectiveaccess_test.go
69 lines · 2619 bytes
1 symbol in this file
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 t.Parallel()
13 inst := startInstance(t)
14 keys := map[string]string{}
15 for _, u := range []string{"alice", "bob", "carol", "dave", "eve"} {
16 keys[u] = inst.newKey(t, u)
17 inst.admin(t, "admin", "user", "create", u, "--key", keys[u]+".pub")
18 }
19 for _, args := range [][]string{
20 {"org", "create", "acme"},
21 {"org", "members", "add", "acme", "bob"},
22 {"org", "members", "add", "acme", "carol"},
23 {"org", "members", "add", "acme", "dave"},
24 {"org", "settings", "members-role", "acme", "read"},
25 {"repo", "create", "acme/core", "--private"},
26 {"org", "team", "create", "acme", "core"},
27 {"org", "team", "add", "acme", "core", "bob"},
28 {"org", "team", "grant", "acme", "core", "acme/core", "write"},
29 {"repo", "access", "grant", "acme/core", "carol", "admin"},
30 } {
31 if _, errOut, code := inst.ssh(t, keys["alice"], "", args...); code != 0 {
32 t.Fatalf("%v: %s", args, errOut)
33 }
34 }
35 out, _, code := inst.ssh(t, keys["alice"], "", "repo", "access", "list", "acme/core", "--json")
36 if code != 0 {
37 t.Fatalf("access list: %s", out)
38 }
39 for _, want := range []string{
40 `{"user":"alice","role":"admin","source":"org admin"}`,
41 `{"user":"bob","role":"write","source":"team core"}`,
42 `{"user":"carol","role":"admin","source":"direct"}`,
43 `{"user":"dave","role":"read","source":"org member"}`,
44 } {
45 if !strings.Contains(out, want) {
46 t.Errorf("access list missing %s:\n%s", want, out)
47 }
48 }
49 if strings.Contains(out, `"eve"`) {
50 t.Errorf("outsider listed:\n%s", out)
51 }
52
53 // eve: the org and its members are public, the teams are not.
54 if _, errOut, code := inst.ssh(t, keys["eve"], "", "org", "show", "acme"); code != 0 {
55 t.Fatalf("org show for an outsider: %d %s", code, errOut)
56 }
57 if _, errOut, code := inst.ssh(t, keys["eve"], "", "org", "members", "list", "acme"); code != 0 {
58 t.Fatalf("org members list for an outsider: %d %s", code, errOut)
59 }
60 if _, errOut, code := inst.ssh(t, keys["eve"], "", "org", "team", "list", "acme"); code != 4 {
61 t.Fatalf("org team list for an outsider: %d %s", code, errOut)
62 }
63 if _, errOut, code := inst.ssh(t, keys["eve"], "", "org", "team", "show", "acme", "core"); code != 4 {
64 t.Fatalf("org team show for an outsider: %d %s", code, errOut)
65 }
66 if _, _, code := inst.ssh(t, keys["eve"], "", "org", "team", "list", "nosuch"); code != 3 {
67 t.Fatalf("missing org: %d", code)
68 }
69}