internal/control/repotransfer_test.go
70 lines · 2184 bytes
1package control
2
3import (
4 "os"
5 "path/filepath"
6 "testing"
7
8 "gitbay.org/gitbay/internal/protocol"
9)
10
11// A transfer into an org folds the repository's same-named labels into
12// the org's rows. The directory moves first, so a move that fails leaves
13// the record, and the fold, untouched (#212).
14func TestRepoTransferMovesDirectoryBeforeRecord(t *testing.T) {
15 f := newOrgFixture(t)
16 root := t.TempDir()
17 if err := f.st.SetLabel(f.app, "bug", "#00ff00"); err != nil {
18 t.Fatal(err)
19 }
20 if _, err := f.st.SetOrgLabel(f.org, "bug", "#ff0000"); err != nil {
21 t.Fatal(err)
22 }
23 oldDir := RepoDir(root, "alice", "app")
24 newDir := RepoDir(root, "acme", "app")
25 if err := os.MkdirAll(oldDir, 0o750); err != nil {
26 t.Fatal(err)
27 }
28 // A file where the org's directory must go makes the move fail.
29 if err := os.WriteFile(filepath.Dir(newDir), nil, 0o600); err != nil {
30 t.Fatal(err)
31 }
32 repoLabels := func() int {
33 var n int
34 f.st.DB.QueryRow("SELECT COUNT(*) FROM labels WHERE repo_id = ?", f.app.ID).Scan(&n)
35 return n
36 }
37 run := func() (int, string) {
38 c, out := f.ctx(f.alice)
39 c.Cfg.Server.Root = root
40 return runRepoTransfer(c, []string{"alice/app", "acme"}), out.String()
41 }
42 if code, out := run(); code != protocol.ExitFailure {
43 t.Fatalf("failed move: exit %d %s", code, out)
44 }
45 if r, _ := f.st.RepoByID(f.app.ID); r.OwnerKind != "user" || r.OwnerID != f.alice {
46 t.Fatalf("owner changed after a failed move: %s/%s", r.OwnerKind, r.OwnerName)
47 }
48 if n := repoLabels(); n != 1 {
49 t.Fatalf("labels folded after a failed move: %d repo rows", n)
50 }
51 if _, err := os.Stat(oldDir); err != nil {
52 t.Fatalf("directory moved after a failed move: %v", err)
53 }
54
55 if err := os.Remove(filepath.Dir(newDir)); err != nil {
56 t.Fatal(err)
57 }
58 if code, out := run(); code != protocol.ExitOK {
59 t.Fatalf("transfer: exit %d %s", code, out)
60 }
61 if r, _ := f.st.RepoByID(f.app.ID); r.OwnerKind != "org" || r.OwnerID != f.org {
62 t.Fatalf("owner after transfer: %s/%s", r.OwnerKind, r.OwnerName)
63 }
64 if n := repoLabels(); n != 0 {
65 t.Fatalf("labels not folded after transfer: %d repo rows", n)
66 }
67 if _, err := os.Stat(newDir); err != nil {
68 t.Fatalf("directory not moved: %v", err)
69 }
70}