Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Security Solution] Install/Update Prebuilt Rules Test Implementation refactor #165488

Merged

Conversation

jpdjere
Copy link
Contributor

@jpdjere jpdjere commented Sep 1, 2023

Fixes: #148192

(Tick the two open checkboxes in that issue when merging this PR)

Summary

This PR rewrites/refactors Cypress tests for the Installation and Upgrade of Prebuilt Rules implemented in #161687. Most of the changes here address feedback received in that PR - answered those comments there.

  • RBAC/Authorization: adds tests scenarios for users with full privileges (happy path)
  • Gets rid of huge util helpers such as assertRuleAvailableForInstallAndInstallOne and rewrites test cases in a more descriptive way, with step by step actions.
  • Gets rid of complex logic in tests and their helpers - removing if/else logic within them and removing optional flags passed to helpers.
  • Fixes bulkCreateRuleAssets util and uses it in other helpers to install multiple security-rule assets with a single bulk request to ES.

Additionally: checked installation_and_upgrade.md test plan to make sure it matches with the test in place. Added link to a ticket for a to-do task for the sections:

  • Rule installation workflow: filtering, sorting, pagination
  • Rule upgrade workflow: filtering, sorting, pagination

Flaky test runner

https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3420 🟢

https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3513

@jpdjere jpdjere self-assigned this Sep 1, 2023
@jpdjere jpdjere force-pushed the intall-update-test-implementation-refactor branch 4 times, most recently from b2c2751 to d5b1c16 Compare September 14, 2023 22:48
@jpdjere jpdjere marked this pull request as ready for review September 18, 2023 08:19
@jpdjere jpdjere requested a review from a team as a code owner September 18, 2023 08:19
@jpdjere jpdjere added release_note:skip Skip the PR/issue when compiling release notes Team:Detections and Resp Security Detection Response Team Team: SecuritySolution Security Solutions Team working on SIEM, Endpoint, Timeline, Resolver, etc. Team:Detection Rule Management Security Detection Rule Management Team labels Sep 18, 2023
@elasticmachine
Copy link
Contributor

Pinging @elastic/security-detections-response (Team:Detections and Resp)

@elasticmachine
Copy link
Contributor

Pinging @elastic/security-solution (Team: SecuritySolution)

@jpdjere jpdjere added Feature:Prebuilt Detection Rules Security Solution Prebuilt Detection Rules v8.11.0 labels Sep 18, 2023
@banderror banderror added refactoring test-coverage issues & PRs for improving code test coverage labels Sep 18, 2023
Copy link
Contributor

@xcrzx xcrzx left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for refactoring the tests, @jpdjere! They're much more readable now 👍 I've left a few comments for additional improvements, but they're pretty minor. Reach out if we need to discuss anything.

beforeEach(() => {
preventPrebuiltRulesPackageInstallation();
Copy link
Contributor

@xcrzx xcrzx Sep 20, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We have already called preventPrebuiltRulesPackageInstallation at the parent beforeEach. Should we remove this one?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removing

Comment on lines 78 to 84
// Install one prebuilt rule asset to assert that user can't install it
installPrebuiltRuleAssets([RULE_2]);

// Install one prebuilt rule asset to assert that user can't upgrade it
createAndInstallMockedPrebuiltRules([OUTDATED_RULE_1]);
// Create a new version of the rule to make it available for upgrade
installPrebuiltRuleAssets([UPDATED_RULE_1]);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some of the installed rules are needed for specific test cases only. Let's move them to corresponding test bodies so they will be easier to read.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixing


describe('User with full privileges on Security Solution', () => {
beforeEach(() => {
preventPrebuiltRulesPackageInstallation();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here. We have already called preventPrebuiltRulesPackageInstallation at the parent beforeEach. Should we remove this one?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed

describe('User with full privileges on Security Solution', () => {
beforeEach(() => {
preventPrebuiltRulesPackageInstallation();
loginPageAsFullPrivilegesUser();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we test the workflow using the minimal required privileges instead of using a fully privileged user?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, makes sense. I'm using now the Hunter/ T3 Analyst role, following this table: #81866 (comment)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like the role with the minimum required priviliges for writing rules

// Make two mock rules available for installation
installPrebuiltRuleAssets([RULE_1, RULE_2]);
// Navigate to install Elastic rules page
addElasticRulesButtonClick();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please move test actions, such as clicks, from beforeEach directly into the test bodies to enhance readability.

Even if some actions are common across multiple tests, duplicating them can make the tests clearer. Use the beforeEach section mainly for setting up preconditions, not for the main test steps.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done :+1

beforeEach(() => {
cleanKibana();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here. We already call cleanKibana() inside the top level beforeEach

installPrebuiltRuleAssets([UPDATED_RULE_1, UPDATED_RULE_2]);
login();

visitSecurityDetectionRulesPage();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We already call visitSecurityDetectionRulesPage() inside the top level beforeEach

Comment on lines +106 to +129
for (const rule of rules) {
cy.get(RULES_UPDATES_TABLE).contains(rule['security-rule'].name);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we need this check here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We are checking here that when the update fails, the toast is shown with the right message -confirming the failed upgrade- and subsequently checking that the rule available for update are still present in the Rule Update table

Comment on lines 96 to 115
for (const rule of rules) {
cy.get(RULES_UPDATES_TABLE).contains(rule['security-rule'].name);
cy.get(rule['security-rule'].name).should('not.exist');
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure I understand what this check does. Could you please add a comment?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adding

);
}
for (const rule of rules) {
cy.get(getInstallSingleRuleLoadingSpinnerByRuleId(rule['security-rule'].rule_id)).should(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like a typo, we need to check the "upgrade" spinner here

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for catching this! Fixing

@banderror
Copy link
Contributor

@xcrzx Do you think this PR is a great improvement compared to the previous implementation? Would we benefit from merging it now and addressing the comments you left in a separate PR? I'm asking this because @jpdjere won't be able to work on this PR until mid-October when he gets back from leave, and any improvements to tests' quality and stability we can merge now will contribute to our 8.11 goals.

@xcrzx
Copy link
Contributor

xcrzx commented Sep 22, 2023

@xcrzx Do you think this PR is a great improvement compared to the previous implementation? Would we benefit from merging it now and addressing the comments you left in a separate PR? I'm asking this because @jpdjere won't be able to work on this PR until mid-October when he gets back from leave, and any improvements to tests' quality and stability we can merge now will contribute to our 8.11 goals.

I think it's worth merging this PR. I would only run it against the flaky runner to ensure we do not introduce any flakiness.

@xcrzx xcrzx self-requested a review September 22, 2023 09:59
@jpdjere jpdjere force-pushed the intall-update-test-implementation-refactor branch from c3a33d7 to 82bd289 Compare October 9, 2023 14:04
@jpdjere
Copy link
Contributor Author

jpdjere commented Oct 9, 2023

@xcrzx @banderror Thanks for the review. I rebased, updated and addressed the additional feedback. I'll run the flaky test runner and will merge if everything is green.

@jpdjere jpdjere force-pushed the intall-update-test-implementation-refactor branch from e87edcd to ebd8dba Compare October 16, 2023 08:37
@kibana-ci
Copy link
Collaborator

💛 Build succeeded, but was flaky

Failed CI Steps

Metrics [docs]

Async chunks

Total size of all lazy-loaded chunks that will be downloaded as the user navigates the app

id before after diff
securitySolution 13.0MB 13.0MB +198.0B

History

To update your PR or re-run it, just comment with:
@elasticmachine merge upstream

cc @jpdjere

@jpdjere jpdjere merged commit 24c008b into elastic:main Oct 17, 2023
34 checks passed
@jpdjere jpdjere deleted the intall-update-test-implementation-refactor branch October 17, 2023 11:05
@kibanamachine
Copy link
Contributor

💔 All backports failed

Status Branch Result
8.11 Backport failed because of merge conflicts

You might need to backport the following PRs to 8.11:
- [Security Solution] Adding serverlessQA tag (#167494)

Manual backport

To create the backport manually run:

node scripts/backport --pr 165488

Questions ?

Please refer to the Backport tool documentation

@jpdjere
Copy link
Contributor Author

jpdjere commented Oct 17, 2023

💚 All backports created successfully

Status Branch Result
8.11

Note: Successful backport PRs will be merged automatically after passing CI.

Questions ?

Please refer to the Backport tool documentation

jpdjere added a commit to jpdjere/kibana that referenced this pull request Oct 17, 2023
… refactor (elastic#165488)

Fixes: elastic#148192

(Tick the two open checkboxes in that issue when merging this PR)

## Summary

This PR rewrites/refactors Cypress tests for the Installation and
Upgrade of Prebuilt Rules implemented in
elastic#161687. Most of the changes here
address feedback received in that PR - answered those comments there.

- RBAC/Authorization: adds tests scenarios for users with full
privileges (happy path)
- Gets rid of huge util helpers such as
`assertRuleAvailableForInstallAndInstallOne` and rewrites test cases in
a more descriptive way, with step by step actions.
- Gets rid of complex logic in tests and their helpers - removing
if/else logic within them and removing optional flags passed to helpers.
- Fixes `bulkCreateRuleAssets` util and uses it in other helpers to
install multiple `security-rule` assets with a single bulk request to
ES.

Additionally: checked `installation_and_upgrade.md` test plan to make
sure it matches with the test in place. Added
[link](elastic#166215) to a ticket for
a to-do task for the sections:
- Rule installation workflow: filtering, sorting, pagination
- Rule upgrade workflow: filtering, sorting, pagination

## Flaky test runner

~~https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3420~~
~~🟢~~

https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3513

---------

Co-authored-by: kibanamachine <[email protected]>
(cherry picked from commit 24c008b)

# Conflicts:
#	x-pack/test/security_solution_cypress/package.json
jpdjere added a commit that referenced this pull request Oct 17, 2023
…ntation refactor (#165488) (#169129)

# Backport

This will backport the following commits from `main` to `8.11`:
- [[Security Solution] Install/Update Prebuilt Rules Test Implementation
refactor (#165488)](#165488)

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

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

<!--BACKPORT [{"author":{"name":"Juan Pablo
Djeredjian","email":"[email protected]"},"sourceCommit":{"committedDate":"2023-10-17T11:05:49Z","message":"[Security
Solution] Install/Update Prebuilt Rules Test Implementation refactor
(#165488)\n\nFixes:
https://github.com/elastic/kibana/issues/148192\r\n\r\n(Tick the two
open checkboxes in that issue when merging this PR)\r\n\r\n##
Summary\r\n\r\nThis PR rewrites/refactors Cypress tests for the
Installation and\r\nUpgrade of Prebuilt Rules implemented
in\r\nhttps://github.com//pull/161687. Most of the changes
here\r\naddress feedback received in that PR - answered those comments
there.\r\n\r\n- RBAC/Authorization: adds tests scenarios for users with
full\r\nprivileges (happy path)\r\n- Gets rid of huge util helpers such
as\r\n`assertRuleAvailableForInstallAndInstallOne` and rewrites test
cases in\r\na more descriptive way, with step by step actions.\r\n- Gets
rid of complex logic in tests and their helpers - removing\r\nif/else
logic within them and removing optional flags passed to helpers.\r\n-
Fixes `bulkCreateRuleAssets` util and uses it in other helpers
to\r\ninstall multiple `security-rule` assets with a single bulk request
to\r\nES.\r\n\r\nAdditionally: checked `installation_and_upgrade.md`
test plan to make\r\nsure it matches with the test in place.
Added\r\n[link](#166215) to a
ticket for\r\na to-do task for the sections:\r\n- Rule installation
workflow: filtering, sorting, pagination\r\n- Rule upgrade workflow:
filtering, sorting, pagination\r\n\r\n## Flaky test
runner\r\n\r\n\r\n~~https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3420~~\r\n~~🟢~~\r\n\r\nhttps://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3513\r\n\r\n---------\r\n\r\nCo-authored-by:
kibanamachine
<[email protected]>","sha":"24c008b4c5026dd543f1b4aded94f3787bce5fb0","branchLabelMapping":{"^v8.12.0$":"main","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["refactoring","release_note:skip","test-coverage","Team:Detections
and Resp","Team: SecuritySolution","Team:Detection Rule
Management","Feature:Prebuilt Detection
Rules","v8.11.0","v8.12.0"],"number":165488,"url":"https://github.com/elastic/kibana/pull/165488","mergeCommit":{"message":"[Security
Solution] Install/Update Prebuilt Rules Test Implementation refactor
(#165488)\n\nFixes:
https://github.com/elastic/kibana/issues/148192\r\n\r\n(Tick the two
open checkboxes in that issue when merging this PR)\r\n\r\n##
Summary\r\n\r\nThis PR rewrites/refactors Cypress tests for the
Installation and\r\nUpgrade of Prebuilt Rules implemented
in\r\nhttps://github.com//pull/161687. Most of the changes
here\r\naddress feedback received in that PR - answered those comments
there.\r\n\r\n- RBAC/Authorization: adds tests scenarios for users with
full\r\nprivileges (happy path)\r\n- Gets rid of huge util helpers such
as\r\n`assertRuleAvailableForInstallAndInstallOne` and rewrites test
cases in\r\na more descriptive way, with step by step actions.\r\n- Gets
rid of complex logic in tests and their helpers - removing\r\nif/else
logic within them and removing optional flags passed to helpers.\r\n-
Fixes `bulkCreateRuleAssets` util and uses it in other helpers
to\r\ninstall multiple `security-rule` assets with a single bulk request
to\r\nES.\r\n\r\nAdditionally: checked `installation_and_upgrade.md`
test plan to make\r\nsure it matches with the test in place.
Added\r\n[link](#166215) to a
ticket for\r\na to-do task for the sections:\r\n- Rule installation
workflow: filtering, sorting, pagination\r\n- Rule upgrade workflow:
filtering, sorting, pagination\r\n\r\n## Flaky test
runner\r\n\r\n\r\n~~https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3420~~\r\n~~🟢~~\r\n\r\nhttps://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3513\r\n\r\n---------\r\n\r\nCo-authored-by:
kibanamachine
<[email protected]>","sha":"24c008b4c5026dd543f1b4aded94f3787bce5fb0"}},"sourceBranch":"main","suggestedTargetBranches":["8.11"],"targetPullRequestStates":[{"branch":"8.11","label":"v8.11.0","labelRegex":"^v(\\d+).(\\d+).\\d+$","isSourceBranch":false,"state":"NOT_CREATED"},{"branch":"main","label":"v8.12.0","labelRegex":"^v8.12.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/165488","number":165488,"mergeCommit":{"message":"[Security
Solution] Install/Update Prebuilt Rules Test Implementation refactor
(#165488)\n\nFixes:
https://github.com/elastic/kibana/issues/148192\r\n\r\n(Tick the two
open checkboxes in that issue when merging this PR)\r\n\r\n##
Summary\r\n\r\nThis PR rewrites/refactors Cypress tests for the
Installation and\r\nUpgrade of Prebuilt Rules implemented
in\r\nhttps://github.com//pull/161687. Most of the changes
here\r\naddress feedback received in that PR - answered those comments
there.\r\n\r\n- RBAC/Authorization: adds tests scenarios for users with
full\r\nprivileges (happy path)\r\n- Gets rid of huge util helpers such
as\r\n`assertRuleAvailableForInstallAndInstallOne` and rewrites test
cases in\r\na more descriptive way, with step by step actions.\r\n- Gets
rid of complex logic in tests and their helpers - removing\r\nif/else
logic within them and removing optional flags passed to helpers.\r\n-
Fixes `bulkCreateRuleAssets` util and uses it in other helpers
to\r\ninstall multiple `security-rule` assets with a single bulk request
to\r\nES.\r\n\r\nAdditionally: checked `installation_and_upgrade.md`
test plan to make\r\nsure it matches with the test in place.
Added\r\n[link](#166215) to a
ticket for\r\na to-do task for the sections:\r\n- Rule installation
workflow: filtering, sorting, pagination\r\n- Rule upgrade workflow:
filtering, sorting, pagination\r\n\r\n## Flaky test
runner\r\n\r\n\r\n~~https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3420~~\r\n~~🟢~~\r\n\r\nhttps://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3513\r\n\r\n---------\r\n\r\nCo-authored-by:
kibanamachine
<[email protected]>","sha":"24c008b4c5026dd543f1b4aded94f3787bce5fb0"}}]}]
BACKPORT-->
WafaaNasr pushed a commit to WafaaNasr/kibana that referenced this pull request Oct 18, 2023
… refactor (elastic#165488)

Fixes: elastic#148192

(Tick the two open checkboxes in that issue when merging this PR)

## Summary

This PR rewrites/refactors Cypress tests for the Installation and
Upgrade of Prebuilt Rules implemented in
elastic#161687. Most of the changes here
address feedback received in that PR - answered those comments there.

- RBAC/Authorization: adds tests scenarios for users with full
privileges (happy path)
- Gets rid of huge util helpers such as
`assertRuleAvailableForInstallAndInstallOne` and rewrites test cases in
a more descriptive way, with step by step actions.
- Gets rid of complex logic in tests and their helpers - removing
if/else logic within them and removing optional flags passed to helpers.
- Fixes `bulkCreateRuleAssets` util and uses it in other helpers to
install multiple `security-rule` assets with a single bulk request to
ES.

Additionally: checked `installation_and_upgrade.md` test plan to make
sure it matches with the test in place. Added
[link](elastic#166215) to a ticket for
a to-do task for the sections:
- Rule installation workflow: filtering, sorting, pagination
- Rule upgrade workflow: filtering, sorting, pagination

## Flaky test runner


~~https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3420~~
~~🟢~~

https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3513

---------

Co-authored-by: kibanamachine <[email protected]>
benakansara pushed a commit to benakansara/kibana that referenced this pull request Oct 22, 2023
… refactor (elastic#165488)

Fixes: elastic#148192

(Tick the two open checkboxes in that issue when merging this PR)

## Summary

This PR rewrites/refactors Cypress tests for the Installation and
Upgrade of Prebuilt Rules implemented in
elastic#161687. Most of the changes here
address feedback received in that PR - answered those comments there.

- RBAC/Authorization: adds tests scenarios for users with full
privileges (happy path)
- Gets rid of huge util helpers such as
`assertRuleAvailableForInstallAndInstallOne` and rewrites test cases in
a more descriptive way, with step by step actions.
- Gets rid of complex logic in tests and their helpers - removing
if/else logic within them and removing optional flags passed to helpers.
- Fixes `bulkCreateRuleAssets` util and uses it in other helpers to
install multiple `security-rule` assets with a single bulk request to
ES.

Additionally: checked `installation_and_upgrade.md` test plan to make
sure it matches with the test in place. Added
[link](elastic#166215) to a ticket for
a to-do task for the sections:
- Rule installation workflow: filtering, sorting, pagination
- Rule upgrade workflow: filtering, sorting, pagination

## Flaky test runner


~~https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3420~~
~~🟢~~

https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3513

---------

Co-authored-by: kibanamachine <[email protected]>
benakansara pushed a commit to benakansara/kibana that referenced this pull request Oct 22, 2023
… refactor (elastic#165488)

Fixes: elastic#148192

(Tick the two open checkboxes in that issue when merging this PR)

## Summary

This PR rewrites/refactors Cypress tests for the Installation and
Upgrade of Prebuilt Rules implemented in
elastic#161687. Most of the changes here
address feedback received in that PR - answered those comments there.

- RBAC/Authorization: adds tests scenarios for users with full
privileges (happy path)
- Gets rid of huge util helpers such as
`assertRuleAvailableForInstallAndInstallOne` and rewrites test cases in
a more descriptive way, with step by step actions.
- Gets rid of complex logic in tests and their helpers - removing
if/else logic within them and removing optional flags passed to helpers.
- Fixes `bulkCreateRuleAssets` util and uses it in other helpers to
install multiple `security-rule` assets with a single bulk request to
ES.

Additionally: checked `installation_and_upgrade.md` test plan to make
sure it matches with the test in place. Added
[link](elastic#166215) to a ticket for
a to-do task for the sections:
- Rule installation workflow: filtering, sorting, pagination
- Rule upgrade workflow: filtering, sorting, pagination

## Flaky test runner


~~https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3420~~
~~🟢~~

https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3513

---------

Co-authored-by: kibanamachine <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Feature:Prebuilt Detection Rules Security Solution Prebuilt Detection Rules refactoring release_note:skip Skip the PR/issue when compiling release notes Team:Detection Rule Management Security Detection Rule Management Team Team:Detections and Resp Security Detection Response Team Team: SecuritySolution Security Solutions Team working on SIEM, Endpoint, Timeline, Resolver, etc. test-coverage issues & PRs for improving code test coverage v8.11.0 v8.12.0
Projects
None yet
6 participants