internal/store/ownerguard_test.go

v1.30.0
gitbay/internal/store/ownerguard_test.go history · blame · raw

50 lines · 1563 bytes

 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}