From 7d758193e79a6eb2aff6bb42bff7f762b8d2024c Mon Sep 17 00:00:00 2001 From: Yara Tercero Date: Fri, 21 Jul 2023 08:26:20 -0700 Subject: [PATCH] [Detection Response][Cypress] Reshuffle bulk action cypress tests (#161900) ## Summary A very small first piece to address https://github.com/elastic/kibana/issues/153645 - Starts adding new folder structure in cypress tests `detections_response/rules_management` - Adds `detections_response/rules_management/bulk_actions` - Reshuffled screens and tasks to now also have a corresponding `screens/rules_bulk_actions.ts` and `tasks/rules_bulk_actions.ts` - We chatted and decided to try to organize tests by subdomains rather than by teams. Anticipated upcoming changes will add something like: - `detections_response/rules_management` - `/bulk_actions.ts` - `/rules_table.ts` - `detections_response/prebuilt_rules` - `detections_response/rule_creation` - `detections_response/rule_details` - `detections_response/rule_edit` - `detections_response/exceptions` - `/shared_exception_lists` - `/alerts_table` - `/alerts_details` - `/rule_details` --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Georgii Gorbachev --- .../detection_rules/custom_query_rule.cy.ts | 2 +- .../e2e/detection_rules/export_rule.cy.ts | 2 +- .../indicator_match_rule.cy.ts | 2 +- .../prebuilt_rules_management.cy.ts | 8 +- .../bulk_actions}/bulk_duplicate_rules.cy.ts | 25 +- .../bulk_actions}/bulk_edit_rules.cy.ts | 30 +- .../bulk_edit_rules_actions.cy.ts | 28 +- .../bulk_edit_rules_data_view.cy.ts | 24 +- .../cypress/screens/alerts_detection_rules.ts | 14 - ...les_bulk_edit.ts => rules_bulk_actions.ts} | 82 ++-- .../cypress/tasks/alerts_detection_rules.ts | 55 --- ...les_bulk_edit.ts => rules_bulk_actions.ts} | 370 ++++++++++-------- 12 files changed, 334 insertions(+), 308 deletions(-) rename x-pack/plugins/security_solution/cypress/e2e/{detection_rules => detections_response/rules_management/bulk_actions}/bulk_duplicate_rules.cy.ts (86%) rename x-pack/plugins/security_solution/cypress/e2e/{detection_rules => detections_response/rules_management/bulk_actions}/bulk_edit_rules.cy.ts (95%) rename x-pack/plugins/security_solution/cypress/e2e/{detection_rules => detections_response/rules_management/bulk_actions}/bulk_edit_rules_actions.cy.ts (88%) rename x-pack/plugins/security_solution/cypress/e2e/{detection_rules => detections_response/rules_management/bulk_actions}/bulk_edit_rules_data_view.cy.ts (93%) rename x-pack/plugins/security_solution/cypress/screens/{rules_bulk_edit.ts => rules_bulk_actions.ts} (82%) rename x-pack/plugins/security_solution/cypress/tasks/{rules_bulk_edit.ts => rules_bulk_actions.ts} (83%) diff --git a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/custom_query_rule.cy.ts b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/custom_query_rule.cy.ts index b42ea0190a4060..d6eb89cee13d8c 100644 --- a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/custom_query_rule.cy.ts +++ b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/custom_query_rule.cy.ts @@ -69,11 +69,11 @@ import { import { deleteFirstRule, deleteRuleFromDetailsPage, - deleteSelectedRules, editFirstRule, goToRuleDetails, selectNumberOfRules, } from '../../tasks/alerts_detection_rules'; +import { deleteSelectedRules } from '../../tasks/rules_bulk_actions'; import { createRule } from '../../tasks/api_calls/rules'; import { createTimeline } from '../../tasks/api_calls/timelines'; import { cleanKibana, deleteAlertsAndRules, deleteConnectors } from '../../tasks/common'; diff --git a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/export_rule.cy.ts b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/export_rule.cy.ts index 1b7bde1ea7be1e..f089b2991d7820 100644 --- a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/export_rule.cy.ts +++ b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/export_rule.cy.ts @@ -17,13 +17,13 @@ import { import { filterByElasticRules, selectNumberOfRules, - bulkExportRules, selectAllRules, waitForRuleExecution, exportRule, importRules, expectManagementTableRules, } from '../../tasks/alerts_detection_rules'; +import { bulkExportRules } from '../../tasks/rules_bulk_actions'; import { createExceptionList, deleteExceptionList } from '../../tasks/api_calls/exceptions'; import { getExceptionList } from '../../objects/exception'; import { createRule } from '../../tasks/api_calls/rules'; diff --git a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/indicator_match_rule.cy.ts b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/indicator_match_rule.cy.ts index f22dc47e56b966..f7b5ed197f43fd 100644 --- a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/indicator_match_rule.cy.ts +++ b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/indicator_match_rule.cy.ts @@ -63,8 +63,8 @@ import { selectNumberOfRules, checkDuplicatedRule, expectNumberOfRules, - duplicateSelectedRulesWithExceptions, } from '../../tasks/alerts_detection_rules'; +import { duplicateSelectedRulesWithExceptions } from '../../tasks/rules_bulk_actions'; import { createRule } from '../../tasks/api_calls/rules'; import { loadPrepackagedTimelineTemplates } from '../../tasks/api_calls/timelines'; import { cleanKibana, deleteAlertsAndRules } from '../../tasks/common'; diff --git a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/prebuilt_rules_management.cy.ts b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/prebuilt_rules_management.cy.ts index f36d8f7fa0948c..eea13a4def02b3 100644 --- a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/prebuilt_rules_management.cy.ts +++ b/x-pack/plugins/security_solution/cypress/e2e/detection_rules/prebuilt_rules_management.cy.ts @@ -21,14 +21,16 @@ import { import { confirmRulesDelete, deleteFirstRule, - deleteSelectedRules, - disableSelectedRules, - enableSelectedRules, selectAllRules, selectNumberOfRules, waitForPrebuiltDetectionRulesToBeLoaded, waitForRuleToUpdate, } from '../../tasks/alerts_detection_rules'; +import { + deleteSelectedRules, + disableSelectedRules, + enableSelectedRules, +} from '../../tasks/rules_bulk_actions'; import { createAndInstallMockedPrebuiltRules, getAvailablePrebuiltRulesCount, diff --git a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/bulk_duplicate_rules.cy.ts b/x-pack/plugins/security_solution/cypress/e2e/detections_response/rules_management/bulk_actions/bulk_duplicate_rules.cy.ts similarity index 86% rename from x-pack/plugins/security_solution/cypress/e2e/detection_rules/bulk_duplicate_rules.cy.ts rename to x-pack/plugins/security_solution/cypress/e2e/detections_response/rules_management/bulk_actions/bulk_duplicate_rules.cy.ts index 16f3ca1e235e4f..2f091fd4d03afe 100644 --- a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/bulk_duplicate_rules.cy.ts +++ b/x-pack/plugins/security_solution/cypress/e2e/detections_response/rules_management/bulk_actions/bulk_duplicate_rules.cy.ts @@ -9,27 +9,28 @@ import { waitForRulesTableToBeLoaded, goToTheRuleDetailsOf, selectNumberOfRules, - duplicateSelectedRulesWithoutExceptions, expectManagementTableRules, +} from '../../../../tasks/alerts_detection_rules'; +import { + duplicateSelectedRulesWithoutExceptions, duplicateSelectedRulesWithExceptions, duplicateSelectedRulesWithNonExpiredExceptions, -} from '../../tasks/alerts_detection_rules'; - -import { goToExceptionsTab, viewExpiredExceptionItems } from '../../tasks/rule_details'; -import { login, visitWithoutDateRange } from '../../tasks/login'; +} from '../../../../tasks/rules_bulk_actions'; +import { goToExceptionsTab, viewExpiredExceptionItems } from '../../../../tasks/rule_details'; +import { login, visitWithoutDateRange } from '../../../../tasks/login'; -import { SECURITY_DETECTIONS_RULES_URL } from '../../urls/navigation'; -import { createRule } from '../../tasks/api_calls/rules'; -import { cleanKibana, resetRulesTableState, deleteAlertsAndRules } from '../../tasks/common'; +import { SECURITY_DETECTIONS_RULES_URL } from '../../../../urls/navigation'; +import { createRule } from '../../../../tasks/api_calls/rules'; +import { cleanKibana, resetRulesTableState, deleteAlertsAndRules } from '../../../../tasks/common'; -import { getNewRule } from '../../objects/rule'; +import { getNewRule } from '../../../../objects/rule'; -import { createRuleExceptionItem } from '../../tasks/api_calls/exceptions'; -import { EXCEPTION_CARD_ITEM_NAME } from '../../screens/exceptions'; +import { createRuleExceptionItem } from '../../../../tasks/api_calls/exceptions'; +import { EXCEPTION_CARD_ITEM_NAME } from '../../../../screens/exceptions'; import { assertExceptionItemsExists, assertNumberOfExceptionItemsExists, -} from '../../tasks/exceptions'; +} from '../../../../tasks/exceptions'; const RULE_NAME = 'Custom rule for bulk actions'; diff --git a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/bulk_edit_rules.cy.ts b/x-pack/plugins/security_solution/cypress/e2e/detections_response/rules_management/bulk_actions/bulk_edit_rules.cy.ts similarity index 95% rename from x-pack/plugins/security_solution/cypress/e2e/detection_rules/bulk_edit_rules.cy.ts rename to x-pack/plugins/security_solution/cypress/e2e/detections_response/rules_management/bulk_actions/bulk_edit_rules.cy.ts index 3fba5602cf42fa..efb546fb8ec29b 100644 --- a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/bulk_edit_rules.cy.ts +++ b/x-pack/plugins/security_solution/cypress/e2e/detections_response/rules_management/bulk_actions/bulk_edit_rules.cy.ts @@ -11,7 +11,7 @@ import { RULE_CHECKBOX, RULES_TAGS_POPOVER_BTN, MODAL_ERROR_BODY, -} from '../../screens/alerts_detection_rules'; +} from '../../../../screens/alerts_detection_rules'; import { RULES_BULK_EDIT_INDEX_PATTERNS_WARNING, @@ -20,11 +20,11 @@ import { TAGS_RULE_BULK_MENU_ITEM, INDEX_PATTERNS_RULE_BULK_MENU_ITEM, APPLY_TIMELINE_RULE_BULK_MENU_ITEM, -} from '../../screens/rules_bulk_edit'; +} from '../../../../screens/rules_bulk_actions'; -import { TIMELINE_TEMPLATE_DETAILS } from '../../screens/rule_details'; +import { TIMELINE_TEMPLATE_DETAILS } from '../../../../screens/rule_details'; -import { EUI_FILTER_SELECT_ITEM } from '../../screens/common/controls'; +import { EUI_FILTER_SELECT_ITEM } from '../../../../screens/common/controls'; import { waitForRulesTableToBeLoaded, @@ -38,7 +38,7 @@ import { clickErrorToastBtn, unselectRuleByName, cancelConfirmationModal, -} from '../../tasks/alerts_detection_rules'; +} from '../../../../tasks/alerts_detection_rules'; import { typeIndexPatterns, @@ -69,15 +69,15 @@ import { assertRuleScheduleValues, assertUpdateScheduleWarningExists, assertDefaultValuesAreAppliedToScheduleFields, -} from '../../tasks/rules_bulk_edit'; +} from '../../../../tasks/rules_bulk_actions'; -import { hasIndexPatterns, getDetails } from '../../tasks/rule_details'; -import { login, visitWithoutDateRange } from '../../tasks/login'; +import { hasIndexPatterns, getDetails } from '../../../../tasks/rule_details'; +import { login, visitWithoutDateRange } from '../../../../tasks/login'; -import { SECURITY_DETECTIONS_RULES_URL } from '../../urls/navigation'; -import { createRule } from '../../tasks/api_calls/rules'; -import { loadPrepackagedTimelineTemplates } from '../../tasks/api_calls/timelines'; -import { cleanKibana, resetRulesTableState, deleteAlertsAndRules } from '../../tasks/common'; +import { SECURITY_DETECTIONS_RULES_URL } from '../../../../urls/navigation'; +import { createRule } from '../../../../tasks/api_calls/rules'; +import { loadPrepackagedTimelineTemplates } from '../../../../tasks/api_calls/timelines'; +import { cleanKibana, resetRulesTableState, deleteAlertsAndRules } from '../../../../tasks/common'; import { getEqlRule, @@ -86,13 +86,13 @@ import { getNewThresholdRule, getMachineLearningRule, getNewTermsRule, -} from '../../objects/rule'; +} from '../../../../objects/rule'; import { getAvailablePrebuiltRulesCount, excessivelyInstallAllPrebuiltRules, -} from '../../tasks/api_calls/prebuilt_rules'; -import { setRowsPerPageTo } from '../../tasks/table_pagination'; +} from '../../../../tasks/api_calls/prebuilt_rules'; +import { setRowsPerPageTo } from '../../../../tasks/table_pagination'; const RULE_NAME = 'Custom rule for bulk actions'; const EUI_SELECTABLE_LIST_ITEM_SR_TEXT = '. To check this option, press Enter.'; diff --git a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/bulk_edit_rules_actions.cy.ts b/x-pack/plugins/security_solution/cypress/e2e/detections_response/rules_management/bulk_actions/bulk_edit_rules_actions.cy.ts similarity index 88% rename from x-pack/plugins/security_solution/cypress/e2e/detection_rules/bulk_edit_rules_actions.cy.ts rename to x-pack/plugins/security_solution/cypress/e2e/detections_response/rules_management/bulk_actions/bulk_edit_rules_actions.cy.ts index 5cc0e4c0bfbd34..7f06d43f4bd960 100644 --- a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/bulk_edit_rules_actions.cy.ts +++ b/x-pack/plugins/security_solution/cypress/e2e/detections_response/rules_management/bulk_actions/bulk_edit_rules_actions.cy.ts @@ -6,17 +6,17 @@ */ import type { RuleActionArray } from '@kbn/securitysolution-io-ts-alerting-types'; -import { ROLES } from '../../../common/test'; +import { ROLES } from '../../../../../common/test'; import { RULES_BULK_EDIT_ACTIONS_INFO, RULES_BULK_EDIT_ACTIONS_WARNING, ADD_RULE_ACTIONS_MENU_ITEM, -} from '../../screens/rules_bulk_edit'; -import { actionFormSelector } from '../../screens/common/rule_actions'; +} from '../../../../screens/rules_bulk_actions'; +import { actionFormSelector } from '../../../../screens/common/rule_actions'; -import { cleanKibana, deleteAlertsAndRules, deleteConnectors } from '../../tasks/common'; -import type { RuleActionCustomFrequency } from '../../tasks/common/rule_actions'; +import { cleanKibana, deleteAlertsAndRules, deleteConnectors } from '../../../../tasks/common'; +import type { RuleActionCustomFrequency } from '../../../../tasks/common/rule_actions'; import { addSlackRuleAction, assertSlackRuleAction, @@ -28,25 +28,25 @@ import { pickCustomFrequencyOption, pickPerRuleRunFrequencyOption, pickSummaryOfAlertsOption, -} from '../../tasks/common/rule_actions'; +} from '../../../../tasks/common/rule_actions'; import { waitForRulesTableToBeLoaded, selectNumberOfRules, goToEditRuleActionsSettingsOf, -} from '../../tasks/alerts_detection_rules'; +} from '../../../../tasks/alerts_detection_rules'; import { waitForBulkEditActionToFinish, submitBulkEditForm, checkOverwriteRuleActionsCheckbox, openBulkEditRuleActionsForm, openBulkActionsMenu, -} from '../../tasks/rules_bulk_edit'; -import { login, visitWithoutDateRange } from '../../tasks/login'; +} from '../../../../tasks/rules_bulk_actions'; +import { login, visitWithoutDateRange } from '../../../../tasks/login'; -import { SECURITY_DETECTIONS_RULES_URL } from '../../urls/navigation'; +import { SECURITY_DETECTIONS_RULES_URL } from '../../../../urls/navigation'; -import { createRule } from '../../tasks/api_calls/rules'; -import { createSlackConnector } from '../../tasks/api_calls/connectors'; +import { createRule } from '../../../../tasks/api_calls/rules'; +import { createSlackConnector } from '../../../../tasks/api_calls/connectors'; import { getEqlRule, @@ -55,8 +55,8 @@ import { getNewThresholdRule, getMachineLearningRule, getNewTermsRule, -} from '../../objects/rule'; -import { excessivelyInstallAllPrebuiltRules } from '../../tasks/api_calls/prebuilt_rules'; +} from '../../../../objects/rule'; +import { excessivelyInstallAllPrebuiltRules } from '../../../../tasks/api_calls/prebuilt_rules'; const ruleNameToAssert = 'Custom rule name with actions'; const expectedNumberOfCustomRulesToBeEdited = 7; diff --git a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/bulk_edit_rules_data_view.cy.ts b/x-pack/plugins/security_solution/cypress/e2e/detections_response/rules_management/bulk_actions/bulk_edit_rules_data_view.cy.ts similarity index 93% rename from x-pack/plugins/security_solution/cypress/e2e/detection_rules/bulk_edit_rules_data_view.cy.ts rename to x-pack/plugins/security_solution/cypress/e2e/detections_response/rules_management/bulk_actions/bulk_edit_rules_data_view.cy.ts index 55533c0cb86d0d..f3963340c89778 100644 --- a/x-pack/plugins/security_solution/cypress/e2e/detection_rules/bulk_edit_rules_data_view.cy.ts +++ b/x-pack/plugins/security_solution/cypress/e2e/detections_response/rules_management/bulk_actions/bulk_edit_rules_data_view.cy.ts @@ -8,16 +8,16 @@ import { RULES_BULK_EDIT_DATA_VIEWS_WARNING, RULES_BULK_EDIT_OVERWRITE_DATA_VIEW_CHECKBOX, -} from '../../screens/rules_bulk_edit'; +} from '../../../../screens/rules_bulk_actions'; -import { DATA_VIEW_DETAILS, INDEX_PATTERNS_DETAILS } from '../../screens/rule_details'; +import { DATA_VIEW_DETAILS, INDEX_PATTERNS_DETAILS } from '../../../../screens/rule_details'; import { waitForRulesTableToBeLoaded, goToRuleDetails, selectNumberOfRules, goToTheRuleDetailsOf, -} from '../../tasks/alerts_detection_rules'; +} from '../../../../tasks/alerts_detection_rules'; import { typeIndexPatterns, @@ -27,14 +27,18 @@ import { checkOverwriteIndexPatternsCheckbox, openBulkEditAddIndexPatternsForm, openBulkEditDeleteIndexPatternsForm, -} from '../../tasks/rules_bulk_edit'; +} from '../../../../tasks/rules_bulk_actions'; -import { hasIndexPatterns, getDetails, assertDetailsNotExist } from '../../tasks/rule_details'; -import { login, visitWithoutDateRange } from '../../tasks/login'; +import { + hasIndexPatterns, + getDetails, + assertDetailsNotExist, +} from '../../../../tasks/rule_details'; +import { login, visitWithoutDateRange } from '../../../../tasks/login'; -import { SECURITY_DETECTIONS_RULES_URL } from '../../urls/navigation'; -import { createRule } from '../../tasks/api_calls/rules'; -import { cleanKibana, deleteAlertsAndRules, postDataView } from '../../tasks/common'; +import { SECURITY_DETECTIONS_RULES_URL } from '../../../../urls/navigation'; +import { createRule } from '../../../../tasks/api_calls/rules'; +import { cleanKibana, deleteAlertsAndRules, postDataView } from '../../../../tasks/common'; import { getEqlRule, @@ -42,7 +46,7 @@ import { getNewRule, getNewThresholdRule, getNewTermsRule, -} from '../../objects/rule'; +} from '../../../../objects/rule'; const DATA_VIEW_ID = 'auditbeat'; diff --git a/x-pack/plugins/security_solution/cypress/screens/alerts_detection_rules.ts b/x-pack/plugins/security_solution/cypress/screens/alerts_detection_rules.ts index 5ba64892e741a1..166bb191e87304 100644 --- a/x-pack/plugins/security_solution/cypress/screens/alerts_detection_rules.ts +++ b/x-pack/plugins/security_solution/cypress/screens/alerts_detection_rules.ts @@ -5,10 +5,6 @@ * 2.0. */ -export const BULK_ACTIONS_BTN = '[data-test-subj="bulkActions"] span'; - -export const BULK_ACTIONS_PROGRESS_BTN = '[data-test-subj="bulkActions-progress"]'; - export const CREATE_NEW_RULE_BTN = '[data-test-subj="create-new-rule"]'; export const COLLAPSED_ACTION_BTN = '[data-test-subj="euiCollapsedItemActionsButton"]'; @@ -30,14 +26,6 @@ export const DUPLICATE_RULE_ACTION_BTN = '[data-test-subj="duplicateRuleAction"] export const DUPLICATE_RULE_MENU_PANEL_BTN = '[data-test-subj="rules-details-duplicate-rule"]'; export const CONFIRM_DUPLICATE_RULE = '[data-test-subj="confirmModalConfirmButton"]'; -export const ENABLE_RULE_BULK_BTN = '[data-test-subj="enableRuleBulk"]'; - -export const DISABLE_RULE_BULK_BTN = '[data-test-subj="disableRuleBulk"]'; - -export const DELETE_RULE_BULK_BTN = '[data-test-subj="deleteRuleBulk"]'; - -export const DUPLICATE_RULE_BULK_BTN = '[data-test-subj="duplicateRuleBulk"]'; - export const DUPLICATE_WITH_EXCEPTIONS_OPTION = '[data-test-subj="withExceptions"] label'; export const DUPLICATE_WITH_EXCEPTIONS_WITHOUT_EXPIRED_OPTION = @@ -49,8 +37,6 @@ export const RULE_SEARCH_FIELD = '[data-test-subj="ruleSearchField"]'; export const EXPORT_ACTION_BTN = '[data-test-subj="exportRuleAction"]'; -export const BULK_EXPORT_ACTION_BTN = '[data-test-subj="exportRuleBulk"]'; - export const FIRST_RULE = 0; export const FOURTH_RULE = 3; diff --git a/x-pack/plugins/security_solution/cypress/screens/rules_bulk_edit.ts b/x-pack/plugins/security_solution/cypress/screens/rules_bulk_actions.ts similarity index 82% rename from x-pack/plugins/security_solution/cypress/screens/rules_bulk_edit.ts rename to x-pack/plugins/security_solution/cypress/screens/rules_bulk_actions.ts index 7a36c7fd7c74eb..69efa1d31c2a71 100644 --- a/x-pack/plugins/security_solution/cypress/screens/rules_bulk_edit.ts +++ b/x-pack/plugins/security_solution/cypress/screens/rules_bulk_actions.ts @@ -5,6 +5,12 @@ * 2.0. */ +// FORM +export const RULES_BULK_EDIT_FORM_TITLE = '[data-test-subj="rulesBulkEditFormTitle"]'; + +export const RULES_BULK_EDIT_FORM_CONFIRM_BTN = '[data-test-subj="rulesBulkEditFormSaveBtn"]'; + +// INDEX PATTERNS export const INDEX_PATTERNS_RULE_BULK_MENU_ITEM = '[data-test-subj="indexPatternsBulkEditRule"]'; export const ADD_INDEX_PATTERNS_RULE_BULK_MENU_ITEM = @@ -13,22 +19,6 @@ export const ADD_INDEX_PATTERNS_RULE_BULK_MENU_ITEM = export const DELETE_INDEX_PATTERNS_RULE_BULK_MENU_ITEM = '[data-test-subj="deleteIndexPatternsBulkEditRule"]'; -export const UPDATE_SCHEDULE_MENU_ITEM = '[data-test-subj="setScheduleBulk"]'; - -export const ADD_RULE_ACTIONS_MENU_ITEM = '[data-test-subj="addRuleActionsBulk"]'; - -export const APPLY_TIMELINE_RULE_BULK_MENU_ITEM = '[data-test-subj="applyTimelineTemplateBulk"]'; - -export const TAGS_RULE_BULK_MENU_ITEM = '[data-test-subj="tagsBulkEditRule"]'; - -export const ADD_TAGS_RULE_BULK_MENU_ITEM = '[data-test-subj="addTagsBulkEditRule"]'; - -export const DELETE_TAGS_RULE_BULK_MENU_ITEM = '[data-test-subj="deleteTagsBulkEditRule"]'; - -export const RULES_BULK_EDIT_FORM_TITLE = '[data-test-subj="rulesBulkEditFormTitle"]'; - -export const RULES_BULK_EDIT_FORM_CONFIRM_BTN = '[data-test-subj="rulesBulkEditFormSaveBtn"]'; - export const RULES_BULK_EDIT_INDEX_PATTERNS = '[data-test-subj="bulkEditRulesIndexPatterns"]'; export const RULES_BULK_EDIT_OVERWRITE_INDEX_PATTERNS_CHECKBOX = @@ -37,25 +27,15 @@ export const RULES_BULK_EDIT_OVERWRITE_INDEX_PATTERNS_CHECKBOX = export const RULES_BULK_EDIT_OVERWRITE_DATA_VIEW_CHECKBOX = '[data-test-subj="bulkEditRulesOverwriteRulesWithDataViews"]'; -export const RULES_BULK_EDIT_TAGS = '[data-test-subj="bulkEditRulesTags"]'; - -export const RULES_BULK_EDIT_OVERWRITE_TAGS_CHECKBOX = - '[data-test-subj="bulkEditRulesOverwriteTags"]'; - export const RULES_BULK_EDIT_INDEX_PATTERNS_WARNING = '[data-test-subj="bulkEditRulesIndexPatternsWarning"]'; -export const RULES_BULK_EDIT_TAGS_WARNING = '[data-test-subj="bulkEditRulesTagsWarning"]'; - -export const RULES_BULK_EDIT_TIMELINE_TEMPLATES_SELECTOR = - '[data-test-subj="bulkEditRulesTimelineTemplateSelector"]'; - -export const RULES_BULK_EDIT_TIMELINE_TEMPLATES_WARNING = - '[data-test-subj="bulkEditRulesTimelineTemplateWarning"]'; - export const RULES_BULK_EDIT_DATA_VIEWS_WARNING = '[data-test-subj="bulkEditRulesDataViewsWarning"]'; +// SCHEDULE +export const UPDATE_SCHEDULE_MENU_ITEM = '[data-test-subj="setScheduleBulk"]'; + export const RULES_BULK_EDIT_SCHEDULES_WARNING = '[data-test-subj="bulkEditRulesSchedulesWarning"]'; export const UPDATE_SCHEDULE_INTERVAL_INPUT = @@ -66,9 +46,53 @@ export const UPDATE_SCHEDULE_LOOKBACK_INPUT = export const UPDATE_SCHEDULE_TIME_UNIT_SELECT = '[data-test-subj="timeType"]'; +// ACTIONS +export const ADD_RULE_ACTIONS_MENU_ITEM = '[data-test-subj="addRuleActionsBulk"]'; + export const RULES_BULK_EDIT_ACTIONS_INFO = '[data-test-subj="bulkEditRulesRuleActionInfo"]'; export const RULES_BULK_EDIT_ACTIONS_WARNING = '[data-test-subj="bulkEditRulesRuleActionsWarning"]'; export const RULES_BULK_EDIT_OVERWRITE_ACTIONS_CHECKBOX = '[data-test-subj="bulkEditRulesOverwriteRuleActions"]'; + +export const BULK_ACTIONS_BTN = '[data-test-subj="bulkActions"] span'; + +export const BULK_ACTIONS_PROGRESS_BTN = '[data-test-subj="bulkActions-progress"]'; + +// TIMELINE +export const APPLY_TIMELINE_RULE_BULK_MENU_ITEM = '[data-test-subj="applyTimelineTemplateBulk"]'; + +export const RULES_BULK_EDIT_TIMELINE_TEMPLATES_SELECTOR = + '[data-test-subj="bulkEditRulesTimelineTemplateSelector"]'; + +export const RULES_BULK_EDIT_TIMELINE_TEMPLATES_WARNING = + '[data-test-subj="bulkEditRulesTimelineTemplateWarning"]'; + +// TAGS +export const TAGS_RULE_BULK_MENU_ITEM = '[data-test-subj="tagsBulkEditRule"]'; + +export const ADD_TAGS_RULE_BULK_MENU_ITEM = '[data-test-subj="addTagsBulkEditRule"]'; + +export const DELETE_TAGS_RULE_BULK_MENU_ITEM = '[data-test-subj="deleteTagsBulkEditRule"]'; + +export const RULES_BULK_EDIT_TAGS = '[data-test-subj="bulkEditRulesTags"]'; + +export const RULES_BULK_EDIT_OVERWRITE_TAGS_CHECKBOX = + '[data-test-subj="bulkEditRulesOverwriteTags"]'; + +export const RULES_BULK_EDIT_TAGS_WARNING = '[data-test-subj="bulkEditRulesTagsWarning"]'; + +// ENABLE/DISABLE +export const ENABLE_RULE_BULK_BTN = '[data-test-subj="enableRuleBulk"]'; + +export const DISABLE_RULE_BULK_BTN = '[data-test-subj="disableRuleBulk"]'; + +// DELETE +export const DELETE_RULE_BULK_BTN = '[data-test-subj="deleteRuleBulk"]'; + +// DUPLICATE +export const DUPLICATE_RULE_BULK_BTN = '[data-test-subj="duplicateRuleBulk"]'; + +// EXPORT +export const BULK_EXPORT_ACTION_BTN = '[data-test-subj="exportRuleBulk"]'; diff --git a/x-pack/plugins/security_solution/cypress/tasks/alerts_detection_rules.ts b/x-pack/plugins/security_solution/cypress/tasks/alerts_detection_rules.ts index 97dbdad4506a9b..02a2051968fdd2 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/alerts_detection_rules.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/alerts_detection_rules.ts @@ -7,11 +7,9 @@ import { duplicatedRuleName } from '../objects/rule'; import { - BULK_ACTIONS_BTN, COLLAPSED_ACTION_BTN, CUSTOM_RULES_BTN, DELETE_RULE_ACTION_BTN, - DELETE_RULE_BULK_BTN, RULES_SELECTED_TAG, RULES_TABLE_INITIAL_LOADING_INDICATOR, RULES_TABLE_AUTOREFRESH_INDICATOR, @@ -24,14 +22,11 @@ import { EDIT_RULE_ACTION_BTN, DUPLICATE_RULE_ACTION_BTN, DUPLICATE_RULE_MENU_PANEL_BTN, - DUPLICATE_RULE_BULK_BTN, CONFIRM_DUPLICATE_RULE, RULES_ROW, SELECT_ALL_RULES_BTN, MODAL_CONFIRMATION_BTN, RULES_DELETE_CONFIRMATION_MODAL, - ENABLE_RULE_BULK_BTN, - DISABLE_RULE_BULK_BTN, RULE_DETAILS_DELETE_BTN, RULE_IMPORT_MODAL_BUTTON, RULE_IMPORT_MODAL, @@ -45,7 +40,6 @@ import { REFRESH_SETTINGS_POPOVER, REFRESH_SETTINGS_SWITCH, ELASTIC_RULES_BTN, - BULK_EXPORT_ACTION_BTN, TOASTER_ERROR_BTN, MODAL_CONFIRMATION_CANCEL_BTN, MODAL_CONFIRMATION_BODY, @@ -60,9 +54,6 @@ import { DISABLED_RULES_BTN, REFRESH_RULES_TABLE_BUTTON, RULE_LAST_RUN, - DUPLICATE_WITHOUT_EXCEPTIONS_OPTION, - DUPLICATE_WITH_EXCEPTIONS_OPTION, - DUPLICATE_WITH_EXCEPTIONS_WITHOUT_EXPIRED_OPTION, TOASTER_CLOSE_ICON, ADD_ELASTIC_RULES_EMPTY_PROMPT_BTN, } from '../screens/alerts_detection_rules'; @@ -126,11 +117,6 @@ export const deleteFirstRule = () => { cy.get(DELETE_RULE_ACTION_BTN).click(); }; -export const deleteSelectedRules = () => { - cy.get(BULK_ACTIONS_BTN).click(); - cy.get(DELETE_RULE_BULK_BTN).click(); -}; - export const deleteRuleFromDetailsPage = () => { cy.get(ALL_ACTIONS).should('be.visible'); // We cannot use cy.root().pipe($el) withing this function and instead have to use a cy.wait() @@ -145,42 +131,6 @@ export const deleteRuleFromDetailsPage = () => { cy.get(RULE_DETAILS_DELETE_BTN).should('not.be.visible'); }; -export const duplicateSelectedRulesWithoutExceptions = () => { - cy.log('Duplicate selected rules'); - cy.get(BULK_ACTIONS_BTN).click(); - cy.get(DUPLICATE_RULE_BULK_BTN).click(); - cy.get(DUPLICATE_WITHOUT_EXCEPTIONS_OPTION).click(); - cy.get(CONFIRM_DUPLICATE_RULE).click(); -}; - -export const duplicateSelectedRulesWithExceptions = () => { - cy.log('Duplicate selected rules'); - cy.get(BULK_ACTIONS_BTN).click(); - cy.get(DUPLICATE_RULE_BULK_BTN).click(); - cy.get(DUPLICATE_WITH_EXCEPTIONS_OPTION).click(); - cy.get(CONFIRM_DUPLICATE_RULE).click(); -}; - -export const duplicateSelectedRulesWithNonExpiredExceptions = () => { - cy.log('Duplicate selected rules'); - cy.get(BULK_ACTIONS_BTN).click(); - cy.get(DUPLICATE_RULE_BULK_BTN).click(); - cy.get(DUPLICATE_WITH_EXCEPTIONS_WITHOUT_EXPIRED_OPTION).click(); - cy.get(CONFIRM_DUPLICATE_RULE).click(); -}; - -export const enableSelectedRules = () => { - cy.log('Enable selected rules'); - cy.get(BULK_ACTIONS_BTN).click(); - cy.get(ENABLE_RULE_BULK_BTN).click(); -}; - -export const disableSelectedRules = () => { - cy.log('Disable selected rules'); - cy.get(BULK_ACTIONS_BTN).click(); - cy.get(DISABLE_RULE_BULK_BTN).click(); -}; - export const exportRule = (name: string) => { cy.log(`Export rule "${name}"`); @@ -534,11 +484,6 @@ export const mockGlobalClock = () => { cy.clock(Date.now(), ['setInterval', 'clearInterval', 'Date']); }; -export const bulkExportRules = () => { - cy.get(BULK_ACTIONS_BTN).click(); - cy.get(BULK_EXPORT_ACTION_BTN).click(); -}; - export const cancelConfirmationModal = () => { cy.get(MODAL_CONFIRMATION_CANCEL_BTN).click(); cy.get(MODAL_CONFIRMATION_BODY).should('not.exist'); diff --git a/x-pack/plugins/security_solution/cypress/tasks/rules_bulk_edit.ts b/x-pack/plugins/security_solution/cypress/tasks/rules_bulk_actions.ts similarity index 83% rename from x-pack/plugins/security_solution/cypress/tasks/rules_bulk_edit.ts rename to x-pack/plugins/security_solution/cypress/tasks/rules_bulk_actions.ts index 010a587cf1019a..7361cdc9f1a0ac 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/rules_bulk_edit.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/rules_bulk_actions.ts @@ -6,69 +6,127 @@ */ import { recurse } from 'cypress-recurse'; -import { TIMELINE_SEARCHBOX, EUI_SELECTABLE_LIST_ITEM } from '../screens/common/controls'; import { - BULK_ACTIONS_BTN, - BULK_ACTIONS_PROGRESS_BTN, - MODAL_CONFIRMATION_TITLE, + CONFIRM_DUPLICATE_RULE, + DUPLICATE_WITHOUT_EXCEPTIONS_OPTION, + DUPLICATE_WITH_EXCEPTIONS_OPTION, + DUPLICATE_WITH_EXCEPTIONS_WITHOUT_EXPIRED_OPTION, MODAL_CONFIRMATION_BODY, - TOASTER_BODY, + MODAL_CONFIRMATION_TITLE, RULES_TAGS_FILTER_BTN, + TOASTER_BODY, } from '../screens/alerts_detection_rules'; - +import { EUI_SELECTABLE_LIST_ITEM, TIMELINE_SEARCHBOX } from '../screens/common/controls'; import { - INDEX_PATTERNS_RULE_BULK_MENU_ITEM, ADD_INDEX_PATTERNS_RULE_BULK_MENU_ITEM, ADD_RULE_ACTIONS_MENU_ITEM, - DELETE_INDEX_PATTERNS_RULE_BULK_MENU_ITEM, - TAGS_RULE_BULK_MENU_ITEM, ADD_TAGS_RULE_BULK_MENU_ITEM, + APPLY_TIMELINE_RULE_BULK_MENU_ITEM, + BULK_ACTIONS_BTN, + BULK_ACTIONS_PROGRESS_BTN, + BULK_EXPORT_ACTION_BTN, + DELETE_INDEX_PATTERNS_RULE_BULK_MENU_ITEM, + DELETE_RULE_BULK_BTN, DELETE_TAGS_RULE_BULK_MENU_ITEM, + DISABLE_RULE_BULK_BTN, + DUPLICATE_RULE_BULK_BTN, + ENABLE_RULE_BULK_BTN, + INDEX_PATTERNS_RULE_BULK_MENU_ITEM, + RULES_BULK_EDIT_FORM_CONFIRM_BTN, RULES_BULK_EDIT_FORM_TITLE, RULES_BULK_EDIT_INDEX_PATTERNS, - RULES_BULK_EDIT_TAGS, - RULES_BULK_EDIT_FORM_CONFIRM_BTN, - APPLY_TIMELINE_RULE_BULK_MENU_ITEM, - RULES_BULK_EDIT_OVERWRITE_TAGS_CHECKBOX, - RULES_BULK_EDIT_OVERWRITE_INDEX_PATTERNS_CHECKBOX, + RULES_BULK_EDIT_OVERWRITE_ACTIONS_CHECKBOX, RULES_BULK_EDIT_OVERWRITE_DATA_VIEW_CHECKBOX, + RULES_BULK_EDIT_OVERWRITE_INDEX_PATTERNS_CHECKBOX, + RULES_BULK_EDIT_OVERWRITE_TAGS_CHECKBOX, + RULES_BULK_EDIT_SCHEDULES_WARNING, + RULES_BULK_EDIT_TAGS, RULES_BULK_EDIT_TIMELINE_TEMPLATES_SELECTOR, - UPDATE_SCHEDULE_MENU_ITEM, + TAGS_RULE_BULK_MENU_ITEM, UPDATE_SCHEDULE_INTERVAL_INPUT, - UPDATE_SCHEDULE_TIME_UNIT_SELECT, UPDATE_SCHEDULE_LOOKBACK_INPUT, - RULES_BULK_EDIT_SCHEDULES_WARNING, - RULES_BULK_EDIT_OVERWRITE_ACTIONS_CHECKBOX, -} from '../screens/rules_bulk_edit'; + UPDATE_SCHEDULE_MENU_ITEM, + UPDATE_SCHEDULE_TIME_UNIT_SELECT, +} from '../screens/rules_bulk_actions'; import { SCHEDULE_DETAILS } from '../screens/rule_details'; -export const clickApplyTimelineTemplatesMenuItem = () => { +// DELETE +export const deleteSelectedRules = () => { cy.get(BULK_ACTIONS_BTN).click(); - cy.get(APPLY_TIMELINE_RULE_BULK_MENU_ITEM).click(); - cy.get(APPLY_TIMELINE_RULE_BULK_MENU_ITEM).should('not.exist'); + cy.get(DELETE_RULE_BULK_BTN).click(); }; -const clickIndexPatternsMenuItem = () => { +// DUPLICATE +export const duplicateSelectedRulesWithoutExceptions = () => { + cy.log('Bulk duplicate selected rules without exceptions'); cy.get(BULK_ACTIONS_BTN).click(); - cy.get(INDEX_PATTERNS_RULE_BULK_MENU_ITEM).click(); - cy.get(INDEX_PATTERNS_RULE_BULK_MENU_ITEM).should('not.exist'); + cy.get(DUPLICATE_RULE_BULK_BTN).click(); + cy.get(DUPLICATE_WITHOUT_EXCEPTIONS_OPTION).click(); + cy.get(CONFIRM_DUPLICATE_RULE).click(); }; -const clickTagsMenuItem = () => { +export const duplicateSelectedRulesWithExceptions = () => { + cy.log('Bulk duplicate selected rules with exceptions'); cy.get(BULK_ACTIONS_BTN).click(); - cy.get(TAGS_RULE_BULK_MENU_ITEM).click(); + cy.get(DUPLICATE_RULE_BULK_BTN).click(); + cy.get(DUPLICATE_WITH_EXCEPTIONS_OPTION).click(); + cy.get(CONFIRM_DUPLICATE_RULE).click(); }; -export const clickAddTagsMenuItem = () => { - clickTagsMenuItem(); - cy.get(ADD_TAGS_RULE_BULK_MENU_ITEM).click(); +export const duplicateSelectedRulesWithNonExpiredExceptions = () => { + cy.log('Bulk duplicate selected rules with non expired exceptions'); + cy.get(BULK_ACTIONS_BTN).click(); + cy.get(DUPLICATE_RULE_BULK_BTN).click(); + cy.get(DUPLICATE_WITH_EXCEPTIONS_WITHOUT_EXPIRED_OPTION).click(); + cy.get(CONFIRM_DUPLICATE_RULE).click(); }; -export const clickUpdateScheduleMenuItem = () => { +// ENABLE/DISABLE +export const enableSelectedRules = () => { + cy.log('Bulk enable selected rules'); cy.get(BULK_ACTIONS_BTN).click(); - cy.get(UPDATE_SCHEDULE_MENU_ITEM).click(); - cy.get(UPDATE_SCHEDULE_MENU_ITEM).should('not.exist'); + cy.get(ENABLE_RULE_BULK_BTN).click(); +}; + +export const disableSelectedRules = () => { + cy.log('Bulk disable selected rules'); + cy.get(BULK_ACTIONS_BTN).click(); + cy.get(DISABLE_RULE_BULK_BTN).click(); +}; + +// EXPORT +export const bulkExportRules = () => { + cy.get(BULK_ACTIONS_BTN).click(); + cy.get(BULK_EXPORT_ACTION_BTN).click(); +}; + +// EDIT-TIMELINE +export const clickApplyTimelineTemplatesMenuItem = () => { + cy.get(BULK_ACTIONS_BTN).click(); + cy.get(APPLY_TIMELINE_RULE_BULK_MENU_ITEM).click(); + cy.get(APPLY_TIMELINE_RULE_BULK_MENU_ITEM).should('not.exist'); +}; + +export const selectTimelineTemplate = (timelineTitle: string) => { + recurse( + () => { + cy.get(RULES_BULK_EDIT_TIMELINE_TEMPLATES_SELECTOR).click(); + cy.get(TIMELINE_SEARCHBOX).clear(); + cy.get(TIMELINE_SEARCHBOX).type(`${timelineTitle}{enter}`); + // eslint-disable-next-line cypress/no-unnecessary-waiting + cy.wait(500); + return cy.get(TIMELINE_SEARCHBOX).should(Cypress._.noop); + }, + ($el) => !$el.length + ); +}; + +// EDIT-INDEX +const clickIndexPatternsMenuItem = () => { + cy.get(BULK_ACTIONS_BTN).click(); + cy.get(INDEX_PATTERNS_RULE_BULK_MENU_ITEM).click(); + cy.get(INDEX_PATTERNS_RULE_BULK_MENU_ITEM).should('not.exist'); }; export const clickAddIndexPatternsMenuItem = () => { @@ -82,13 +140,6 @@ export const openBulkEditAddIndexPatternsForm = () => { cy.get(RULES_BULK_EDIT_FORM_TITLE).should('have.text', 'Add index patterns'); }; -export const openBulkEditRuleActionsForm = () => { - cy.get(BULK_ACTIONS_BTN).click(); - cy.get(ADD_RULE_ACTIONS_MENU_ITEM).click(); - - cy.get(RULES_BULK_EDIT_FORM_TITLE).should('have.text', 'Add rule actions'); -}; - export const openBulkEditDeleteIndexPatternsForm = () => { cy.get(BULK_ACTIONS_BTN).click(); cy.get(INDEX_PATTERNS_RULE_BULK_MENU_ITEM).click(); @@ -97,92 +148,61 @@ export const openBulkEditDeleteIndexPatternsForm = () => { cy.get(RULES_BULK_EDIT_FORM_TITLE).should('have.text', 'Delete index patterns'); }; -export const openBulkEditAddTagsForm = () => { - clickAddTagsMenuItem(); +export const typeIndexPatterns = (indices: string[]) => { + cy.get(RULES_BULK_EDIT_INDEX_PATTERNS).find('input').type(indices.join('{enter}')); +}; - cy.get(RULES_BULK_EDIT_FORM_TITLE).should('have.text', 'Add tags'); +export const checkOverwriteIndexPatternsCheckbox = () => { + cy.get(RULES_BULK_EDIT_OVERWRITE_INDEX_PATTERNS_CHECKBOX) + .should('have.text', "Overwrite all selected rules' index patterns") + .click(); + cy.get(RULES_BULK_EDIT_OVERWRITE_INDEX_PATTERNS_CHECKBOX) + .should('have.text', "Overwrite all selected rules' index patterns") + .get('input') + .should('be.checked'); }; -export const openBulkEditDeleteTagsForm = () => { - clickTagsMenuItem(); - cy.get(DELETE_TAGS_RULE_BULK_MENU_ITEM).click(); +export const checkOverwriteDataViewCheckbox = () => { + cy.get(RULES_BULK_EDIT_OVERWRITE_DATA_VIEW_CHECKBOX) + .should('have.text', 'Apply changes to rules configured with data views') + .click(); - cy.get(RULES_BULK_EDIT_FORM_TITLE).should('have.text', 'Delete tags'); + cy.get(RULES_BULK_EDIT_OVERWRITE_DATA_VIEW_CHECKBOX) + .should('have.text', 'Apply changes to rules configured with data views') + .get('input') + .should('be.checked'); }; -export const openBulkActionsMenu = () => { +// EDIT-TAGS +const clickTagsMenuItem = () => { cy.get(BULK_ACTIONS_BTN).click(); + cy.get(TAGS_RULE_BULK_MENU_ITEM).click(); }; -export const typeIndexPatterns = (indices: string[]) => { - cy.get(RULES_BULK_EDIT_INDEX_PATTERNS).find('input').type(indices.join('{enter}')); +export const clickAddTagsMenuItem = () => { + clickTagsMenuItem(); + cy.get(ADD_TAGS_RULE_BULK_MENU_ITEM).click(); }; -export const typeTags = (tags: string[]) => { - cy.get(RULES_BULK_EDIT_TAGS).find('input').type(tags.join('{enter}')); -}; +export const openBulkEditAddTagsForm = () => { + clickAddTagsMenuItem(); -export const openTagsSelect = () => { - cy.get(RULES_BULK_EDIT_TAGS).find('input').click(); + cy.get(RULES_BULK_EDIT_FORM_TITLE).should('have.text', 'Add tags'); }; -export const submitBulkEditForm = () => cy.get(RULES_BULK_EDIT_FORM_CONFIRM_BTN).click(); - -export const waitForBulkEditActionToFinish = ({ - updatedCount, - skippedCount, - failedCount, - showDataViewsWarning = false, -}: { - updatedCount?: number; - skippedCount?: number; - failedCount?: number; - showDataViewsWarning?: boolean; -}) => { - cy.get(BULK_ACTIONS_PROGRESS_BTN).should('be.disabled'); - - if (updatedCount !== undefined) { - cy.contains(TOASTER_BODY, `You've successfully updated ${updatedCount} rule`); - } - if (failedCount !== undefined) { - if (failedCount === 1) { - cy.contains(TOASTER_BODY, `${failedCount} rule failed to update`); - } else { - cy.contains(TOASTER_BODY, `${failedCount} rules failed to update`); - } - } - if (skippedCount !== undefined) { - if (skippedCount === 1) { - cy.contains(TOASTER_BODY, `${skippedCount} rule was skipped`); - } else { - cy.contains(TOASTER_BODY, `${skippedCount} rules were skipped`); - } - if (showDataViewsWarning) { - cy.contains( - TOASTER_BODY, - 'If you did not select to apply changes to rules using Kibana data views, those rules were not updated and will continue using data views.' - ); - } - } -}; +export const openBulkEditDeleteTagsForm = () => { + clickTagsMenuItem(); + cy.get(DELETE_TAGS_RULE_BULK_MENU_ITEM).click(); -export const checkPrebuiltRulesCannotBeModified = (rulesCount: number) => { - cy.get(MODAL_CONFIRMATION_BODY).contains( - `${rulesCount} prebuilt Elastic rules (editing prebuilt rules is not supported)` - ); + cy.get(RULES_BULK_EDIT_FORM_TITLE).should('have.text', 'Delete tags'); }; -export const checkMachineLearningRulesCannotBeModified = (rulesCount: number) => { - cy.get(MODAL_CONFIRMATION_BODY).contains( - `${rulesCount} custom machine learning rule (these rules don't have index patterns)` - ); +export const typeTags = (tags: string[]) => { + cy.get(RULES_BULK_EDIT_TAGS).find('input').type(tags.join('{enter}')); }; -export const waitForMixedRulesBulkEditModal = (customRulesCount: number) => { - cy.get(MODAL_CONFIRMATION_TITLE).should( - 'have.text', - `This action can only be applied to ${customRulesCount} custom rules` - ); +export const openTagsSelect = () => { + cy.get(RULES_BULK_EDIT_TAGS).find('input').click(); }; export const checkOverwriteTagsCheckbox = () => { @@ -195,52 +215,6 @@ export const checkOverwriteTagsCheckbox = () => { .should('be.checked'); }; -export const checkOverwriteIndexPatternsCheckbox = () => { - cy.get(RULES_BULK_EDIT_OVERWRITE_INDEX_PATTERNS_CHECKBOX) - .should('have.text', "Overwrite all selected rules' index patterns") - .click(); - cy.get(RULES_BULK_EDIT_OVERWRITE_INDEX_PATTERNS_CHECKBOX) - .should('have.text', "Overwrite all selected rules' index patterns") - .get('input') - .should('be.checked'); -}; - -export const checkOverwriteRuleActionsCheckbox = () => { - cy.get(RULES_BULK_EDIT_OVERWRITE_ACTIONS_CHECKBOX) - .should('have.text', 'Overwrite all selected rules actions') - .find('input') - .click({ force: true }); - cy.get(RULES_BULK_EDIT_OVERWRITE_ACTIONS_CHECKBOX) - .should('have.text', 'Overwrite all selected rules actions') - .find('input') - .should('be.checked'); -}; - -export const checkOverwriteDataViewCheckbox = () => { - cy.get(RULES_BULK_EDIT_OVERWRITE_DATA_VIEW_CHECKBOX) - .should('have.text', 'Apply changes to rules configured with data views') - .click(); - - cy.get(RULES_BULK_EDIT_OVERWRITE_DATA_VIEW_CHECKBOX) - .should('have.text', 'Apply changes to rules configured with data views') - .get('input') - .should('be.checked'); -}; - -export const selectTimelineTemplate = (timelineTitle: string) => { - recurse( - () => { - cy.get(RULES_BULK_EDIT_TIMELINE_TEMPLATES_SELECTOR).click(); - cy.get(TIMELINE_SEARCHBOX).clear(); - cy.get(TIMELINE_SEARCHBOX).type(`${timelineTitle}{enter}`); - // eslint-disable-next-line cypress/no-unnecessary-waiting - cy.wait(500); - return cy.get(TIMELINE_SEARCHBOX).should(Cypress._.noop); - }, - ($el) => !$el.length - ); -}; - /** * check if rule tags filter populated with a list of tags * @param tags @@ -256,6 +230,13 @@ export const checkTagsInTagsFilter = (tags: string[], srOnlyText: string = '') = }); }; +// EDIT-SCHEDULE +export const clickUpdateScheduleMenuItem = () => { + cy.get(BULK_ACTIONS_BTN).click(); + cy.get(UPDATE_SCHEDULE_MENU_ITEM).click(); + cy.get(UPDATE_SCHEDULE_MENU_ITEM).should('not.exist'); +}; + export const typeScheduleInterval = (interval: string) => { cy.get(UPDATE_SCHEDULE_INTERVAL_INPUT).find('input').type(`{selectAll}${interval.toString()}`); cy.get(UPDATE_SCHEDULE_INTERVAL_INPUT).find('input').blur(); @@ -312,3 +293,86 @@ export const assertRuleScheduleValues = ({ interval, lookback }: RuleSchedule) = cy.get('dd').eq(1).should('contain.text', lookback); }); }; + +// EDIT-ACTIONS +export const openBulkEditRuleActionsForm = () => { + cy.get(BULK_ACTIONS_BTN).click(); + cy.get(ADD_RULE_ACTIONS_MENU_ITEM).click(); + + cy.get(RULES_BULK_EDIT_FORM_TITLE).should('have.text', 'Add rule actions'); +}; + +export const openBulkActionsMenu = () => { + cy.get(BULK_ACTIONS_BTN).click(); +}; + +export const checkOverwriteRuleActionsCheckbox = () => { + cy.get(RULES_BULK_EDIT_OVERWRITE_ACTIONS_CHECKBOX) + .should('have.text', 'Overwrite all selected rules actions') + .find('input') + .click({ force: true }); + cy.get(RULES_BULK_EDIT_OVERWRITE_ACTIONS_CHECKBOX) + .should('have.text', 'Overwrite all selected rules actions') + .find('input') + .should('be.checked'); +}; + +// EDIT-FORM +export const submitBulkEditForm = () => cy.get(RULES_BULK_EDIT_FORM_CONFIRM_BTN).click(); + +export const waitForBulkEditActionToFinish = ({ + updatedCount, + skippedCount, + failedCount, + showDataViewsWarning = false, +}: { + updatedCount?: number; + skippedCount?: number; + failedCount?: number; + showDataViewsWarning?: boolean; +}) => { + cy.get(BULK_ACTIONS_PROGRESS_BTN).should('be.disabled'); + + if (updatedCount !== undefined) { + cy.contains(TOASTER_BODY, `You've successfully updated ${updatedCount} rule`); + } + if (failedCount !== undefined) { + if (failedCount === 1) { + cy.contains(TOASTER_BODY, `${failedCount} rule failed to update`); + } else { + cy.contains(TOASTER_BODY, `${failedCount} rules failed to update`); + } + } + if (skippedCount !== undefined) { + if (skippedCount === 1) { + cy.contains(TOASTER_BODY, `${skippedCount} rule was skipped`); + } else { + cy.contains(TOASTER_BODY, `${skippedCount} rules were skipped`); + } + if (showDataViewsWarning) { + cy.contains( + TOASTER_BODY, + 'If you did not select to apply changes to rules using Kibana data views, those rules were not updated and will continue using data views.' + ); + } + } +}; + +export const checkPrebuiltRulesCannotBeModified = (rulesCount: number) => { + cy.get(MODAL_CONFIRMATION_BODY).contains( + `${rulesCount} prebuilt Elastic rules (editing prebuilt rules is not supported)` + ); +}; + +export const checkMachineLearningRulesCannotBeModified = (rulesCount: number) => { + cy.get(MODAL_CONFIRMATION_BODY).contains( + `${rulesCount} custom machine learning rule (these rules don't have index patterns)` + ); +}; + +export const waitForMixedRulesBulkEditModal = (customRulesCount: number) => { + cy.get(MODAL_CONFIRMATION_TITLE).should( + 'have.text', + `This action can only be applied to ${customRulesCount} custom rules` + ); +};