1
+ package utils
2
+
3
+ import (
4
+ "io/ioutil"
5
+ "os"
6
+ "testing"
7
+ "bytes"
8
+ "fmt"
9
+ "errors"
10
+ "path/filepath"
11
+ )
12
+
13
+ // MockGitHubExec is a mock of the GitHubExec interface for testing.
14
+ type MockGitHubExec struct {
15
+ ExecFunc func (args ... string ) (stdout , stderr bytes.Buffer , err error )
16
+ }
17
+
18
+ func (m * MockGitHubExec ) Exec (args ... string ) (stdout , stderr bytes.Buffer , err error ) {
19
+ return m .ExecFunc (args ... )
20
+ }
21
+
22
+
23
+ func TestCloneRepository (t * testing.T ) {
24
+ tmpDir , err := ioutil .TempDir ("" , "cloneTest" )
25
+ if err != nil {
26
+ t .Fatalf ("Failed to create temp directory: %v" , err )
27
+ }
28
+ defer os .RemoveAll (tmpDir ) // clean up
29
+ // Test cases
30
+ tests := []struct {
31
+ name string
32
+ execMock * MockGitHubExec
33
+ clonePath string
34
+ repoFullName string
35
+ wantErr bool
36
+ errMsg string
37
+ }{
38
+ {
39
+ name : "successful clone" ,
40
+ execMock : & MockGitHubExec {
41
+ ExecFunc : func (args ... string ) (stdout bytes.Buffer , stderr bytes.Buffer , err error ) {
42
+ var stdoutBuf , stderrBuf bytes.Buffer
43
+ stdoutBuf .Write ([]byte ("your string here" ))
44
+ return stdoutBuf , stderrBuf , nil
45
+ },
46
+ },
47
+ clonePath : "" , // Will be set to a temp directory in the test
48
+ repoFullName : "example/repo" ,
49
+ wantErr : false ,
50
+ },
51
+ {
52
+ name : "clone failure" ,
53
+ execMock : & MockGitHubExec {
54
+ ExecFunc : func (args ... string ) (stdout bytes.Buffer , stderr bytes.Buffer , err error ) {
55
+ var stdoutBuf , stderrBuf bytes.Buffer
56
+ return stdoutBuf , stderrBuf , errors .New ("clone error" )
57
+ },
58
+ },
59
+ clonePath : filepath .Join (tmpDir , "repo" ),
60
+ repoFullName : "example/repo" ,
61
+ wantErr : true ,
62
+ errMsg : "error cloning example/repo: clone error" ,
63
+ },
64
+ {
65
+ name : "repository already exists" ,
66
+ execMock : & MockGitHubExec {
67
+ ExecFunc : func (args ... string ) (stdout bytes.Buffer , stderr bytes.Buffer , err error ) {
68
+ var stdoutBuf , stderrBuf bytes.Buffer
69
+ return stdoutBuf , stderrBuf , nil
70
+ },
71
+ },
72
+ clonePath : "./repo" , // Current directory always exists
73
+ repoFullName : "example/repo" ,
74
+ wantErr : true ,
75
+ errMsg : "repository already exists: ." ,
76
+ },
77
+ }
78
+
79
+
80
+ for _ , tt := range tests {
81
+ t .Run (tt .name , func (t * testing.T ) {
82
+ if tt .name == "successful clone" {
83
+ fmt .Println ("Running successful clone test" )
84
+ tmpDir , err := ioutil .TempDir ("" , "cloneTest" )
85
+ if err != nil {
86
+ t .Fatalf ("Failed to create temp directory: %v" , err )
87
+ }
88
+ defer os .RemoveAll (tmpDir ) // clean up
89
+ tt .clonePath = filepath .Join (tmpDir , "repo" )
90
+ }
91
+
92
+
93
+ fmt .Println ("Running test" , tt .name , "with clonePath" , tt .clonePath , "and repoFullName" , tt .repoFullName )
94
+ err := CloneRepository (tt .clonePath , tt .repoFullName , tt .execMock )
95
+ if err != nil && err .Error () != tt .errMsg {
96
+ t .Errorf ("CloneRepository() error = %v, wantErr %v" , err , tt .wantErr )
97
+ }
98
+ })
99
+ }
100
+ }
0 commit comments