internal/control/repotransfer_test.go

e9566eed86ebcd185c4b85f63d667b5e671fe787
gitbay/internal/control/repotransfer_test.go history · blame · raw

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}