Skip to content

Commit 4651bb5

Browse files
committed
fix(test): configure git user in TestCommitChangelog for CI
The test relied on global git config for author identity, which is not available in CI environments.
1 parent 60aa9be commit 4651bb5

8 files changed

Lines changed: 231 additions & 238 deletions

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@
22
/.idea/
33
/dist/
44
since
5+
.claude/*.local.json

convcommits/commits_test.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package convcommits
1818

1919
import (
2020
"reflect"
21+
"sort"
2122
"testing"
2223
)
2324

@@ -56,3 +57,54 @@ func TestCategoriseByType(t *testing.T) {
5657
})
5758
}
5859
}
60+
61+
func TestCategoriseByType_scopedCommits(t *testing.T) {
62+
commits := []string{"feat(api): add endpoint", "fix(ui): correct layout"}
63+
got := CategoriseByType(commits)
64+
65+
if len(got) != 2 {
66+
t.Fatalf("expected 2 categories, got %d", len(got))
67+
}
68+
if _, ok := got["feat"]; !ok {
69+
t.Errorf("expected 'feat' category, got keys: %v", got)
70+
}
71+
if _, ok := got["fix"]; !ok {
72+
t.Errorf("expected 'fix' category, got keys: %v", got)
73+
}
74+
}
75+
76+
func TestCategoriseByType_breakingChange(t *testing.T) {
77+
commits := []string{"feat!: breaking feature"}
78+
got := CategoriseByType(commits)
79+
80+
if _, ok := got["BREAKING CHANGE"]; !ok {
81+
t.Errorf("expected 'BREAKING CHANGE' category, got keys: %v", got)
82+
}
83+
}
84+
85+
func TestCategoriseByType_noPrefix(t *testing.T) {
86+
commits := []string{"some random commit message"}
87+
got := CategoriseByType(commits)
88+
89+
if _, ok := got[""]; !ok {
90+
t.Errorf("expected empty prefix category, got keys: %v", got)
91+
}
92+
}
93+
94+
func TestDetermineTypes(t *testing.T) {
95+
commits := []string{"feat: foo", "fix: bar", "feat: baz"}
96+
got := DetermineTypes(commits)
97+
sort.Strings(got)
98+
99+
want := []string{"feat", "fix"}
100+
sort.Strings(want)
101+
102+
if len(got) != len(want) {
103+
t.Fatalf("DetermineTypes() length = %d, want %d", len(got), len(want))
104+
}
105+
for i := range got {
106+
if got[i] != want[i] {
107+
t.Errorf("DetermineTypes()[%d] = %v, want %v", i, got[i], want[i])
108+
}
109+
}
110+
}

convcommits/commits_test_extra_test.go

Lines changed: 0 additions & 57 deletions
This file was deleted.

semver/versions_test.go

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,3 +120,80 @@ func TestDetermineChangeType(t *testing.T) {
120120
})
121121
}
122122
}
123+
124+
func TestGetNextVersion_withVPrefix(t *testing.T) {
125+
got := GetNextVersion("1.2.3", true, []string{"feat: new feature"})
126+
want := "v1.3.0"
127+
if got != want {
128+
t.Errorf("GetNextVersion() with vPrefix = %v, want %v", got, want)
129+
}
130+
}
131+
132+
func TestGetNextVersion_noChanges(t *testing.T) {
133+
got := GetNextVersion("1.2.3", false, []string{"unknown: something"})
134+
want := ""
135+
if got != want {
136+
t.Errorf("GetNextVersion() with no recognised changes = %v, want %v", got, want)
137+
}
138+
}
139+
140+
func TestDetermineChangeType_allPatchTypes(t *testing.T) {
141+
patchTypes := []string{"build", "chore", "ci", "docs", "fix", "refactor", "security", "style", "test"}
142+
for _, pt := range patchTypes {
143+
t.Run(pt, func(t *testing.T) {
144+
got := DetermineChangeType([]string{pt})
145+
if got != ComponentPatch {
146+
t.Errorf("DetermineChangeType(%v) = %v, want %v", pt, got, ComponentPatch)
147+
}
148+
})
149+
}
150+
}
151+
152+
func TestDetermineChangeType_none(t *testing.T) {
153+
got := DetermineChangeType([]string{"unknown"})
154+
if got != ComponentNone {
155+
t.Errorf("DetermineChangeType(unknown) = %v, want %v", got, ComponentNone)
156+
}
157+
}
158+
159+
func TestDetermineChangeType_majorTakesPrecedence(t *testing.T) {
160+
got := DetermineChangeType([]string{"feat", "BREAKING CHANGE", "fix"})
161+
if got != ComponentMajor {
162+
t.Errorf("DetermineChangeType() = %v, want %v", got, ComponentMajor)
163+
}
164+
}
165+
166+
func TestBumpVersion(t *testing.T) {
167+
tests := []struct {
168+
name string
169+
version string
170+
component Component
171+
want string
172+
}{
173+
{
174+
name: "bump major resets minor and patch",
175+
version: "1.5.9",
176+
component: ComponentMajor,
177+
want: "2.0.0",
178+
},
179+
{
180+
name: "bump minor resets patch",
181+
version: "1.5.9",
182+
component: ComponentMinor,
183+
want: "1.6.0",
184+
},
185+
{
186+
name: "bump patch only",
187+
version: "1.5.9",
188+
component: ComponentPatch,
189+
want: "1.5.10",
190+
},
191+
}
192+
for _, tt := range tests {
193+
t.Run(tt.name, func(t *testing.T) {
194+
if got := bumpVersion(tt.version, tt.component); got != tt.want {
195+
t.Errorf("bumpVersion() = %v, want %v", got, tt.want)
196+
}
197+
})
198+
}
199+
}

semver/versions_test_extra_test.go

Lines changed: 0 additions & 80 deletions
This file was deleted.

vcs/commits_test.go

Lines changed: 91 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,11 @@ limitations under the License.
1616

1717
package vcs
1818

19-
import "testing"
19+
import (
20+
"reflect"
21+
"regexp"
22+
"testing"
23+
)
2024

2125
func Test_getShortMessage(t *testing.T) {
2226
type args struct {
@@ -50,3 +54,89 @@ func Test_getShortMessage(t *testing.T) {
5054
})
5155
}
5256
}
57+
58+
func TestFlattenCommits(t *testing.T) {
59+
tags := []TagCommits{
60+
{
61+
TagMeta: TagMeta{Name: "v1"},
62+
Commits: []string{"feat: a", "fix: b"},
63+
},
64+
{
65+
TagMeta: TagMeta{Name: "v2"},
66+
Commits: []string{"chore: c"},
67+
},
68+
}
69+
got := FlattenCommits(&tags)
70+
want := []string{"feat: a", "fix: b", "chore: c"}
71+
if !reflect.DeepEqual(got, want) {
72+
t.Errorf("FlattenCommits() = %v, want %v", got, want)
73+
}
74+
}
75+
76+
func TestFlattenCommits_empty(t *testing.T) {
77+
tags := []TagCommits{}
78+
got := FlattenCommits(&tags)
79+
if len(got) != 0 {
80+
t.Errorf("FlattenCommits() = %v, want empty", got)
81+
}
82+
}
83+
84+
func Test_shouldInclude(t *testing.T) {
85+
tests := []struct {
86+
name string
87+
message string
88+
excludes []*regexp.Regexp
89+
want bool
90+
}{
91+
{
92+
name: "no excludes",
93+
message: "feat: something",
94+
excludes: nil,
95+
want: true,
96+
},
97+
{
98+
name: "matching exclude",
99+
message: "build: release v1.0.0",
100+
excludes: []*regexp.Regexp{regexp.MustCompile(`^build: release`)},
101+
want: false,
102+
},
103+
{
104+
name: "non-matching exclude",
105+
message: "feat: new feature",
106+
excludes: []*regexp.Regexp{regexp.MustCompile(`^build: release`)},
107+
want: true,
108+
},
109+
{
110+
name: "multiple excludes with one match",
111+
message: "chore: bump deps",
112+
excludes: []*regexp.Regexp{
113+
regexp.MustCompile(`^build: release`),
114+
regexp.MustCompile(`^chore: bump`),
115+
},
116+
want: false,
117+
},
118+
}
119+
for _, tt := range tests {
120+
t.Run(tt.name, func(t *testing.T) {
121+
if got := shouldInclude(tt.message, tt.excludes); got != tt.want {
122+
t.Errorf("shouldInclude() = %v, want %v", got, tt.want)
123+
}
124+
})
125+
}
126+
}
127+
128+
func Test_getShortMessage_singleLine(t *testing.T) {
129+
got := getShortMessage("simple message")
130+
want := "simple message"
131+
if got != want {
132+
t.Errorf("getShortMessage() = %v, want %v", got, want)
133+
}
134+
}
135+
136+
func Test_getShortMessage_withLeadingWhitespace(t *testing.T) {
137+
got := getShortMessage(" message with spaces ")
138+
want := "message with spaces"
139+
if got != want {
140+
t.Errorf("getShortMessage() = %v, want %v", got, want)
141+
}
142+
}

0 commit comments

Comments
 (0)