2024-08-02 18:09:13 +02:00
|
|
|
package rp
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
|
|
"github.com/leodido/go-conventionalcommits"
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
|
)
|
|
|
|
|
|
2024-08-02 23:11:07 +02:00
|
|
|
func TestReleases_NextVersion(t *testing.T) {
|
2024-08-02 18:09:13 +02:00
|
|
|
type args struct {
|
2024-08-08 19:01:44 +02:00
|
|
|
releases Releases
|
2024-08-02 18:09:13 +02:00
|
|
|
versionBump conventionalcommits.VersionBump
|
|
|
|
|
nextVersionType NextVersionType
|
|
|
|
|
}
|
|
|
|
|
tests := []struct {
|
2024-08-08 19:01:44 +02:00
|
|
|
name string
|
|
|
|
|
args args
|
|
|
|
|
want string
|
|
|
|
|
wantErr assert.ErrorAssertionFunc
|
2024-08-02 18:09:13 +02:00
|
|
|
}{
|
|
|
|
|
{
|
|
|
|
|
name: "simple bump (major)",
|
|
|
|
|
args: args{
|
2024-08-08 19:01:44 +02:00
|
|
|
releases: Releases{
|
|
|
|
|
Latest: &Tag{Name: "v1.1.1"},
|
|
|
|
|
Stable: &Tag{Name: "v1.1.1"},
|
|
|
|
|
},
|
2024-08-02 18:09:13 +02:00
|
|
|
versionBump: conventionalcommits.MajorVersion,
|
|
|
|
|
nextVersionType: NextVersionTypeUndefined,
|
|
|
|
|
},
|
|
|
|
|
want: "v2.0.0",
|
|
|
|
|
wantErr: assert.NoError,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "simple bump (minor)",
|
|
|
|
|
args: args{
|
2024-08-08 19:01:44 +02:00
|
|
|
releases: Releases{
|
|
|
|
|
Latest: &Tag{Name: "v1.1.1"},
|
|
|
|
|
Stable: &Tag{Name: "v1.1.1"},
|
|
|
|
|
},
|
2024-08-02 18:09:13 +02:00
|
|
|
versionBump: conventionalcommits.MinorVersion,
|
|
|
|
|
nextVersionType: NextVersionTypeUndefined,
|
|
|
|
|
},
|
|
|
|
|
want: "v1.2.0",
|
|
|
|
|
wantErr: assert.NoError,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "simple bump (patch)",
|
|
|
|
|
args: args{
|
2024-08-08 19:01:44 +02:00
|
|
|
releases: Releases{
|
|
|
|
|
Latest: &Tag{Name: "v1.1.1"},
|
|
|
|
|
Stable: &Tag{Name: "v1.1.1"},
|
|
|
|
|
},
|
2024-08-02 18:09:13 +02:00
|
|
|
versionBump: conventionalcommits.PatchVersion,
|
|
|
|
|
nextVersionType: NextVersionTypeUndefined,
|
|
|
|
|
},
|
|
|
|
|
want: "v1.1.2",
|
|
|
|
|
wantErr: assert.NoError,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "normal to prerelease (major)",
|
|
|
|
|
args: args{
|
2024-08-08 19:01:44 +02:00
|
|
|
releases: Releases{
|
|
|
|
|
Latest: &Tag{Name: "v1.1.1"},
|
|
|
|
|
Stable: &Tag{Name: "v1.1.1"},
|
|
|
|
|
},
|
2024-08-02 18:09:13 +02:00
|
|
|
versionBump: conventionalcommits.MajorVersion,
|
|
|
|
|
nextVersionType: NextVersionTypeRC,
|
|
|
|
|
},
|
|
|
|
|
want: "v2.0.0-rc.0",
|
|
|
|
|
wantErr: assert.NoError,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "normal to prerelease (minor)",
|
|
|
|
|
args: args{
|
2024-08-08 19:01:44 +02:00
|
|
|
releases: Releases{
|
|
|
|
|
Latest: &Tag{Name: "v1.1.1"},
|
|
|
|
|
Stable: &Tag{Name: "v1.1.1"},
|
|
|
|
|
},
|
2024-08-02 18:09:13 +02:00
|
|
|
versionBump: conventionalcommits.MinorVersion,
|
|
|
|
|
nextVersionType: NextVersionTypeRC,
|
|
|
|
|
},
|
|
|
|
|
want: "v1.2.0-rc.0",
|
|
|
|
|
wantErr: assert.NoError,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "normal to prerelease (patch)",
|
|
|
|
|
args: args{
|
2024-08-08 19:01:44 +02:00
|
|
|
releases: Releases{
|
|
|
|
|
Latest: &Tag{Name: "v1.1.1"},
|
|
|
|
|
Stable: &Tag{Name: "v1.1.1"},
|
|
|
|
|
},
|
2024-08-02 18:09:13 +02:00
|
|
|
versionBump: conventionalcommits.PatchVersion,
|
|
|
|
|
nextVersionType: NextVersionTypeRC,
|
|
|
|
|
},
|
|
|
|
|
want: "v1.1.2-rc.0",
|
|
|
|
|
wantErr: assert.NoError,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "prerelease bump (major)",
|
|
|
|
|
args: args{
|
2024-08-08 19:01:44 +02:00
|
|
|
releases: Releases{
|
|
|
|
|
Latest: &Tag{Name: "v2.0.0-rc.0"},
|
|
|
|
|
Stable: &Tag{Name: "v1.1.1"},
|
|
|
|
|
},
|
2024-08-02 18:09:13 +02:00
|
|
|
versionBump: conventionalcommits.MajorVersion,
|
|
|
|
|
nextVersionType: NextVersionTypeRC,
|
|
|
|
|
},
|
|
|
|
|
want: "v2.0.0-rc.1",
|
|
|
|
|
wantErr: assert.NoError,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "prerelease bump (minor)",
|
|
|
|
|
args: args{
|
2024-08-08 19:01:44 +02:00
|
|
|
releases: Releases{
|
|
|
|
|
Latest: &Tag{Name: "v1.2.0-rc.0"},
|
|
|
|
|
Stable: &Tag{Name: "v1.1.1"},
|
|
|
|
|
},
|
2024-08-02 18:09:13 +02:00
|
|
|
versionBump: conventionalcommits.MinorVersion,
|
|
|
|
|
nextVersionType: NextVersionTypeRC,
|
|
|
|
|
},
|
|
|
|
|
want: "v1.2.0-rc.1",
|
|
|
|
|
wantErr: assert.NoError,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "prerelease bump (patch)",
|
|
|
|
|
args: args{
|
2024-08-08 19:01:44 +02:00
|
|
|
releases: Releases{
|
|
|
|
|
Latest: &Tag{Name: "v1.1.2-rc.0"},
|
|
|
|
|
Stable: &Tag{Name: "v1.1.1"},
|
|
|
|
|
},
|
2024-08-02 18:09:13 +02:00
|
|
|
versionBump: conventionalcommits.PatchVersion,
|
|
|
|
|
nextVersionType: NextVersionTypeRC,
|
|
|
|
|
},
|
|
|
|
|
want: "v1.1.2-rc.1",
|
|
|
|
|
wantErr: assert.NoError,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "prerelease different bump (major)",
|
|
|
|
|
args: args{
|
2024-08-08 19:01:44 +02:00
|
|
|
releases: Releases{
|
|
|
|
|
Latest: &Tag{Name: "v1.2.0-rc.0"},
|
|
|
|
|
Stable: &Tag{Name: "v1.1.1"},
|
|
|
|
|
},
|
2024-08-02 18:09:13 +02:00
|
|
|
versionBump: conventionalcommits.MajorVersion,
|
|
|
|
|
nextVersionType: NextVersionTypeRC,
|
|
|
|
|
},
|
|
|
|
|
want: "v2.0.0-rc.1",
|
|
|
|
|
wantErr: assert.NoError,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "prerelease different bump (minor)",
|
|
|
|
|
args: args{
|
2024-08-08 19:01:44 +02:00
|
|
|
releases: Releases{
|
|
|
|
|
Latest: &Tag{Name: "v1.1.2-rc.0"},
|
|
|
|
|
Stable: &Tag{Name: "v1.1.1"},
|
|
|
|
|
},
|
2024-08-02 18:09:13 +02:00
|
|
|
versionBump: conventionalcommits.MinorVersion,
|
|
|
|
|
nextVersionType: NextVersionTypeRC,
|
|
|
|
|
},
|
|
|
|
|
want: "v1.2.0-rc.1",
|
|
|
|
|
wantErr: assert.NoError,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "prerelease to prerelease",
|
|
|
|
|
args: args{
|
2024-08-08 19:01:44 +02:00
|
|
|
releases: Releases{
|
|
|
|
|
Latest: &Tag{Name: "v1.1.1-alpha.2"},
|
|
|
|
|
Stable: &Tag{Name: "v1.1.0"},
|
|
|
|
|
},
|
2024-08-02 18:09:13 +02:00
|
|
|
versionBump: conventionalcommits.PatchVersion,
|
|
|
|
|
nextVersionType: NextVersionTypeRC,
|
|
|
|
|
},
|
|
|
|
|
want: "v1.1.1-rc.0",
|
|
|
|
|
wantErr: assert.NoError,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "prerelease to normal (explicit)",
|
|
|
|
|
args: args{
|
2024-08-08 19:01:44 +02:00
|
|
|
releases: Releases{
|
|
|
|
|
Latest: &Tag{Name: "v1.1.1-alpha.2"},
|
|
|
|
|
Stable: &Tag{Name: "v1.1.0"},
|
|
|
|
|
},
|
2024-08-02 18:09:13 +02:00
|
|
|
versionBump: conventionalcommits.PatchVersion,
|
|
|
|
|
nextVersionType: NextVersionTypeNormal,
|
|
|
|
|
},
|
|
|
|
|
want: "v1.1.1",
|
|
|
|
|
wantErr: assert.NoError,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "prerelease to normal (implicit)",
|
|
|
|
|
args: args{
|
2024-08-08 19:01:44 +02:00
|
|
|
releases: Releases{
|
|
|
|
|
Latest: &Tag{Name: "v1.1.1-alpha.2"},
|
|
|
|
|
Stable: &Tag{Name: "v1.1.0"},
|
|
|
|
|
},
|
2024-08-02 18:09:13 +02:00
|
|
|
versionBump: conventionalcommits.PatchVersion,
|
|
|
|
|
nextVersionType: NextVersionTypeUndefined,
|
|
|
|
|
},
|
|
|
|
|
want: "v1.1.1",
|
|
|
|
|
wantErr: assert.NoError,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "nil tag (major)",
|
|
|
|
|
args: args{
|
2024-08-08 19:01:44 +02:00
|
|
|
releases: Releases{
|
|
|
|
|
Latest: nil,
|
|
|
|
|
Stable: nil,
|
|
|
|
|
},
|
2024-08-02 18:09:13 +02:00
|
|
|
versionBump: conventionalcommits.MajorVersion,
|
|
|
|
|
nextVersionType: NextVersionTypeUndefined,
|
|
|
|
|
},
|
|
|
|
|
want: "v1.0.0",
|
|
|
|
|
wantErr: assert.NoError,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "nil tag (minor)",
|
|
|
|
|
args: args{
|
2024-08-08 19:01:44 +02:00
|
|
|
releases: Releases{
|
|
|
|
|
Latest: nil,
|
|
|
|
|
Stable: nil,
|
|
|
|
|
},
|
2024-08-02 18:09:13 +02:00
|
|
|
versionBump: conventionalcommits.MinorVersion,
|
|
|
|
|
nextVersionType: NextVersionTypeUndefined,
|
|
|
|
|
},
|
|
|
|
|
want: "v0.1.0",
|
|
|
|
|
wantErr: assert.NoError,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "nil tag (patch)",
|
|
|
|
|
args: args{
|
2024-08-08 19:01:44 +02:00
|
|
|
releases: Releases{
|
|
|
|
|
Latest: nil,
|
|
|
|
|
Stable: nil,
|
|
|
|
|
},
|
2024-08-02 18:09:13 +02:00
|
|
|
versionBump: conventionalcommits.PatchVersion,
|
|
|
|
|
nextVersionType: NextVersionTypeUndefined,
|
|
|
|
|
},
|
|
|
|
|
want: "v0.0.1",
|
|
|
|
|
wantErr: assert.NoError,
|
|
|
|
|
},
|
2024-08-03 01:16:58 +02:00
|
|
|
{
|
|
|
|
|
name: "nil stable release (major)",
|
|
|
|
|
args: args{
|
2024-08-08 19:01:44 +02:00
|
|
|
releases: Releases{
|
|
|
|
|
Latest: &Tag{Name: "v1.1.1-rc.0"},
|
|
|
|
|
Stable: nil,
|
|
|
|
|
},
|
2024-08-03 01:16:58 +02:00
|
|
|
versionBump: conventionalcommits.MajorVersion,
|
|
|
|
|
nextVersionType: NextVersionTypeUndefined,
|
|
|
|
|
},
|
|
|
|
|
want: "v2.0.0",
|
|
|
|
|
wantErr: assert.NoError,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "nil stable release (minor)",
|
|
|
|
|
args: args{
|
2024-08-08 19:01:44 +02:00
|
|
|
releases: Releases{
|
|
|
|
|
Latest: &Tag{Name: "v1.1.1-rc.0"},
|
|
|
|
|
Stable: nil,
|
|
|
|
|
},
|
2024-08-03 01:16:58 +02:00
|
|
|
versionBump: conventionalcommits.MinorVersion,
|
|
|
|
|
nextVersionType: NextVersionTypeUndefined,
|
|
|
|
|
},
|
|
|
|
|
want: "v1.2.0",
|
|
|
|
|
wantErr: assert.NoError,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "nil stable release (patch)",
|
|
|
|
|
args: args{
|
2024-08-08 19:01:44 +02:00
|
|
|
releases: Releases{
|
|
|
|
|
Latest: &Tag{Name: "v1.1.1-rc.0"},
|
|
|
|
|
Stable: nil,
|
|
|
|
|
},
|
2024-08-03 01:16:58 +02:00
|
|
|
versionBump: conventionalcommits.PatchVersion,
|
|
|
|
|
nextVersionType: NextVersionTypeUndefined,
|
|
|
|
|
},
|
|
|
|
|
// TODO: Is this actually correct our should it be v1.1.1?
|
|
|
|
|
want: "v1.1.2",
|
|
|
|
|
wantErr: assert.NoError,
|
|
|
|
|
},
|
2024-08-02 18:09:13 +02:00
|
|
|
{
|
|
|
|
|
name: "error on invalid tag semver",
|
|
|
|
|
args: args{
|
2024-08-08 19:01:44 +02:00
|
|
|
releases: Releases{
|
|
|
|
|
Latest: &Tag{Name: "foodazzle"},
|
|
|
|
|
Stable: &Tag{Name: "foodazzle"},
|
|
|
|
|
},
|
2024-08-02 18:09:13 +02:00
|
|
|
versionBump: conventionalcommits.PatchVersion,
|
|
|
|
|
nextVersionType: NextVersionTypeRC,
|
|
|
|
|
},
|
|
|
|
|
want: "",
|
|
|
|
|
wantErr: assert.Error,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "error on invalid tag prerelease",
|
|
|
|
|
args: args{
|
2024-08-08 19:01:44 +02:00
|
|
|
releases: Releases{
|
|
|
|
|
Latest: &Tag{Name: "v1.1.1-rc.foo"},
|
|
|
|
|
Stable: &Tag{Name: "v1.1.1-rc.foo"},
|
|
|
|
|
},
|
2024-08-02 18:09:13 +02:00
|
|
|
versionBump: conventionalcommits.PatchVersion,
|
|
|
|
|
nextVersionType: NextVersionTypeRC,
|
|
|
|
|
},
|
|
|
|
|
want: "",
|
|
|
|
|
wantErr: assert.Error,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "error on invalid bump",
|
|
|
|
|
args: args{
|
2024-08-08 19:01:44 +02:00
|
|
|
releases: Releases{
|
|
|
|
|
Latest: &Tag{Name: "v1.1.1"},
|
|
|
|
|
Stable: &Tag{Name: "v1.1.1"},
|
|
|
|
|
},
|
2024-08-02 23:11:07 +02:00
|
|
|
|
2024-08-02 18:09:13 +02:00
|
|
|
versionBump: conventionalcommits.UnknownVersion,
|
|
|
|
|
nextVersionType: NextVersionTypeUndefined,
|
|
|
|
|
},
|
|
|
|
|
want: "",
|
|
|
|
|
wantErr: assert.Error,
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
for _, tt := range tests {
|
|
|
|
|
t.Run(tt.name, func(t *testing.T) {
|
2024-08-08 19:01:44 +02:00
|
|
|
got, err := SemVerNextVersion(tt.args.releases, tt.args.versionBump, tt.args.nextVersionType)
|
|
|
|
|
if !tt.wantErr(t, err, fmt.Sprintf("SemVerNextVersion(Releases(%v, %v), %v, %v)", tt.args.releases.Latest, tt.args.releases.Stable, tt.args.versionBump, tt.args.nextVersionType)) {
|
2024-08-02 18:09:13 +02:00
|
|
|
return
|
|
|
|
|
}
|
2024-08-08 19:01:44 +02:00
|
|
|
assert.Equalf(t, tt.want, got, "SemVerNextVersion(Releases(%v, %v), %v, %v)", tt.args.releases.Latest, tt.args.releases.Stable, tt.args.versionBump, tt.args.nextVersionType)
|
2024-08-02 18:09:13 +02:00
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestVersionBumpFromChangesets(t *testing.T) {
|
|
|
|
|
tests := []struct {
|
|
|
|
|
name string
|
|
|
|
|
changesets []Changeset
|
|
|
|
|
want conventionalcommits.VersionBump
|
|
|
|
|
}{
|
|
|
|
|
{
|
|
|
|
|
name: "no entries (unknown)",
|
|
|
|
|
changesets: []Changeset{},
|
|
|
|
|
want: conventionalcommits.UnknownVersion,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "non-release type (unknown)",
|
|
|
|
|
changesets: []Changeset{{ChangelogEntries: []AnalyzedCommit{{Type: "docs"}}}},
|
|
|
|
|
want: conventionalcommits.UnknownVersion,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "single breaking (major)",
|
|
|
|
|
changesets: []Changeset{{ChangelogEntries: []AnalyzedCommit{{BreakingChange: true}}}},
|
|
|
|
|
want: conventionalcommits.MajorVersion,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "single feat (minor)",
|
|
|
|
|
changesets: []Changeset{{ChangelogEntries: []AnalyzedCommit{{Type: "feat"}}}},
|
|
|
|
|
want: conventionalcommits.MinorVersion,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "single fix (patch)",
|
|
|
|
|
changesets: []Changeset{{ChangelogEntries: []AnalyzedCommit{{Type: "fix"}}}},
|
|
|
|
|
want: conventionalcommits.PatchVersion,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "multiple changesets (major)",
|
|
|
|
|
changesets: []Changeset{
|
|
|
|
|
{ChangelogEntries: []AnalyzedCommit{{Type: "fix"}}},
|
|
|
|
|
{ChangelogEntries: []AnalyzedCommit{{BreakingChange: true}}},
|
|
|
|
|
},
|
|
|
|
|
want: conventionalcommits.MajorVersion,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "multiple changesets (minor)",
|
|
|
|
|
changesets: []Changeset{
|
|
|
|
|
{ChangelogEntries: []AnalyzedCommit{{Type: "fix"}}},
|
|
|
|
|
{ChangelogEntries: []AnalyzedCommit{{Type: "feat"}}},
|
|
|
|
|
},
|
|
|
|
|
want: conventionalcommits.MinorVersion,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "multiple changesets (patch)",
|
|
|
|
|
changesets: []Changeset{
|
|
|
|
|
{ChangelogEntries: []AnalyzedCommit{{Type: "docs"}}},
|
|
|
|
|
{ChangelogEntries: []AnalyzedCommit{{Type: "fix"}}},
|
|
|
|
|
},
|
|
|
|
|
want: conventionalcommits.PatchVersion,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "multiple entries in one changeset (major)",
|
|
|
|
|
changesets: []Changeset{
|
|
|
|
|
{ChangelogEntries: []AnalyzedCommit{{Type: "fix"}, {BreakingChange: true}}},
|
|
|
|
|
},
|
|
|
|
|
want: conventionalcommits.MajorVersion,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "multiple entries in one changeset (minor)",
|
|
|
|
|
changesets: []Changeset{
|
|
|
|
|
{ChangelogEntries: []AnalyzedCommit{{Type: "fix"}, {Type: "feat"}}},
|
|
|
|
|
},
|
|
|
|
|
want: conventionalcommits.MinorVersion,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "multiple entries in one changeset (patch)",
|
|
|
|
|
changesets: []Changeset{
|
|
|
|
|
{ChangelogEntries: []AnalyzedCommit{{Type: "docs"}, {Type: "fix"}}},
|
|
|
|
|
},
|
|
|
|
|
want: conventionalcommits.PatchVersion,
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
for _, tt := range tests {
|
|
|
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
|
|
|
assert.Equalf(t, tt.want, VersionBumpFromChangesets(tt.changesets), "VersionBumpFromChangesets(%v)", tt.changesets)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|