[Security Solution] Unskip and enable for Serverless shared_exception_lists_management Cypress tests (#169182)

## Summary

Running flaky test runner for:
-
`x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management`

## Changes

-
`x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/list_detail_page/list_details.cy.ts`
**enabled on Serverless**
-
`x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/manage_exceptions.cy.ts`
**enabled on Serverless**
-
`x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/manage_exceptions.cy.ts`
**enabled on Serverless**
-
`x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/shared_exception_list_page/filter_table.cy.ts`
**enabled on Serverless**
-
`x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/shared_exception_list_page/import_lists.cy.ts`
**enabled on Serverless**
-
`x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/shared_exception_list_page/manage_lists.cy.ts`
**unskipped and enabled in Serverless**
-
`x-pack/test/security_solution_cypress/cypress/e2e/exceptions/shared_exception_lists_management/shared_exception_list_page/read_only.cy.ts`
**removed from Serverless testing**


## Related failing-test issues
1. https://github.com/elastic/kibana/issues/165874
2. https://github.com/elastic/kibana/issues/165838
3. https://github.com/elastic/kibana/issues/165795
4. https://github.com/elastic/kibana/issues/165743 - **Closed as
duplicate of _#165640**
5. https://github.com/elastic/kibana/issues/165690
6. https://github.com/elastic/kibana/issues/165640

### Flaky test runner link

-
https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3557#_
(Only ESS) 🟢
-
https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3564#_
(ESS and Serverless)
-
https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3613
(Serverless evaluated and corrected)
-
https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3878
[V3]
-
https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3891
[V4]
This commit is contained in:
Juan Pablo Djeredjian 2023-11-03 23:35:09 +01:00 committed by GitHub
parent f28445449e
commit c0c7d1365f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 229 additions and 252 deletions

View file

@ -41,93 +41,84 @@ const getExceptionList1 = () => ({
const EXCEPTION_LIST_NAME = 'Newly created list';
// TODO: https://github.com/elastic/kibana/issues/161539
// FLAKY: https://github.com/elastic/kibana/issues/165640
describe(
'Exception list detail page',
{ tags: ['@ess', '@serverless', '@skipInServerless'] },
() => {
before(() => {
login();
describe('Exception list detail page', { tags: ['@ess', '@serverless'] }, () => {
beforeEach(() => {
login();
// Create exception list associated with a rule
createExceptionList(getExceptionList1(), getExceptionList1().list_id).then((response) =>
createRule(
getNewRule({
exceptions_list: [
{
id: response.body.id,
list_id: getExceptionList1().list_id,
type: getExceptionList1().type,
namespace_type: getExceptionList1().namespace_type,
},
],
})
)
);
createRule(getNewRule({ name: 'Rule to link to shared list' }));
// Create exception list associated with a rule
createExceptionList(getExceptionList1(), getExceptionList1().list_id).then((response) =>
createRule(
getNewRule({
exceptions_list: [
{
id: response.body.id,
list_id: getExceptionList1().list_id,
type: getExceptionList1().type,
namespace_type: getExceptionList1().namespace_type,
},
],
})
)
);
createRule(getNewRule({ name: 'Rule to link to shared list' }));
visit(EXCEPTIONS_URL);
});
it('Should edit list details', () => {
visit(exceptionsListDetailsUrl(getExceptionList1().list_id));
waitForExceptionListDetailToBeLoaded();
// Check list details are loaded
cy.get(EXCEPTIONS_LIST_MANAGEMENT_NAME).should('have.text', LIST_NAME);
cy.get(EXCEPTIONS_LIST_MANAGEMENT_DESCRIPTION).should('have.text', LIST_DESCRIPTION);
// Update list details in edit modal
editExceptionLisDetails({
name: { original: LIST_NAME, updated: UPDATED_LIST_NAME },
description: { original: LIST_DESCRIPTION, updated: UPDATED_LIST_DESCRIPTION },
});
beforeEach(() => {
login();
visit(EXCEPTIONS_URL);
// Ensure that list details were updated
cy.get(EXCEPTIONS_LIST_MANAGEMENT_NAME).should('have.text', UPDATED_LIST_NAME);
cy.get(EXCEPTIONS_LIST_MANAGEMENT_DESCRIPTION).should('have.text', UPDATED_LIST_DESCRIPTION);
// Ensure that list details changes persisted
visit(exceptionsListDetailsUrl(getExceptionList1().list_id));
cy.get(EXCEPTIONS_LIST_MANAGEMENT_NAME).should('have.text', UPDATED_LIST_NAME);
cy.get(EXCEPTIONS_LIST_MANAGEMENT_DESCRIPTION).should('have.text', UPDATED_LIST_DESCRIPTION);
// Remove description
editExceptionLisDetails({
description: { original: UPDATED_LIST_DESCRIPTION, updated: null },
});
cy.get(EXCEPTIONS_LIST_MANAGEMENT_DESCRIPTION).should('have.text', 'Add a description');
it('Should edit list details', () => {
visit(exceptionsListDetailsUrl(getExceptionList1().list_id));
waitForExceptionListDetailToBeLoaded();
// Check list details are loaded
cy.get(EXCEPTIONS_LIST_MANAGEMENT_NAME).should('have.text', LIST_NAME);
cy.get(EXCEPTIONS_LIST_MANAGEMENT_DESCRIPTION).should('have.text', LIST_DESCRIPTION);
// Ensure description removal persisted
visit(exceptionsListDetailsUrl(getExceptionList1().list_id));
cy.get(EXCEPTIONS_LIST_MANAGEMENT_DESCRIPTION).should('have.text', 'Add a description');
});
// Update list details in edit modal
editExceptionLisDetails({
name: { original: LIST_NAME, updated: UPDATED_LIST_NAME },
description: { original: LIST_DESCRIPTION, updated: UPDATED_LIST_DESCRIPTION },
});
// TODO: Flaky in ESS and Serverless: https://github.com/elastic/kibana/pull/169182#issuecomment-1792597980
it.skip('Should create a new list and link it to two rules', () => {
createSharedExceptionList(
{ name: 'Newly created list', description: 'This is my list.' },
true
);
// Ensure that list details were updated
cy.get(EXCEPTIONS_LIST_MANAGEMENT_NAME).should('have.text', UPDATED_LIST_NAME);
cy.get(EXCEPTIONS_LIST_MANAGEMENT_DESCRIPTION).should('have.text', UPDATED_LIST_DESCRIPTION);
// After creation - directed to list detail page
cy.get(EXCEPTIONS_LIST_MANAGEMENT_NAME).should('have.text', EXCEPTION_LIST_NAME);
// Ensure that list details changes persisted
visit(exceptionsListDetailsUrl(getExceptionList1().list_id));
cy.get(EXCEPTIONS_LIST_MANAGEMENT_NAME).should('have.text', UPDATED_LIST_NAME);
cy.get(EXCEPTIONS_LIST_MANAGEMENT_DESCRIPTION).should('have.text', UPDATED_LIST_DESCRIPTION);
// Open Link rules flyout
cy.get(EXCEPTION_LIST_DETAILS_LINK_RULES_BTN).click();
// Remove description
editExceptionLisDetails({
description: { original: UPDATED_LIST_DESCRIPTION, updated: null },
});
cy.get(EXCEPTIONS_LIST_MANAGEMENT_DESCRIPTION).should('have.text', 'Add a description');
// Link the first two Rules
linkSharedListToRulesFromListDetails(2);
// Ensure description removal persisted
visit(exceptionsListDetailsUrl(getExceptionList1().list_id));
cy.get(EXCEPTIONS_LIST_MANAGEMENT_DESCRIPTION).should('have.text', 'Add a description');
});
// Save the 2 linked Rules
saveLinkedRules();
it('Should create a new list and link it to two rules', () => {
createSharedExceptionList(
{ name: 'Newly created list', description: 'This is my list.' },
true
);
const linkedRulesNames = ['Rule to link to shared list', 'New Rule Test'];
// After creation - directed to list detail page
cy.get(EXCEPTIONS_LIST_MANAGEMENT_NAME).should('have.text', EXCEPTION_LIST_NAME);
// Open Link rules flyout
cy.get(EXCEPTION_LIST_DETAILS_LINK_RULES_BTN).click();
// Link the first two Rules
linkSharedListToRulesFromListDetails(2);
// Save the 2 linked Rules
saveLinkedRules();
const linkedRulesNames = ['Rule to link to shared list', 'New Rule Test'];
// Validate the number of linked rules as well as the Rules' names
validateSharedListLinkedRules(2, linkedRulesNames);
});
}
);
// Validate the number of linked rules as well as the Rules' names
validateSharedListLinkedRules(2, linkedRulesNames);
});
});

View file

@ -44,166 +44,160 @@ import { visitRuleDetailsPage } from '../../../tasks/rule_details';
import { deleteEndpointExceptionList, deleteExceptionLists } from '../../../tasks/common';
import { closeErrorToast } from '../../../tasks/alerts_detection_rules';
// TODO: https://github.com/elastic/kibana/issues/161539
// FLAKY: https://github.com/elastic/kibana/issues/165795
describe(
'Add, edit and delete exception',
{ tags: ['@ess', '@serverless', '@skipInServerless'] },
() => {
beforeEach(() => {
login();
deleteExceptionLists();
deleteEndpointExceptionList();
cy.task('esArchiverLoad', { archiveName: 'exceptions' });
createRule(getNewRule()).as('createdRule');
describe('Add, edit and delete exception', { tags: ['@ess', '@serverless'] }, () => {
beforeEach(() => {
login();
deleteExceptionLists();
deleteEndpointExceptionList();
cy.task('esArchiverLoad', { archiveName: 'exceptions' });
createRule(getNewRule()).as('createdRule');
visit(EXCEPTIONS_URL);
});
afterEach(() => {
cy.task('esArchiverUnload', 'exceptions');
});
const exceptionName = 'My item name';
const exceptionNameEdited = 'My item name edited';
const FIELD_DIFFERENT_FROM_EXISTING_ITEM_FIELD = 'agent.name';
const EXCEPTION_LIST_NAME = 'Newly created list';
describe('Add, Edit and delete Exception item', () => {
it('should create exception item from Shared Exception List page and linked to a Rule', () => {
// Click on "Create shared exception list" button on the header
// Click on "Create exception item"
addExceptionListFromSharedExceptionListHeaderMenu();
// Add exception item name
addExceptionFlyoutItemName(exceptionName);
// Add Condition
editException(FIELD_DIFFERENT_FROM_EXISTING_ITEM_FIELD, 0, 0);
// Confirm button should disabled until a rule(s) is selected
cy.get(CONFIRM_BTN).should('have.attr', 'disabled');
// select rule
linkFirstRuleOnExceptionFlyout();
// should be able to submit
cy.get(CONFIRM_BTN).should('not.have.attr', 'disabled');
submitNewExceptionItem();
// Navigate to Rule details page
cy.get<Cypress.Response<RuleResponse>>('@createdRule').then((rule) =>
visitRuleDetailsPage(rule.body.id, { tab: 'rule_exceptions' })
);
// Only one Exception should generated
cy.get(EXCEPTION_ITEM_VIEWER_CONTAINER).should('have.length', 1);
// validate the And operator is displayed correctly
cy.get(EXCEPTION_CARD_ITEM_NAME).should('have.text', exceptionName);
});
it('should create exception item from Shared Exception List page, linked to a Shared List and validate Edit/delete in list detail page', function () {
createSharedExceptionList(
{ name: 'Newly created list', description: 'This is my list.' },
true
);
// After creation - directed to list detail page
cy.get(EXCEPTIONS_LIST_MANAGEMENT_NAME).should('have.text', EXCEPTION_LIST_NAME);
// Go back to Shared Exception List
visit(EXCEPTIONS_URL);
// Click on "Create shared exception list" button on the header
// Click on "Create exception item"
addExceptionListFromSharedExceptionListHeaderMenu();
// Add exception item name
addExceptionFlyoutItemName(exceptionName);
// Add Condition
editException(FIELD_DIFFERENT_FROM_EXISTING_ITEM_FIELD, 0, 0);
// select shared list radio option and select the first one
linkFirstSharedListOnExceptionFlyout();
submitNewExceptionItem();
// New exception is added to the new List
findSharedExceptionListItemsByName(`${EXCEPTION_LIST_NAME}`, [exceptionName]);
// Click on the first exception overflow menu items
// Open the edit modal
editFirstExceptionItemInListDetailPage();
// edit exception item name
editExceptionFlyoutItemName(exceptionNameEdited);
// submit
submitEditedExceptionItem();
// check the new name after edit
cy.get(EXECPTION_ITEM_CARD_HEADER_TITLE).should('have.text', exceptionNameEdited);
// Click on the first exception overflow menu items
// delete the exception
deleteFirstExceptionItemInListDetailPage();
cy.get(EMPTY_EXCEPTIONS_VIEWER).should('exist');
});
afterEach(() => {
cy.task('esArchiverUnload', 'exceptions');
it('should handle huge text as a comment gracefully and allow user create exception item after user updates the comment', function () {
createSharedExceptionList(
{ name: 'Newly created list', description: 'This is my list.' },
true
);
// After creation - directed to list detail page
cy.get(EXCEPTIONS_LIST_MANAGEMENT_NAME).should('have.text', EXCEPTION_LIST_NAME);
// Go back to Shared Exception List
visit(EXCEPTIONS_URL);
// Click on "Create shared exception list" button on the header
// Click on "Create exception item"
addExceptionListFromSharedExceptionListHeaderMenu();
// Add exception item name
addExceptionFlyoutItemName(exceptionName);
// Add Condition
editException(FIELD_DIFFERENT_FROM_EXISTING_ITEM_FIELD, 0, 0);
// select shared list radio option and select the first one
linkFirstSharedListOnExceptionFlyout();
// add exception comment which is super long
addExceptionHugeComment([...new Array(5000).keys()].map((_) => `Test text!`).join(''));
// submit
submitNewExceptionItemWithFailure();
// Failed to add exception due to comment length and submit button should be disabled
cy.get(CONFIRM_BTN).should('have.attr', 'disabled');
// Close error toast
closeErrorToast();
// Dismiss error callout
dismissExceptionItemErrorCallOut();
// Submit button should be enabled after we dismissed error callout
cy.get(CONFIRM_BTN).should('not.have.attr', 'disabled');
// update exception comment to a reasonable (length wise) text
editExceptionComment('Exceptional comment');
// submit
submitNewExceptionItem();
// New exception is added to the new List
findSharedExceptionListItemsByName(`${EXCEPTION_LIST_NAME}`, [exceptionName]);
});
const exceptionName = 'My item name';
const exceptionNameEdited = 'My item name edited';
const FIELD_DIFFERENT_FROM_EXISTING_ITEM_FIELD = 'agent.name';
const EXCEPTION_LIST_NAME = 'Newly created list';
describe('Add, Edit and delete Exception item', () => {
it('should create exception item from Shared Exception List page and linked to a Rule', () => {
// Click on "Create shared exception list" button on the header
// Click on "Create exception item"
addExceptionListFromSharedExceptionListHeaderMenu();
// Add exception item name
addExceptionFlyoutItemName(exceptionName);
// Add Condition
editException(FIELD_DIFFERENT_FROM_EXISTING_ITEM_FIELD, 0, 0);
// Confirm button should disabled until a rule(s) is selected
cy.get(CONFIRM_BTN).should('have.attr', 'disabled');
// select rule
linkFirstRuleOnExceptionFlyout();
// should be able to submit
cy.get(CONFIRM_BTN).should('not.have.attr', 'disabled');
submitNewExceptionItem();
// Navigate to Rule details page
cy.get<Cypress.Response<RuleResponse>>('@createdRule').then((rule) =>
visitRuleDetailsPage(rule.body.id, { tab: 'rule_exceptions' })
);
// Only one Exception should generated
cy.get(EXCEPTION_ITEM_VIEWER_CONTAINER).should('have.length', 1);
// validate the And operator is displayed correctly
cy.get(EXCEPTION_CARD_ITEM_NAME).should('have.text', exceptionName);
});
it('should create exception item from Shared Exception List page, linked to a Shared List and validate Edit/delete in list detail page', function () {
createSharedExceptionList(
{ name: 'Newly created list', description: 'This is my list.' },
true
);
// After creation - directed to list detail page
cy.get(EXCEPTIONS_LIST_MANAGEMENT_NAME).should('have.text', EXCEPTION_LIST_NAME);
// Go back to Shared Exception List
visit(EXCEPTIONS_URL);
// Click on "Create shared exception list" button on the header
// Click on "Create exception item"
addExceptionListFromSharedExceptionListHeaderMenu();
// Add exception item name
addExceptionFlyoutItemName(exceptionName);
// Add Condition
editException(FIELD_DIFFERENT_FROM_EXISTING_ITEM_FIELD, 0, 0);
// select shared list radio option and select the first one
linkFirstSharedListOnExceptionFlyout();
submitNewExceptionItem();
// New exception is added to the new List
findSharedExceptionListItemsByName(`${EXCEPTION_LIST_NAME}`, [exceptionName]);
// Click on the first exception overflow menu items
// Open the edit modal
editFirstExceptionItemInListDetailPage();
// edit exception item name
editExceptionFlyoutItemName(exceptionNameEdited);
// submit
submitEditedExceptionItem();
// check the new name after edit
cy.get(EXECPTION_ITEM_CARD_HEADER_TITLE).should('have.text', exceptionNameEdited);
// Click on the first exception overflow menu items
// delete the exception
deleteFirstExceptionItemInListDetailPage();
cy.get(EMPTY_EXCEPTIONS_VIEWER).should('exist');
});
it('should handle huge text as a comment gracefully and allow user create exception item after user updates the comment', function () {
createSharedExceptionList(
{ name: 'Newly created list', description: 'This is my list.' },
true
);
// After creation - directed to list detail page
cy.get(EXCEPTIONS_LIST_MANAGEMENT_NAME).should('have.text', EXCEPTION_LIST_NAME);
// Go back to Shared Exception List
visit(EXCEPTIONS_URL);
// Click on "Create shared exception list" button on the header
// Click on "Create exception item"
addExceptionListFromSharedExceptionListHeaderMenu();
// Add exception item name
addExceptionFlyoutItemName(exceptionName);
// Add Condition
editException(FIELD_DIFFERENT_FROM_EXISTING_ITEM_FIELD, 0, 0);
// select shared list radio option and select the first one
linkFirstSharedListOnExceptionFlyout();
// add exception comment which is super long
addExceptionHugeComment([...new Array(5000).keys()].map((_) => `Test text!`).join(''));
// submit
submitNewExceptionItemWithFailure();
// Failed to add exception due to comment length and submit button should be disabled
cy.get(CONFIRM_BTN).should('have.attr', 'disabled');
// Close error toast
closeErrorToast();
// Dismiss error callout
dismissExceptionItemErrorCallOut();
// Submit button should be enabled after we dismissed error callout
cy.get(CONFIRM_BTN).should('not.have.attr', 'disabled');
// update exception comment to a reasonable (length wise) text
editExceptionComment('Exceptional comment');
// submit
submitNewExceptionItem();
// New exception is added to the new List
findSharedExceptionListItemsByName(`${EXCEPTION_LIST_NAME}`, [exceptionName]);
});
});
}
);
});
});

View file

@ -42,9 +42,7 @@ const getExceptionList2 = () => ({
list_id: 'exception_list_2',
});
// TODO: https://github.com/elastic/kibana/issues/161539
// Flaky in serverless tests
describe('Duplicate List', { tags: ['@ess', '@serverless', '@skipInServerless'] }, () => {
describe('Duplicate List', { tags: ['@ess', '@serverless'] }, () => {
beforeEach(() => {
login();
deleteAlertsAndRules();

View file

@ -37,8 +37,7 @@ const getExceptionList2 = () => ({
list_id: 'exception_list_2',
});
// TODO: https://github.com/elastic/kibana/issues/161539
describe('Filter Lists', { tags: ['@ess', '@serverless', '@skipInServerless'] }, () => {
describe('Filter Lists', { tags: ['@ess', '@serverless'] }, () => {
beforeEach(() => {
login();

View file

@ -21,8 +21,6 @@ import { login } from '../../../../tasks/login';
import { visit } from '../../../../tasks/navigation';
import { EXCEPTIONS_URL } from '../../../../urls/navigation';
// TODO: https://github.com/elastic/kibana/issues/161539
// Flaky in serverless
describe('Import Lists', { tags: ['@ess', '@serverless', '@skipInServerless'] }, () => {
const LIST_TO_IMPORT_FILENAME = 'cypress/fixtures/7_16_exception_list.ndjson';
beforeEach(() => {

View file

@ -48,12 +48,9 @@ const getExceptionList2 = () => ({
let exceptionListResponse: Cypress.Response<ExceptionListSchema>;
// TODO: https://github.com/elastic/kibana/issues/161539
// FLAKY: https://github.com/elastic/kibana/issues/165690
// FLAKY: https://github.com/elastic/kibana/issues/165838
describe.skip(
describe(
'Manage lists from "Shared Exception Lists" page',
{ tags: ['@ess', '@serverless', '@skipInServerless'] },
{ tags: ['@ess', '@serverless'] },
() => {
describe('Create/Export/Delete List', () => {
before(() => {

View file

@ -7,7 +7,7 @@
"scripts": {
"cypress": "NODE_OPTIONS=--openssl-legacy-provider ../../../node_modules/.bin/cypress",
"cypress:open:ess": "TZ=UTC NODE_OPTIONS=--openssl-legacy-provider node ../../plugins/security_solution/scripts/start_cypress_parallel open --spec './cypress/e2e/**/*.cy.ts' --config-file ../../test/security_solution_cypress/cypress/cypress.config.ts --ftr-config-file ../../test/security_solution_cypress/cli_config",
"cypress:run:ess": "yarn cypress:ess --spec './cypress/e2e/!(investigations|explore)/**/*.cy.ts'",
"cypress:run:ess": "yarn cypress:ess --spec './cypress/e2e/exceptions/shared_exception_lists_management/**/*.cy.ts'",
"cypress:run:cases:ess": "yarn cypress:ess --spec './cypress/e2e/explore/cases/*.cy.ts'",
"cypress:ess": "TZ=UTC NODE_OPTIONS=--openssl-legacy-provider node ../../plugins/security_solution/scripts/start_cypress_parallel run --config-file ../../test/security_solution_cypress/cypress/cypress_ci.config.ts --ftr-config-file ../../test/security_solution_cypress/cli_config",
"cypress:run:respops:ess": "yarn cypress:ess --spec './cypress/e2e/(detection_response|exceptions)/**/*.cy.ts'",
@ -21,7 +21,7 @@
"cypress:cloud:serverless": "TZ=UTC NODE_OPTIONS=--openssl-legacy-provider NODE_TLS_REJECT_UNAUTHORIZED=0 ../../../node_modules/.bin/cypress",
"cypress:open:cloud:serverless": "yarn cypress:cloud:serverless open --config-file ./cypress/cypress_serverless.config.ts --env CLOUD_SERVERLESS=true",
"cypress:open:serverless": "yarn cypress:serverless open --config-file ../../test/security_solution_cypress/cypress/cypress_serverless.config.ts --spec './cypress/e2e/**/*.cy.ts'",
"cypress:run:serverless": "yarn cypress:serverless --spec './cypress/e2e/!(investigations|explore)/**/*.cy.ts'",
"cypress:run:serverless": "yarn cypress:serverless --spec './cypress/e2e/exceptions/shared_exception_lists_management/**/*.cy.ts'",
"cypress:run:cloud:serverless": "yarn cypress:cloud:serverless run --config-file ./cypress/cypress_ci_serverless.config.ts --env CLOUD_SERVERLESS=true",
"cypress:run:qa:serverless": "yarn cypress:cloud:serverless run --config-file ./cypress/cypress_ci_serverless_qa.config.ts --env CLOUD_SERVERLESS=true",
"cypress:investigations:run:serverless": "yarn cypress:serverless --spec './cypress/e2e/investigations/**/*.cy.ts'",
@ -29,4 +29,4 @@
"cypress:changed-specs-only:serverless": "yarn cypress:serverless --changed-specs-only --env burn=5",
"cypress:burn:serverless": "yarn cypress:serverless --env burn=5"
}
}
}