package engineversion import ( "errors" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestParseSemverNormalises(t *testing.T) { tests := []struct { input string want string }{ {"1.2.3", "v1.2.3"}, {"v1.2.3", "v1.2.3"}, {" v0.4.0 ", "v0.4.0"}, {"v2.0.0-rc.1", "v2.0.0-rc.1"}, {"v2.0.0+build.7", "v2.0.0+build.7"}, } for _, tt := range tests { t.Run(tt.input, func(t *testing.T) { got, err := ParseSemver(tt.input) require.NoError(t, err) assert.Equal(t, tt.want, got) }) } } func TestParseSemverRejects(t *testing.T) { tests := []string{ "", " ", "latest", "1", "1.2", "v1.2", "1.2.3.4", "v1.2.x", } for _, input := range tests { t.Run(input, func(t *testing.T) { _, err := ParseSemver(input) require.Error(t, err) assert.True(t, errors.Is(err, ErrInvalidSemver)) }) } } func TestIsPatchUpgrade(t *testing.T) { tests := []struct { name string current string next string want bool }{ {"same patch", "v1.2.3", "v1.2.3", true}, {"patch bump", "v1.2.3", "v1.2.4", true}, {"patch downgrade", "1.2.4", "1.2.0", true}, {"prerelease patch", "v1.2.3", "v1.2.3-rc.1", true}, {"minor bump", "v1.2.3", "v1.3.0", false}, {"minor downgrade", "v1.2.3", "v1.1.9", false}, {"major bump", "v1.2.3", "v2.0.0", false}, {"major downgrade", "v2.0.0", "v1.9.9", false}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := IsPatchUpgrade(tt.current, tt.next) require.NoError(t, err) assert.Equal(t, tt.want, got) }) } } func TestIsPatchUpgradeRejectsBadInputs(t *testing.T) { _, err := IsPatchUpgrade("garbage", "v1.2.3") require.Error(t, err) assert.True(t, errors.Is(err, ErrInvalidSemver)) _, err = IsPatchUpgrade("v1.2.3", "") require.Error(t, err) assert.True(t, errors.Is(err, ErrInvalidSemver)) }