Skip to content

Commit 7d53835

Browse files
authored
Add extra tests for zero major version (#472)
Zero major version is reserved for initial development according to SemVer spec [^1] and anything may change at any time. As the result of the above update behaviour is different for it. [^1]: https://semver.org/#spec-item-4 Signed-off-by: Mikalai Radchuk <[email protected]>
1 parent fd02095 commit 7d53835

File tree

1 file changed

+123
-16
lines changed

1 file changed

+123
-16
lines changed

internal/resolution/variablesources/installed_package_test.go

Lines changed: 123 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,27 @@ func TestInstalledPackageVariableSource(t *testing.T) {
2424
Name: "stable",
2525
Entries: []declcfg.ChannelEntry{
2626
{
27-
Name: "test-package.v1.0.0",
27+
Name: "test-package.v0.0.1",
28+
},
29+
{
30+
Name: "test-package.v0.0.2",
31+
Replaces: "test-package.v0.0.1",
32+
},
33+
{
34+
Name: "test-package.v0.1.0",
35+
Replaces: "test-package.v0.0.2",
36+
},
37+
{
38+
Name: "test-package.v0.1.1",
39+
Replaces: "test-package.v0.1.0",
40+
},
41+
{
42+
Name: "test-package.v0.2.0",
43+
Replaces: "test-package.v0.1.1",
44+
},
45+
{
46+
Name: "test-package.v1.0.0",
47+
Replaces: "test-package.v0.2.0",
2848
},
2949
{
3050
Name: "test-package.v2.0.0",
@@ -53,6 +73,51 @@ func TestInstalledPackageVariableSource(t *testing.T) {
5373
},
5474
}}
5575
bundleList := []*catalogmetadata.Bundle{
76+
{Bundle: declcfg.Bundle{
77+
Name: "test-package.v0.0.1",
78+
Package: "test-package",
79+
Image: "registry.io/repo/[email protected]",
80+
Properties: []property.Property{
81+
{Type: property.TypePackage, Value: json.RawMessage(`{"packageName": "test-package", "version": "0.0.1"}`)},
82+
}},
83+
InChannels: []*catalogmetadata.Channel{&channel},
84+
},
85+
{Bundle: declcfg.Bundle{
86+
Name: "test-package.v0.0.2",
87+
Package: "test-package",
88+
Image: "registry.io/repo/[email protected]",
89+
Properties: []property.Property{
90+
{Type: property.TypePackage, Value: json.RawMessage(`{"packageName": "test-package", "version": "0.0.2"}`)},
91+
}},
92+
InChannels: []*catalogmetadata.Channel{&channel},
93+
},
94+
{Bundle: declcfg.Bundle{
95+
Name: "test-package.v0.1.0",
96+
Package: "test-package",
97+
Image: "registry.io/repo/[email protected]",
98+
Properties: []property.Property{
99+
{Type: property.TypePackage, Value: json.RawMessage(`{"packageName": "test-package", "version": "0.1.0"}`)},
100+
}},
101+
InChannels: []*catalogmetadata.Channel{&channel},
102+
},
103+
{Bundle: declcfg.Bundle{
104+
Name: "test-package.v0.1.1",
105+
Package: "test-package",
106+
Image: "registry.io/repo/[email protected]",
107+
Properties: []property.Property{
108+
{Type: property.TypePackage, Value: json.RawMessage(`{"packageName": "test-package", "version": "0.1.1"}`)},
109+
}},
110+
InChannels: []*catalogmetadata.Channel{&channel},
111+
},
112+
{Bundle: declcfg.Bundle{
113+
Name: "test-package.v0.2.0",
114+
Package: "test-package",
115+
Image: "registry.io/repo/[email protected]",
116+
Properties: []property.Property{
117+
{Type: property.TypePackage, Value: json.RawMessage(`{"packageName": "test-package", "version": "0.2.0"}`)},
118+
}},
119+
InChannels: []*catalogmetadata.Channel{&channel},
120+
},
56121
{Bundle: declcfg.Bundle{
57122
Name: "test-package.v1.0.0",
58123
Package: "test-package",
@@ -118,33 +183,75 @@ func TestInstalledPackageVariableSource(t *testing.T) {
118183
},
119184
}
120185

121-
const bundleImage = "registry.io/repo/[email protected]"
122186
fakeCatalogClient := testutil.NewFakeCatalogClient(bundleList)
123187

124188
t.Run("with ForceSemverUpgradeConstraints feature gate enabled", func(t *testing.T) {
125189
defer featuregatetesting.SetFeatureGateDuringTest(t, features.OperatorControllerFeatureGate, features.ForceSemverUpgradeConstraints, true)()
126190

127-
ipvs, err := variablesources.NewInstalledPackageVariableSource(&fakeCatalogClient, bundleImage)
128-
require.NoError(t, err)
191+
t.Run("with non-zero major version", func(t *testing.T) {
192+
const bundleImage = "registry.io/repo/[email protected]"
193+
ipvs, err := variablesources.NewInstalledPackageVariableSource(&fakeCatalogClient, bundleImage)
194+
require.NoError(t, err)
129195

130-
variables, err := ipvs.GetVariables(context.TODO())
131-
require.NoError(t, err)
132-
require.Len(t, variables, 1)
133-
packageVariable, ok := variables[0].(*olmvariables.InstalledPackageVariable)
134-
assert.True(t, ok)
135-
assert.Equal(t, deppy.IdentifierFromString("installed package test-package"), packageVariable.Identifier())
196+
variables, err := ipvs.GetVariables(context.TODO())
197+
require.NoError(t, err)
198+
require.Len(t, variables, 1)
199+
packageVariable, ok := variables[0].(*olmvariables.InstalledPackageVariable)
200+
assert.True(t, ok)
201+
assert.Equal(t, deppy.IdentifierFromString("installed package test-package"), packageVariable.Identifier())
136202

137-
// ensure bundles are in version order (high to low)
138-
bundles := packageVariable.Bundles()
139-
require.Len(t, bundles, 3)
140-
assert.Equal(t, "test-package.v2.2.0", packageVariable.Bundles()[0].Name)
141-
assert.Equal(t, "test-package.v2.1.0", packageVariable.Bundles()[1].Name)
142-
assert.Equal(t, "test-package.v2.0.0", packageVariable.Bundles()[2].Name)
203+
// ensure bundles are in version order (high to low)
204+
bundles := packageVariable.Bundles()
205+
require.Len(t, bundles, 3)
206+
assert.Equal(t, "test-package.v2.2.0", packageVariable.Bundles()[0].Name)
207+
assert.Equal(t, "test-package.v2.1.0", packageVariable.Bundles()[1].Name)
208+
assert.Equal(t, "test-package.v2.0.0", packageVariable.Bundles()[2].Name)
209+
})
210+
211+
t.Run("with zero major version", func(t *testing.T) {
212+
t.Run("with zero minor version", func(t *testing.T) {
213+
const bundleImage = "registry.io/repo/[email protected]"
214+
ipvs, err := variablesources.NewInstalledPackageVariableSource(&fakeCatalogClient, bundleImage)
215+
require.NoError(t, err)
216+
217+
variables, err := ipvs.GetVariables(context.TODO())
218+
require.NoError(t, err)
219+
require.Len(t, variables, 1)
220+
packageVariable, ok := variables[0].(*olmvariables.InstalledPackageVariable)
221+
assert.True(t, ok)
222+
assert.Equal(t, deppy.IdentifierFromString("installed package test-package"), packageVariable.Identifier())
223+
224+
// No upgrades are allowed in major version zero when minor version is also zero
225+
bundles := packageVariable.Bundles()
226+
require.Len(t, bundles, 1)
227+
assert.Equal(t, "test-package.v0.0.1", packageVariable.Bundles()[0].Name)
228+
})
229+
230+
t.Run("with non-zero minor version", func(t *testing.T) {
231+
const bundleImage = "registry.io/repo/[email protected]"
232+
ipvs, err := variablesources.NewInstalledPackageVariableSource(&fakeCatalogClient, bundleImage)
233+
require.NoError(t, err)
234+
235+
variables, err := ipvs.GetVariables(context.TODO())
236+
require.NoError(t, err)
237+
require.Len(t, variables, 1)
238+
packageVariable, ok := variables[0].(*olmvariables.InstalledPackageVariable)
239+
assert.True(t, ok)
240+
assert.Equal(t, deppy.IdentifierFromString("installed package test-package"), packageVariable.Identifier())
241+
242+
// Patch version upgrades are allowed, but not minor upgrades
243+
bundles := packageVariable.Bundles()
244+
require.Len(t, bundles, 2)
245+
assert.Equal(t, "test-package.v0.1.1", packageVariable.Bundles()[0].Name)
246+
assert.Equal(t, "test-package.v0.1.0", packageVariable.Bundles()[1].Name)
247+
})
248+
})
143249
})
144250

145251
t.Run("with ForceSemverUpgradeConstraints feature gate disabled", func(t *testing.T) {
146252
defer featuregatetesting.SetFeatureGateDuringTest(t, features.OperatorControllerFeatureGate, features.ForceSemverUpgradeConstraints, false)()
147253

254+
const bundleImage = "registry.io/repo/[email protected]"
148255
ipvs, err := variablesources.NewInstalledPackageVariableSource(&fakeCatalogClient, bundleImage)
149256
require.NoError(t, err)
150257

0 commit comments

Comments
 (0)