gogit_testing.go

 1package repository
 2
 3import (
 4	"log"
 5	"path/filepath"
 6	"strings"
 7	"testing"
 8
 9	"github.com/99designs/keyring"
10)
11
12type TestingT interface {
13	Cleanup(func())
14	Helper()
15	TempDir() string
16}
17
18const namespace = "git-bug"
19
20// This is intended for testing only
21
22func CreateGoGitTestRepo(t TestingT, bare bool) TestedRepo {
23	t.Helper()
24
25	dir := t.TempDir()
26
27	var creator func(string, string) (*GoGitRepo, error)
28
29	if bare {
30		creator = InitBareGoGitRepo
31	} else {
32		creator = InitGoGitRepo
33	}
34
35	repo, err := creator(dir, namespace)
36	if err != nil {
37		log.Fatal(err)
38	}
39
40	t.Cleanup(func() {
41		repo.Close()
42	})
43
44	config := repo.LocalConfig()
45	if err := config.StoreString("user.name", "testuser"); err != nil {
46		log.Fatal("failed to set user.name for test repository: ", err)
47	}
48	if err := config.StoreString("user.email", "testuser@example.com"); err != nil {
49		log.Fatal("failed to set user.email for test repository: ", err)
50	}
51
52	// make sure we use a mock keyring for testing to not interact with the global system
53	return &replaceKeyring{
54		TestedRepo: repo,
55		keyring:    keyring.NewArrayKeyring(nil),
56	}
57}
58
59func SetupGoGitReposAndRemote(t *testing.T) (repoA, repoB, remote TestedRepo) {
60	t.Helper()
61
62	repoA = CreateGoGitTestRepo(t, false)
63	repoB = CreateGoGitTestRepo(t, false)
64	remote = CreateGoGitTestRepo(t, true)
65
66	err := repoA.AddRemote("origin", remote.GetLocalRemote())
67	if err != nil {
68		log.Fatal(err)
69	}
70
71	err = repoB.AddRemote("origin", remote.GetLocalRemote())
72	if err != nil {
73		log.Fatal(err)
74	}
75
76	return repoA, repoB, remote
77}
78
79func RepoDir(t *testing.T, repo TestedRepo) string {
80	t.Helper()
81
82	dir := repo.GetLocalRemote()
83	if strings.HasSuffix(dir, ".git") {
84		dir, _ = filepath.Split(dir)
85	}
86
87	if dir[len(dir)-1] == filepath.Separator {
88		dir = dir[:len(dir)-1]
89	}
90
91	return dir
92}