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 }