[8.16] [Cloud Security] Cypress Test for Misconfiguration Preview and Table for Contextual Flyout (#193125) (#196974)

# Backport

This will backport the following commits from `main` to `8.16`:
- [[Cloud Security] Cypress Test for Misconfiguration Preview and Table
for Contextual Flyout
(#193125)](https://github.com/elastic/kibana/pull/193125)

<!--- Backport version: 8.9.8 -->

### Questions ?
Please refer to the [Backport tool
documentation](https://github.com/sqren/backport)

<!--BACKPORT [{"author":{"name":"Rickyanto
Ang","email":"rickyangwyn@gmail.com"},"sourceCommit":{"committedDate":"2024-10-19T08:39:50Z","message":"[Cloud
Security] Cypress Test for Misconfiguration Preview and Table for
Contextual Flyout (#193125)\n\n## Summary\r\nThis PR is for Cypress test
for the Misconfiguration Preview and
Data\r\ntable\r\n\r\n---------\r\n\r\nCo-authored-by: kibanamachine
<42973632+kibanamachine@users.noreply.github.com>","sha":"2de1f4a55805d4a6d4d3560e3025798e33db87b5","branchLabelMapping":{"^v9.0.0$":"main","^v8.17.0$":"8.x","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["release_note:skip","v9.0.0","Team:Cloud
Security","v8.16.0","backport:version"],"number":193125,"url":"https://github.com/elastic/kibana/pull/193125","mergeCommit":{"message":"[Cloud
Security] Cypress Test for Misconfiguration Preview and Table for
Contextual Flyout (#193125)\n\n## Summary\r\nThis PR is for Cypress test
for the Misconfiguration Preview and
Data\r\ntable\r\n\r\n---------\r\n\r\nCo-authored-by: kibanamachine
<42973632+kibanamachine@users.noreply.github.com>","sha":"2de1f4a55805d4a6d4d3560e3025798e33db87b5"}},"sourceBranch":"main","suggestedTargetBranches":["8.16"],"targetPullRequestStates":[{"branch":"main","label":"v9.0.0","labelRegex":"^v9.0.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/193125","number":193125,"mergeCommit":{"message":"[Cloud
Security] Cypress Test for Misconfiguration Preview and Table for
Contextual Flyout (#193125)\n\n## Summary\r\nThis PR is for Cypress test
for the Misconfiguration Preview and
Data\r\ntable\r\n\r\n---------\r\n\r\nCo-authored-by: kibanamachine
<42973632+kibanamachine@users.noreply.github.com>","sha":"2de1f4a55805d4a6d4d3560e3025798e33db87b5"}},{"branch":"8.16","label":"v8.16.0","labelRegex":"^v(\\d+).(\\d+).\\d+$","isSourceBranch":false,"state":"NOT_CREATED"}]}]
BACKPORT-->

---------

Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
This commit is contained in:
Rickyanto Ang 2024-10-21 19:42:18 +07:00 committed by GitHub
parent 6d77db490f
commit 29333f8587
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 363 additions and 15 deletions

View file

@ -87,6 +87,14 @@
{
"key": "cypress/apm_cypress",
"name": "APM - Cypress"
},
{
"key": "cypress/cloud_security_posture",
"name": "Cloud Security Posture - Cypress"
},
{
"key": "cypress/cloud_security_posture_serverless",
"name": "[Serverless] Cloud Security Posture - Cypress"
}
]
}

View file

@ -0,0 +1,30 @@
steps:
- command: .buildkite/scripts/steps/functional/cloud_security_posture.sh
label: 'Cloud Security Posture Cypress Tests'
agents:
machineType: n2-standard-4
preemptible: true
depends_on:
- build
- quick_checks
timeout_in_minutes: 60
parallelism: 1
retry:
automatic:
- exit_status: '-1'
limit: 1
- command: .buildkite/scripts/steps/functional/cloud_security_posture_serverless.sh
label: 'Cloud Security Posture Cypress Tests on Serverless'
agents:
machineType: n2-standard-4
preemptible: true
depends_on:
- build
- quick_checks
timeout_in_minutes: 60
parallelism: 1
retry:
automatic:
- exit_status: '-1'
limit: 1

View file

@ -298,6 +298,22 @@ const getPipeline = (filename: string, removeSteps = true) => {
);
}
if (
(await doAnyChangesMatch([
/^x-pack\/packages\/kbn-cloud-security-posture/,
/^x-pack\/plugins\/cloud_security_posture/,
/^x-pack\/plugins\/security_solution/,
/^x-pack\/test\/security_solution_cypress/,
])) ||
GITHUB_PR_LABELS.includes('ci:all-cypress-suites')
) {
pipeline.push(
getPipeline(
'.buildkite/pipelines/pull_request/security_solution/cloud_security_posture.yml'
)
);
}
pipeline.push(getPipeline('.buildkite/pipelines/pull_request/post_build.yml'));
// remove duplicated steps

View file

@ -0,0 +1,16 @@
#!/usr/bin/env bash
set -euo pipefail
source .buildkite/scripts/steps/functional/common.sh
export JOB=kibana-cloud-security-posture-cypress
export KIBANA_INSTALL_DIR=${KIBANA_BUILD_LOCATION}
echo "--- Cloud Security Posture Workflows Cypress tests"
cd x-pack/test/security_solution_cypress
set +e
yarn cypress:cloud_security_posture:run:ess; status=$?; yarn junit:merge || :; exit $status

View file

@ -0,0 +1,16 @@
#!/usr/bin/env bash
set -euo pipefail
source .buildkite/scripts/steps/functional/common.sh
export JOB=kibana-cloud-security-posture-serverless-cypress
export KIBANA_INSTALL_DIR=${KIBANA_BUILD_LOCATION}
echo "--- Cloud Security Posture Workflows Cypress tests on Serverless"
cd x-pack/test/security_solution_cypress
set +e
yarn cypress:cloud_security_posture:run:serverless; status=$?; yarn junit:merge || :; exit $status

View file

@ -20,6 +20,7 @@ For general guidelines, read [Kibana Testing Guide](https://www.elastic.co/guide
1. [End-to-End Tests](../../test/cloud_security_posture_functional/config.ts)
1. [Serverless API Integration tests](../../test_serverless/api_integration/test_suites/security/config.ts)
1. [Serverless End-to-End Tests](../../test_serverless/functional/test_suites/security/config.ts)
1. [Cypress End-to-End Tests](../../test/security_solution_cypress/cypress/e2e/cloud_security_posture)
### Tools
@ -73,6 +74,17 @@ yarn test:ftr --config x-pack/test_serverless/api_integration/test_suites/securi
yarn test:ftr --config x-pack/test_serverless/functional/test_suites/security/config.cloud_security_posture.ts
```
Run [**End-to-End Cypress Tests**](https://github.com/elastic/kibana/tree/main/x-pack/test/security_solution_cypress/cypress):
> **Note**
>
> Run this from security_solution_cypress folder
```bash
yarn cypress:open:serverless
yarn cypress:open:ess
yarn cypress:cloud_security_posture:run:serverless
yarn cypress:cloud_security_posture:run:ess
```
#### Run **FTR tests (integration or e2e) for development**
Functional test runner (FTR) can be used separately with `ftr:runner` and `ftr:server`. This is convenient while developing tests.
@ -107,4 +119,29 @@ run serverless e2e tests:
```bash
yarn test:ftr:server --config x-pack/test_serverless/functional/test_suites/security/config.cloud_security_posture.ts
yarn test:ftr:runner ---config x-pack/test_serverless/functional/test_suites/security/config.cloud_security_posture.ts
```
```
#### Run **Cypress tests (e2e) for development**
When developing feature outside our plugin folder, instead of using FTRs for e2e test, we may use Cypress. Before running cypress, make sure you have installed it first. Like FTRs, we can run cypress in different environment, for example:
run ess e2e tests:
```bash
yarn cypress:open:ess
```
run ess Cloud Security Posture e2e tests:
```bash
yarn cypress:cloud_security_posture:run:ess
```
run serverless e2e tests:
```bash
yarn cypress:open:serverless
```
run serverless Cloud Security Posture e2e tests:
```bash
yarn cypress:cloud_security_posture:run:serverless
```
Unlike FTR where we have to set server and runner separately, Cypress handles everything in 1 go, so just running the above the script is enough to get it running

View file

@ -196,6 +196,7 @@ export const MisconfigurationFindingsDetailsTable = memo(
columns={columns}
pagination={pagination}
onChange={onTableChange}
data-test-subj={'securitySolutionFlyoutMisconfigurationFindingsTable'}
/>
</EuiPanel>
</>

View file

@ -229,6 +229,7 @@ export const MisconfigurationsPreview = ({
css={css`
font-weight: ${euiTheme.font.weight.semiBold};
`}
data-test-subj={'securitySolutionFlyoutInsightsMisconfigurationsTitleText'}
>
<FormattedMessage
id="xpack.securitySolution.flyout.right.insights.misconfigurations.misconfigurationsTitle"

View file

@ -79,6 +79,8 @@ Run the tests with the following yarn scripts from `x-pack/test/security_solutio
| cypress:detection_engine:run:serverless | Runs all tests tagged as SERVERLESS in the `e2e/detection_response/detection_engine` excluding `e2e/detection_response/detection_engine` directory in headless mode |
| cypress:ai_assistant:run:ess | Runs all tests tagged as ESS in the `e2e/ai_assistant` directory in headless mode |
| cypress:ai_assistant:run:serverless | Runs all tests tagged as SERVERLESS in the `e2e/ai_assistant` directory in headless mode |
| cypress:cloud_security_posture:run:ess | Runs all tests tagged as ESS in the `e2e/cloud_security_posture` directory in headless mode |
| cypress:cloud_security_posture:run:serverless | Runs all tests tagged as SERVERLESS in the `e2e/cloud_security_posture` directory in headless mode |
| cypress:detection_engine:exceptions:run:serverless | Runs all tests tagged as ESS in the `e2e/detection_response/detection_engine/exceptions` directory in headless mode |
| cypress:investigations:run:ess | Runs all tests tagged as SERVERLESS in the `e2e/investigations` directory in headless mode |
| cypress:explore:run:ess | Runs all tests tagged as ESS in the `e2e/explore` directory in headless mode |
@ -88,6 +90,7 @@ Run the tests with the following yarn scripts from `x-pack/test/security_solutio
| cypress:run:qa:serverless:entity_analytics | Runs all tests tagged as SERVERLESS placed in the `e2e/entity_analytics` directory in headless mode using the QA environment and real MKI projects.|
| cypress:run:qa:serverless:explore | Runs all tests tagged as SERVERLESS in the `e2e/explore` directory in headless mode using the QA environment and real MKI prorjects. |
| cypress:run:qa:serverless:investigations | Runs all tests tagged as SERVERLESS in the `e2e/investigations` directory in headless mode using the QA environment and reak MKI projects. |
| cypress:run:qa:serverless:cloud_security_posture | Runs all tests tagged as SERVERLESS in the `e2e/cloud_security_posture` directory in headless mode using the QA environment and reak MKI projects. |
| cypress:run:qa:serverless:rule_management | Runs all tests tagged as SERVERLESS in the `e2e/detection_response/rule_management` directory, excluding `e2e/detection_response/rule_management/prebuilt_rules` in headless mode using the QA environment and reak MKI projects. |
| cypress:run:qa:serverless:rule_management:prebuilt_rules | Runs all tests tagged as SERVERLESS in the `e2e/detection_response/rule_management/prebuilt_rules` directory in headless mode using the QA environment and reak MKI projects. |
| cypress:run:qa:serverless:detection_engine | Runs all tests tagged as SERVERLESS in the `e2e/detection_response/detection_engine` directory, excluding `e2e/detection_response/detection_engine/exceptions` in headless mode using the QA environment and reak MKI projects. |

View file

@ -0,0 +1,219 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
import { CDR_LATEST_NATIVE_MISCONFIGURATIONS_INDEX_PATTERN } from '@kbn/cloud-security-posture-common';
import { createRule } from '../../tasks/api_calls/rules';
import { getNewRule } from '../../objects/rule';
import { getDataTestSubjectSelector } from '../../helpers/common';
import { rootRequest, deleteAlertsAndRules } from '../../tasks/api_calls/common';
import {
expandFirstAlertHostFlyout,
expandFirstAlertUserFlyout,
} from '../../tasks/asset_criticality/common';
import { waitForAlertsToPopulate } from '../../tasks/create_new_rule';
import { login } from '../../tasks/login';
import { ALERTS_URL } from '../../urls/navigation';
import { visit } from '../../tasks/navigation';
const CSP_INSIGHT_MISCONFIGURATION_TITLE = getDataTestSubjectSelector(
'securitySolutionFlyoutInsightsMisconfigurationsTitleLink'
);
const CSP_INSIGHT_TAB_TITLE = getDataTestSubjectSelector('securitySolutionFlyoutInsightInputsTab');
const CSP_INSIGHT_TABLE = getDataTestSubjectSelector(
'securitySolutionFlyoutMisconfigurationFindingsTable'
);
const clickMisconfigurationTitle = () => {
cy.get(CSP_INSIGHT_MISCONFIGURATION_TITLE).click();
};
const timestamp = Date.now();
const date = new Date(timestamp);
const iso8601String = date.toISOString();
const mockFindingHostName = (matches: boolean) => {
return {
'@timestamp': iso8601String,
host: { name: matches ? 'siem-kibana' : 'not-siem-kibana' },
resource: {
id: '1234ABCD',
name: 'kubelet',
sub_type: 'lower case sub type',
},
result: { evaluation: matches ? 'passed' : 'failed' },
rule: {
name: 'Upper case rule name',
section: 'Upper case section',
benchmark: {
id: 'cis_k8s',
posture_type: 'kspm',
name: 'CIS Kubernetes V1.23',
version: 'v1.0.0',
},
type: 'process',
},
cluster_id: 'Upper case cluster id',
data_stream: {
dataset: 'cloud_security_posture.findings',
},
};
};
const mockFindingUserName = (matches: boolean) => {
return {
'@timestamp': iso8601String,
user: { name: matches ? 'test' : 'not-test' },
resource: {
id: '1234ABCD',
name: 'kubelet',
sub_type: 'lower case sub type',
},
result: { evaluation: matches ? 'passed' : 'failed' },
rule: {
name: 'Upper case rule name',
section: 'Upper case section',
benchmark: {
id: 'cis_k8s',
posture_type: 'kspm',
name: 'CIS Kubernetes V1.23',
version: 'v1.0.0',
},
type: 'process',
},
cluster_id: 'Upper case cluster id',
data_stream: {
dataset: 'cloud_security_posture.findings',
},
};
};
const createMockFinding = (isNameMatches: boolean, findingType: 'host.name' | 'user.name') => {
return rootRequest({
method: 'POST',
url: `${Cypress.env(
'ELASTICSEARCH_URL'
)}/${CDR_LATEST_NATIVE_MISCONFIGURATIONS_INDEX_PATTERN}/_doc`,
body:
findingType === 'host.name'
? mockFindingHostName(isNameMatches)
: mockFindingUserName(isNameMatches),
});
};
const deleteDataStream = () => {
return rootRequest({
method: 'DELETE',
url: `${Cypress.env(
'ELASTICSEARCH_URL'
)}/_data_stream/${CDR_LATEST_NATIVE_MISCONFIGURATIONS_INDEX_PATTERN}`,
});
};
describe('Alert Host details expandable flyout', { tags: ['@ess', '@serverless'] }, () => {
beforeEach(() => {
deleteAlertsAndRules();
login();
createRule(getNewRule());
visit(ALERTS_URL);
waitForAlertsToPopulate();
});
context('Host name - Has misconfiguration findings', () => {
beforeEach(() => {
createMockFinding(true, 'host.name');
cy.reload();
expandFirstAlertHostFlyout();
});
afterEach(() => {
/* Deleting data stream even though we don't create it because data stream is automatically created when Cloud security API is used */
deleteDataStream();
});
it('should display Misconfiguration preview under Insights Entities when it has Misconfiguration Findings', () => {
cy.log('check if Misconfiguration preview title shown');
cy.get(CSP_INSIGHT_MISCONFIGURATION_TITLE).should('be.visible');
});
it('should display insight tabs and findings table upon clicking on misconfiguration accordion', () => {
clickMisconfigurationTitle();
cy.get(CSP_INSIGHT_TAB_TITLE).should('be.visible');
cy.get(CSP_INSIGHT_TABLE).should('be.visible');
});
});
context(
'Host name - Has misconfiguration findings but host name is not the same as alert host name',
() => {
beforeEach(() => {
createMockFinding(false, 'host.name');
cy.reload();
expandFirstAlertHostFlyout();
});
afterEach(() => {
deleteDataStream();
});
it('should display Misconfiguration preview under Insights Entities when it has Misconfiguration Findings', () => {
expandFirstAlertHostFlyout();
cy.log('check if Misconfiguration preview title is not shown');
cy.get(CSP_INSIGHT_MISCONFIGURATION_TITLE).should('not.exist');
});
}
);
context('User name - Has misconfiguration findings', () => {
beforeEach(() => {
createMockFinding(true, 'user.name');
cy.reload();
expandFirstAlertUserFlyout();
});
afterEach(() => {
deleteDataStream();
});
it('should display Misconfiguration preview under Insights Entities when it has Misconfiguration Findings', () => {
cy.log('check if Misconfiguration preview title shown');
cy.get(CSP_INSIGHT_MISCONFIGURATION_TITLE).should('be.visible');
});
it('should display insight tabs and findings table upon clicking on misconfiguration accordion', () => {
clickMisconfigurationTitle();
cy.get(CSP_INSIGHT_TAB_TITLE).should('be.visible');
cy.get(CSP_INSIGHT_TABLE).should('be.visible');
});
});
context(
'User name - Has misconfiguration findings but host name is not the same as alert host name',
() => {
beforeEach(() => {
createMockFinding(false, 'user.name');
cy.reload();
expandFirstAlertHostFlyout();
});
afterEach(() => {
deleteDataStream();
});
it('should display Misconfiguration preview under Insights Entities when it has Misconfiguration Findings', () => {
expandFirstAlertUserFlyout();
cy.log('check if Misconfiguration preview title is not shown');
cy.get(CSP_INSIGHT_MISCONFIGURATION_TITLE).should('not.exist');
});
}
);
});

View file

@ -6,16 +6,16 @@
*/
import { CDR_LATEST_NATIVE_VULNERABILITIES_INDEX_PATTERN } from '@kbn/cloud-security-posture-common';
import { createRule } from '../../../../tasks/api_calls/rules';
import { getNewRule } from '../../../../objects/rule';
import { getDataTestSubjectSelector } from '../../../../helpers/common';
import { createRule } from '../../tasks/api_calls/rules';
import { getNewRule } from '../../objects/rule';
import { getDataTestSubjectSelector } from '../../helpers/common';
import { rootRequest, deleteAlertsAndRules } from '../../../../tasks/api_calls/common';
import { expandFirstAlertHostFlyout } from '../../../../tasks/asset_criticality/common';
import { waitForAlertsToPopulate } from '../../../../tasks/create_new_rule';
import { login } from '../../../../tasks/login';
import { ALERTS_URL } from '../../../../urls/navigation';
import { visit } from '../../../../tasks/navigation';
import { rootRequest, deleteAlertsAndRules } from '../../tasks/api_calls/common';
import { expandFirstAlertHostFlyout } from '../../tasks/asset_criticality/common';
import { waitForAlertsToPopulate } from '../../tasks/create_new_rule';
import { login } from '../../tasks/login';
import { ALERTS_URL } from '../../urls/navigation';
import { visit } from '../../tasks/navigation';
const CSP_INSIGHT_VULNERABILITIES_TITLE = getDataTestSubjectSelector(
'securitySolutionFlyoutInsightsVulnerabilitiesTitleLink'
@ -27,10 +27,8 @@ const CSP_INSIGHT_VULNERABILITIES_TABLE = getDataTestSubjectSelector(
const timestamp = Date.now();
// Create a Date object using the timestamp
const date = new Date(timestamp);
// Convert the Date object to ISO 8601 format
const iso8601String = date.toISOString();
const getMockVulnerability = (isNameMatchesAlert: boolean) => {
@ -138,8 +136,7 @@ const deleteDataStream = () => {
});
};
// skipping because failure on MKI environment (https://buildkite.com/elastic/kibana-serverless-security-solution-quality-gate-investigations/builds/1390#01927579-caed-41bc-9440-3cf29629a263)
describe.skip('Alert Host details expandable flyout', { tags: ['@ess', '@serverless'] }, () => {
describe('Alert Host details expandable flyout', { tags: ['@ess', '@serverless'] }, () => {
beforeEach(() => {
deleteAlertsAndRules();
login();
@ -167,6 +164,7 @@ describe.skip('Alert Host details expandable flyout', { tags: ['@ess', '@serverl
});
afterEach(() => {
/* Deleting data stream even though we don't create it because data stream is automatically created when Cloud security API is used */
deleteDataStream();
});

View file

@ -19,6 +19,7 @@
"cypress:investigations:run:ess": "yarn cypress:ess --spec './cypress/e2e/investigations/**/*.cy.ts'",
"cypress:explore:run:ess": "yarn cypress:ess --spec './cypress/e2e/explore/**/*.cy.ts'",
"cypress:changed-specs-only:ess": "yarn cypress:ess --changed-specs-only --env burn=5",
"cypress:cloud_security_posture:run:ess": "yarn cypress:ess --spec './cypress/e2e/cloud_security_posture/**/*.cy.ts'",
"cypress:burn:ess": "yarn cypress:ess --env burn=5",
"junit:merge": "../../../node_modules/.bin/mochawesome-merge ../../../target/kibana-security-solution/cypress/results/mochawesome*.json > ../../../target/kibana-security-solution/cypress/results/output.json && ../../../node_modules/.bin/marge ../../../target/kibana-security-solution/cypress/results/output.json --reportDir ../../../target/kibana-security-solution/cypress/results && yarn junit:transform && mkdir -p ../../../target/junit && cp ../../../target/kibana-security-solution/cypress/results/*.xml ../../../target/junit/",
"junit:transform": "node ../../plugins/security_solution/scripts/junit_transformer --pathPattern '../../../target/kibana-security-solution/cypress/results/*.xml' --rootDirectory ../../../ --reportName 'Security Solution Cypress' --writeInPlace",
@ -35,6 +36,7 @@
"cypress:investigations:run:serverless": "yarn cypress:serverless --spec './cypress/e2e/investigations/**/*.cy.ts'",
"cypress:explore:run:serverless": "yarn cypress:serverless --spec './cypress/e2e/explore/**/*.cy.ts'",
"cypress:changed-specs-only:serverless": "yarn cypress:serverless --changed-specs-only --env burn=5",
"cypress:cloud_security_posture:run:serverless": "yarn cypress:serverless --spec './cypress/e2e/cloud_security_posture/**/*.cy.ts'",
"cypress:burn:serverless": "yarn cypress:serverless --env burn=2",
"cypress:qa:serverless": "TZ=UTC NODE_OPTIONS=--openssl-legacy-provider node ../../plugins/security_solution/scripts/start_cypress_parallel_serverless --config-file ../../test/security_solution_cypress/cypress/cypress_ci_serverless_qa.config.ts",
"cypress:open:qa:serverless": "yarn cypress:qa:serverless open",
@ -45,6 +47,7 @@
"cypress:run:qa:serverless:rule_management:prebuilt_rules": "yarn cypress:qa:serverless --spec './cypress/e2e/detection_response/rule_management/prebuilt_rules/**/*.cy.ts'",
"cypress:run:qa:serverless:detection_engine": "yarn cypress:qa:serverless --spec './cypress/e2e/detection_response/detection_engine/!(exceptions)/**/*.cy.ts'",
"cypress:run:qa:serverless:detection_engine:exceptions": "yarn cypress:qa:serverless --spec './cypress/e2e/detection_response/detection_engine/exceptions/**/*.cy.ts'",
"cypress:run:qa:serverless:ai_assistant": "yarn cypress:qa:serverless --spec './cypress/e2e/ai_assistant/**/*.cy.ts'"
"cypress:run:qa:serverless:ai_assistant": "yarn cypress:qa:serverless --spec './cypress/e2e/ai_assistant/**/*.cy.ts'",
"cypress:run:qa:serverless:cloud_security_posture": "yarn cypress:qa:serverless --spec './cypress/e2e/cloud_security_posture/**/*.cy.ts"
}
}