@@ -15,19 +15,29 @@ import { goToRuleDetails } from '../../tasks/alerts_detection_rules';
1515import { esArchiverLoad , esArchiverUnload } from '../../tasks/es_archiver' ;
1616import { loginAndWaitForPageWithoutDateRange } from '../../tasks/login' ;
1717import { 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' ;
1923import {
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
2833import { DETECTIONS_URL } from '../../urls/navigation' ;
2934import { 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.
3141describe ( '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} ) ;
0 commit comments