diff --git a/api/triggers.yaml b/api/triggers.yaml index de8b0dadc1..9ccf099b31 100644 --- a/api/triggers.yaml +++ b/api/triggers.yaml @@ -6,7 +6,7 @@ components: properties: type: type: string - enum: ["http", "grpc", "traceid", "kafka", "cypress"] + enum: ["http", "grpc", "traceid", "kafka", "cypress", "playwright"] httpRequest: $ref: "./http.yaml#/components/schemas/HTTPRequest" grpc: @@ -21,7 +21,7 @@ components: properties: type: type: string - enum: ["http", "grpc", "traceid", "kafka", "cypress"] + enum: ["http", "grpc", "traceid", "kafka", "cypress", "playwright"] triggerResult: type: object properties: diff --git a/cli/openapi/api_resource_api.go b/cli/openapi/api_resource_api.go index cb89fa02d6..7cb9f97a43 100644 --- a/cli/openapi/api_resource_api.go +++ b/cli/openapi/api_resource_api.go @@ -239,17 +239,17 @@ func (a *ResourceApiApiService) CreateLinterExecute(r ApiCreateLinterRequest) (* } type ApiCreateTestRequest struct { - ctx context.Context - ApiService *ResourceApiApiService - test *Test + ctx context.Context + ApiService *ResourceApiApiService + testResource *TestResource } -func (r ApiCreateTestRequest) Test(test Test) ApiCreateTestRequest { - r.test = &test +func (r ApiCreateTestRequest) TestResource(testResource TestResource) ApiCreateTestRequest { + r.testResource = &testResource return r } -func (r ApiCreateTestRequest) Execute() (*Test, *http.Response, error) { +func (r ApiCreateTestRequest) Execute() (*TestResource, *http.Response, error) { return r.ApiService.CreateTestExecute(r) } @@ -270,13 +270,13 @@ func (a *ResourceApiApiService) CreateTest(ctx context.Context) ApiCreateTestReq // Execute executes the request // -// @return Test -func (a *ResourceApiApiService) CreateTestExecute(r ApiCreateTestRequest) (*Test, *http.Response, error) { +// @return TestResource +func (a *ResourceApiApiService) CreateTestExecute(r ApiCreateTestRequest) (*TestResource, *http.Response, error) { var ( localVarHTTPMethod = http.MethodPost localVarPostBody interface{} formFiles []formFile - localVarReturnValue *Test + localVarReturnValue *TestResource ) localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ResourceApiApiService.CreateTest") @@ -308,7 +308,7 @@ func (a *ResourceApiApiService) CreateTestExecute(r ApiCreateTestRequest) (*Test localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept } // body params - localVarPostBody = r.test + localVarPostBody = r.testResource req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles) if err != nil { return localVarReturnValue, nil, err @@ -562,98 +562,6 @@ func (a *ResourceApiApiService) CreateVariableSetExecute(r ApiCreateVariableSetR return localVarReturnValue, localVarHTTPResponse, nil } -type ApiDeleteDataStoreRequest struct { - ctx context.Context - ApiService *ResourceApiApiService - dataStoreId string -} - -func (r ApiDeleteDataStoreRequest) Execute() (*http.Response, error) { - return r.ApiService.DeleteDataStoreExecute(r) -} - -/* -DeleteDataStore Delete a Data Store - -Delete a Data Store - - @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - @param dataStoreId ID of a datastore used on Tracetest to configure how to fetch traces in a test - @return ApiDeleteDataStoreRequest -*/ -func (a *ResourceApiApiService) DeleteDataStore(ctx context.Context, dataStoreId string) ApiDeleteDataStoreRequest { - return ApiDeleteDataStoreRequest{ - ApiService: a, - ctx: ctx, - dataStoreId: dataStoreId, - } -} - -// Execute executes the request -func (a *ResourceApiApiService) DeleteDataStoreExecute(r ApiDeleteDataStoreRequest) (*http.Response, error) { - var ( - localVarHTTPMethod = http.MethodDelete - localVarPostBody interface{} - formFiles []formFile - ) - - localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ResourceApiApiService.DeleteDataStore") - if err != nil { - return nil, &GenericOpenAPIError{error: err.Error()} - } - - localVarPath := localBasePath + "/datastores/{dataStoreId}" - localVarPath = strings.Replace(localVarPath, "{"+"dataStoreId"+"}", url.PathEscape(parameterValueToString(r.dataStoreId, "dataStoreId")), -1) - - localVarHeaderParams := make(map[string]string) - localVarQueryParams := url.Values{} - localVarFormParams := url.Values{} - - // to determine the Content-Type header - localVarHTTPContentTypes := []string{} - - // set Content-Type header - localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes) - if localVarHTTPContentType != "" { - localVarHeaderParams["Content-Type"] = localVarHTTPContentType - } - - // to determine the Accept header - localVarHTTPHeaderAccepts := []string{} - - // set Accept header - localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts) - if localVarHTTPHeaderAccept != "" { - localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept - } - req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles) - if err != nil { - return nil, err - } - - localVarHTTPResponse, err := a.client.callAPI(req) - if err != nil || localVarHTTPResponse == nil { - return localVarHTTPResponse, err - } - - localVarBody, err := ioutil.ReadAll(localVarHTTPResponse.Body) - localVarHTTPResponse.Body.Close() - localVarHTTPResponse.Body = ioutil.NopCloser(bytes.NewBuffer(localVarBody)) - if err != nil { - return localVarHTTPResponse, err - } - - if localVarHTTPResponse.StatusCode >= 300 { - newErr := &GenericOpenAPIError{ - body: localVarBody, - error: localVarHTTPResponse.Status, - } - return localVarHTTPResponse, newErr - } - - return localVarHTTPResponse, nil -} - type ApiDeleteDemoRequest struct { ctx context.Context ApiService *ResourceApiApiService @@ -1634,6 +1542,110 @@ func (a *ResourceApiApiService) GetPollingProfileExecute(r ApiGetPollingProfileR return localVarReturnValue, localVarHTTPResponse, nil } +type ApiGetTestRequest struct { + ctx context.Context + ApiService *ResourceApiApiService + testId string +} + +func (r ApiGetTestRequest) Execute() (*TestResource, *http.Response, error) { + return r.ApiService.GetTestExecute(r) +} + +/* +GetTest get test + +get test + + @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). + @param testId id of the test + @return ApiGetTestRequest +*/ +func (a *ResourceApiApiService) GetTest(ctx context.Context, testId string) ApiGetTestRequest { + return ApiGetTestRequest{ + ApiService: a, + ctx: ctx, + testId: testId, + } +} + +// Execute executes the request +// +// @return TestResource +func (a *ResourceApiApiService) GetTestExecute(r ApiGetTestRequest) (*TestResource, *http.Response, error) { + var ( + localVarHTTPMethod = http.MethodGet + localVarPostBody interface{} + formFiles []formFile + localVarReturnValue *TestResource + ) + + localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ResourceApiApiService.GetTest") + if err != nil { + return localVarReturnValue, nil, &GenericOpenAPIError{error: err.Error()} + } + + localVarPath := localBasePath + "/tests/{testId}" + localVarPath = strings.Replace(localVarPath, "{"+"testId"+"}", url.PathEscape(parameterValueToString(r.testId, "testId")), -1) + + localVarHeaderParams := make(map[string]string) + localVarQueryParams := url.Values{} + localVarFormParams := url.Values{} + + // to determine the Content-Type header + localVarHTTPContentTypes := []string{} + + // set Content-Type header + localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes) + if localVarHTTPContentType != "" { + localVarHeaderParams["Content-Type"] = localVarHTTPContentType + } + + // to determine the Accept header + localVarHTTPHeaderAccepts := []string{"application/json"} + + // set Accept header + localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts) + if localVarHTTPHeaderAccept != "" { + localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept + } + req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles) + if err != nil { + return localVarReturnValue, nil, err + } + + localVarHTTPResponse, err := a.client.callAPI(req) + if err != nil || localVarHTTPResponse == nil { + return localVarReturnValue, localVarHTTPResponse, err + } + + localVarBody, err := ioutil.ReadAll(localVarHTTPResponse.Body) + localVarHTTPResponse.Body.Close() + localVarHTTPResponse.Body = ioutil.NopCloser(bytes.NewBuffer(localVarBody)) + if err != nil { + return localVarReturnValue, localVarHTTPResponse, err + } + + if localVarHTTPResponse.StatusCode >= 300 { + newErr := &GenericOpenAPIError{ + body: localVarBody, + error: localVarHTTPResponse.Status, + } + return localVarReturnValue, localVarHTTPResponse, newErr + } + + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr := &GenericOpenAPIError{ + body: localVarBody, + error: err.Error(), + } + return localVarReturnValue, localVarHTTPResponse, newErr + } + + return localVarReturnValue, localVarHTTPResponse, nil +} + type ApiGetTestSuiteRequest struct { ctx context.Context ApiService *ResourceApiApiService @@ -2982,110 +2994,6 @@ func (a *ResourceApiApiService) ListVariableSetsExecute(r ApiListVariableSetsReq return localVarReturnValue, localVarHTTPResponse, nil } -type ApiTestsTestIdGetRequest struct { - ctx context.Context - ApiService *ResourceApiApiService - testId string -} - -func (r ApiTestsTestIdGetRequest) Execute() (*TestResource, *http.Response, error) { - return r.ApiService.TestsTestIdGetExecute(r) -} - -/* -TestsTestIdGet get test - -get test - - @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). - @param testId id of the test - @return ApiTestsTestIdGetRequest -*/ -func (a *ResourceApiApiService) TestsTestIdGet(ctx context.Context, testId string) ApiTestsTestIdGetRequest { - return ApiTestsTestIdGetRequest{ - ApiService: a, - ctx: ctx, - testId: testId, - } -} - -// Execute executes the request -// -// @return TestResource -func (a *ResourceApiApiService) TestsTestIdGetExecute(r ApiTestsTestIdGetRequest) (*TestResource, *http.Response, error) { - var ( - localVarHTTPMethod = http.MethodGet - localVarPostBody interface{} - formFiles []formFile - localVarReturnValue *TestResource - ) - - localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ResourceApiApiService.TestsTestIdGet") - if err != nil { - return localVarReturnValue, nil, &GenericOpenAPIError{error: err.Error()} - } - - localVarPath := localBasePath + "/tests/{testId}" - localVarPath = strings.Replace(localVarPath, "{"+"testId"+"}", url.PathEscape(parameterValueToString(r.testId, "testId")), -1) - - localVarHeaderParams := make(map[string]string) - localVarQueryParams := url.Values{} - localVarFormParams := url.Values{} - - // to determine the Content-Type header - localVarHTTPContentTypes := []string{} - - // set Content-Type header - localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes) - if localVarHTTPContentType != "" { - localVarHeaderParams["Content-Type"] = localVarHTTPContentType - } - - // to determine the Accept header - localVarHTTPHeaderAccepts := []string{"application/json"} - - // set Accept header - localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts) - if localVarHTTPHeaderAccept != "" { - localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept - } - req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles) - if err != nil { - return localVarReturnValue, nil, err - } - - localVarHTTPResponse, err := a.client.callAPI(req) - if err != nil || localVarHTTPResponse == nil { - return localVarReturnValue, localVarHTTPResponse, err - } - - localVarBody, err := ioutil.ReadAll(localVarHTTPResponse.Body) - localVarHTTPResponse.Body.Close() - localVarHTTPResponse.Body = ioutil.NopCloser(bytes.NewBuffer(localVarBody)) - if err != nil { - return localVarReturnValue, localVarHTTPResponse, err - } - - if localVarHTTPResponse.StatusCode >= 300 { - newErr := &GenericOpenAPIError{ - body: localVarBody, - error: localVarHTTPResponse.Status, - } - return localVarReturnValue, localVarHTTPResponse, newErr - } - - err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) - if err != nil { - newErr := &GenericOpenAPIError{ - body: localVarBody, - error: err.Error(), - } - return localVarReturnValue, localVarHTTPResponse, newErr - } - - return localVarReturnValue, localVarHTTPResponse, nil -} - type ApiUpdateConfigurationRequest struct { ctx context.Context ApiService *ResourceApiApiService @@ -3635,14 +3543,14 @@ func (a *ResourceApiApiService) UpdatePollingProfileExecute(r ApiUpdatePollingPr } type ApiUpdateTestRequest struct { - ctx context.Context - ApiService *ResourceApiApiService - testId string - test *Test + ctx context.Context + ApiService *ResourceApiApiService + testId string + testResource *TestResource } -func (r ApiUpdateTestRequest) Test(test Test) ApiUpdateTestRequest { - r.test = &test +func (r ApiUpdateTestRequest) TestResource(testResource TestResource) ApiUpdateTestRequest { + r.testResource = &testResource return r } @@ -3705,7 +3613,7 @@ func (a *ResourceApiApiService) UpdateTestExecute(r ApiUpdateTestRequest) (*http localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept } // body params - localVarPostBody = r.test + localVarPostBody = r.testResource req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles) if err != nil { return nil, err @@ -3957,3 +3865,111 @@ func (a *ResourceApiApiService) UpdateVariableSetExecute(r ApiUpdateVariableSetR return localVarReturnValue, localVarHTTPResponse, nil } + +type ApiUpsertTestRequest struct { + ctx context.Context + ApiService *ResourceApiApiService + testResource *TestResource +} + +func (r ApiUpsertTestRequest) TestResource(testResource TestResource) ApiUpsertTestRequest { + r.testResource = &testResource + return r +} + +func (r ApiUpsertTestRequest) Execute() (*TestResource, *http.Response, error) { + return r.ApiService.UpsertTestExecute(r) +} + +/* +UpsertTest Upsert new test + +Upsert new test action + + @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background(). + @return ApiUpsertTestRequest +*/ +func (a *ResourceApiApiService) UpsertTest(ctx context.Context) ApiUpsertTestRequest { + return ApiUpsertTestRequest{ + ApiService: a, + ctx: ctx, + } +} + +// Execute executes the request +// +// @return TestResource +func (a *ResourceApiApiService) UpsertTestExecute(r ApiUpsertTestRequest) (*TestResource, *http.Response, error) { + var ( + localVarHTTPMethod = http.MethodPut + localVarPostBody interface{} + formFiles []formFile + localVarReturnValue *TestResource + ) + + localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ResourceApiApiService.UpsertTest") + if err != nil { + return localVarReturnValue, nil, &GenericOpenAPIError{error: err.Error()} + } + + localVarPath := localBasePath + "/tests" + + localVarHeaderParams := make(map[string]string) + localVarQueryParams := url.Values{} + localVarFormParams := url.Values{} + + // to determine the Content-Type header + localVarHTTPContentTypes := []string{"application/json"} + + // set Content-Type header + localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes) + if localVarHTTPContentType != "" { + localVarHeaderParams["Content-Type"] = localVarHTTPContentType + } + + // to determine the Accept header + localVarHTTPHeaderAccepts := []string{"application/json"} + + // set Accept header + localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts) + if localVarHTTPHeaderAccept != "" { + localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept + } + // body params + localVarPostBody = r.testResource + req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, formFiles) + if err != nil { + return localVarReturnValue, nil, err + } + + localVarHTTPResponse, err := a.client.callAPI(req) + if err != nil || localVarHTTPResponse == nil { + return localVarReturnValue, localVarHTTPResponse, err + } + + localVarBody, err := ioutil.ReadAll(localVarHTTPResponse.Body) + localVarHTTPResponse.Body.Close() + localVarHTTPResponse.Body = ioutil.NopCloser(bytes.NewBuffer(localVarBody)) + if err != nil { + return localVarReturnValue, localVarHTTPResponse, err + } + + if localVarHTTPResponse.StatusCode >= 300 { + newErr := &GenericOpenAPIError{ + body: localVarBody, + error: localVarHTTPResponse.Status, + } + return localVarReturnValue, localVarHTTPResponse, newErr + } + + err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type")) + if err != nil { + newErr := &GenericOpenAPIError{ + body: localVarBody, + error: err.Error(), + } + return localVarReturnValue, localVarHTTPResponse, newErr + } + + return localVarReturnValue, localVarHTTPResponse, nil +} diff --git a/cli/openapi/model_supported_data_stores.go b/cli/openapi/model_supported_data_stores.go index 61c39fca06..cd7793a1de 100644 --- a/cli/openapi/model_supported_data_stores.go +++ b/cli/openapi/model_supported_data_stores.go @@ -20,7 +20,6 @@ type SupportedDataStores string // List of SupportedDataStores const ( - AGENT SupportedDataStores = "agent" JAEGER SupportedDataStores = "jaeger" OPENSEARCH SupportedDataStores = "opensearch" TEMPO SupportedDataStores = "tempo" @@ -40,7 +39,6 @@ const ( // All allowed values of SupportedDataStores enum var AllowedSupportedDataStoresEnumValues = []SupportedDataStores{ - "agent", "jaeger", "opensearch", "tempo", diff --git a/cli/openapi/model_test_.go b/cli/openapi/model_test_.go index 569cea82c8..7027547077 100644 --- a/cli/openapi/model_test_.go +++ b/cli/openapi/model_test_.go @@ -383,7 +383,9 @@ func (o Test) MarshalJSON() ([]byte, error) { func (o Test) ToMap() (map[string]interface{}, error) { toSerialize := map[string]interface{}{} - // skip: id is readOnly + if !isNil(o.Id) { + toSerialize["id"] = o.Id + } if !isNil(o.Name) { toSerialize["name"] = o.Name } diff --git a/server/openapi/api.go b/server/openapi/api.go index 4cce9a3d94..23a6a59748 100644 --- a/server/openapi/api.go +++ b/server/openapi/api.go @@ -54,7 +54,6 @@ type ResourceApiApiRouter interface { CreateTest(http.ResponseWriter, *http.Request) CreateTestSuite(http.ResponseWriter, *http.Request) CreateVariableSet(http.ResponseWriter, *http.Request) - DeleteDataStore(http.ResponseWriter, *http.Request) DeleteDemo(http.ResponseWriter, *http.Request) DeleteLinter(http.ResponseWriter, *http.Request) DeleteTest(http.ResponseWriter, *http.Request) @@ -65,6 +64,7 @@ type ResourceApiApiRouter interface { GetDemo(http.ResponseWriter, *http.Request) GetLinter(http.ResponseWriter, *http.Request) GetPollingProfile(http.ResponseWriter, *http.Request) + GetTest(http.ResponseWriter, *http.Request) GetTestSuite(http.ResponseWriter, *http.Request) GetTestSuites(http.ResponseWriter, *http.Request) GetTests(http.ResponseWriter, *http.Request) @@ -75,7 +75,6 @@ type ResourceApiApiRouter interface { ListLinters(http.ResponseWriter, *http.Request) ListPollingProfile(http.ResponseWriter, *http.Request) ListVariableSets(http.ResponseWriter, *http.Request) - TestsTestIdGet(http.ResponseWriter, *http.Request) UpdateConfiguration(http.ResponseWriter, *http.Request) UpdateDataStore(http.ResponseWriter, *http.Request) UpdateDemo(http.ResponseWriter, *http.Request) @@ -84,6 +83,7 @@ type ResourceApiApiRouter interface { UpdateTest(http.ResponseWriter, *http.Request) UpdateTestSuite(http.ResponseWriter, *http.Request) UpdateVariableSet(http.ResponseWriter, *http.Request) + UpsertTest(http.ResponseWriter, *http.Request) } // ApiApiServicer defines the api actions for the ApiApi service @@ -125,10 +125,9 @@ type ApiApiServicer interface { type ResourceApiApiServicer interface { CreateDemo(context.Context, Demo) (ImplResponse, error) CreateLinter(context.Context, LinterResource) (ImplResponse, error) - CreateTest(context.Context, Test) (ImplResponse, error) + CreateTest(context.Context, TestResource) (ImplResponse, error) CreateTestSuite(context.Context, TestSuiteResource) (ImplResponse, error) CreateVariableSet(context.Context, VariableSetResource) (ImplResponse, error) - DeleteDataStore(context.Context, string) (ImplResponse, error) DeleteDemo(context.Context, string) (ImplResponse, error) DeleteLinter(context.Context, string) (ImplResponse, error) DeleteTest(context.Context, string) (ImplResponse, error) @@ -139,6 +138,7 @@ type ResourceApiApiServicer interface { GetDemo(context.Context, string) (ImplResponse, error) GetLinter(context.Context, string) (ImplResponse, error) GetPollingProfile(context.Context, string) (ImplResponse, error) + GetTest(context.Context, string) (ImplResponse, error) GetTestSuite(context.Context, string) (ImplResponse, error) GetTestSuites(context.Context, int32, int32, string, string, string) (ImplResponse, error) GetTests(context.Context, int32, int32, string, string, string) (ImplResponse, error) @@ -149,13 +149,13 @@ type ResourceApiApiServicer interface { ListLinters(context.Context, int32, int32, string, string) (ImplResponse, error) ListPollingProfile(context.Context, int32, int32, string, string) (ImplResponse, error) ListVariableSets(context.Context, int32, int32, string, string) (ImplResponse, error) - TestsTestIdGet(context.Context, string) (ImplResponse, error) UpdateConfiguration(context.Context, string, ConfigurationResource) (ImplResponse, error) UpdateDataStore(context.Context, string, DataStore) (ImplResponse, error) UpdateDemo(context.Context, string, Demo) (ImplResponse, error) UpdateLinter(context.Context, string, LinterResource) (ImplResponse, error) UpdatePollingProfile(context.Context, string, PollingProfile) (ImplResponse, error) - UpdateTest(context.Context, string, Test) (ImplResponse, error) + UpdateTest(context.Context, string, TestResource) (ImplResponse, error) UpdateTestSuite(context.Context, string, TestSuiteResource) (ImplResponse, error) UpdateVariableSet(context.Context, string, VariableSetResource) (ImplResponse, error) + UpsertTest(context.Context, TestResource) (ImplResponse, error) } diff --git a/server/openapi/api_resource_api.go b/server/openapi/api_resource_api.go index 09e5c0dc34..0ab11a3e75 100644 --- a/server/openapi/api_resource_api.go +++ b/server/openapi/api_resource_api.go @@ -80,12 +80,6 @@ func (c *ResourceApiApiController) Routes() Routes { "/api/variableSets", c.CreateVariableSet, }, - { - "DeleteDataStore", - strings.ToUpper("Delete"), - "/api/datastores/{dataStoreId}", - c.DeleteDataStore, - }, { "DeleteDemo", strings.ToUpper("Delete"), @@ -146,6 +140,12 @@ func (c *ResourceApiApiController) Routes() Routes { "/api/pollingprofiles/{pollingProfileId}", c.GetPollingProfile, }, + { + "GetTest", + strings.ToUpper("Get"), + "/api/tests/{testId}", + c.GetTest, + }, { "GetTestSuite", strings.ToUpper("Get"), @@ -206,12 +206,6 @@ func (c *ResourceApiApiController) Routes() Routes { "/api/variableSets", c.ListVariableSets, }, - { - "TestsTestIdGet", - strings.ToUpper("Get"), - "/api/tests/{testId}", - c.TestsTestIdGet, - }, { "UpdateConfiguration", strings.ToUpper("Put"), @@ -260,6 +254,12 @@ func (c *ResourceApiApiController) Routes() Routes { "/api/variableSets/{variableSetId}", c.UpdateVariableSet, }, + { + "UpsertTest", + strings.ToUpper("Put"), + "/api/tests", + c.UpsertTest, + }, } } @@ -313,18 +313,18 @@ func (c *ResourceApiApiController) CreateLinter(w http.ResponseWriter, r *http.R // CreateTest - Create new test func (c *ResourceApiApiController) CreateTest(w http.ResponseWriter, r *http.Request) { - testParam := Test{} + testResourceParam := TestResource{} d := json.NewDecoder(r.Body) d.DisallowUnknownFields() - if err := d.Decode(&testParam); err != nil { + if err := d.Decode(&testResourceParam); err != nil { c.errorHandler(w, r, &ParsingError{Err: err}, nil) return } - if err := AssertTestRequired(testParam); err != nil { + if err := AssertTestResourceRequired(testResourceParam); err != nil { c.errorHandler(w, r, err, nil) return } - result, err := c.service.CreateTest(r.Context(), testParam) + result, err := c.service.CreateTest(r.Context(), testResourceParam) // If an error occurred, encode the error with the status code if err != nil { c.errorHandler(w, r, err, &result) @@ -383,22 +383,6 @@ func (c *ResourceApiApiController) CreateVariableSet(w http.ResponseWriter, r *h } -// DeleteDataStore - Delete a Data Store -func (c *ResourceApiApiController) DeleteDataStore(w http.ResponseWriter, r *http.Request) { - params := mux.Vars(r) - dataStoreIdParam := params["dataStoreId"] - - result, err := c.service.DeleteDataStore(r.Context(), dataStoreIdParam) - // If an error occurred, encode the error with the status code - if err != nil { - c.errorHandler(w, r, err, &result) - return - } - // If no error, encode the body and the result code - EncodeJSONResponse(result.Body, &result.Code, w) - -} - // DeleteDemo - Delete a Demonstration setting func (c *ResourceApiApiController) DeleteDemo(w http.ResponseWriter, r *http.Request) { params := mux.Vars(r) @@ -559,6 +543,22 @@ func (c *ResourceApiApiController) GetPollingProfile(w http.ResponseWriter, r *h } +// GetTest - get test +func (c *ResourceApiApiController) GetTest(w http.ResponseWriter, r *http.Request) { + params := mux.Vars(r) + testIdParam := params["testId"] + + result, err := c.service.GetTest(r.Context(), testIdParam) + // If an error occurred, encode the error with the status code + if err != nil { + c.errorHandler(w, r, err, &result) + return + } + // If no error, encode the body and the result code + EncodeJSONResponse(result.Body, &result.Code, w) + +} + // GetTestSuite - get TestSuite func (c *ResourceApiApiController) GetTestSuite(w http.ResponseWriter, r *http.Request) { params := mux.Vars(r) @@ -801,22 +801,6 @@ func (c *ResourceApiApiController) ListVariableSets(w http.ResponseWriter, r *ht } -// TestsTestIdGet - get test -func (c *ResourceApiApiController) TestsTestIdGet(w http.ResponseWriter, r *http.Request) { - params := mux.Vars(r) - testIdParam := params["testId"] - - result, err := c.service.TestsTestIdGet(r.Context(), testIdParam) - // If an error occurred, encode the error with the status code - if err != nil { - c.errorHandler(w, r, err, &result) - return - } - // If no error, encode the body and the result code - EncodeJSONResponse(result.Body, &result.Code, w) - -} - // UpdateConfiguration - Update Tracetest configuration func (c *ResourceApiApiController) UpdateConfiguration(w http.ResponseWriter, r *http.Request) { params := mux.Vars(r) @@ -957,18 +941,18 @@ func (c *ResourceApiApiController) UpdateTest(w http.ResponseWriter, r *http.Req params := mux.Vars(r) testIdParam := params["testId"] - testParam := Test{} + testResourceParam := TestResource{} d := json.NewDecoder(r.Body) d.DisallowUnknownFields() - if err := d.Decode(&testParam); err != nil { + if err := d.Decode(&testResourceParam); err != nil { c.errorHandler(w, r, &ParsingError{Err: err}, nil) return } - if err := AssertTestRequired(testParam); err != nil { + if err := AssertTestResourceRequired(testResourceParam); err != nil { c.errorHandler(w, r, err, nil) return } - result, err := c.service.UpdateTest(r.Context(), testIdParam, testParam) + result, err := c.service.UpdateTest(r.Context(), testIdParam, testResourceParam) // If an error occurred, encode the error with the status code if err != nil { c.errorHandler(w, r, err, &result) @@ -1032,3 +1016,27 @@ func (c *ResourceApiApiController) UpdateVariableSet(w http.ResponseWriter, r *h EncodeJSONResponse(result.Body, &result.Code, w) } + +// UpsertTest - Upsert new test +func (c *ResourceApiApiController) UpsertTest(w http.ResponseWriter, r *http.Request) { + testResourceParam := TestResource{} + d := json.NewDecoder(r.Body) + d.DisallowUnknownFields() + if err := d.Decode(&testResourceParam); err != nil { + c.errorHandler(w, r, &ParsingError{Err: err}, nil) + return + } + if err := AssertTestResourceRequired(testResourceParam); err != nil { + c.errorHandler(w, r, err, nil) + return + } + result, err := c.service.UpsertTest(r.Context(), testResourceParam) + // If an error occurred, encode the error with the status code + if err != nil { + c.errorHandler(w, r, err, &result) + return + } + // If no error, encode the body and the result code + EncodeJSONResponse(result.Body, &result.Code, w) + +} diff --git a/server/openapi/api_resource_api_service.go b/server/openapi/api_resource_api_service.go index 3e02d1e332..89cce1101e 100644 --- a/server/openapi/api_resource_api_service.go +++ b/server/openapi/api_resource_api_service.go @@ -55,12 +55,12 @@ func (s *ResourceApiApiService) CreateLinter(ctx context.Context, linterResource } // CreateTest - Create new test -func (s *ResourceApiApiService) CreateTest(ctx context.Context, test Test) (ImplResponse, error) { +func (s *ResourceApiApiService) CreateTest(ctx context.Context, testResource TestResource) (ImplResponse, error) { // TODO - update CreateTest with the required logic for this service method. // Add api_resource_api_service.go to the .openapi-generator-ignore to avoid overwriting this service implementation when updating open api generation. - //TODO: Uncomment the next line to return response Response(200, Test{}) or use other options such as http.Ok ... - //return Response(200, Test{}), nil + //TODO: Uncomment the next line to return response Response(200, TestResource{}) or use other options such as http.Ok ... + //return Response(200, TestResource{}), nil //TODO: Uncomment the next line to return response Response(400, {}) or use other options such as http.Ok ... //return Response(400, nil),nil @@ -99,17 +99,6 @@ func (s *ResourceApiApiService) CreateVariableSet(ctx context.Context, variableS return Response(http.StatusNotImplemented, nil), errors.New("CreateVariableSet method not implemented") } -// DeleteDataStore - Delete a Data Store -func (s *ResourceApiApiService) DeleteDataStore(ctx context.Context, dataStoreId string) (ImplResponse, error) { - // TODO - update DeleteDataStore with the required logic for this service method. - // Add api_resource_api_service.go to the .openapi-generator-ignore to avoid overwriting this service implementation when updating open api generation. - - //TODO: Uncomment the next line to return response Response(204, {}) or use other options such as http.Ok ... - //return Response(204, nil),nil - - return Response(http.StatusNotImplemented, nil), errors.New("DeleteDataStore method not implemented") -} - // DeleteDemo - Delete a Demonstration setting func (s *ResourceApiApiService) DeleteDemo(ctx context.Context, demoId string) (ImplResponse, error) { // TODO - update DeleteDemo with the required logic for this service method. @@ -280,6 +269,20 @@ func (s *ResourceApiApiService) GetPollingProfile(ctx context.Context, pollingPr return Response(http.StatusNotImplemented, nil), errors.New("GetPollingProfile method not implemented") } +// GetTest - get test +func (s *ResourceApiApiService) GetTest(ctx context.Context, testId string) (ImplResponse, error) { + // TODO - update GetTest with the required logic for this service method. + // Add api_resource_api_service.go to the .openapi-generator-ignore to avoid overwriting this service implementation when updating open api generation. + + //TODO: Uncomment the next line to return response Response(200, TestResource{}) or use other options such as http.Ok ... + //return Response(200, TestResource{}), nil + + //TODO: Uncomment the next line to return response Response(500, {}) or use other options such as http.Ok ... + //return Response(500, nil),nil + + return Response(http.StatusNotImplemented, nil), errors.New("GetTest method not implemented") +} + // GetTestSuite - get TestSuite func (s *ResourceApiApiService) GetTestSuite(ctx context.Context, testSuiteId string) (ImplResponse, error) { // TODO - update GetTestSuite with the required logic for this service method. @@ -441,20 +444,6 @@ func (s *ResourceApiApiService) ListVariableSets(ctx context.Context, take int32 return Response(http.StatusNotImplemented, nil), errors.New("ListVariableSets method not implemented") } -// TestsTestIdGet - get test -func (s *ResourceApiApiService) TestsTestIdGet(ctx context.Context, testId string) (ImplResponse, error) { - // TODO - update TestsTestIdGet with the required logic for this service method. - // Add api_resource_api_service.go to the .openapi-generator-ignore to avoid overwriting this service implementation when updating open api generation. - - //TODO: Uncomment the next line to return response Response(200, TestResource{}) or use other options such as http.Ok ... - //return Response(200, TestResource{}), nil - - //TODO: Uncomment the next line to return response Response(500, {}) or use other options such as http.Ok ... - //return Response(500, nil),nil - - return Response(http.StatusNotImplemented, nil), errors.New("TestsTestIdGet method not implemented") -} - // UpdateConfiguration - Update Tracetest configuration func (s *ResourceApiApiService) UpdateConfiguration(ctx context.Context, configId string, configurationResource ConfigurationResource) (ImplResponse, error) { // TODO - update UpdateConfiguration with the required logic for this service method. @@ -547,7 +536,7 @@ func (s *ResourceApiApiService) UpdatePollingProfile(ctx context.Context, pollin } // UpdateTest - update test -func (s *ResourceApiApiService) UpdateTest(ctx context.Context, testId string, test Test) (ImplResponse, error) { +func (s *ResourceApiApiService) UpdateTest(ctx context.Context, testId string, testResource TestResource) (ImplResponse, error) { // TODO - update UpdateTest with the required logic for this service method. // Add api_resource_api_service.go to the .openapi-generator-ignore to avoid overwriting this service implementation when updating open api generation. @@ -599,3 +588,14 @@ func (s *ResourceApiApiService) UpdateVariableSet(ctx context.Context, variableS return Response(http.StatusNotImplemented, nil), errors.New("UpdateVariableSet method not implemented") } + +// UpsertTest - Upsert new test +func (s *ResourceApiApiService) UpsertTest(ctx context.Context, testResource TestResource) (ImplResponse, error) { + // TODO - update UpsertTest with the required logic for this service method. + // Add api_resource_api_service.go to the .openapi-generator-ignore to avoid overwriting this service implementation when updating open api generation. + + //TODO: Uncomment the next line to return response Response(200, TestResource{}) or use other options such as http.Ok ... + //return Response(200, TestResource{}), nil + + return Response(http.StatusNotImplemented, nil), errors.New("UpsertTest method not implemented") +} diff --git a/server/openapi/model_supported_data_stores.go b/server/openapi/model_supported_data_stores.go index d68ed85259..be49243dd8 100644 --- a/server/openapi/model_supported_data_stores.go +++ b/server/openapi/model_supported_data_stores.go @@ -13,7 +13,6 @@ type SupportedDataStores string // List of SupportedDataStores const ( - AGENT SupportedDataStores = "agent" JAEGER SupportedDataStores = "jaeger" OPENSEARCH SupportedDataStores = "opensearch" TEMPO SupportedDataStores = "tempo" diff --git a/server/test/trigger/traceid.go b/server/test/trigger/traceid.go index ff4f65eab2..c5d68ddf62 100644 --- a/server/test/trigger/traceid.go +++ b/server/test/trigger/traceid.go @@ -2,8 +2,9 @@ package trigger const TriggerTypeTraceID TriggerType = "traceid" const TriggerTypeCypress TriggerType = "cypress" +const TriggerTypePlaywright TriggerType = "playwright" -var traceIDBasedTriggers = []TriggerType{TriggerTypeTraceID, TriggerTypeCypress} +var traceIDBasedTriggers = []TriggerType{TriggerTypeTraceID, TriggerTypeCypress, TriggerTypePlaywright} type TraceIDRequest struct { ID string `json:"id,omitempty" expr_enabled:"true"` diff --git a/server/test/trigger/trigger.go b/server/test/trigger/trigger.go index 5841f4a0a7..9ebabb5777 100644 --- a/server/test/trigger/trigger.go +++ b/server/test/trigger/trigger.go @@ -43,5 +43,5 @@ func (t TriggerType) IsTraceIDBased() bool { } func (t TriggerType) IsFrontendE2EBased() bool { - return t == TriggerTypeCypress + return t == TriggerTypeCypress || t == TriggerTypePlaywright } diff --git a/server/test/trigger/trigger_json.go b/server/test/trigger/trigger_json.go index 7d67c68e95..13930199c9 100644 --- a/server/test/trigger/trigger_json.go +++ b/server/test/trigger/trigger_json.go @@ -21,7 +21,7 @@ func (v3 triggerJSONV3) valid() bool { (v3.HTTP != nil || v3.GRPC != nil || v3.TraceID != nil || - v3.Kafka != nil)) || v3.Type == TriggerTypeCypress + v3.Kafka != nil)) || (v3.Type == TriggerTypeCypress || v3.Type == TriggerTypePlaywright) } type triggerJSONV2 struct { diff --git a/web/src/components/RunDetailAutomate/RunDetailAutomate.tsx b/web/src/components/RunDetailAutomate/RunDetailAutomate.tsx index ed0abf8801..526eeb5df7 100644 --- a/web/src/components/RunDetailAutomate/RunDetailAutomate.tsx +++ b/web/src/components/RunDetailAutomate/RunDetailAutomate.tsx @@ -5,6 +5,7 @@ import RunDetailAutomateMethods from 'components/RunDetailAutomateMethods'; import CliCommand from 'components/RunDetailAutomateMethods/methods/CLICommand'; import Cypress from 'components/RunDetailAutomateMethods/methods/Cypress'; import DeepLink from 'components/RunDetailAutomateMethods/methods/DeepLink'; +import Playwright from 'components/RunDetailAutomateMethods/methods/Playwright'; import GithubActions from 'components/RunDetailAutomateMethods/methods/GithubActions'; import {CLI_RUNNING_TESTS_URL} from 'constants/Common.constants'; import {TriggerTypes} from 'constants/Test.constants'; @@ -24,6 +25,14 @@ function getMethods(triggerType: TriggerTypes) { component: Cypress, }, ]; + case TriggerTypes.playwright: + return [ + { + id: 'playwright', + label: 'Playwright', + component: Playwright, + }, + ]; default: return [ { diff --git a/web/src/components/RunDetailAutomateMethods/methods/Cypress/Cypress.tsx b/web/src/components/RunDetailAutomateMethods/methods/Cypress/Cypress.tsx index f12bc98e19..e31aaa2b06 100644 --- a/web/src/components/RunDetailAutomateMethods/methods/Cypress/Cypress.tsx +++ b/web/src/components/RunDetailAutomateMethods/methods/Cypress/Cypress.tsx @@ -14,7 +14,7 @@ const Cypress = ({test}: IProps) => ( Cypress Integration - The code snippet below enables you to run this test via a cypress run. + The code snippet below enables you to run this test via a Cypress run. ); diff --git a/web/src/components/RunDetailAutomateMethods/methods/Playwright/Playwright.styled.ts b/web/src/components/RunDetailAutomateMethods/methods/Playwright/Playwright.styled.ts new file mode 100644 index 0000000000..96afc21ad8 --- /dev/null +++ b/web/src/components/RunDetailAutomateMethods/methods/Playwright/Playwright.styled.ts @@ -0,0 +1,22 @@ +import {Typography} from 'antd'; +import styled from 'styled-components'; + +export const Title = styled(Typography.Title).attrs({ + level: 3, +})` + && { + font-size: ${({theme}) => theme.size.md}; + font-weight: 600; + margin-bottom: 16px; + } +`; + +export const TitleContainer = styled.div` + display: flex; + justify-content: space-between; + align-items: center; +`; + +export const Container = styled.div` + margin: 16px 0; +`; diff --git a/web/src/components/RunDetailAutomateMethods/methods/Playwright/Playwright.tsx b/web/src/components/RunDetailAutomateMethods/methods/Playwright/Playwright.tsx new file mode 100644 index 0000000000..611a93b001 --- /dev/null +++ b/web/src/components/RunDetailAutomateMethods/methods/Playwright/Playwright.tsx @@ -0,0 +1,22 @@ +import {Typography} from 'antd'; +import {FramedCodeBlock} from 'components/CodeBlock'; +import {PlaywrightCodeSnippet} from 'constants/Automate.constants'; +import Test from 'models/Test.model'; +import * as S from './Playwright.styled'; +import {IMethodChildrenProps} from '../../RunDetailAutomateMethods'; + +interface IProps extends IMethodChildrenProps { + test: Test; +} + +const Playwright = ({test}: IProps) => ( + + + Playwright Integration + + The code snippet below enables you to run this test via a Playwright run. + + +); + +export default Playwright; diff --git a/web/src/components/RunDetailAutomateMethods/methods/Playwright/index.ts b/web/src/components/RunDetailAutomateMethods/methods/Playwright/index.ts new file mode 100644 index 0000000000..056844809b --- /dev/null +++ b/web/src/components/RunDetailAutomateMethods/methods/Playwright/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line no-restricted-exports +export {default} from './Playwright'; diff --git a/web/src/components/RunDetailTriggerResponse/RunDetailTriggerResponseFactory.tsx b/web/src/components/RunDetailTriggerResponse/RunDetailTriggerResponseFactory.tsx index 700b178316..016bf36dc9 100644 --- a/web/src/components/RunDetailTriggerResponse/RunDetailTriggerResponseFactory.tsx +++ b/web/src/components/RunDetailTriggerResponse/RunDetailTriggerResponseFactory.tsx @@ -18,6 +18,7 @@ const ComponentMap: Record React.React [TriggerTypes.kafka]: RunDetailTriggerResponse, [TriggerTypes.traceid]: RunDetailTriggerData, [TriggerTypes.cypress]: RunDetailTriggerData, + [TriggerTypes.playwright]: RunDetailTriggerData, }; interface IProps extends IPropsComponent { diff --git a/web/src/components/TestPlugins/EntryPointFactory.tsx b/web/src/components/TestPlugins/EntryPointFactory.tsx index cc1319cb96..53536511e3 100644 --- a/web/src/components/TestPlugins/EntryPointFactory.tsx +++ b/web/src/components/TestPlugins/EntryPointFactory.tsx @@ -10,6 +10,7 @@ const EntryPointFactoryMap = { [TriggerTypes.kafka]: TriggerHeaderBarKafka, [TriggerTypes.traceid]: TriggerHeaderBarTraceID, [TriggerTypes.cypress]: () => null, + [TriggerTypes.playwright]: () => null, }; interface IProps { diff --git a/web/src/components/TestPlugins/FormFactory.tsx b/web/src/components/TestPlugins/FormFactory.tsx index 565e4f8398..c1c7c24a13 100644 --- a/web/src/components/TestPlugins/FormFactory.tsx +++ b/web/src/components/TestPlugins/FormFactory.tsx @@ -10,6 +10,7 @@ const FormFactoryMap = { [TriggerTypes.kafka]: Kafka, [TriggerTypes.traceid]: () => null, [TriggerTypes.cypress]: () => null, + [TriggerTypes.playwright]: () => null, }; export interface IFormProps { diff --git a/web/src/constants/Automate.constants.ts b/web/src/constants/Automate.constants.ts index 1ba009e8a8..1bd923122c 100644 --- a/web/src/constants/Automate.constants.ts +++ b/web/src/constants/Automate.constants.ts @@ -24,3 +24,37 @@ describe('Cypress Test', () => { }); });`; } + +export function PlaywrightCodeSnippet(testName: string) { + return `import { test, expect } from '@playwright/test'; +import Tracetest from '@tracetest/playwright'; + +const { TRACETEST_API_TOKEN = '' } = process.env; + +const tracetest = Tracetest(); + +test.describe.configure({ mode: 'serial' }); + +test.beforeAll(async () => { + await tracetest.configure(TRACETEST_API_TOKEN); +}); + +test.beforeEach(async ({ page }, { title }) => { + await page.goto('/'); + await tracetest.capture(title, page); +}); + +test.afterEach(async ({}, { title, config }) => { + await tracetest.runTest(title, config.metadata.definition ?? ''); +}); + +// optional step to break the playwright script in case a Tracetest test fails +test.afterAll(async ({}, testInfo) => { + testInfo.setTimeout(60000); + await tracetest.summary(); +}); + +test('${testName}', () => { + // ...playwright commands +});`; +} diff --git a/web/src/constants/Common.constants.ts b/web/src/constants/Common.constants.ts index 0303c3f69c..7b29bb61d7 100644 --- a/web/src/constants/Common.constants.ts +++ b/web/src/constants/Common.constants.ts @@ -71,4 +71,5 @@ export enum SupportedPlugins { Kafka = 'Kafka', TraceID = 'TraceID', Cypress = 'Cypress', + Playwright = 'Playwright', } diff --git a/web/src/constants/Demo.constants.ts b/web/src/constants/Demo.constants.ts index 0c7221c077..ab6948bf1e 100644 --- a/web/src/constants/Demo.constants.ts +++ b/web/src/constants/Demo.constants.ts @@ -229,6 +229,7 @@ export function getDemoByPluginMap(demos: Demo[]) { ], [SupportedPlugins.TraceID]: [], [SupportedPlugins.Cypress]: [], + [SupportedPlugins.Playwright]: [], [SupportedPlugins.Kafka]: (pokeshopDemoMap && pokeshopDemoMap[SupportedPlugins.Kafka]) || [], }; } diff --git a/web/src/constants/Plugins.constants.ts b/web/src/constants/Plugins.constants.ts index 97be5ffa5f..d809858f2e 100644 --- a/web/src/constants/Plugins.constants.ts +++ b/web/src/constants/Plugins.constants.ts @@ -58,12 +58,23 @@ const Cypress: IPlugin = { requestType: TriggerTypes.traceid, }; +const Playwright: IPlugin = { + name: SupportedPlugins.Playwright, + title: 'Playwright', + description: 'Define your test via Playwright', + isActive: true, + demoList: [], + type: TriggerTypes.playwright, + requestType: TriggerTypes.traceid, +}; + export const Plugins = { [SupportedPlugins.REST]: Rest, [SupportedPlugins.GRPC]: GRPC, [SupportedPlugins.Kafka]: Kafka, [SupportedPlugins.TraceID]: TraceID, [SupportedPlugins.Cypress]: Cypress, + [SupportedPlugins.Playwright]: Playwright, } as const; export const TriggerTypeToPlugin = { @@ -72,6 +83,7 @@ export const TriggerTypeToPlugin = { [TriggerTypes.kafka]: Plugins.Kafka, [TriggerTypes.traceid]: Plugins.TraceID, [TriggerTypes.cypress]: Plugins.Cypress, + [TriggerTypes.playwright]: Plugins.Playwright, } as const; export const CreateTriggerTypeToPlugin = { diff --git a/web/src/constants/Test.constants.ts b/web/src/constants/Test.constants.ts index b0c26eeecd..17b1b84492 100644 --- a/web/src/constants/Test.constants.ts +++ b/web/src/constants/Test.constants.ts @@ -11,6 +11,7 @@ export enum TriggerTypes { traceid = 'traceid', kafka = 'kafka', cypress = 'cypress', + playwright = 'playwright', } export enum ImportTypes { diff --git a/web/src/models/Test.model.ts b/web/src/models/Test.model.ts index 7a3cb48808..1db2ba151c 100644 --- a/web/src/models/Test.model.ts +++ b/web/src/models/Test.model.ts @@ -56,7 +56,7 @@ Test.FromDefinition = (definition: string): Test => { }; Test.shouldAllowRun = (triggerType: TriggerTypes): boolean => { - return triggerType !== TriggerTypes.cypress; + return ![TriggerTypes.cypress, TriggerTypes.playwright].includes(triggerType); }; export default Test; diff --git a/web/src/models/Trigger.model.ts b/web/src/models/Trigger.model.ts index 12947b8e7b..64c611a054 100644 --- a/web/src/models/Trigger.model.ts +++ b/web/src/models/Trigger.model.ts @@ -42,6 +42,12 @@ const EntryData = { method: 'Cypress', }; }, + [TriggerTypes.playwright](request: TRequest) { + return { + entryPoint: get(request, 'id', ''), + method: 'Playwright', + }; + }, [TriggerTypes.kafka](request: TRequest) { let entryPoint = ''; @@ -71,7 +77,7 @@ const Trigger = ({ request = HttpRequest(httpRequest); } else if (type === TriggerTypes.grpc) { request = GrpcRequest(grpc); - } else if ([TriggerTypes.traceid, TriggerTypes.cypress].includes(type)) { + } else if ([TriggerTypes.traceid, TriggerTypes.cypress, TriggerTypes.playwright].includes(type)) { request = TraceIDRequest(traceid); } else if (type === TriggerTypes.kafka) { request = KafkaRequest(kafka); diff --git a/web/src/models/TriggerResult.model.ts b/web/src/models/TriggerResult.model.ts index cd092fafcf..6acc3c797b 100644 --- a/web/src/models/TriggerResult.model.ts +++ b/web/src/models/TriggerResult.model.ts @@ -41,6 +41,13 @@ const ResponseData = { statusCode: 200, }; }, + [TriggerTypes.playwright](response: object) { + return { + body: get(response, 'id', ''), + headers: [], + statusCode: 200, + }; + }, [TriggerTypes.kafka](response: object) { const kafkaResult = { offset: get(response, 'offset', ''), @@ -66,7 +73,7 @@ const TriggerResult = ({ request = http; } else if (type === TriggerTypes.grpc) { request = grpc; - } else if ([TriggerTypes.traceid, TriggerTypes.cypress].includes(type)) { + } else if ([TriggerTypes.traceid, TriggerTypes.cypress, TriggerTypes.playwright].includes(type)) { request = traceid; } else if (type === TriggerTypes.kafka) { request = kafka; diff --git a/web/src/services/Test.service.ts b/web/src/services/Test.service.ts index 80216ec04a..be970eed38 100644 --- a/web/src/services/Test.service.ts +++ b/web/src/services/Test.service.ts @@ -36,6 +36,7 @@ const TriggerServiceMap = { [SupportedPlugins.Kafka]: KafkaService, [SupportedPlugins.TraceID]: TraceIDService, [SupportedPlugins.Cypress]: CypressService, + [SupportedPlugins.Playwright]: CypressService, } as const; const TriggerServiceByTypeMap = { @@ -43,6 +44,7 @@ const TriggerServiceByTypeMap = { [TriggerTypes.http]: HttpService, [TriggerTypes.traceid]: TraceIDService, [TriggerTypes.cypress]: CypressService, + [TriggerTypes.playwright]: CypressService, [TriggerTypes.kafka]: KafkaService, } as const; diff --git a/web/src/types/Generated.types.ts b/web/src/types/Generated.types.ts index dafdbb5053..a3a6bb3bd8 100644 --- a/web/src/types/Generated.types.ts +++ b/web/src/types/Generated.types.ts @@ -2071,7 +2071,13 @@ export interface external { schemas: { Trigger: { /** @enum {string} */ - type?: "http" | "grpc" | "traceid" | "kafka" | "cypress"; + type?: + | "http" + | "grpc" + | "traceid" + | "kafka" + | "cypress" + | "playwright"; httpRequest?: external["http.yaml"]["components"]["schemas"]["HTTPRequest"]; grpc?: external["grpc.yaml"]["components"]["schemas"]["GRPCRequest"]; traceid?: external["traceid.yaml"]["components"]["schemas"]["TRACEIDRequest"]; @@ -2079,7 +2085,13 @@ export interface external { }; TriggerResult: { /** @enum {string} */ - type?: "http" | "grpc" | "traceid" | "kafka" | "cypress"; + type?: + | "http" + | "grpc" + | "traceid" + | "kafka" + | "cypress" + | "playwright"; triggerResult?: { http?: external["http.yaml"]["components"]["schemas"]["HTTPResponse"]; grpc?: external["grpc.yaml"]["components"]["schemas"]["GRPCResponse"];