github.com/client9/goreleaser@v0.17.4-0.20170511023544-27e4b028926d/pipeline/git/git_test.go (about)

     1  package git
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  	"path/filepath"
     7  	"testing"
     8  
     9  	"github.com/goreleaser/goreleaser/config"
    10  	"github.com/goreleaser/goreleaser/context"
    11  	"github.com/goreleaser/goreleaser/pipeline/defaults"
    12  	"github.com/stretchr/testify/assert"
    13  )
    14  
    15  func TestDescription(t *testing.T) {
    16  	assert.NotEmpty(t, Pipe{}.Description())
    17  }
    18  
    19  func TestNotAGitFolder(t *testing.T) {
    20  	var assert = assert.New(t)
    21  	_, back := createAndChdir(t)
    22  	defer back()
    23  	var ctx = &context.Context{
    24  		Config: config.Project{},
    25  	}
    26  	assert.Error(Pipe{}.Run(ctx))
    27  }
    28  
    29  func TestSingleCommit(t *testing.T) {
    30  	var assert = assert.New(t)
    31  	_, back := createAndChdir(t)
    32  	defer back()
    33  	gitInit(t)
    34  	gitCommit(t, "commit1")
    35  	gitTag(t, "v0.0.1")
    36  	var ctx = &context.Context{
    37  		Config: config.Project{},
    38  	}
    39  	assert.NoError(Pipe{}.Run(ctx))
    40  	assert.Equal("v0.0.1", ctx.Git.CurrentTag)
    41  }
    42  
    43  func TestNewRepository(t *testing.T) {
    44  	var assert = assert.New(t)
    45  	_, back := createAndChdir(t)
    46  	defer back()
    47  	gitInit(t)
    48  	var ctx = &context.Context{
    49  		Config: config.Project{},
    50  	}
    51  	assert.Error(Pipe{}.Run(ctx))
    52  }
    53  
    54  func TestNoTagsSnapshot(t *testing.T) {
    55  	assert := assert.New(t)
    56  	_, back := createAndChdir(t)
    57  	defer back()
    58  	gitInit(t)
    59  	gitCommit(t, "first")
    60  	var ctx = &context.Context{
    61  		Config: config.Project{
    62  			Snapshot: config.Snapshot{
    63  				NameTemplate: defaults.SnapshotNameTemplate,
    64  			},
    65  		},
    66  		Snapshot: true,
    67  		Publish:  false,
    68  	}
    69  	assert.NoError(Pipe{}.Run(ctx))
    70  	assert.Contains(ctx.Version, "SNAPSHOT-")
    71  }
    72  
    73  func TestNoTagsSnapshotInvalidTemplate(t *testing.T) {
    74  	assert := assert.New(t)
    75  	_, back := createAndChdir(t)
    76  	defer back()
    77  	gitInit(t)
    78  	gitCommit(t, "first")
    79  	var ctx = &context.Context{
    80  		Config: config.Project{
    81  			Snapshot: config.Snapshot{
    82  				NameTemplate: "{{",
    83  			},
    84  		},
    85  		Snapshot: true,
    86  		Publish:  false,
    87  	}
    88  	assert.Error(Pipe{}.Run(ctx))
    89  }
    90  
    91  // TestNoTagsNoSnapshot covers the situation where a repository
    92  // only contains simple commits and no tags. In this case you have
    93  // to set the --snapshot flag otherwise an error is returned.
    94  func TestNoTagsNoSnapshot(t *testing.T) {
    95  	assert := assert.New(t)
    96  	_, back := createAndChdir(t)
    97  	defer back()
    98  	gitInit(t)
    99  	gitCommit(t, "first")
   100  	var ctx = &context.Context{
   101  		Config: config.Project{
   102  			Snapshot: config.Snapshot{
   103  				NameTemplate: defaults.SnapshotNameTemplate,
   104  			},
   105  		},
   106  		Snapshot: false,
   107  		Publish:  false,
   108  	}
   109  	assert.Error(Pipe{}.Run(ctx))
   110  }
   111  
   112  func TestInvalidTagFormat(t *testing.T) {
   113  	var assert = assert.New(t)
   114  	_, back := createAndChdir(t)
   115  	defer back()
   116  	gitInit(t)
   117  	gitCommit(t, "commit2")
   118  	gitTag(t, "sadasd")
   119  	var ctx = &context.Context{
   120  		Config:   config.Project{},
   121  		Validate: true,
   122  	}
   123  	assert.EqualError(Pipe{}.Run(ctx), "sadasd is not in a valid version format")
   124  	assert.Equal("sadasd", ctx.Git.CurrentTag)
   125  }
   126  
   127  func TestDirty(t *testing.T) {
   128  	var assert = assert.New(t)
   129  	folder, back := createAndChdir(t)
   130  	defer back()
   131  	gitInit(t)
   132  	dummy, err := os.Create(filepath.Join(folder, "dummy"))
   133  	assert.NoError(err)
   134  	gitAdd(t)
   135  	gitCommit(t, "commit2")
   136  	gitTag(t, "v0.0.1")
   137  	assert.NoError(ioutil.WriteFile(dummy.Name(), []byte("lorem ipsum"), 0644))
   138  	var ctx = &context.Context{
   139  		Config:   config.Project{},
   140  		Validate: true,
   141  	}
   142  	err = Pipe{}.Run(ctx)
   143  	assert.Error(err)
   144  	assert.Contains(err.Error(), "git is currently in a dirty state:")
   145  }
   146  
   147  func TestTagIsNotLastCommit(t *testing.T) {
   148  	var assert = assert.New(t)
   149  	_, back := createAndChdir(t)
   150  	defer back()
   151  	gitInit(t)
   152  	gitCommit(t, "commit3")
   153  	gitTag(t, "v0.0.1")
   154  	gitCommit(t, "commit4")
   155  	var ctx = &context.Context{
   156  		Config:   config.Project{},
   157  		Validate: true,
   158  	}
   159  	err := Pipe{}.Run(ctx)
   160  	assert.Error(err)
   161  	assert.Contains(err.Error(), "git tag v0.0.1 was not made against commit")
   162  }
   163  
   164  func TestValidState(t *testing.T) {
   165  	var assert = assert.New(t)
   166  	_, back := createAndChdir(t)
   167  	defer back()
   168  	gitInit(t)
   169  	gitCommit(t, "commit3")
   170  	gitTag(t, "v0.0.1")
   171  	gitCommit(t, "commit4")
   172  	gitTag(t, "v0.0.2")
   173  	var ctx = &context.Context{
   174  		Config:   config.Project{},
   175  		Validate: true,
   176  	}
   177  	assert.NoError(Pipe{}.Run(ctx))
   178  }
   179  
   180  func TestNoValidate(t *testing.T) {
   181  	var assert = assert.New(t)
   182  	_, back := createAndChdir(t)
   183  	defer back()
   184  	gitInit(t)
   185  	gitAdd(t)
   186  	gitCommit(t, "commit5")
   187  	gitTag(t, "v0.0.1")
   188  	gitCommit(t, "commit6")
   189  	var ctx = &context.Context{
   190  		Config:   config.Project{},
   191  		Validate: false,
   192  	}
   193  	assert.NoError(Pipe{}.Run(ctx))
   194  }
   195  
   196  func TestChangelog(t *testing.T) {
   197  	var assert = assert.New(t)
   198  	_, back := createAndChdir(t)
   199  	defer back()
   200  	gitInit(t)
   201  	gitCommit(t, "first")
   202  	gitTag(t, "v0.0.1")
   203  	gitCommit(t, "added feature 1")
   204  	gitCommit(t, "fixed bug 2")
   205  	gitTag(t, "v0.0.2")
   206  	var ctx = &context.Context{
   207  		Config: config.Project{},
   208  	}
   209  	assert.NoError(Pipe{}.Run(ctx))
   210  	assert.Equal("v0.0.2", ctx.Git.CurrentTag)
   211  	assert.Contains(ctx.ReleaseNotes, "## Changelog")
   212  	assert.NotContains(ctx.ReleaseNotes, "first")
   213  	assert.Contains(ctx.ReleaseNotes, "added feature 1")
   214  	assert.Contains(ctx.ReleaseNotes, "fixed bug 2")
   215  }
   216  
   217  func TestChangelogOfFirstRelease(t *testing.T) {
   218  	var assert = assert.New(t)
   219  	_, back := createAndChdir(t)
   220  	defer back()
   221  	gitInit(t)
   222  	var msgs = []string{
   223  		"initial commit",
   224  		"another one",
   225  		"one more",
   226  		"and finally this one",
   227  	}
   228  	for _, msg := range msgs {
   229  		gitCommit(t, msg)
   230  	}
   231  	gitTag(t, "v0.0.1")
   232  	var ctx = &context.Context{
   233  		Config: config.Project{},
   234  	}
   235  	assert.NoError(Pipe{}.Run(ctx))
   236  	assert.Equal("v0.0.1", ctx.Git.CurrentTag)
   237  	assert.Contains(ctx.ReleaseNotes, "## Changelog")
   238  	for _, msg := range msgs {
   239  		assert.Contains(ctx.ReleaseNotes, msg)
   240  	}
   241  }
   242  
   243  func TestCustomReleaseNotes(t *testing.T) {
   244  	var assert = assert.New(t)
   245  	_, back := createAndChdir(t)
   246  	defer back()
   247  	gitInit(t)
   248  	gitCommit(t, "first")
   249  	gitTag(t, "v0.0.1")
   250  	var ctx = &context.Context{
   251  		Config:       config.Project{},
   252  		ReleaseNotes: "custom",
   253  	}
   254  	assert.NoError(Pipe{}.Run(ctx))
   255  	assert.Equal("v0.0.1", ctx.Git.CurrentTag)
   256  	assert.Equal(ctx.ReleaseNotes, "custom")
   257  }
   258  
   259  //
   260  // helper functions
   261  //
   262  
   263  func createAndChdir(t *testing.T) (current string, back func()) {
   264  	var assert = assert.New(t)
   265  	folder, err := ioutil.TempDir("", "goreleasertest")
   266  	assert.NoError(err)
   267  	previous, err := os.Getwd()
   268  	assert.NoError(err)
   269  	assert.NoError(os.Chdir(folder))
   270  	return folder, func() {
   271  		assert.NoError(os.Chdir(previous))
   272  	}
   273  }
   274  
   275  func gitInit(t *testing.T) {
   276  	var assert = assert.New(t)
   277  	out, err := git("init")
   278  	assert.NoError(err)
   279  	assert.Contains(out, "Initialized empty Git repository")
   280  }
   281  
   282  func gitCommit(t *testing.T, msg string) {
   283  	var assert = assert.New(t)
   284  	out, err := fakeGit("commit", "--allow-empty", "-m", msg)
   285  	assert.NoError(err)
   286  	assert.Contains(out, "master", msg)
   287  }
   288  
   289  func gitTag(t *testing.T, tag string) {
   290  	var assert = assert.New(t)
   291  	out, err := fakeGit("tag", tag)
   292  	assert.NoError(err)
   293  	assert.Empty(out)
   294  }
   295  
   296  func gitAdd(t *testing.T) {
   297  	var assert = assert.New(t)
   298  	out, err := git("add", "-A")
   299  	assert.NoError(err)
   300  	assert.Empty(out)
   301  }
   302  
   303  func fakeGit(args ...string) (string, error) {
   304  	var allArgs = []string{
   305  		"-c",
   306  		"user.name='GoReleaser'",
   307  		"-c",
   308  		"user.email='test@goreleaser.github.com'",
   309  	}
   310  	allArgs = append(allArgs, args...)
   311  	return git(allArgs...)
   312  }