[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 <georgii.gorbachev@elastic.co>
This commit is contained in:
Yara Tercero 2023-07-21 08:26:20 -07:00 committed by GitHub
parent ea588d280b
commit e54cf60426
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 381 additions and 355 deletions

View file

@ -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';

View file

@ -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';

View file

@ -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';

View file

@ -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,

View file

@ -9,27 +9,28 @@ import {
waitForRulesTableToBeLoaded,
goToTheRuleDetailsOf,
selectNumberOfRules,
duplicateSelectedRulesWithoutExceptions,
expectManagementTableRules,
} from '../../../../tasks/alerts_detection_rules';
import {
duplicateSelectedRulesWithoutExceptions,
duplicateSelectedRulesWithExceptions,
duplicateSelectedRulesWithNonExpiredExceptions,
} from '../../tasks/alerts_detection_rules';
} from '../../../../tasks/rules_bulk_actions';
import { goToExceptionsTab, viewExpiredExceptionItems } from '../../../../tasks/rule_details';
import { login, visitWithoutDateRange } from '../../../../tasks/login';
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';

View file

@ -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.';

View file

@ -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;

View file

@ -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';

View file

@ -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;

View file

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

View file

@ -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');

View file

@ -6,227 +6,108 @@
*/
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_DATA_VIEW_CHECKBOX,
RULES_BULK_EDIT_TIMELINE_TEMPLATES_SELECTOR,
UPDATE_SCHEDULE_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';
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,
TAGS_RULE_BULK_MENU_ITEM,
UPDATE_SCHEDULE_INTERVAL_INPUT,
UPDATE_SCHEDULE_LOOKBACK_INPUT,
UPDATE_SCHEDULE_MENU_ITEM,
UPDATE_SCHEDULE_TIME_UNIT_SELECT,
} from '../screens/rules_bulk_actions';
import { SCHEDULE_DETAILS } from '../screens/rule_details';
// DELETE
export const deleteSelectedRules = () => {
cy.get(BULK_ACTIONS_BTN).click();
cy.get(DELETE_RULE_BULK_BTN).click();
};
// DUPLICATE
export const duplicateSelectedRulesWithoutExceptions = () => {
cy.log('Bulk duplicate selected rules without exceptions');
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('Bulk duplicate selected rules with exceptions');
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('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();
};
// ENABLE/DISABLE
export const enableSelectedRules = () => {
cy.log('Bulk enable selected rules');
cy.get(BULK_ACTIONS_BTN).click();
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');
};
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');
};
const clickTagsMenuItem = () => {
cy.get(BULK_ACTIONS_BTN).click();
cy.get(TAGS_RULE_BULK_MENU_ITEM).click();
};
export const clickAddTagsMenuItem = () => {
clickTagsMenuItem();
cy.get(ADD_TAGS_RULE_BULK_MENU_ITEM).click();
};
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 clickAddIndexPatternsMenuItem = () => {
clickIndexPatternsMenuItem();
cy.get(ADD_INDEX_PATTERNS_RULE_BULK_MENU_ITEM).click();
};
export const openBulkEditAddIndexPatternsForm = () => {
clickAddIndexPatternsMenuItem();
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();
cy.get(DELETE_INDEX_PATTERNS_RULE_BULK_MENU_ITEM).click();
cy.get(RULES_BULK_EDIT_FORM_TITLE).should('have.text', 'Delete index patterns');
};
export const openBulkEditAddTagsForm = () => {
clickAddTagsMenuItem();
cy.get(RULES_BULK_EDIT_FORM_TITLE).should('have.text', 'Add tags');
};
export const openBulkEditDeleteTagsForm = () => {
clickTagsMenuItem();
cy.get(DELETE_TAGS_RULE_BULK_MENU_ITEM).click();
cy.get(RULES_BULK_EDIT_FORM_TITLE).should('have.text', 'Delete tags');
};
export const openBulkActionsMenu = () => {
cy.get(BULK_ACTIONS_BTN).click();
};
export const typeIndexPatterns = (indices: string[]) => {
cy.get(RULES_BULK_EDIT_INDEX_PATTERNS).find('input').type(indices.join('{enter}'));
};
export const typeTags = (tags: string[]) => {
cy.get(RULES_BULK_EDIT_TAGS).find('input').type(tags.join('{enter}'));
};
export const openTagsSelect = () => {
cy.get(RULES_BULK_EDIT_TAGS).find('input').click();
};
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`
);
};
export const checkOverwriteTagsCheckbox = () => {
cy.get(RULES_BULK_EDIT_OVERWRITE_TAGS_CHECKBOX)
.should('have.text', "Overwrite all selected rules' tags")
.click();
cy.get(RULES_BULK_EDIT_OVERWRITE_TAGS_CHECKBOX)
.should('have.text', "Overwrite all selected rules' tags")
.get('input')
.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(
() => {
@ -241,6 +122,99 @@ export const selectTimelineTemplate = (timelineTitle: string) => {
);
};
// 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 = () => {
clickIndexPatternsMenuItem();
cy.get(ADD_INDEX_PATTERNS_RULE_BULK_MENU_ITEM).click();
};
export const openBulkEditAddIndexPatternsForm = () => {
clickAddIndexPatternsMenuItem();
cy.get(RULES_BULK_EDIT_FORM_TITLE).should('have.text', 'Add index patterns');
};
export const openBulkEditDeleteIndexPatternsForm = () => {
cy.get(BULK_ACTIONS_BTN).click();
cy.get(INDEX_PATTERNS_RULE_BULK_MENU_ITEM).click();
cy.get(DELETE_INDEX_PATTERNS_RULE_BULK_MENU_ITEM).click();
cy.get(RULES_BULK_EDIT_FORM_TITLE).should('have.text', 'Delete index patterns');
};
export const typeIndexPatterns = (indices: string[]) => {
cy.get(RULES_BULK_EDIT_INDEX_PATTERNS).find('input').type(indices.join('{enter}'));
};
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 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');
};
// EDIT-TAGS
const clickTagsMenuItem = () => {
cy.get(BULK_ACTIONS_BTN).click();
cy.get(TAGS_RULE_BULK_MENU_ITEM).click();
};
export const clickAddTagsMenuItem = () => {
clickTagsMenuItem();
cy.get(ADD_TAGS_RULE_BULK_MENU_ITEM).click();
};
export const openBulkEditAddTagsForm = () => {
clickAddTagsMenuItem();
cy.get(RULES_BULK_EDIT_FORM_TITLE).should('have.text', 'Add tags');
};
export const openBulkEditDeleteTagsForm = () => {
clickTagsMenuItem();
cy.get(DELETE_TAGS_RULE_BULK_MENU_ITEM).click();
cy.get(RULES_BULK_EDIT_FORM_TITLE).should('have.text', 'Delete tags');
};
export const typeTags = (tags: string[]) => {
cy.get(RULES_BULK_EDIT_TAGS).find('input').type(tags.join('{enter}'));
};
export const openTagsSelect = () => {
cy.get(RULES_BULK_EDIT_TAGS).find('input').click();
};
export const checkOverwriteTagsCheckbox = () => {
cy.get(RULES_BULK_EDIT_OVERWRITE_TAGS_CHECKBOX)
.should('have.text', "Overwrite all selected rules' tags")
.click();
cy.get(RULES_BULK_EDIT_OVERWRITE_TAGS_CHECKBOX)
.should('have.text', "Overwrite all selected rules' tags")
.get('input')
.should('be.checked');
};
/**
* 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`
);
};