e2e/effectiveaccess_test.go

v1.40.0
gitbay/e2e/effectiveaccess_test.go history · blame · raw

69 lines · 2619 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	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}