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  }