Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions controllers/keda/suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,9 @@ import (
kedav1alpha1 "github.com/kedacore/keda/v2/apis/keda/v1alpha1"
"github.com/kedacore/keda/v2/pkg/eventemitter"
"github.com/kedacore/keda/v2/pkg/k8s"
"github.com/kedacore/keda/v2/pkg/scalers"
"github.com/kedacore/keda/v2/pkg/scalers/authentication"
"github.com/kedacore/keda/v2/pkg/scalers/scalersconfig"
"github.com/kedacore/keda/v2/pkg/scaling"
)

Expand All @@ -59,6 +61,11 @@ func TestAPIs(t *testing.T) {
var _ = BeforeSuite(func() {
logf.SetLogger(zap.New(zap.UseDevMode(true), zap.WriteTo(GinkgoWriter)))

// Register test-only scalers
scaling.RegisterTestScalerBuilder("external-mock", func(_ context.Context, _ client.Client, _ string, config *scalersconfig.ScalerConfig) (scalers.Scaler, error) {
return scalers.NewExternalMockScaler(config)
})

By("bootstrapping test environment")
testEnv = &envtest.Environment{
CRDDirectoryPaths: []string{filepath.Join("..", "..", "config", "crd", "bases")},
Expand Down
17 changes: 14 additions & 3 deletions pkg/scaling/scalers_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -119,8 +119,22 @@ func (h *scaleHandler) buildScalers(ctx context.Context, withTriggers *kedav1alp
return result, nil
}

// function type for building test-only scalers
type testScalerBuilder func(context.Context, client.Client, string, *scalersconfig.ScalerConfig) (scalers.Scaler, error)

var testScalerBuilders = make(map[string]testScalerBuilder)

func RegisterTestScalerBuilder(triggerType string, builder testScalerBuilder) {
testScalerBuilders[triggerType] = builder
}

// buildScaler builds a scaler form input config and trigger type
func buildScaler(ctx context.Context, client client.Client, triggerType string, config *scalersconfig.ScalerConfig) (scalers.Scaler, error) {
// Check test scalers first (only populated during tests)
if builder, ok := testScalerBuilders[triggerType]; ok {
return builder(ctx, client, triggerType, config)
}

// TRIGGERS-START
switch triggerType {
case "activemq":
Expand Down Expand Up @@ -179,9 +193,6 @@ func buildScaler(ctx context.Context, client client.Client, triggerType string,
return scalers.NewEtcdScaler(config)
case "external":
return scalers.NewExternalScaler(config)
// TODO: use other way for test.
case "external-mock":
return scalers.NewExternalMockScaler(config)
case "external-push":
return scalers.NewExternalPushScaler(config)
case "forgejo-runner":
Expand Down
37 changes: 37 additions & 0 deletions pkg/scaling/scalers_builder_registry_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package scaling

import (
"context"
"testing"

"sigs.k8s.io/controller-runtime/pkg/client"

"github.com/kedacore/keda/v2/pkg/scalers"
"github.com/kedacore/keda/v2/pkg/scalers/scalersconfig"
)

func TestTestScalerRegistry(t *testing.T) {
called := false
RegisterTestScalerBuilder("test-scaler", func(_ context.Context, _ client.Client, _ string, _ *scalersconfig.ScalerConfig) (scalers.Scaler, error) {
called = true
return nil, nil
})

_, _ = buildScaler(context.Background(), nil, "test-scaler", &scalersconfig.ScalerConfig{})

if !called {
t.Error("Test scaler builder was not called")
}

delete(testScalerBuilders, "test-scaler")
}

func TestProductionScalerStillWorks(t *testing.T) {
// Verify that a production scaler like "cron" still returns an error with proper message
config := &scalersconfig.ScalerConfig{}
_, err := buildScaler(context.Background(), nil, "cron", config)

if err != nil && err.Error() == "no scaler found for type: cron" {
t.Error("Production scaler 'cron' was not found in buildScaler")
}
}
Loading