Skip to content

Commit c8e7316

Browse files
committed
Address code review feedback for build metadata precedence
- Add documentation for AsLegacyRegistryV1Version method explaining the build metadata conversion logic - Fix AsLegacyRegistryV1Version to preserve original build metadata when Release field is not set - Add comprehensive test coverage for NewLegacyRegistryV1VersionRelease including edge cases for build metadata and release parsing - Add test coverage for AsLegacyRegistryV1Version conversion logic - Improve compare_test.go test structure with descriptive test names and assertion functions for better clarity - Add test case for non-release build metadata comparison
1 parent fb24d4e commit c8e7316

File tree

4 files changed

+166
-19
lines changed

4 files changed

+166
-19
lines changed

internal/operator-controller/bundle/versionrelease.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,14 +65,22 @@ func (vr *VersionRelease) Compare(other VersionRelease) int {
6565
return vr.Release.Compare(other.Release)
6666
}
6767

68+
// AsLegacyRegistryV1Version converts a VersionRelease into a standard semver version.
69+
// If the VersionRelease's Release field is set, the returned semver version's build
70+
// metadata is set to the VersionRelease's Release. Otherwise, the build metadata is
71+
// set to the VersionRelease's Version field's build metadata.
6872
func (vr *VersionRelease) AsLegacyRegistryV1Version() bsemver.Version {
69-
return bsemver.Version{
73+
v := bsemver.Version{
7074
Major: vr.Version.Major,
7175
Minor: vr.Version.Minor,
7276
Patch: vr.Version.Patch,
7377
Pre: vr.Version.Pre,
74-
Build: slicesutil.Map(vr.Release, func(i bsemver.PRVersion) string { return i.String() }),
78+
Build: vr.Version.Build,
7579
}
80+
if len(vr.Release) > 0 {
81+
v.Build = slicesutil.Map(vr.Release, func(i bsemver.PRVersion) string { return i.String() })
82+
}
83+
return v
7684
}
7785

7886
type Release []bsemver.PRVersion

internal/operator-controller/bundle/versionrelease_test.go

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,118 @@ package bundle_test
33
import (
44
"testing"
55

6+
bsemver "github.com/blang/semver/v4"
67
"github.com/stretchr/testify/assert"
78
"github.com/stretchr/testify/require"
89

910
"github.com/operator-framework/operator-controller/internal/operator-controller/bundle"
1011
)
1112

13+
func TestNewLegacyRegistryV1VersionRelease(t *testing.T) {
14+
type testCase struct {
15+
name string
16+
input string
17+
expect func(*testing.T, *bundle.VersionRelease, error)
18+
}
19+
for _, tc := range []testCase{
20+
{
21+
name: "empty input",
22+
input: "",
23+
expect: func(t *testing.T, _ *bundle.VersionRelease, err error) {
24+
assert.Error(t, err)
25+
},
26+
},
27+
{
28+
name: "v-prefix is invalid",
29+
input: "v1.0.0",
30+
expect: func(t *testing.T, _ *bundle.VersionRelease, err error) {
31+
assert.Error(t, err)
32+
},
33+
},
34+
{
35+
name: "valid semver, valid build metadata, but not a valid release",
36+
input: "1.2.3-alpha+4.005",
37+
expect: func(t *testing.T, vr *bundle.VersionRelease, err error) {
38+
require.NoError(t, err)
39+
assert.Equal(t, uint64(1), vr.Version.Major)
40+
assert.Equal(t, uint64(2), vr.Version.Minor)
41+
assert.Equal(t, uint64(3), vr.Version.Patch)
42+
assert.Equal(t, []bsemver.PRVersion{{VersionStr: "alpha"}}, vr.Version.Pre)
43+
assert.Equal(t, []string{"4", "005"}, vr.Version.Build)
44+
assert.Empty(t, vr.Release)
45+
},
46+
},
47+
{
48+
name: "valid semver, valid build metadata, valid release",
49+
input: "1.2.3-alpha+4.5",
50+
expect: func(t *testing.T, vr *bundle.VersionRelease, err error) {
51+
require.NoError(t, err)
52+
assert.Equal(t, uint64(1), vr.Version.Major)
53+
assert.Equal(t, uint64(2), vr.Version.Minor)
54+
assert.Equal(t, uint64(3), vr.Version.Patch)
55+
assert.Equal(t, []bsemver.PRVersion{{VersionStr: "alpha"}}, vr.Version.Pre)
56+
assert.Empty(t, vr.Version.Build)
57+
assert.Equal(t, bundle.Release([]bsemver.PRVersion{
58+
{VersionNum: 4, IsNum: true},
59+
{VersionNum: 5, IsNum: true},
60+
}), vr.Release)
61+
},
62+
},
63+
} {
64+
t.Run(tc.name, func(t *testing.T) {
65+
actual, err := bundle.NewLegacyRegistryV1VersionRelease(tc.input)
66+
tc.expect(t, actual, err)
67+
})
68+
}
69+
}
70+
71+
func TestVersionRelease_AsLegacyRegistryV1Version(t *testing.T) {
72+
type testCase struct {
73+
name string
74+
input bundle.VersionRelease
75+
expect bsemver.Version
76+
}
77+
for _, tc := range []testCase{
78+
{
79+
name: "Release is set, so release is set as build metadata",
80+
input: bundle.VersionRelease{
81+
Version: bsemver.Version{
82+
Major: 1,
83+
Minor: 2,
84+
Patch: 3,
85+
},
86+
Release: bundle.Release([]bsemver.PRVersion{{VersionStr: "release"}}),
87+
},
88+
expect: bsemver.Version{
89+
Major: 1,
90+
Minor: 2,
91+
Patch: 3,
92+
Build: []string{"release"},
93+
},
94+
},
95+
{
96+
name: "Release is unset, so version build metadata is set as build metadata",
97+
input: bundle.VersionRelease{
98+
Version: bsemver.Version{
99+
Major: 1,
100+
Minor: 2,
101+
Patch: 3,
102+
Build: []string{"buildmetadata"},
103+
},
104+
},
105+
expect: bsemver.Version{
106+
Major: 1,
107+
Minor: 2,
108+
Patch: 3,
109+
Build: []string{"buildmetadata"},
110+
}},
111+
} {
112+
t.Run(tc.name, func(t *testing.T) {
113+
assert.Equal(t, tc.expect, tc.input.AsLegacyRegistryV1Version())
114+
})
115+
}
116+
}
117+
12118
func TestLegacyRegistryV1VersionRelease_Compare(t *testing.T) {
13119
type testCase struct {
14120
name string
@@ -107,6 +213,12 @@ func TestLegacyRegistryV1VersionRelease_Compare(t *testing.T) {
107213
v2: "0.0.0-0+1",
108214
expect: 1,
109215
},
216+
{
217+
name: "non-release build metadata is less than valid release build metadata",
218+
v1: "0.0.0-0+1.001",
219+
v2: "0.0.0-0+0",
220+
expect: -1,
221+
},
110222
} {
111223
t.Run(tc.name, func(t *testing.T) {
112224
vr1, err1 := bundle.NewLegacyRegistryV1VersionRelease(tc.v1)

internal/operator-controller/bundleutil/bundle_test.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"encoding/json"
55
"testing"
66

7-
"github.com/blang/semver/v4"
87
bsemver "github.com/blang/semver/v4"
98
"github.com/stretchr/testify/require"
109

@@ -29,7 +28,7 @@ func TestGetVersionAndRelease(t *testing.T) {
2928
Value: json.RawMessage(`{"version": "1.0.0-pre+1.alpha.2"}`),
3029
},
3130
wantVersionRelease: &bundle.VersionRelease{
32-
Version: semver.MustParse("1.0.0-pre"),
31+
Version: bsemver.MustParse("1.0.0-pre"),
3332
Release: bundle.Release([]bsemver.PRVersion{
3433
{VersionNum: 1, IsNum: true},
3534
{VersionStr: "alpha"},
@@ -53,7 +52,7 @@ func TestGetVersionAndRelease(t *testing.T) {
5352
Value: json.RawMessage(`{"version": "1.0.0+001"}`),
5453
},
5554
wantVersionRelease: &bundle.VersionRelease{
56-
Version: semver.MustParse("1.0.0+001"),
55+
Version: bsemver.MustParse("1.0.0+001"),
5756
},
5857
wantErr: false,
5958
},

internal/operator-controller/catalogmetadata/compare/compare_test.go

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,40 +19,68 @@ func TestNewVersionRange(t *testing.T) {
1919
type testCase struct {
2020
name string
2121
versionRange string
22-
inputVersion bsemver.Version
23-
expect bool
22+
assertFunc func(t *testing.T, vr bsemver.Range, err error)
2423
}
2524
for _, tc := range []testCase{
2625
{
26+
name: "version without build metadata matches range with build metadata",
2727
versionRange: "1.0.0+1",
28-
inputVersion: bsemver.MustParse("1.0.0"),
29-
expect: true,
28+
assertFunc: func(t *testing.T, vr bsemver.Range, err error) {
29+
require.NoError(t, err)
30+
assert.True(t, vr(bsemver.MustParse("1.0.0")))
31+
},
3032
},
3133
{
34+
name: "version with different build metadata matches range with build metadata",
3235
versionRange: "1.0.0+1",
33-
inputVersion: bsemver.MustParse("1.0.0+2"),
34-
expect: true,
36+
assertFunc: func(t *testing.T, vr bsemver.Range, err error) {
37+
require.NoError(t, err)
38+
assert.True(t, vr(bsemver.MustParse("1.0.0+2")))
39+
},
3540
},
3641
{
42+
name: "version with same build metadata matches range with build metadata",
3743
versionRange: "1.0.0+1",
38-
inputVersion: bsemver.MustParse("1.0.0+1"),
39-
expect: true,
44+
assertFunc: func(t *testing.T, vr bsemver.Range, err error) {
45+
require.NoError(t, err)
46+
assert.True(t, vr(bsemver.MustParse("1.0.0+1")))
47+
},
4048
},
4149
{
50+
name: "exact version match without build metadata",
4251
versionRange: "1.0.0",
43-
inputVersion: bsemver.MustParse("1.0.0"),
44-
expect: true,
52+
assertFunc: func(t *testing.T, vr bsemver.Range, err error) {
53+
require.NoError(t, err)
54+
assert.True(t, vr(bsemver.MustParse("1.0.0")))
55+
},
4556
},
4657
{
58+
name: "version with build metadata matches range without build metadata",
4759
versionRange: "1.0.0",
48-
inputVersion: bsemver.MustParse("1.0.0+1"),
49-
expect: true,
60+
assertFunc: func(t *testing.T, vr bsemver.Range, err error) {
61+
require.NoError(t, err)
62+
assert.True(t, vr(bsemver.MustParse("1.0.0+1")))
63+
},
64+
},
65+
{
66+
name: "invalid range returns error",
67+
versionRange: "not-a-valid-version",
68+
assertFunc: func(t *testing.T, vr bsemver.Range, err error) {
69+
require.Error(t, err)
70+
},
71+
},
72+
{
73+
name: "version does not match range",
74+
versionRange: ">=2.0.0",
75+
assertFunc: func(t *testing.T, vr bsemver.Range, err error) {
76+
require.NoError(t, err)
77+
assert.False(t, vr(bsemver.MustParse("1.0.0")))
78+
},
5079
},
5180
} {
5281
t.Run(tc.name, func(t *testing.T) {
5382
versionRange, err := compare.NewVersionRange(tc.versionRange)
54-
require.NoError(t, err)
55-
assert.Equal(t, tc.expect, versionRange(tc.inputVersion))
83+
tc.assertFunc(t, versionRange, err)
5684
})
5785
}
5886
}

0 commit comments

Comments
 (0)