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"];