github.com/kubeshop/testkube@v1.17.23/pkg/triggers/executor_test.go (about) 1 package triggers 2 3 import ( 4 "context" 5 "testing" 6 7 "github.com/golang/mock/gomock" 8 "github.com/stretchr/testify/assert" 9 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 10 11 v1 "github.com/kubeshop/testkube-operator/api/executor/v1" 12 testsv3 "github.com/kubeshop/testkube-operator/api/tests/v3" 13 testtriggersv1 "github.com/kubeshop/testkube-operator/api/testtriggers/v1" 14 executorsclientv1 "github.com/kubeshop/testkube-operator/pkg/client/executors/v1" 15 testsclientv3 "github.com/kubeshop/testkube-operator/pkg/client/tests/v3" 16 testsourcesv1 "github.com/kubeshop/testkube-operator/pkg/client/testsources/v1" 17 testsuiteexecutionsv1 "github.com/kubeshop/testkube-operator/pkg/client/testsuiteexecutions/v1" 18 testsuitesv3 "github.com/kubeshop/testkube-operator/pkg/client/testsuites/v3" 19 "github.com/kubeshop/testkube/internal/app/api/metrics" 20 "github.com/kubeshop/testkube/pkg/api/v1/testkube" 21 "github.com/kubeshop/testkube/pkg/configmap" 22 "github.com/kubeshop/testkube/pkg/event" 23 "github.com/kubeshop/testkube/pkg/event/bus" 24 "github.com/kubeshop/testkube/pkg/executor/client" 25 "github.com/kubeshop/testkube/pkg/featureflags" 26 "github.com/kubeshop/testkube/pkg/log" 27 logsclient "github.com/kubeshop/testkube/pkg/logs/client" 28 "github.com/kubeshop/testkube/pkg/repository/config" 29 "github.com/kubeshop/testkube/pkg/repository/result" 30 "github.com/kubeshop/testkube/pkg/repository/testresult" 31 "github.com/kubeshop/testkube/pkg/scheduler" 32 "github.com/kubeshop/testkube/pkg/secret" 33 ) 34 35 func TestExecute(t *testing.T) { 36 t.Parallel() 37 38 ctx := context.Background() 39 metricsHandle := metrics.NewMetrics() 40 41 mockCtrl := gomock.NewController(t) 42 defer mockCtrl.Finish() 43 44 mockBus := bus.NewEventBusMock() 45 mockResultRepository := result.NewMockRepository(mockCtrl) 46 mockTestResultRepository := testresult.NewMockRepository(mockCtrl) 47 48 mockExecutorsClient := executorsclientv1.NewMockInterface(mockCtrl) 49 mockTestsClient := testsclientv3.NewMockInterface(mockCtrl) 50 mockTestSuitesClient := testsuitesv3.NewMockInterface(mockCtrl) 51 mockTestSourcesClient := testsourcesv1.NewMockInterface(mockCtrl) 52 mockSecretClient := secret.NewMockInterface(mockCtrl) 53 configMapConfig := config.NewMockRepository(mockCtrl) 54 mockConfigMapClient := configmap.NewMockInterface(mockCtrl) 55 mockTestSuiteExecutionsClient := testsuiteexecutionsv1.NewMockInterface(mockCtrl) 56 57 mockExecutor := client.NewMockExecutor(mockCtrl) 58 59 mockEventEmitter := event.NewEmitter(bus.NewEventBusMock(), "", nil) 60 61 mockTest := testsv3.Test{ 62 ObjectMeta: metav1.ObjectMeta{Namespace: "testkube", Name: "some-test"}, 63 Spec: testsv3.TestSpec{ 64 Type_: "cypress", 65 ExecutionRequest: &testsv3.ExecutionRequest{ 66 Name: "some-custom-execution", 67 Number: 1, 68 Image: "test-image", 69 }, 70 }, 71 } 72 mockTestsClient.EXPECT().Get("some-test").Return(&mockTest, nil).AnyTimes() 73 var mockNextExecutionNumber int32 = 1 74 mockResultRepository.EXPECT().GetNextExecutionNumber(gomock.Any(), "some-test").Return(mockNextExecutionNumber, nil) 75 mockExecutionResult := testkube.ExecutionResult{Status: testkube.ExecutionStatusRunning} 76 mockExecution := testkube.Execution{Name: "test-execution-1"} 77 mockExecution.ExecutionResult = &mockExecutionResult 78 mockResultRepository.EXPECT().GetByNameAndTest(gomock.Any(), "some-custom-execution", "some-test").Return(mockExecution, nil) 79 mockSecretUUID := "b524c2f6-6bcf-4178-87c1-1aa2b2abb5dc" 80 mockTestsClient.EXPECT().GetCurrentSecretUUID("some-test").Return(mockSecretUUID, nil) 81 mockExecutorTypes := "cypress" 82 mockExecutorV1 := v1.Executor{ 83 TypeMeta: metav1.TypeMeta{}, 84 ObjectMeta: metav1.ObjectMeta{Namespace: "testkube", Name: "cypress"}, 85 Spec: v1.ExecutorSpec{ 86 Types: []string{mockExecutorTypes}, 87 ExecutorType: "job", 88 URI: "", 89 Image: "cypress", 90 Args: nil, 91 Command: []string{"run"}, 92 ImagePullSecrets: nil, 93 Features: nil, 94 ContentTypes: nil, 95 JobTemplate: "", 96 JobTemplateReference: "", 97 Meta: nil, 98 UseDataDirAsWorkingDir: false, 99 }, 100 } 101 mockExecutorsClient.EXPECT().GetByType(mockExecutorTypes).Return(&mockExecutorV1, nil).AnyTimes() 102 mockResultRepository.EXPECT().Insert(gomock.Any(), gomock.Any()).Return(nil) 103 mockResultRepository.EXPECT().StartExecution(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil) 104 mockExecutor.EXPECT().Execute(gomock.Any(), gomock.Any(), gomock.Any()).Return(&mockExecutionResult, nil) 105 mockResultRepository.EXPECT().UpdateResult(gomock.Any(), gomock.Any(), gomock.Any()).Return(nil) 106 107 mockLogsStream := logsclient.NewMockStream(mockCtrl) 108 109 sched := scheduler.NewScheduler( 110 metricsHandle, 111 mockExecutor, 112 mockExecutor, 113 mockResultRepository, 114 mockTestResultRepository, 115 mockExecutorsClient, 116 mockTestsClient, 117 mockTestSuitesClient, 118 mockTestSourcesClient, 119 mockSecretClient, 120 mockEventEmitter, 121 log.DefaultLogger, 122 configMapConfig, 123 mockConfigMapClient, 124 mockTestSuiteExecutionsClient, 125 mockBus, 126 "", 127 featureflags.FeatureFlags{}, 128 mockLogsStream, 129 "", 130 "", 131 "", 132 ) 133 s := &Service{ 134 triggerStatus: make(map[statusKey]*triggerStatus), 135 scheduler: sched, 136 testsClient: mockTestsClient, 137 testSuitesClient: mockTestSuitesClient, 138 logger: log.DefaultLogger, 139 } 140 141 status := testtriggersv1.TRUE_TestTriggerConditionStatuses 142 testTrigger := testtriggersv1.TestTrigger{ 143 ObjectMeta: metav1.ObjectMeta{Namespace: "testkube", Name: "test-trigger-1"}, 144 Spec: testtriggersv1.TestTriggerSpec{ 145 Resource: "deployment", 146 ResourceSelector: testtriggersv1.TestTriggerSelector{Name: "test-deployment"}, 147 Event: "created", 148 ConditionSpec: &testtriggersv1.TestTriggerConditionSpec{ 149 Conditions: []testtriggersv1.TestTriggerCondition{{ 150 Type_: "Progressing", 151 Status: &status, 152 Reason: "NewReplicaSetAvailable", 153 Ttl: 60, 154 }}, 155 }, 156 ProbeSpec: &testtriggersv1.TestTriggerProbeSpec{ 157 Probes: []testtriggersv1.TestTriggerProbe{{ 158 Host: "testkube-api-server", 159 Path: "/health", 160 Port: 8088, 161 Headers: map[string]string{"X-Token": "12345"}, 162 }}, 163 }, 164 Action: "run", 165 Execution: "test", 166 ConcurrencyPolicy: "allow", 167 TestSelector: testtriggersv1.TestTriggerSelector{Name: "some-test"}, 168 }, 169 } 170 171 s.addTrigger(&testTrigger) 172 173 key := newStatusKey(testTrigger.Namespace, testTrigger.Name) 174 assert.Contains(t, s.triggerStatus, key) 175 176 err := s.execute(ctx, &watcherEvent{}, &testTrigger) 177 assert.NoError(t, err) 178 }