github.phpd.cn/goreleaser/goreleaser@v0.92.0/internal/pipe/changelog/changelog_test.go (about) 1 package changelog 2 3 import ( 4 "io/ioutil" 5 "path/filepath" 6 "testing" 7 8 "github.com/stretchr/testify/assert" 9 10 "github.com/goreleaser/goreleaser/internal/testlib" 11 "github.com/goreleaser/goreleaser/pkg/config" 12 "github.com/goreleaser/goreleaser/pkg/context" 13 ) 14 15 func TestDescription(t *testing.T) { 16 assert.NotEmpty(t, Pipe{}.String()) 17 } 18 19 func TestChangelogProvidedViaFlag(t *testing.T) { 20 var ctx = context.New(config.Project{}) 21 ctx.ReleaseNotes = "c0ff33 foo bar" 22 testlib.AssertSkipped(t, Pipe{}.Run(ctx)) 23 } 24 25 func TestSnapshot(t *testing.T) { 26 var ctx = context.New(config.Project{}) 27 ctx.Snapshot = true 28 testlib.AssertSkipped(t, Pipe{}.Run(ctx)) 29 } 30 31 func TestChangelog(t *testing.T) { 32 folder, back := testlib.Mktmp(t) 33 defer back() 34 testlib.GitInit(t) 35 testlib.GitCommit(t, "first") 36 testlib.GitTag(t, "v0.0.1") 37 testlib.GitCommit(t, "added feature 1") 38 testlib.GitCommit(t, "fixed bug 2") 39 testlib.GitCommit(t, "ignored: whatever") 40 testlib.GitCommit(t, "docs: whatever") 41 testlib.GitCommit(t, "something about cArs we dont need") 42 testlib.GitCommit(t, "feat: added that thing") 43 testlib.GitCommit(t, "Merge pull request #999 from goreleaser/some-branch") 44 testlib.GitCommit(t, "this is not a Merge pull request") 45 testlib.GitTag(t, "v0.0.2") 46 var ctx = context.New(config.Project{ 47 Dist: folder, 48 Changelog: config.Changelog{ 49 Filters: config.Filters{ 50 Exclude: []string{ 51 "docs:", 52 "ignored:", 53 "(?i)cars", 54 "^Merge pull request", 55 }, 56 }, 57 }, 58 }) 59 ctx.Git.CurrentTag = "v0.0.2" 60 assert.NoError(t, Pipe{}.Run(ctx)) 61 assert.Contains(t, ctx.ReleaseNotes, "## Changelog") 62 assert.NotContains(t, ctx.ReleaseNotes, "first") 63 assert.Contains(t, ctx.ReleaseNotes, "added feature 1") 64 assert.Contains(t, ctx.ReleaseNotes, "fixed bug 2") 65 assert.NotContains(t, ctx.ReleaseNotes, "docs") 66 assert.NotContains(t, ctx.ReleaseNotes, "ignored") 67 assert.NotContains(t, ctx.ReleaseNotes, "cArs") 68 assert.NotContains(t, ctx.ReleaseNotes, "from goreleaser/some-branch") 69 70 bts, err := ioutil.ReadFile(filepath.Join(folder, "CHANGELOG.md")) 71 assert.NoError(t, err) 72 assert.NotEmpty(t, string(bts)) 73 } 74 75 func TestChangelogSort(t *testing.T) { 76 _, back := testlib.Mktmp(t) 77 defer back() 78 testlib.GitInit(t) 79 testlib.GitCommit(t, "whatever") 80 testlib.GitTag(t, "v0.9.9") 81 testlib.GitCommit(t, "c: commit") 82 testlib.GitCommit(t, "a: commit") 83 testlib.GitCommit(t, "b: commit") 84 testlib.GitTag(t, "v1.0.0") 85 var ctx = context.New(config.Project{ 86 Changelog: config.Changelog{}, 87 }) 88 ctx.Git.CurrentTag = "v1.0.0" 89 90 for _, cfg := range []struct { 91 Sort string 92 Entries []string 93 }{ 94 { 95 Sort: "", 96 Entries: []string{ 97 "b: commit", 98 "a: commit", 99 "c: commit", 100 }, 101 }, 102 { 103 Sort: "asc", 104 Entries: []string{ 105 "a: commit", 106 "b: commit", 107 "c: commit", 108 }, 109 }, 110 { 111 Sort: "desc", 112 Entries: []string{ 113 "c: commit", 114 "b: commit", 115 "a: commit", 116 }, 117 }, 118 } { 119 t.Run("changelog sort='"+cfg.Sort+"'", func(t *testing.T) { 120 ctx.Config.Changelog.Sort = cfg.Sort 121 entries, err := buildChangelog(ctx) 122 assert.NoError(t, err) 123 assert.Len(t, entries, len(cfg.Entries)) 124 var changes []string 125 for _, line := range entries { 126 _, msg := extractCommitInfo(line) 127 changes = append(changes, msg) 128 } 129 assert.EqualValues(t, cfg.Entries, changes) 130 }) 131 } 132 } 133 134 func TestChangelogInvalidSort(t *testing.T) { 135 var ctx = context.New(config.Project{ 136 Changelog: config.Changelog{ 137 Sort: "dope", 138 }, 139 }) 140 assert.EqualError(t, Pipe{}.Run(ctx), ErrInvalidSortDirection.Error()) 141 } 142 143 func TestChangelogOfFirstRelease(t *testing.T) { 144 _, back := testlib.Mktmp(t) 145 defer back() 146 testlib.GitInit(t) 147 var msgs = []string{ 148 "initial commit", 149 "another one", 150 "one more", 151 "and finally this one", 152 } 153 for _, msg := range msgs { 154 testlib.GitCommit(t, msg) 155 } 156 testlib.GitTag(t, "v0.0.1") 157 var ctx = context.New(config.Project{}) 158 ctx.Git.CurrentTag = "v0.0.1" 159 assert.NoError(t, Pipe{}.Run(ctx)) 160 assert.Contains(t, ctx.ReleaseNotes, "## Changelog") 161 for _, msg := range msgs { 162 assert.Contains(t, ctx.ReleaseNotes, msg) 163 } 164 } 165 166 func TestChangelogFilterInvalidRegex(t *testing.T) { 167 _, back := testlib.Mktmp(t) 168 defer back() 169 testlib.GitInit(t) 170 testlib.GitCommit(t, "commitssss") 171 testlib.GitTag(t, "v0.0.3") 172 testlib.GitCommit(t, "commitzzz") 173 testlib.GitTag(t, "v0.0.4") 174 var ctx = context.New(config.Project{ 175 Changelog: config.Changelog{ 176 Filters: config.Filters{ 177 Exclude: []string{ 178 "(?iasdr4qasd)not a valid regex i guess", 179 }, 180 }, 181 }, 182 }) 183 ctx.Git.CurrentTag = "v0.0.4" 184 assert.EqualError(t, Pipe{}.Run(ctx), "error parsing regexp: invalid or unsupported Perl syntax: `(?ia`") 185 } 186 187 func TestChangelogNoTags(t *testing.T) { 188 _, back := testlib.Mktmp(t) 189 defer back() 190 testlib.GitInit(t) 191 testlib.GitCommit(t, "first") 192 var ctx = context.New(config.Project{}) 193 assert.Error(t, Pipe{}.Run(ctx)) 194 assert.Empty(t, ctx.ReleaseNotes) 195 } 196 197 func TestChangelogOnBranchWithSameNameAsTag(t *testing.T) { 198 _, back := testlib.Mktmp(t) 199 defer back() 200 testlib.GitInit(t) 201 var msgs = []string{ 202 "initial commit", 203 "another one", 204 "one more", 205 "and finally this one", 206 } 207 for _, msg := range msgs { 208 testlib.GitCommit(t, msg) 209 } 210 testlib.GitTag(t, "v0.0.1") 211 testlib.GitCheckoutBranch(t, "v0.0.1") 212 var ctx = context.New(config.Project{}) 213 ctx.Git.CurrentTag = "v0.0.1" 214 assert.NoError(t, Pipe{}.Run(ctx)) 215 assert.Contains(t, ctx.ReleaseNotes, "## Changelog") 216 for _, msg := range msgs { 217 assert.Contains(t, ctx.ReleaseNotes, msg) 218 } 219 }