e2e/effectiveaccess_test.go

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

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}