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  }