Skip to content

Commit

Permalink
finalizing tests
Browse files Browse the repository at this point in the history
  • Loading branch information
yctercero committed Feb 12, 2021
1 parent 5c6b7a8 commit 65ee43e
Show file tree
Hide file tree
Showing 3 changed files with 111 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,29 @@ import { goToRuleDetails } from '../../tasks/alerts_detection_rules';
import { esArchiverLoad, esArchiverUnload } from '../../tasks/es_archiver';
import { loginAndWaitForPageWithoutDateRange } from '../../tasks/login';
import { openExceptionModalFromRuleSettings, goToExceptionsTab } from '../../tasks/rule_details';
import { addExceptionEntryFieldValue, closeExceptionBuilderModal } from '../../tasks/exceptions';
import {
addExceptionEntryFieldValue,
addExceptionEntryFieldValueOfItemX,
closeExceptionBuilderModal,
} from '../../tasks/exceptions';
import {
ADD_AND_BTN,
ADD_OR_BTN,
ADD_NESTED_BTN,
ENTRY_DELETE_BTN,
FIELD_INPUT,
LOADING_SPINNER,
EXCEPTION_ITEM_CONTAINER,
} from '../../screens/exceptions';

import { DETECTIONS_URL } from '../../urls/navigation';
import { cleanKibana } from '../../tasks/common';

// NOTE: You might look at these tests and feel they're overkill,
// but the exceptions modal has a lot of logic making it difficult
// to test in enzyme and very small changes can inadvertently add
// bugs. As the complexity within the builder grows, these should
// ensure the most basic logic holds.
describe('Exceptions modal', () => {
before(() => {
cleanKibana();
Expand All @@ -39,6 +49,9 @@ describe('Exceptions modal', () => {

cy.get(RULE_STATUS).should('have.text', '—');

// this is a made-up index that has just the necessary
// mappings to conduct tests, avoiding loading large
// amounts of data like in auditbeat_exceptions
esArchiverLoad('exceptions');

goToExceptionsTab();
Expand All @@ -48,72 +61,126 @@ describe('Exceptions modal', () => {
esArchiverUnload('exceptions');
});

it('Does not overwrite invalid values and-ed together', () => {
openExceptionModalFromRuleSettings();

it('Does not overwrite values and-ed together', () => {
// VALID VALUES
// add multiple entries with invalid field values
addExceptionEntryFieldValue('a', 0);
addExceptionEntryFieldValue('agent.name', 0);
cy.get(ADD_AND_BTN).click();
addExceptionEntryFieldValue('b', 1);
addExceptionEntryFieldValue('@timestamp', 1);
cy.get(ADD_AND_BTN).click();
addExceptionEntryFieldValue('c', 2);

// delete second item, invalid values 'a' and 'c' should remain
cy.get(ENTRY_DELETE_BTN).eq(1).click();
cy.get(FIELD_INPUT).eq(0).should('have.text', 'a');
cy.get(FIELD_INPUT).eq(0).should('have.text', 'agent.name');
cy.get(FIELD_INPUT).eq(1).should('have.text', 'c');

closeExceptionBuilderModal();
});

it('Does not overwrite invalid values or-ed together', () => {
openExceptionModalFromRuleSettings();
cy.get(LOADING_SPINNER).should('not.exist');

it('Does not overwrite values or-ed together', () => {
// exception item 1
addExceptionEntryFieldValue('a', 0);
addExceptionEntryFieldValueOfItemX('agent.name', 0, 0);
cy.get(ADD_AND_BTN).click();
addExceptionEntryFieldValue('b', 1);
addExceptionEntryFieldValueOfItemX('user.id.keyword', 0, 1);

// exception item 2
cy.get(ADD_OR_BTN).click();
addExceptionEntryFieldValue('c', 2);
addExceptionEntryFieldValueOfItemX('user.first', 1, 0);
cy.get(ADD_AND_BTN).click();
addExceptionEntryFieldValue('d', 3);
addExceptionEntryFieldValueOfItemX('user.last', 1, 1);
cy.get(ADD_AND_BTN).click();
addExceptionEntryFieldValue('e', 4);
addExceptionEntryFieldValueOfItemX('e', 0, 2);

// delete single entry from exception item 2
cy.get(ENTRY_DELETE_BTN).eq(3).click();
cy.get(FIELD_INPUT).eq(0).should('have.text', 'a');
cy.get(FIELD_INPUT).eq(1).should('have.text', 'b');
cy.get(FIELD_INPUT).eq(2).should('have.text', 'c');
cy.get(FIELD_INPUT).eq(3).should('have.text', 'e');
cy.get(EXCEPTION_ITEM_CONTAINER)
.eq(0)
.find(FIELD_INPUT)
.eq(0)
.should('have.text', 'agent.name');
cy.get(EXCEPTION_ITEM_CONTAINER)
.eq(0)
.find(FIELD_INPUT)
.eq(1)
.should('have.text', 'user.id.keyword');
cy.get(EXCEPTION_ITEM_CONTAINER)
.eq(1)
.find(FIELD_INPUT)
.eq(0)
.should('have.text', 'user.first');
cy.get(EXCEPTION_ITEM_CONTAINER).eq(1).find(FIELD_INPUT).eq(1).should('have.text', 'e');

// delete remaining entries in exception item 2
cy.get(ENTRY_DELETE_BTN).eq(2).click();
cy.get(ENTRY_DELETE_BTN).eq(2).click();
cy.get(FIELD_INPUT).eq(0).should('have.text', 'a');
cy.get(FIELD_INPUT).eq(1).should('have.text', 'b');
cy.get(FIELD_INPUT).eq(2).should('not.exist');
cy.get(EXCEPTION_ITEM_CONTAINER)
.eq(0)
.find(FIELD_INPUT)
.eq(0)
.should('have.text', 'agent.name');
cy.get(EXCEPTION_ITEM_CONTAINER)
.eq(0)
.find(FIELD_INPUT)
.eq(1)
.should('have.text', 'user.id.keyword');
cy.get(EXCEPTION_ITEM_CONTAINER).eq(1).should('not.exist');

closeExceptionBuilderModal();
});

it('Does not overwrite invalid values of nested entry items', () => {
it('Does not overwrite values of nested entry items', () => {
openExceptionModalFromRuleSettings();
cy.get(LOADING_SPINNER).should('not.exist');

// exception item 1
addExceptionEntryFieldValue('a', 0);
addExceptionEntryFieldValueOfItemX('agent.name', 0, 0);
cy.get(ADD_AND_BTN).click();
addExceptionEntryFieldValue('b', 1);
addExceptionEntryFieldValueOfItemX('b', 0, 1);

// exception item 2 with nested field
cy.get(ADD_OR_BTN).click();
addExceptionEntryFieldValue('c', 2);
addExceptionEntryFieldValueOfItemX('c', 1, 0);
cy.get(ADD_NESTED_BTN).click();
addExceptionEntryFieldValueOfItemX('user.id{downarrow}{enter}', 1, 1);
cy.get(ADD_AND_BTN).click();
addExceptionEntryFieldValueOfItemX('last{downarrow}{enter}', 1, 3);
// This button will now read `Add non-nested button`
cy.get(ADD_NESTED_BTN).click();
addExceptionEntryFieldValueOfItemX('@timestamp', 1, 4);

// should have only deleted `user.id`
cy.get(ENTRY_DELETE_BTN).eq(4).click();
cy.get(EXCEPTION_ITEM_CONTAINER)
.eq(0)
.find(FIELD_INPUT)
.eq(0)
.should('have.text', 'agent.name');
cy.get(EXCEPTION_ITEM_CONTAINER).eq(0).find(FIELD_INPUT).eq(1).should('have.text', 'b');
cy.get(EXCEPTION_ITEM_CONTAINER).eq(1).find(FIELD_INPUT).eq(0).should('have.text', 'c');
cy.get(EXCEPTION_ITEM_CONTAINER).eq(1).find(FIELD_INPUT).eq(1).should('have.text', 'user');
cy.get(EXCEPTION_ITEM_CONTAINER).eq(1).find(FIELD_INPUT).eq(2).should('have.text', 'last');
cy.get(EXCEPTION_ITEM_CONTAINER)
.eq(1)
.find(FIELD_INPUT)
.eq(3)
.should('have.text', '@timestamp');

// deleting the last value of a nested entry, should delete the child and parent
cy.get(ENTRY_DELETE_BTN).eq(4).click();
cy.get(EXCEPTION_ITEM_CONTAINER)
.eq(0)
.find(FIELD_INPUT)
.eq(0)
.should('have.text', 'agent.name');
cy.get(EXCEPTION_ITEM_CONTAINER).eq(0).find(FIELD_INPUT).eq(1).should('have.text', 'b');
cy.get(EXCEPTION_ITEM_CONTAINER).eq(1).find(FIELD_INPUT).eq(0).should('have.text', 'c');
cy.get(EXCEPTION_ITEM_CONTAINER)
.eq(1)
.find(FIELD_INPUT)
.eq(1)
.should('have.text', '@timestamp');

// closeExceptionBuilderModal();
closeExceptionBuilderModal();
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -56,3 +56,5 @@ export const EXCEPTIONS_TABLE_LIST_NAME = '[data-test-subj="exceptionsTableName"
export const EXCEPTIONS_TABLE_MODAL = '[data-test-subj="referenceErrorModal"]';

export const EXCEPTIONS_TABLE_MODAL_CONFIRM_BTN = '[data-test-subj="confirmModalConfirmButton"]';

export const EXCEPTION_ITEM_CONTAINER = '[data-test-subj="exceptionEntriesContainer"]';
14 changes: 14 additions & 0 deletions x-pack/plugins/security_solution/cypress/tasks/exceptions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,22 @@ import {
VALUES_INPUT,
CANCEL_BTN,
BUILDER_MODAL_BODY,
EXCEPTION_ITEM_CONTAINER,
} from '../screens/exceptions';

export const addExceptionEntryFieldValueOfItemX = (
field: string,
itemIndex = 0,
fieldIndex = 0
) => {
cy.get(EXCEPTION_ITEM_CONTAINER)
.eq(itemIndex)
.find(FIELD_INPUT)
.eq(fieldIndex)
.type(`${field}{enter}`);
cy.get(BUILDER_MODAL_BODY).click();
};

export const addExceptionEntryFieldValue = (field: string, index = 0) => {
cy.get(FIELD_INPUT).eq(index).type(`${field}{enter}`);
cy.get(BUILDER_MODAL_BODY).click();
Expand Down

0 comments on commit 65ee43e

Please sign in to comment.