internal/control/idreuse_test.go

v1.40.0
gitbay/internal/control/idreuse_test.go history · blame · raw

95 lines · 2872 bytes

 1package control
 2
 3import (
 4	"fmt"
 5	"testing"
 6	"time"
 7
 8	"gitbay.org/gitbay/internal/policy"
 9)
10
11// A deploy key names its repository by id in its scope. Deleting the
12// repository removes the key, and the next repository does not take the
13// id, so the key opens nothing either way (#306).
14func TestDeployKeyOfDeletedRepository(t *testing.T) {
15	st, _, uid := newQueueTestRepo(t)
16	goneID, err := st.CreateRepo("user", uid, "gone", "private")
17	if err != nil {
18		t.Fatal(err)
19	}
20	scope := fmt.Sprintf("deploy:%d:rw", goneID)
21	if err := st.AddSSHKey(uid, "SHA256:deploy", "ssh-ed25519", []byte("d"), scope, ""); err != nil {
22		t.Fatal(err)
23	}
24	if err := st.DeleteRepo(goneID); err != nil {
25		t.Fatal(err)
26	}
27	nextID, err := st.CreateRepo("user", uid, "next", "private")
28	if err != nil {
29		t.Fatal(err)
30	}
31	if policy.DeployScopeAllows(scope, nextID, false) {
32		t.Fatalf("the deleted repository's deploy key reads repository %d", nextID)
33	}
34}
35
36// A grant names its account by id. Deleting the account removes the
37// grant, and the next account does not take the id (#306).
38func TestGrantOfDeletedAccount(t *testing.T) {
39	st, repo, _ := newQueueTestRepo(t)
40	carol, err := st.CreateUser("carol", false)
41	if err != nil {
42		t.Fatal(err)
43	}
44	if err := st.GrantAccess(repo.ID, carol, "admin"); err != nil {
45		t.Fatal(err)
46	}
47	if err := st.DeleteUser(carol); err != nil {
48		t.Fatal(err)
49	}
50	dave, err := st.CreateUser("dave", false)
51	if err != nil {
52		t.Fatal(err)
53	}
54	if role, err := st.AccessRole(repo.ID, dave); err != nil || role != "" {
55		t.Fatalf("new account's role on the repository: %q, %v", role, err)
56	}
57}
58
59// A merge queued with a key that is then removed stays refused when a
60// new key is added: key_id is set to NULL on removal and the new key has
61// an id of its own (#289, #306).
62func TestQueuedMergeKeyRemovedThenNewKey(t *testing.T) {
63	st, repo, uid := newQueueTestRepo(t)
64	if err := st.AddSSHKey(uid, "SHA256:k1", "ssh-ed25519", []byte("k1"), "full", ""); err != nil {
65		t.Fatal(err)
66	}
67	k1, err := st.SSHKeyByFingerprint("SHA256:k1")
68	if err != nil {
69		t.Fatal(err)
70	}
71	if _, err := st.CreateMR(repo.ID, uid, repo.ID, "feature", "main", "t", "", "abc", "md", false); err != nil {
72		t.Fatal(err)
73	}
74	mr, err := st.MRByNumber(repo.ID, 1)
75	if err != nil {
76		t.Fatal(err)
77	}
78	mrID := mr.ID
79	if err := st.QueueMerge(mrID, uid, "", k1.ID, 0); err != nil {
80		t.Fatal(err)
81	}
82	if err := st.RemoveSSHKey(uid, "SHA256:k1"); err != nil {
83		t.Fatal(err)
84	}
85	if err := st.AddSSHKey(uid, "SHA256:k2", "ssh-ed25519", []byte("k2"), "full", ""); err != nil {
86		t.Fatal(err)
87	}
88	if k2, _ := st.SSHKeyByFingerprint("SHA256:k2"); k2.ID == k1.ID {
89		t.Fatalf("new key took the removed key's id %d", k1.ID)
90	}
91	reason, err := queueCredentialLapsed(st, mrID, time.Now())
92	if err != nil || reason != "the key it was queued with was removed" {
93		t.Fatalf("lapsed = %q, %v", reason, err)
94	}
95}