internal/store/ownerguard_test.go
50 lines · 1563 bytes
1 symbol in this file
1package store
2
3import (
4 "strings"
5 "testing"
6)
7
8// repos.owner_id is polymorphic, so no foreign key can hold it. The
9// triggers from migration 0033 refuse deleting an owner that still owns
10// repositories even when the application guards are bypassed (#136).
11func TestOwnerDeleteRefusedWhileReposRemain(t *testing.T) {
12 s := open(t)
13 if err := s.MigrateUp(); err != nil {
14 t.Fatal(err)
15 }
16 uid, err := s.CreateUser("alice", false)
17 if err != nil {
18 t.Fatal(err)
19 }
20 repoID, err := s.CreateRepo("user", uid, "app", "public")
21 if err != nil {
22 t.Fatal(err)
23 }
24 if _, err := s.DB.Exec("DELETE FROM users WHERE id = ?", uid); err == nil || !strings.Contains(err.Error(), "owns repositories") {
25 t.Fatalf("direct user delete with repositories: err=%v", err)
26 }
27 oid, err := s.CreateOrg("theorg", uid)
28 if err != nil {
29 t.Fatal(err)
30 }
31 orgRepo, err := s.CreateRepo("org", oid, "site", "public")
32 if err != nil {
33 t.Fatal(err)
34 }
35 if _, err := s.DB.Exec("DELETE FROM orgs WHERE id = ?", oid); err == nil || !strings.Contains(err.Error(), "owns repositories") {
36 t.Fatalf("direct org delete with repositories: err=%v", err)
37 }
38 // Without repositories the deletes go through.
39 for _, id := range []int64{repoID, orgRepo} {
40 if err := s.DeleteRepo(id); err != nil {
41 t.Fatal(err)
42 }
43 }
44 if _, err := s.DB.Exec("DELETE FROM orgs WHERE id = ?", oid); err != nil {
45 t.Fatalf("org delete without repositories: %v", err)
46 }
47 if _, err := s.DB.Exec("DELETE FROM users WHERE id = ?", uid); err != nil {
48 t.Fatalf("user delete without repositories: %v", err)
49 }
50}