github.com/git-hooks/git-hooks@v1.3.1/cli_test.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "github.com/google/go-github/github" 6 "github.com/stretchr/testify/assert" 7 "io" 8 "io/ioutil" 9 "net/http" 10 "net/http/httptest" 11 "os" 12 "os/exec" 13 "path/filepath" 14 "runtime" 15 "strings" 16 "testing" 17 ) 18 19 // Create temporary directory 20 func createDirectory(t *testing.T, dir string, context func(tempdir string)) { 21 tempdir, err := ioutil.TempDir(dir, "git-hooks") 22 assert.Nil(t, err) 23 24 current, err := os.Getwd() 25 assert.Nil(t, err) 26 27 err = os.Chdir(tempdir) 28 assert.Nil(t, err) 29 30 context(tempdir) 31 32 err = os.Chdir(current) 33 assert.Nil(t, err) 34 35 err = os.RemoveAll(tempdir) 36 assert.Nil(t, err) 37 } 38 39 // Create temporary git repo 40 func createGitRepo(t *testing.T, context func(tempdir string)) { 41 createDirectory(t, filepath.Join("fixtures", "repos"), func(tempdir string) { 42 cmd := exec.Command("bash", "-c", ` 43 git init; 44 git config user.email "zhongchiyu@gmail.com"; 45 git config user.name "CatTail"; 46 `) 47 err := cmd.Run() 48 assert.Nil(t, err) 49 50 context(tempdir) 51 }) 52 } 53 54 func TestList(t *testing.T) { 55 gitExec(GIT["RemoveTemplateDir"]) 56 // not inside git repo 57 // Should outside of this repo 58 createDirectory(t, os.TempDir(), func(tempdir string) { 59 list() 60 assert.Equal(t, MESSAGES["NotGitRepo"], logger.infos[0]) 61 logger.clear() 62 }) 63 64 // git hooks not installed 65 createGitRepo(t, func(tempdir string) { 66 list() 67 assert.Equal(t, MESSAGES["NotInstalled"], logger.infos[0]) 68 logger.clear() 69 }) 70 71 // git hooks installed 72 createGitRepo(t, func(tempdir string) { 73 cmd := exec.Command("git", "hooks", "install") 74 err := cmd.Run() 75 assert.Nil(t, err) 76 77 list() 78 assert.Equal(t, MESSAGES["Installed"], logger.infos[0]) 79 logger.clear() 80 }) 81 } 82 83 // Include uninstall test 84 func TestInstall(t *testing.T) { 85 // not inside git repo 86 createDirectory(t, os.TempDir(), func(tempdir string) { 87 install(true) 88 assert.Equal(t, MESSAGES["NotGitRepo"], logger.errors[0]) 89 logger.clear() 90 }) 91 92 // installed 93 createGitRepo(t, func(tempdir string) { 94 install(true) 95 assert.Equal(t, len(TRIGGERS)*2, len(logger.infos)) // with newline 96 logger.clear() 97 }) 98 99 // already installed 100 createGitRepo(t, func(tempdir string) { 101 install(true) 102 install(true) 103 assert.Equal(t, MESSAGES["ExistHooks"], logger.errors[0]) 104 logger.clear() 105 }) 106 107 // uninstall 108 createGitRepo(t, func(tempdir string) { 109 install(true) 110 logger.clear() 111 112 uninstall() 113 assert.Equal(t, MESSAGES["Restore"], logger.infos[0]) 114 logger.clear() 115 }) 116 117 // not installed 118 createGitRepo(t, func(tempdir string) { 119 uninstall() 120 assert.Equal(t, MESSAGES["NotExistHooks"], logger.errors[0]) 121 logger.clear() 122 }) 123 } 124 125 func TestInstallGlobal(t *testing.T) { 126 // backup current configuration file 127 templatedir, err := gitExec(GIT["GetTemplateDir"]) 128 129 createDirectory(t, os.TempDir(), func(tempdir string) { 130 DIRS["HomeTemplate"] = filepath.Join(tempdir, "home") 131 132 installGlobal(tempdir) 133 newTemplatedir, err := gitExec(GIT["GetTemplateDir"]) 134 assert.Nil(t, err) 135 assert.Equal(t, DIRS["HomeTemplate"], newTemplatedir) 136 assert.True(t, strings.HasPrefix(logger.infos[len(logger.infos)-2].(string), MESSAGES["SetTemplateDir"])) 137 logger.clear() 138 }) 139 140 // already installed 141 createDirectory(t, os.TempDir(), func(tempdir string) { 142 DIRS["HomeTemplate"] = filepath.Join(tempdir, "home") 143 144 installGlobal(tempdir) 145 logger.clear() 146 147 installGlobal(tempdir) 148 newTemplatedir, err := gitExec(GIT["GetTemplateDir"]) 149 assert.Nil(t, err) 150 assert.Equal(t, DIRS["HomeTemplate"], newTemplatedir) 151 assert.True(t, strings.HasPrefix(logger.infos[0].(string), MESSAGES["SetTemplateDir"])) 152 logger.clear() 153 }) 154 155 // restore 156 if err == nil { 157 gitExec(GIT["SetTemplateDir"] + templatedir) 158 } else { 159 gitExec(GIT["RemoveTemplateDir"]) 160 } 161 } 162 163 func TestUninstallGlobal(t *testing.T) { 164 // backup current configuration file 165 templatedir, err := gitExec(GIT["GetTemplateDir"]) 166 167 createDirectory(t, os.TempDir(), func(tempdir string) { 168 DIRS["HomeTemplate"] = filepath.Join(tempdir, "home") 169 170 installGlobal(tempdir) 171 newTemplatedir, err := gitExec(GIT["GetTemplateDir"]) 172 assert.Nil(t, err) 173 assert.Equal(t, DIRS["HomeTemplate"], newTemplatedir) 174 assert.True(t, strings.HasPrefix(logger.infos[len(logger.infos)-2].(string), MESSAGES["SetTemplateDir"])) 175 logger.clear() 176 177 uninstallGlobal() 178 newTemplatedir, err = gitExec(GIT["GetTemplateDir"]) 179 assert.NotNil(t, err) 180 }) 181 182 // not installed 183 createDirectory(t, os.TempDir(), func(tempdir string) { 184 uninstallGlobal() 185 newTemplatedir, err := gitExec(GIT["GetTemplateDir"]) 186 assert.NotNil(t, err) 187 assert.Equal(t, "", newTemplatedir) 188 }) 189 190 // restore 191 if err == nil { 192 gitExec(GIT["SetTemplateDir"] + templatedir) 193 } else { 194 gitExec(GIT["RemoveTemplateDir"]) 195 } 196 } 197 198 func TestUpdate(t *testing.T) { 199 // start test server 200 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 201 fixture, err := os.Open(filepath.Join("fixtures", "test.tar.gz")) 202 assert.Nil(t, err) 203 io.Copy(w, fixture) 204 })) 205 defer ts.Close() 206 207 tagName := "v1.1.0" 208 assetName := fmt.Sprintf("git-hooks_%s_%s.tar.gz", runtime.GOOS, runtime.GOARCH) 209 210 releases := []*github.RepositoryRelease{ 211 &github.RepositoryRelease{ 212 TagName: &tagName, 213 Assets: []github.ReleaseAsset{ 214 github.ReleaseAsset{ 215 Name: &assetName, 216 BrowserDownloadURL: &ts.URL, 217 }, 218 }, 219 }, 220 } 221 222 REAL_VERSION := VERSION 223 224 // latest version 225 VERSION = "v1.1.0" 226 update(releases) 227 assert.Equal(t, MESSAGES["UpdateToDate"], logger.infos[2]) 228 logger.clear() 229 230 // backward imcompatible 231 VERSION = "v0.9.0" 232 update(releases) 233 assert.Equal(t, MESSAGES["Incompatible"], logger.infos[2]) 234 logger.clear() 235 236 // update version 237 VERSION = "v1.0.0" 238 update(releases) 239 assert.True(t, strings.HasPrefix(logger.infos[len(logger.infos)-2].(string), "Successfully")) 240 logger.clear() 241 242 VERSION = REAL_VERSION 243 } 244 245 func TestIdentity(t *testing.T) { 246 createGitRepo(t, func(tempdir string) { 247 identity() 248 assert.True(t, len(logger.errors) != 0) 249 logger.clear() 250 }) 251 252 createGitRepo(t, func(tempdir string) { 253 cmd := exec.Command("bash", "-c", ` 254 touch a; 255 git add a; 256 git commit -m "test"; 257 `) 258 err := cmd.Run() 259 assert.Nil(t, err) 260 261 identity() 262 assert.True(t, len(logger.errors) == 0) 263 logger.clear() 264 }) 265 } 266 267 func TestProtocol(t *testing.T) { 268 gitUrl := "https://my.git.repository.com/org/repo" 269 noProtocol, noProtocolNoUser := findProtocol(gitUrl) 270 assert.True(t, noProtocolNoUser == "my.git.repository.com/org/repo") 271 assert.True(t, noProtocol == "https://my.git.repository.com/org/repo") 272 273 gitUrl = "my.git.repository.com/org/repo" 274 noProtocol, noProtocolNoUser = findProtocol(gitUrl) 275 assert.True(t, noProtocolNoUser == "my.git.repository.com/org/repo") 276 assert.True(t, noProtocol == "https://my.git.repository.com/org/repo") 277 278 gitUrl = "ssh://git@my.git.repository.com:org/repo" 279 noProtocol, noProtocolNoUser = findProtocol(gitUrl) 280 assert.True(t, noProtocolNoUser == "my.git.repository.com/org/repo") 281 assert.True(t, noProtocol == "git@my.git.repository.com:org/repo") 282 } 283 284 func TestRun(t *testing.T) { 285 }