internal/control/idreuse_test.go
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}