Skip to content

Commit

Permalink
test: Increase moduletemplateinfolookup testcoverage (#2273)
Browse files Browse the repository at this point in the history
* Add by_channel_strategy unit tests

* increase unit test coverage percentage

* add unit tests for by_version_strategy_test.go

* add unit tests for by_module_release_meta_strategy_test.go

* fix linting

* Add unit tests for common

* fix test coverage

* fix linting

* code review commonts - 1

* Add more test cases based on global and default channel

* Add a test case for failed to list ModuleTemplates

* fix linting

* increase test coverage

* remove unneeded test arrangements

---------

Co-authored-by: Christoph Schwägerl <c.schwaegerl@sap.com>
  • Loading branch information
nesmabadr and c-pius authored Feb 26, 2025
1 parent 1773f62 commit 85e6368
Show file tree
Hide file tree
Showing 5 changed files with 373 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,7 @@ func Test_ByChannelStrategy_Lookup_ReturnsModuleTemplateInfo(t *testing.T) {
kyma := builder.NewKymaBuilder().Build()
var moduleReleaseMeta *v1beta2.ModuleReleaseMeta = nil
moduleTemplate := builder.NewModuleTemplateBuilder().
WithName("test-module-regular").
WithModuleName("test-module").
WithVersion("").
WithChannel("regular").
Build()
byChannelStrategy := moduletemplateinfolookup.NewByChannelStrategy(fakeClient(
Expand All @@ -67,3 +65,163 @@ func Test_ByChannelStrategy_Lookup_ReturnsModuleTemplateInfo(t *testing.T) {
assert.Equal(t, moduleTemplate.Spec.Version, moduleTemplateInfo.ModuleTemplate.Spec.Version)
assert.Equal(t, moduleTemplate.Spec.Channel, moduleTemplateInfo.ModuleTemplate.Spec.Channel)
}

func Test_ByChannelStrategy_Lookup_ReturnsModuleTemplateInfo_UsingGlobalChannel(t *testing.T) {
moduleInfo := newModuleInfoBuilder().WithName("test-module").Enabled().Build()
kyma := builder.NewKymaBuilder().WithChannel("fast").Build()
var moduleReleaseMeta *v1beta2.ModuleReleaseMeta = nil
moduleTemplate := builder.NewModuleTemplateBuilder().
WithModuleName("test-module").
WithChannel("fast").
Build()
byChannelStrategy := moduletemplateinfolookup.NewByChannelStrategy(fakeClient(
&v1beta2.ModuleTemplateList{
Items: []v1beta2.ModuleTemplate{
*moduleTemplate,
},
},
))

moduleTemplateInfo := byChannelStrategy.Lookup(context.Background(), moduleInfo, kyma, moduleReleaseMeta)

assert.NotNil(t, moduleTemplateInfo)
assert.Equal(t, moduleTemplate.Name, moduleTemplateInfo.ModuleTemplate.Name)
assert.Equal(t, moduleTemplate.Spec.ModuleName, moduleTemplateInfo.ModuleTemplate.Spec.ModuleName)
assert.Equal(t, moduleTemplate.Spec.Version, moduleTemplateInfo.ModuleTemplate.Spec.Version)
assert.Equal(t, moduleTemplate.Spec.Channel, moduleTemplateInfo.ModuleTemplate.Spec.Channel)
}

func Test_ByChannelStrategy_Lookup_ReturnsModuleTemplateInfo_UsingDefaultChannel(t *testing.T) {
moduleInfo := newModuleInfoBuilder().WithName("test-module").Enabled().Build()
kyma := builder.NewKymaBuilder().Build()
var moduleReleaseMeta *v1beta2.ModuleReleaseMeta = nil
moduleTemplate := builder.NewModuleTemplateBuilder().
WithModuleName("test-module").
WithChannel("regular").
Build()
byChannelStrategy := moduletemplateinfolookup.NewByChannelStrategy(fakeClient(
&v1beta2.ModuleTemplateList{
Items: []v1beta2.ModuleTemplate{
*moduleTemplate,
},
},
))

moduleTemplateInfo := byChannelStrategy.Lookup(context.Background(), moduleInfo, kyma, moduleReleaseMeta)

assert.NotNil(t, moduleTemplateInfo)
assert.Equal(t, moduleTemplate.Name, moduleTemplateInfo.ModuleTemplate.Name)
assert.Equal(t, moduleTemplate.Spec.ModuleName, moduleTemplateInfo.ModuleTemplate.Spec.ModuleName)
assert.Equal(t, moduleTemplate.Spec.Version, moduleTemplateInfo.ModuleTemplate.Spec.Version)
assert.Equal(t, moduleTemplate.Spec.Channel, moduleTemplateInfo.ModuleTemplate.Spec.Channel)
}

func Test_ByChannelStrategy_Lookup_WhenNoModuleTemplateFound(t *testing.T) {
moduleInfo := newModuleInfoBuilder().WithName("test-module").WithChannel("regular").Enabled().Build()
kyma := builder.NewKymaBuilder().Build()
var moduleReleaseMeta *v1beta2.ModuleReleaseMeta = nil
byChannelStrategy := moduletemplateinfolookup.NewByChannelStrategy(fakeClient(&v1beta2.ModuleTemplateList{
Items: []v1beta2.ModuleTemplate{},
}))

moduleTemplateInfo := byChannelStrategy.Lookup(context.Background(), moduleInfo, kyma, moduleReleaseMeta)

assert.NotNil(t, moduleTemplateInfo)
assert.Nil(t, moduleTemplateInfo.ModuleTemplate)
assert.ErrorContains(t, moduleTemplateInfo.Err,
"no templates were found: for module test-module in channel regular")
}

func Test_ByChannelStrateg_Lookup_WhenFailedToListModuleTemplates(t *testing.T) {
moduleInfo := newModuleInfoBuilder().WithName("test-module").WithChannel("regular").Enabled().Build()
kyma := builder.NewKymaBuilder().Build()
var moduleReleaseMeta *v1beta2.ModuleReleaseMeta = nil

byChannelStrategy := moduletemplateinfolookup.NewByChannelStrategy(&failedClientStub{})

moduleTemplateInfo := byChannelStrategy.Lookup(context.Background(), moduleInfo, kyma, moduleReleaseMeta)

assert.NotNil(t, moduleTemplateInfo)
assert.Nil(t, moduleTemplateInfo.ModuleTemplate)
assert.ErrorContains(t, moduleTemplateInfo.Err,
"failed to list module templates on lookup")
}

func Test_ByChannelStrategy_Lookup_WhenMoreThanOneModuleTemplateFound(t *testing.T) {
moduleInfo := newModuleInfoBuilder().WithName("test-module").WithChannel("regular").Enabled().Build()
kyma := builder.NewKymaBuilder().Build()
var moduleReleaseMeta *v1beta2.ModuleReleaseMeta = nil
firstModuleTemplate := builder.NewModuleTemplateBuilder().
WithName("test-module-regular").
WithModuleName("test-module").
WithChannel("regular").
Build()
secondModuleTemplate := builder.NewModuleTemplateBuilder().
WithName("test-module-regular-2").
WithModuleName("test-module").
WithChannel("regular").
Build()
byChannelStrategy := moduletemplateinfolookup.NewByChannelStrategy(fakeClient(
&v1beta2.ModuleTemplateList{
Items: []v1beta2.ModuleTemplate{
*firstModuleTemplate,
*secondModuleTemplate,
},
},
))

moduleTemplateInfo := byChannelStrategy.Lookup(context.Background(), moduleInfo, kyma, moduleReleaseMeta)

assert.NotNil(t, moduleTemplateInfo)
assert.Nil(t, moduleTemplateInfo.ModuleTemplate)
assert.ErrorContains(t, moduleTemplateInfo.Err,
"no unique template could be identified: more than one module template found for module: test-module, candidates: [test-module-regular test-module-regular-2]")
}

func Test_ByChannelStrategy_Lookup_WhenModuleTemplateHasNoChannel(t *testing.T) {
moduleInfo := newModuleInfoBuilder().WithName("test-module").WithChannel("regular").Enabled().Build()
kyma := builder.NewKymaBuilder().Build()
var moduleReleaseMeta *v1beta2.ModuleReleaseMeta = nil
moduleTemplate := builder.NewModuleTemplateBuilder().
WithModuleName("test-module").
Build()
byChannelStrategy := moduletemplateinfolookup.NewByChannelStrategy(fakeClient(
&v1beta2.ModuleTemplateList{
Items: []v1beta2.ModuleTemplate{
*moduleTemplate,
},
},
))

moduleTemplateInfo := byChannelStrategy.Lookup(context.Background(), moduleInfo, kyma, moduleReleaseMeta)

assert.NotNil(t, moduleTemplateInfo)
assert.Nil(t, moduleTemplateInfo.ModuleTemplate)
assert.ErrorContains(t, moduleTemplateInfo.Err,
"no templates were found: for module test-module in channel regular")
}

func Test_ByChannelStrategy_Lookup_WhenModuleTemplateIsMandatory(t *testing.T) {
moduleInfo := newModuleInfoBuilder().WithName("test-module").WithChannel("regular").Enabled().Build()
kyma := builder.NewKymaBuilder().Build()
var moduleReleaseMeta *v1beta2.ModuleReleaseMeta = nil
moduleTemplate := builder.NewModuleTemplateBuilder().
WithModuleName("test-module").
WithChannel("regular").
WithMandatory(true).
Build()
byChannelStrategy := moduletemplateinfolookup.NewByChannelStrategy(fakeClient(
&v1beta2.ModuleTemplateList{
Items: []v1beta2.ModuleTemplate{
*moduleTemplate,
},
},
))

moduleTemplateInfo := byChannelStrategy.Lookup(context.Background(), moduleInfo, kyma, moduleReleaseMeta)

assert.NotNil(t, moduleTemplateInfo)
assert.Nil(t, moduleTemplateInfo.ModuleTemplate)
assert.ErrorContains(t, moduleTemplateInfo.Err,
"template marked as mandatory: for module test-module in channel regular")
}
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@ func Test_ByModuleReleaseMeta_Strategy_Lookup_ReturnsModuleTemplateInfo(t *testi
WithName("test-module-1.0.0").
WithModuleName("test-module").
WithVersion("1.0.0").
WithChannel("none").
Build()
byMRMStrategy := moduletemplateinfolookup.NewByModuleReleaseMetaStrategy(fakeClient(
&v1beta2.ModuleTemplateList{
Expand All @@ -72,6 +71,67 @@ func Test_ByModuleReleaseMeta_Strategy_Lookup_ReturnsModuleTemplateInfo(t *testi
assert.Equal(t, moduleTemplate.Spec.Channel, moduleTemplateInfo.ModuleTemplate.Spec.Channel)
}

func Test_ByModuleReleaseMeta_Strategy_Lookup_WhenGetChannelVersionForModuleReturnsError(t *testing.T) {
moduleInfo := newModuleInfoBuilder().WithName("test-module").WithChannel("regular").Enabled().Build()
kyma := builder.NewKymaBuilder().Build()
moduleReleaseMeta := builder.NewModuleReleaseMetaBuilder().
WithModuleName("test-module").
WithName("test-module").
WithModuleChannelAndVersions([]v1beta2.ChannelVersionAssignment{
{
Channel: "regular",
Version: "1.0.0",
},
}).
Build()
moduleTemplate := builder.NewModuleTemplateBuilder().
WithName("test-module").
WithModuleName("test-module").
WithVersion("1.0.0").
Build()
byMRMStrategy := moduletemplateinfolookup.NewByModuleReleaseMetaStrategy(fakeClient(
&v1beta2.ModuleTemplateList{
Items: []v1beta2.ModuleTemplate{
*moduleTemplate,
},
},
))

moduleTemplateInfo := byMRMStrategy.Lookup(context.Background(), moduleInfo, kyma, moduleReleaseMeta)

assert.NotNil(t, moduleTemplateInfo)
assert.Nil(t, moduleTemplateInfo.ModuleTemplate)
assert.ErrorContains(t, moduleTemplateInfo.Err,
"failed to get module template: moduletemplates.operator.kyma-project.io \"test-module-1.0.0\" not found")
}

func Test_ByModuleReleaseMeta_Strategy_Lookup_WhenGetTemplateByVersionReturnsError(t *testing.T) {
moduleInfo := newModuleInfoBuilder().WithName("test-module").WithChannel("regular").Enabled().Build()
kyma := builder.NewKymaBuilder().Build()
moduleReleaseMeta := builder.NewModuleReleaseMetaBuilder().
WithModuleName("test-module").
WithName("test-module").
Build()
moduleTemplate := builder.NewModuleTemplateBuilder().
WithName("test-module-1.0.0").
WithModuleName("test-module").
WithVersion("1.0.0").
Build()
byMRMStrategy := moduletemplateinfolookup.NewByModuleReleaseMetaStrategy(fakeClient(
&v1beta2.ModuleTemplateList{
Items: []v1beta2.ModuleTemplate{
*moduleTemplate,
},
},
))

moduleTemplateInfo := byMRMStrategy.Lookup(context.Background(), moduleInfo, kyma, moduleReleaseMeta)

assert.NotNil(t, moduleTemplateInfo)
assert.Nil(t, moduleTemplateInfo.ModuleTemplate)
assert.ErrorContains(t, moduleTemplateInfo.Err, "no channels found for module: test-module")
}

func fakeClient(mts *v1beta2.ModuleTemplateList) client.Client {
scheme := machineryruntime.NewScheme()
machineryutilruntime.Must(api.AddToScheme(scheme))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@ package moduletemplateinfolookup_test

import (
"context"
"errors"
"testing"

"github.com/stretchr/testify/assert"
"sigs.k8s.io/controller-runtime/pkg/client"

"github.com/kyma-project/lifecycle-manager/api/v1beta2"
"github.com/kyma-project/lifecycle-manager/pkg/templatelookup"
Expand Down Expand Up @@ -69,6 +71,102 @@ func Test_ByVersion_Strategy_Lookup_ReturnsModuleTemplateInfo(t *testing.T) {
assert.Equal(t, moduleTemplate.Spec.Channel, moduleTemplateInfo.ModuleTemplate.Spec.Channel)
}

func Test_ByVersion_Strategy_Lookup_WhenMoreThanOneModuleTemplateFound(t *testing.T) {
moduleInfo := newModuleInfoBuilder().WithName("test-module").WithVersion("1.0.0").Enabled().Build()
var kyma *v1beta2.Kyma = nil
var moduleReleaseMeta *v1beta2.ModuleReleaseMeta = nil
firstModuleTemplate := builder.NewModuleTemplateBuilder().
WithName("test-module-1.0.0").
WithModuleName("test-module").
WithVersion("1.0.0").
WithChannel("none").
Build()
secondModuleTemplate := builder.NewModuleTemplateBuilder().
WithName("test-module-1.0.0-duplicate").
WithModuleName("test-module").
WithVersion("1.0.0").
WithChannel("none").
Build()

byVersionStrategy := moduletemplateinfolookup.NewByVersionStrategy(fakeClient(
&v1beta2.ModuleTemplateList{
Items: []v1beta2.ModuleTemplate{
*firstModuleTemplate,
*secondModuleTemplate,
},
},
))

moduleTemplateInfo := byVersionStrategy.Lookup(context.Background(), moduleInfo, kyma, moduleReleaseMeta)

assert.NotNil(t, moduleTemplateInfo)
assert.Nil(t, moduleTemplateInfo.ModuleTemplate)
assert.ErrorContains(t, moduleTemplateInfo.Err,
"no unique template could be identified: more than one module template found for module: test-module, candidates: [test-module-1.0.0 test-module-1.0.0-duplicate]")
}

func Test_ByVersion_Strategy_Lookup_WhenFailedToListModuleTemplates(t *testing.T) {
moduleInfo := newModuleInfoBuilder().WithName("test-module").WithVersion("1.0.0").Enabled().Build()
var kyma *v1beta2.Kyma = nil
var moduleReleaseMeta *v1beta2.ModuleReleaseMeta = nil

byVersionStrategy := moduletemplateinfolookup.NewByVersionStrategy(&failedClientStub{})

moduleTemplateInfo := byVersionStrategy.Lookup(context.Background(), moduleInfo, kyma, moduleReleaseMeta)

assert.NotNil(t, moduleTemplateInfo)
assert.Nil(t, moduleTemplateInfo.ModuleTemplate)
assert.ErrorContains(t, moduleTemplateInfo.Err,
"failed to list module templates on lookup")
}

func Test_ByVersion_Strategy_Lookup_WhenNoModuleTemplateFound(t *testing.T) {
moduleInfo := newModuleInfoBuilder().WithName("test-module").WithVersion("1.0.0").Enabled().Build()
var kyma *v1beta2.Kyma = nil
var moduleReleaseMeta *v1beta2.ModuleReleaseMeta = nil

byVersionStrategy := moduletemplateinfolookup.NewByVersionStrategy(fakeClient(
&v1beta2.ModuleTemplateList{
Items: []v1beta2.ModuleTemplate{},
},
))

moduleTemplateInfo := byVersionStrategy.Lookup(context.Background(), moduleInfo, kyma, moduleReleaseMeta)

assert.NotNil(t, moduleTemplateInfo)
assert.Nil(t, moduleTemplateInfo.ModuleTemplate)
assert.ErrorContains(t, moduleTemplateInfo.Err,
"no templates were found: for module test-module in version 1.0.0")
}

func Test_ByVersion_Strategy_Lookup_WhenModuleTemplateIsMandatory(t *testing.T) {
moduleInfo := newModuleInfoBuilder().WithName("test-module").WithVersion("1.0.0").Enabled().Build()
var kyma *v1beta2.Kyma = nil
var moduleReleaseMeta *v1beta2.ModuleReleaseMeta = nil
moduleTemplate := builder.NewModuleTemplateBuilder().
WithName("test-module-1.0.0").
WithModuleName("test-module").
WithVersion("1.0.0").
WithChannel("none").
WithMandatory(true).
Build()

byVersionStrategy := moduletemplateinfolookup.NewByVersionStrategy(fakeClient(
&v1beta2.ModuleTemplateList{
Items: []v1beta2.ModuleTemplate{
*moduleTemplate,
},
},
))

moduleTemplateInfo := byVersionStrategy.Lookup(context.Background(), moduleInfo, kyma, moduleReleaseMeta)

assert.NotNil(t, moduleTemplateInfo)
assert.Nil(t, moduleTemplateInfo.ModuleTemplate)
assert.ErrorContains(t, moduleTemplateInfo.Err,
"template marked as mandatory: for module test-module in version 1.0.0")
}

type moduleInfoBuilder struct {
moduleInfo *templatelookup.ModuleInfo
}
Expand Down Expand Up @@ -104,3 +202,11 @@ func (b moduleInfoBuilder) Enabled() moduleInfoBuilder {
func (b moduleInfoBuilder) Build() *templatelookup.ModuleInfo {
return b.moduleInfo
}

type failedClientStub struct {
client.Client
}

func (c *failedClientStub) List(ctx context.Context, list client.ObjectList, opts ...client.ListOption) error {
return errors.New("failed to list module templates")
}
Loading

0 comments on commit 85e6368

Please sign in to comment.