Skip to content

Commit 65ee43e

Browse files
committed
finalizing tests
1 parent 5c6b7a8 commit 65ee43e

File tree

3 files changed

+111
-28
lines changed

3 files changed

+111
-28
lines changed

x-pack/plugins/security_solution/cypress/integration/exceptions/exceptions_modal.spec.ts

Lines changed: 95 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,29 @@ import { goToRuleDetails } from '../../tasks/alerts_detection_rules';
1515
import { esArchiverLoad, esArchiverUnload } from '../../tasks/es_archiver';
1616
import { loginAndWaitForPageWithoutDateRange } from '../../tasks/login';
1717
import { openExceptionModalFromRuleSettings, goToExceptionsTab } from '../../tasks/rule_details';
18-
import { addExceptionEntryFieldValue, closeExceptionBuilderModal } from '../../tasks/exceptions';
18+
import {
19+
addExceptionEntryFieldValue,
20+
addExceptionEntryFieldValueOfItemX,
21+
closeExceptionBuilderModal,
22+
} from '../../tasks/exceptions';
1923
import {
2024
ADD_AND_BTN,
2125
ADD_OR_BTN,
2226
ADD_NESTED_BTN,
2327
ENTRY_DELETE_BTN,
2428
FIELD_INPUT,
2529
LOADING_SPINNER,
30+
EXCEPTION_ITEM_CONTAINER,
2631
} from '../../screens/exceptions';
2732

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

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

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

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

4457
goToExceptionsTab();
@@ -48,72 +61,126 @@ describe('Exceptions modal', () => {
4861
esArchiverUnload('exceptions');
4962
});
5063

51-
it('Does not overwrite invalid values and-ed together', () => {
52-
openExceptionModalFromRuleSettings();
53-
64+
it('Does not overwrite values and-ed together', () => {
65+
// VALID VALUES
5466
// add multiple entries with invalid field values
55-
addExceptionEntryFieldValue('a', 0);
67+
addExceptionEntryFieldValue('agent.name', 0);
5668
cy.get(ADD_AND_BTN).click();
57-
addExceptionEntryFieldValue('b', 1);
69+
addExceptionEntryFieldValue('@timestamp', 1);
5870
cy.get(ADD_AND_BTN).click();
5971
addExceptionEntryFieldValue('c', 2);
6072

6173
// delete second item, invalid values 'a' and 'c' should remain
6274
cy.get(ENTRY_DELETE_BTN).eq(1).click();
63-
cy.get(FIELD_INPUT).eq(0).should('have.text', 'a');
75+
cy.get(FIELD_INPUT).eq(0).should('have.text', 'agent.name');
6476
cy.get(FIELD_INPUT).eq(1).should('have.text', 'c');
6577

6678
closeExceptionBuilderModal();
6779
});
6880

69-
it('Does not overwrite invalid values or-ed together', () => {
70-
openExceptionModalFromRuleSettings();
71-
cy.get(LOADING_SPINNER).should('not.exist');
72-
81+
it('Does not overwrite values or-ed together', () => {
7382
// exception item 1
74-
addExceptionEntryFieldValue('a', 0);
83+
addExceptionEntryFieldValueOfItemX('agent.name', 0, 0);
7584
cy.get(ADD_AND_BTN).click();
76-
addExceptionEntryFieldValue('b', 1);
85+
addExceptionEntryFieldValueOfItemX('user.id.keyword', 0, 1);
7786

7887
// exception item 2
7988
cy.get(ADD_OR_BTN).click();
80-
addExceptionEntryFieldValue('c', 2);
89+
addExceptionEntryFieldValueOfItemX('user.first', 1, 0);
8190
cy.get(ADD_AND_BTN).click();
82-
addExceptionEntryFieldValue('d', 3);
91+
addExceptionEntryFieldValueOfItemX('user.last', 1, 1);
8392
cy.get(ADD_AND_BTN).click();
84-
addExceptionEntryFieldValue('e', 4);
93+
addExceptionEntryFieldValueOfItemX('e', 0, 2);
8594

8695
// delete single entry from exception item 2
8796
cy.get(ENTRY_DELETE_BTN).eq(3).click();
88-
cy.get(FIELD_INPUT).eq(0).should('have.text', 'a');
89-
cy.get(FIELD_INPUT).eq(1).should('have.text', 'b');
90-
cy.get(FIELD_INPUT).eq(2).should('have.text', 'c');
91-
cy.get(FIELD_INPUT).eq(3).should('have.text', 'e');
97+
cy.get(EXCEPTION_ITEM_CONTAINER)
98+
.eq(0)
99+
.find(FIELD_INPUT)
100+
.eq(0)
101+
.should('have.text', 'agent.name');
102+
cy.get(EXCEPTION_ITEM_CONTAINER)
103+
.eq(0)
104+
.find(FIELD_INPUT)
105+
.eq(1)
106+
.should('have.text', 'user.id.keyword');
107+
cy.get(EXCEPTION_ITEM_CONTAINER)
108+
.eq(1)
109+
.find(FIELD_INPUT)
110+
.eq(0)
111+
.should('have.text', 'user.first');
112+
cy.get(EXCEPTION_ITEM_CONTAINER).eq(1).find(FIELD_INPUT).eq(1).should('have.text', 'e');
92113

93114
// delete remaining entries in exception item 2
94115
cy.get(ENTRY_DELETE_BTN).eq(2).click();
95116
cy.get(ENTRY_DELETE_BTN).eq(2).click();
96-
cy.get(FIELD_INPUT).eq(0).should('have.text', 'a');
97-
cy.get(FIELD_INPUT).eq(1).should('have.text', 'b');
98-
cy.get(FIELD_INPUT).eq(2).should('not.exist');
117+
cy.get(EXCEPTION_ITEM_CONTAINER)
118+
.eq(0)
119+
.find(FIELD_INPUT)
120+
.eq(0)
121+
.should('have.text', 'agent.name');
122+
cy.get(EXCEPTION_ITEM_CONTAINER)
123+
.eq(0)
124+
.find(FIELD_INPUT)
125+
.eq(1)
126+
.should('have.text', 'user.id.keyword');
127+
cy.get(EXCEPTION_ITEM_CONTAINER).eq(1).should('not.exist');
99128

100129
closeExceptionBuilderModal();
101130
});
102131

103-
it('Does not overwrite invalid values of nested entry items', () => {
132+
it('Does not overwrite values of nested entry items', () => {
104133
openExceptionModalFromRuleSettings();
105134
cy.get(LOADING_SPINNER).should('not.exist');
106135

107136
// exception item 1
108-
addExceptionEntryFieldValue('a', 0);
137+
addExceptionEntryFieldValueOfItemX('agent.name', 0, 0);
109138
cy.get(ADD_AND_BTN).click();
110-
addExceptionEntryFieldValue('b', 1);
139+
addExceptionEntryFieldValueOfItemX('b', 0, 1);
111140

112141
// exception item 2 with nested field
113142
cy.get(ADD_OR_BTN).click();
114-
addExceptionEntryFieldValue('c', 2);
143+
addExceptionEntryFieldValueOfItemX('c', 1, 0);
115144
cy.get(ADD_NESTED_BTN).click();
145+
addExceptionEntryFieldValueOfItemX('user.id{downarrow}{enter}', 1, 1);
146+
cy.get(ADD_AND_BTN).click();
147+
addExceptionEntryFieldValueOfItemX('last{downarrow}{enter}', 1, 3);
148+
// This button will now read `Add non-nested button`
149+
cy.get(ADD_NESTED_BTN).click();
150+
addExceptionEntryFieldValueOfItemX('@timestamp', 1, 4);
151+
152+
// should have only deleted `user.id`
153+
cy.get(ENTRY_DELETE_BTN).eq(4).click();
154+
cy.get(EXCEPTION_ITEM_CONTAINER)
155+
.eq(0)
156+
.find(FIELD_INPUT)
157+
.eq(0)
158+
.should('have.text', 'agent.name');
159+
cy.get(EXCEPTION_ITEM_CONTAINER).eq(0).find(FIELD_INPUT).eq(1).should('have.text', 'b');
160+
cy.get(EXCEPTION_ITEM_CONTAINER).eq(1).find(FIELD_INPUT).eq(0).should('have.text', 'c');
161+
cy.get(EXCEPTION_ITEM_CONTAINER).eq(1).find(FIELD_INPUT).eq(1).should('have.text', 'user');
162+
cy.get(EXCEPTION_ITEM_CONTAINER).eq(1).find(FIELD_INPUT).eq(2).should('have.text', 'last');
163+
cy.get(EXCEPTION_ITEM_CONTAINER)
164+
.eq(1)
165+
.find(FIELD_INPUT)
166+
.eq(3)
167+
.should('have.text', '@timestamp');
168+
169+
// deleting the last value of a nested entry, should delete the child and parent
170+
cy.get(ENTRY_DELETE_BTN).eq(4).click();
171+
cy.get(EXCEPTION_ITEM_CONTAINER)
172+
.eq(0)
173+
.find(FIELD_INPUT)
174+
.eq(0)
175+
.should('have.text', 'agent.name');
176+
cy.get(EXCEPTION_ITEM_CONTAINER).eq(0).find(FIELD_INPUT).eq(1).should('have.text', 'b');
177+
cy.get(EXCEPTION_ITEM_CONTAINER).eq(1).find(FIELD_INPUT).eq(0).should('have.text', 'c');
178+
cy.get(EXCEPTION_ITEM_CONTAINER)
179+
.eq(1)
180+
.find(FIELD_INPUT)
181+
.eq(1)
182+
.should('have.text', '@timestamp');
116183

117-
// closeExceptionBuilderModal();
184+
closeExceptionBuilderModal();
118185
});
119186
});

x-pack/plugins/security_solution/cypress/screens/exceptions.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,5 @@ export const EXCEPTIONS_TABLE_LIST_NAME = '[data-test-subj="exceptionsTableName"
5656
export const EXCEPTIONS_TABLE_MODAL = '[data-test-subj="referenceErrorModal"]';
5757

5858
export const EXCEPTIONS_TABLE_MODAL_CONFIRM_BTN = '[data-test-subj="confirmModalConfirmButton"]';
59+
60+
export const EXCEPTION_ITEM_CONTAINER = '[data-test-subj="exceptionEntriesContainer"]';

x-pack/plugins/security_solution/cypress/tasks/exceptions.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,22 @@ import {
1212
VALUES_INPUT,
1313
CANCEL_BTN,
1414
BUILDER_MODAL_BODY,
15+
EXCEPTION_ITEM_CONTAINER,
1516
} from '../screens/exceptions';
1617

18+
export const addExceptionEntryFieldValueOfItemX = (
19+
field: string,
20+
itemIndex = 0,
21+
fieldIndex = 0
22+
) => {
23+
cy.get(EXCEPTION_ITEM_CONTAINER)
24+
.eq(itemIndex)
25+
.find(FIELD_INPUT)
26+
.eq(fieldIndex)
27+
.type(`${field}{enter}`);
28+
cy.get(BUILDER_MODAL_BODY).click();
29+
};
30+
1731
export const addExceptionEntryFieldValue = (field: string, index = 0) => {
1832
cy.get(FIELD_INPUT).eq(index).type(`${field}{enter}`);
1933
cy.get(BUILDER_MODAL_BODY).click();

0 commit comments

Comments
 (0)