package bsl_test import ( "context" "testing" "time" . "edge-infra.dev/pkg/edge/bsl" //nolint:revive //TODO: dont be lazy fakebsl "edge-infra.dev/pkg/edge/bsl/fake" "edge-infra.dev/pkg/lib/logging" assertapi "github.com/stretchr/testify/assert" "sigs.k8s.io/controller-runtime/pkg/client/fake" ) var ( waitForCallbackFunction = 200 * time.Millisecond ) func TestOnConfigMapUpdate(t *testing.T) { assert := assertapi.New(t) cl := fake.NewClientBuilder().Build() ctx := context.Background() configMap := fakebsl.GetBSLInfoConfigMap() updatedConfigmap := fakebsl.GetBSLInfoConfigMap() updatedConfigmap.Data[BSLSiteID] = "foo1" // create ConfigMap watch callCount := 0 logger := logging.NewLogger().WithName("TestOnConfigMapUpdate") watch, err := OnConfigMapUpdate(ctx, cl, logger, func(i *BSLInfo) { assert.NotNil(configMap) if callCount == 0 { actual, err := FromConfigMap(configMap) assert.NoError(err) assert.Equal(actual, i) } else { actual, err := FromConfigMap(updatedConfigmap) assert.NoError(err) assert.Equal(actual, i) } callCount++ }) assert.NoError(err) defer watch.Stop() assert.NoError(cl.Create(ctx, configMap)) time.Sleep(waitForCallbackFunction) // wait for async call assert.NoError(cl.Update(ctx, updatedConfigmap)) time.Sleep(waitForCallbackFunction) assert.Equal(2, callCount) } func TestOnConfigMapUpdateInvalid(t *testing.T) { assert := assertapi.New(t) cl := fake.NewClientBuilder().Build() ctx := context.Background() configMap := fakebsl.GetBSLInfoConfigMap() updatedConfigmap := fakebsl.GetBSLInfoConfigMap() updatedConfigmap.Data[BSLSiteCoordinateLatitude] = "invalid value, number only" // create ConfigMap watch callCount := 0 logger := logging.NewLogger().WithName("TestOnConfigMapUpdateInvalid") watch, err := OnConfigMapUpdate(ctx, cl, logger, func(i *BSLInfo) { assert.NotNil(configMap) actual, err := FromConfigMap(configMap) assert.NoError(err) assert.Equal(actual, i) callCount++ }) assert.NoError(err) defer watch.Stop() assert.NoError(cl.Create(ctx, configMap)) time.Sleep(waitForCallbackFunction) // wait for async call assert.NoError(cl.Update(ctx, updatedConfigmap)) time.Sleep(waitForCallbackFunction) assert.Equal(1, callCount) } // nolint: dupl func TestOnConfigMapUpdateFilterMatchAll(t *testing.T) { assert := assertapi.New(t) cl := fake.NewClientBuilder().Build() ctx := context.Background() configMap := fakebsl.GetBSLInfoConfigMap() updatedConfigmap := fakebsl.GetBSLInfoConfigMap() updatedConfigmap.Data[BSLSiteName] = "foo2" updatedConfigmap.Data[BSLSiteReferenceID] = "new-id" // create ConfigMap watch callCount := 0 logger := logging.NewLogger().WithName("TestOnConfigMapUpdateFilterMatchAll") watch, err := OnConfigMapUpdate(ctx, cl, logger, func(i *BSLInfo) { assert.NotNil(configMap) if callCount == 0 { actual, err := FromConfigMap(configMap) assert.NoError(err) assert.Equal(actual, i) } else { actual, err := FromConfigMap(updatedConfigmap) assert.NoError(err) assert.Equal(actual, i) } callCount++ }, BSLSiteName, BSLSiteReferenceID) assert.NoError(err) defer watch.Stop() assert.NoError(cl.Create(ctx, configMap)) time.Sleep(waitForCallbackFunction) assert.NoError(cl.Update(ctx, updatedConfigmap)) time.Sleep(waitForCallbackFunction) assert.Equal(2, callCount) } // nolint: dupl func TestOnConfigMapUpdateFilterMatchOne(t *testing.T) { assert := assertapi.New(t) cl := fake.NewClientBuilder().Build() ctx := context.Background() configMap := fakebsl.GetBSLInfoConfigMap() updatedConfigmap := fakebsl.GetBSLInfoConfigMap() updatedConfigmap.Data[BSLSiteName] = "foo3" updatedConfigmap.Data[BSLSiteAddressStreet] = "new-location" // create ConfigMap watch callCount := 0 logger := logging.NewLogger().WithName("TestOnConfigMapUpdateFilterMatchOne") watch, err := OnConfigMapUpdate(ctx, cl, logger, func(i *BSLInfo) { assert.NotNil(configMap) if callCount == 0 { actual, err := FromConfigMap(configMap) assert.NoError(err) assert.Equal(actual, i) } else { actual, err := FromConfigMap(updatedConfigmap) assert.NoError(err) assert.Equal(actual, i) } callCount++ }, BSLSiteName, BSLSiteID) assert.NoError(err) defer watch.Stop() assert.NoError(cl.Create(ctx, configMap)) time.Sleep(waitForCallbackFunction) assert.NoError(cl.Update(ctx, updatedConfigmap)) time.Sleep(waitForCallbackFunction) assert.Equal(2, callCount) } func TestOnConfigMapUpdateFilterMatchNone(t *testing.T) { assert := assertapi.New(t) cl := fake.NewClientBuilder().Build() ctx := context.Background() configMap := fakebsl.GetBSLInfoConfigMap() updatedConfigmap := fakebsl.GetBSLInfoConfigMap() updatedConfigmap.Data[BSLSiteName] = "foo4" // create ConfigMap watch callCount := 0 logger := logging.NewLogger().WithName("TestOnConfigMapUpdateFilterMatchNone") watch, err := OnConfigMapUpdate(ctx, cl, logger, func(i *BSLInfo) { assert.NotNil(configMap) actual, err := FromConfigMap(configMap) assert.NoError(err) assert.Equal(actual, i) callCount++ }, BSLSiteID, BSLSiteEnterpriseUnitName) assert.NoError(err) defer watch.Stop() assert.NoError(cl.Create(ctx, configMap)) time.Sleep(waitForCallbackFunction) // wait for async call assert.NoError(cl.Update(ctx, updatedConfigmap)) time.Sleep(waitForCallbackFunction) assert.Equal(1, callCount) }