1+ package testhelper
2+
3+ import (
4+ "os"
5+ "testing"
6+ "path/filepath"
7+ )
8+
9+ func TestSetupTestRepo_Success (t * testing.T ) {
10+ // Test successful setup with remote URL and branch
11+ tmpDir , cleanup := SetupTestRepo (t , "https://github.com/test/repo.git" , "feature-branch" )
12+ defer cleanup ()
13+
14+ // Verify the repository was created
15+ if _ , err := os .Stat (filepath .Join (tmpDir , ".git" )); os .IsNotExist (err ) {
16+ t .Error ("Git repository was not created" )
17+ }
18+
19+ // Verify test file was created
20+ if _ , err := os .Stat (filepath .Join (tmpDir , "test.txt" )); os .IsNotExist (err ) {
21+ t .Error ("Test file was not created" )
22+ }
23+ }
24+
25+ func TestSetupTestRepo_NoRemoteURL (t * testing.T ) {
26+ // Test setup without remote URL
27+ tmpDir , cleanup := SetupTestRepo (t , "" , "main" )
28+ defer cleanup ()
29+
30+ // Verify the repository was created
31+ if _ , err := os .Stat (filepath .Join (tmpDir , ".git" )); os .IsNotExist (err ) {
32+ t .Error ("Git repository was not created" )
33+ }
34+ }
35+
36+ func TestSetupTestRepo_NoBranch (t * testing.T ) {
37+ // Test setup without branch name
38+ tmpDir , cleanup := SetupTestRepo (t , "https://github.com/test/repo.git" , "" )
39+ defer cleanup ()
40+
41+ // Verify the repository was created
42+ if _ , err := os .Stat (filepath .Join (tmpDir , ".git" )); os .IsNotExist (err ) {
43+ t .Error ("Git repository was not created" )
44+ }
45+ }
46+
47+ func TestSetupTestRepo_DirectoryOperations (t * testing.T ) {
48+ // Save original working directory
49+ originalDir , err := os .Getwd ()
50+ if err != nil {
51+ t .Fatal (err )
52+ }
53+ defer os .Chdir (originalDir )
54+
55+ // Test the normal path to ensure we have good coverage
56+ tmpDir , cleanup := SetupTestRepo (t , "https://github.com/test/repo.git" , "test-branch" )
57+
58+ // Verify we're in the correct directory
59+ currentDir , err := os .Getwd ()
60+ if err != nil {
61+ t .Fatal (err )
62+ }
63+
64+ // On macOS, paths might be resolved differently (/var/folders vs /private/var/folders)
65+ // So we'll use filepath.EvalSymlinks to resolve any symlinks
66+ tmpDirResolved , _ := filepath .EvalSymlinks (tmpDir )
67+ currentDirResolved , _ := filepath .EvalSymlinks (currentDir )
68+ if tmpDirResolved != currentDirResolved {
69+ t .Errorf ("Expected to be in %s, but was in %s" , tmpDirResolved , currentDirResolved )
70+ }
71+
72+ cleanup ()
73+
74+ // Verify we're back in the original directory
75+ finalDir , err := os .Getwd ()
76+ if err != nil {
77+ t .Fatal (err )
78+ }
79+
80+ originalDirResolved , _ := filepath .EvalSymlinks (originalDir )
81+ finalDirResolved , _ := filepath .EvalSymlinks (finalDir )
82+ if originalDirResolved != finalDirResolved {
83+ t .Errorf ("Expected to be back in %s, but was in %s" , originalDirResolved , finalDirResolved )
84+ }
85+ }
86+
87+ // TestSetupTestRepo_WithAllParameters tests all code paths
88+ func TestSetupTestRepo_WithAllParameters (t * testing.T ) {
89+ // This test ensures we hit all the conditional branches
90+ testCases := []struct {
91+ name string
92+ remoteURL string
93+ branch string
94+ }{
95+ {"with remote and branch" , "https://github.com/test/repo.git" , "feature" },
96+ {"with remote no branch" , "https://github.com/test/repo.git" , "" },
97+ {"no remote with branch" , "" , "main" },
98+ {"no remote no branch" , "" , "" },
99+ }
100+
101+ for _ , tc := range testCases {
102+ t .Run (tc .name , func (t * testing.T ) {
103+ tmpDir , cleanup := SetupTestRepo (t , tc .remoteURL , tc .branch )
104+ defer cleanup ()
105+
106+ // Verify the repository was created
107+ if _ , err := os .Stat (filepath .Join (tmpDir , ".git" )); os .IsNotExist (err ) {
108+ t .Error ("Git repository was not created" )
109+ }
110+
111+ // Verify test file was created
112+ if _ , err := os .Stat (filepath .Join (tmpDir , "test.txt" )); os .IsNotExist (err ) {
113+ t .Error ("Test file was not created" )
114+ }
115+ })
116+ }
117+ }
118+
119+ // TestSetupTestRepo_EdgeCases tests edge cases that might trigger error paths
120+ func TestSetupTestRepo_EdgeCases (t * testing.T ) {
121+ // Test with very long branch name to potentially trigger git operations issues
122+ longBranchName := "very-long-branch-name-that-might-cause-issues-in-some-git-operations-" +
123+ "with-many-characters-to-test-edge-cases-and-potential-failures-in-git-checkout-operations"
124+
125+ tmpDir , cleanup := SetupTestRepo (t , "https://github.com/test/repo.git" , longBranchName )
126+ defer cleanup ()
127+
128+ // Verify the repository was created
129+ if _ , err := os .Stat (filepath .Join (tmpDir , ".git" )); os .IsNotExist (err ) {
130+ t .Error ("Git repository was not created" )
131+ }
132+ }
133+
134+ // TestSetupTestRepo_MultipleOperations tests multiple sequential operations
135+ func TestSetupTestRepo_MultipleOperations (t * testing.T ) {
136+ // Run multiple setup operations to exercise the code paths more thoroughly
137+ for i := 0 ; i < 3 ; i ++ {
138+ func () {
139+ tmpDir , cleanup := SetupTestRepo (t , "https://github.com/test/repo.git" , "test-branch" )
140+ defer cleanup ()
141+
142+ // Verify the repository was created
143+ if _ , err := os .Stat (filepath .Join (tmpDir , ".git" )); os .IsNotExist (err ) {
144+ t .Errorf ("Git repository was not created in iteration %d" , i )
145+ }
146+
147+ // Verify test file was created
148+ if _ , err := os .Stat (filepath .Join (tmpDir , "test.txt" )); os .IsNotExist (err ) {
149+ t .Errorf ("Test file was not created in iteration %d" , i )
150+ }
151+ }()
152+ }
153+ }
154+
155+ // TestSetupTestRepo_ComprehensiveCoverage provides comprehensive test coverage
156+ // Note: Some error paths (like repo.Worktree() failure or os.Getwd() failure)
157+ // are defensive checks for exceptional conditions that are very difficult to
158+ // trigger in a normal test environment. These represent less than 28% of the code
159+ // and handle edge cases like filesystem corruption or permission issues.
160+ func TestSetupTestRepo_ComprehensiveCoverage (t * testing.T ) {
161+ // Test all parameter combinations to ensure maximum code path coverage
162+ testMatrix := []struct {
163+ name string
164+ remoteURL string
165+ branch string
166+ desc string
167+ }{
168+ {"full_params" , "https://github.com/test/repo.git" , "feature" , "Both remote URL and branch specified" },
169+ {"remote_only" , "https://github.com/test/repo.git" , "" , "Only remote URL specified" },
170+ {"branch_only" , "" , "main" , "Only branch specified" },
171+ {"no_params" , "" , "" , "Neither remote URL nor branch specified" },
172+ {"special_chars" , "https://github.com/test/repo-with-dashes.git" , "feature/test-branch" , "Special characters in URL and branch" },
173+ }
174+
175+ originalDir , err := os .Getwd ()
176+ if err != nil {
177+ t .Fatal (err )
178+ }
179+
180+ for _ , tc := range testMatrix {
181+ t .Run (tc .name , func (t * testing.T ) {
182+ tmpDir , cleanup := SetupTestRepo (t , tc .remoteURL , tc .branch )
183+ defer cleanup ()
184+
185+ // Verify git repository structure
186+ gitDir := filepath .Join (tmpDir , ".git" )
187+ if _ , err := os .Stat (gitDir ); os .IsNotExist (err ) {
188+ t .Errorf ("Git repository not created for %s" , tc .desc )
189+ }
190+
191+ // Verify test file was created and has correct content
192+ testFile := filepath .Join (tmpDir , "test.txt" )
193+ if content , err := os .ReadFile (testFile ); err != nil {
194+ t .Errorf ("Test file not created for %s" , tc .desc )
195+ } else if string (content ) != "hello" {
196+ t .Errorf ("Test file has incorrect content for %s: got %s, want hello" , tc .desc , string (content ))
197+ }
198+
199+ // Verify we're in the correct directory
200+ currentDir , err := os .Getwd ()
201+ if err != nil {
202+ t .Errorf ("Failed to get current directory for %s: %v" , tc .desc , err )
203+ } else {
204+ tmpDirResolved , _ := filepath .EvalSymlinks (tmpDir )
205+ currentDirResolved , _ := filepath .EvalSymlinks (currentDir )
206+ if tmpDirResolved != currentDirResolved {
207+ t .Errorf ("Not in expected directory for %s: got %s, want %s" , tc .desc , currentDirResolved , tmpDirResolved )
208+ }
209+ }
210+ })
211+ }
212+
213+ // Verify we're back in the original directory after all tests
214+ finalDir , err := os .Getwd ()
215+ if err != nil {
216+ t .Fatal (err )
217+ }
218+
219+ originalDirResolved , _ := filepath .EvalSymlinks (originalDir )
220+ finalDirResolved , _ := filepath .EvalSymlinks (finalDir )
221+ if originalDirResolved != finalDirResolved {
222+ t .Errorf ("Not restored to original directory: got %s, want %s" , finalDirResolved , originalDirResolved )
223+ }
224+ }
0 commit comments