diff --git a/cypress/integration/1_detectors.spec.js b/cypress/integration/1_detectors.spec.js
index 25a4a4c99..bbf1ecf8d 100644
--- a/cypress/integration/1_detectors.spec.js
+++ b/cypress/integration/1_detectors.spec.js
@@ -16,7 +16,6 @@ const cypressIndexDns = 'cypress-index-dns';
const cypressIndexWindows = 'cypress-index-windows';
const detectorName = 'test detector';
const cypressLogTypeDns = 'dns';
-const sampleNotificationChannel = 'sample_chime_channel';
const creationFailedMessage = 'Create detector failed.';
const cypressDNSRule = dns_name_rule_data.title;
@@ -43,10 +42,6 @@ const logTypeLabel = 'Log type';
const getLogTypeField = () => cy.getFieldByLabel(logTypeLabel);
-const notificationLabel = 'Notification channel';
-
-const getNotificationField = () => cy.getFieldByLabel(notificationLabel);
-
const openDetectorDetails = (detectorName) => {
cy.getInputByPlaceholder('Search threat detectors').type(`${detectorName}`).pressEnterKey();
cy.getElementByText('.euiTableCellContent button', detectorName).click();
@@ -162,8 +157,6 @@ const createDetector = (detectorName, dataSource, expectFailure) => {
.focus()
.blur();
- getNotificationField().selectComboboxItem(`[Channel] ${sampleNotificationChannel}`);
-
cy.intercept('POST', '/_plugins/_security_analytics/mappings').as('createMappingsRequest');
cy.intercept('POST', '/_plugins/_security_analytics/detectors').as('createDetectorRequest');
@@ -227,155 +220,141 @@ describe('Detectors', () => {
cy.createRule(dns_name_rule_data);
cy.createRule(dns_type_rule_data);
-
- cy.request('POST', 'http://localhost:9200/_plugins/_notifications/configs/', {
- config_id: 'sa_notification-channel_id',
- name: sampleNotificationChannel,
- config: {
- name: sampleNotificationChannel,
- description: 'This is a sample chime channel',
- config_type: 'chime',
- is_enabled: true,
- chime: {
- url: 'https://sample-chime-webhook',
- },
- },
- }).should('have.property', 'status', 200);
});
- // describe('...should validate form fields', () => {
- // beforeEach(() => {
- // cy.intercept('/_plugins/_security_analytics/detectors/_search').as('detectorsSearch');
-
- // // Visit Detectors page before any test
- // cy.visit(`${OPENSEARCH_DASHBOARDS_URL}/detectors`);
- // cy.wait('@detectorsSearch').should('have.property', 'state', 'Complete');
-
- // openCreateForm();
- // });
-
- // it('...should validate name field', () => {
- // getNameField().should('be.empty');
- // getNameField().focus().blur();
- // getNameField().parentsUntil('.euiFormRow__fieldWrapper').siblings().contains('Enter a name.');
-
- // getNameField().type('text').focus().blur();
-
- // getNameField()
- // .parents('.euiFormRow__fieldWrapper')
- // .find('.euiFormErrorText')
- // .contains(
- // 'Name should only consist of upper and lowercase letters, numbers 0-9, hyphens, spaces, and underscores. Use between 5 and 50 characters.'
- // );
-
- // getNameField().type('{selectall}').type('{backspace}').type('tex&').focus().blur();
-
- // getNameField()
- // .parents('.euiFormRow__fieldWrapper')
- // .find('.euiFormErrorText')
- // .contains(
- // 'Name should only consist of upper and lowercase letters, numbers 0-9, hyphens, spaces, and underscores. Use between 5 and 50 characters.'
- // );
-
- // getNameField()
- // .type('{selectall}')
- // .type('{backspace}')
- // .type('Detector name')
- // .focus()
- // .blur()
- // .parents('.euiFormRow__fieldWrapper')
- // .find('.euiFormErrorText')
- // .should('not.exist');
- // });
-
- // it('...should validate description field', () => {
- // const longDescriptionText =
- // 'This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text.';
-
- // getDescriptionField().should('be.empty');
-
- // getDescriptionField().type(longDescriptionText).focus().blur();
-
- // getDescriptionField()
- // .parents('.euiFormRow__fieldWrapper')
- // .find('.euiFormErrorText')
- // .contains(
- // 'Description should only consist of upper and lowercase letters, numbers 0-9, commas, hyphens, periods, spaces, and underscores. Max limit of 500 characters.'
- // );
-
- // getDescriptionField()
- // .type('{selectall}')
- // .type('{backspace}')
- // .type('Detector description...')
- // .focus()
- // .blur();
-
- // getDescriptionField()
- // .type('{selectall}')
- // .type('{backspace}')
- // .type('Detector name')
- // .focus()
- // .blur()
- // .parents('.euiFormRow__fieldWrapper')
- // .find('.euiFormErrorText')
- // .should('not.exist');
- // });
-
- // it('...should validate data source field', () => {
- // getDataSourceField()
- // .focus()
- // .blur()
- // .parentsUntil('.euiFormRow__fieldWrapper')
- // .siblings()
- // .contains('Select an input source.');
-
- // getDataSourceField().selectComboboxItem(cypressIndexDns);
- // getDataSourceField()
- // .focus()
- // .blur()
- // .parentsUntil('.euiFormRow__fieldWrapper')
- // .find('.euiFormErrorText')
- // .should('not.exist');
- // });
-
- // it('...should validate next button', () => {
- // getNextButton().should('be.disabled');
-
- // fillDetailsForm(detectorName, cypressIndexDns);
- // getNextButton().should('be.enabled');
- // });
-
- // it('...should validate alerts page', () => {
- // fillDetailsForm(detectorName, cypressIndexDns);
- // getNextButton().click({ force: true });
- // // Open the trigger details accordion
- // cy.get('[data-test-subj="trigger-details-btn"]').click({ force: true });
- // getTriggerNameField().should('have.value', 'Trigger 1');
- // getTriggerNameField()
- // .parents('.euiFormRow__fieldWrapper')
- // .find('.euiFormErrorText')
- // .should('not.exist');
-
- // getTriggerNameField().type('{selectall}').type('{backspace}').focus().blur();
- // getCreateDetectorButton().should('be.disabled');
-
- // cy.getButtonByText('Remove').click({ force: true });
- // getCreateDetectorButton().should('be.enabled');
- // });
-
- // it('...should show mappings warning', () => {
- // fillDetailsForm(detectorName, cypressIndexDns);
-
- // getDataSourceField().selectComboboxItem(cypressIndexWindows);
- // getDataSourceField().focus().blur();
-
- // cy.get('[data-test-subj="define-detector-diff-log-types-warning"]')
- // .should('be.visible')
- // .contains(
- // 'To avoid issues with field mappings, we recommend creating separate detectors for different log types.'
- // );
- // });
- // });
+ describe('...should validate form fields', () => {
+ beforeEach(() => {
+ cy.intercept('/_plugins/_security_analytics/detectors/_search').as('detectorsSearch');
+
+ // Visit Detectors page before any test
+ cy.visit(`${OPENSEARCH_DASHBOARDS_URL}/detectors`);
+ cy.wait('@detectorsSearch').should('have.property', 'state', 'Complete');
+
+ openCreateForm();
+ });
+
+ it('...should validate name field', () => {
+ getNameField().should('be.empty');
+ getNameField().focus().blur();
+ getNameField().parentsUntil('.euiFormRow__fieldWrapper').siblings().contains('Enter a name.');
+
+ getNameField().type('text').focus().blur();
+
+ getNameField()
+ .parents('.euiFormRow__fieldWrapper')
+ .find('.euiFormErrorText')
+ .contains(
+ 'Name should only consist of upper and lowercase letters, numbers 0-9, hyphens, spaces, and underscores. Use between 5 and 50 characters.'
+ );
+
+ getNameField().type('{selectall}').type('{backspace}').type('tex&').focus().blur();
+
+ getNameField()
+ .parents('.euiFormRow__fieldWrapper')
+ .find('.euiFormErrorText')
+ .contains(
+ 'Name should only consist of upper and lowercase letters, numbers 0-9, hyphens, spaces, and underscores. Use between 5 and 50 characters.'
+ );
+
+ getNameField()
+ .type('{selectall}')
+ .type('{backspace}')
+ .type('Detector name')
+ .focus()
+ .blur()
+ .parents('.euiFormRow__fieldWrapper')
+ .find('.euiFormErrorText')
+ .should('not.exist');
+ });
+
+ it('...should validate description field', () => {
+ const longDescriptionText =
+ 'This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text. This is a long text.';
+
+ getDescriptionField().should('be.empty');
+
+ getDescriptionField().type(longDescriptionText).focus().blur();
+
+ getDescriptionField()
+ .parents('.euiFormRow__fieldWrapper')
+ .find('.euiFormErrorText')
+ .contains(
+ 'Description should only consist of upper and lowercase letters, numbers 0-9, commas, hyphens, periods, spaces, and underscores. Max limit of 500 characters.'
+ );
+
+ getDescriptionField()
+ .type('{selectall}')
+ .type('{backspace}')
+ .type('Detector description...')
+ .focus()
+ .blur();
+
+ getDescriptionField()
+ .type('{selectall}')
+ .type('{backspace}')
+ .type('Detector name')
+ .focus()
+ .blur()
+ .parents('.euiFormRow__fieldWrapper')
+ .find('.euiFormErrorText')
+ .should('not.exist');
+ });
+
+ it('...should validate data source field', () => {
+ getDataSourceField()
+ .focus()
+ .blur()
+ .parentsUntil('.euiFormRow__fieldWrapper')
+ .siblings()
+ .contains('Select an input source.');
+
+ getDataSourceField().selectComboboxItem(cypressIndexDns);
+ getDataSourceField()
+ .focus()
+ .blur()
+ .parentsUntil('.euiFormRow__fieldWrapper')
+ .find('.euiFormErrorText')
+ .should('not.exist');
+ });
+
+ it('...should validate next button', () => {
+ getNextButton().should('be.disabled');
+
+ fillDetailsForm(detectorName, cypressIndexDns);
+ getNextButton().should('be.enabled');
+ });
+
+ it('...should validate alerts page', () => {
+ fillDetailsForm(detectorName, cypressIndexDns);
+ getNextButton().click({ force: true });
+ // Open the trigger details accordion
+ cy.get('[data-test-subj="trigger-details-btn"]').click({ force: true });
+ getTriggerNameField().should('have.value', 'Trigger 1');
+ getTriggerNameField()
+ .parents('.euiFormRow__fieldWrapper')
+ .find('.euiFormErrorText')
+ .should('not.exist');
+
+ getTriggerNameField().type('{selectall}').type('{backspace}').focus().blur();
+ getCreateDetectorButton().should('be.disabled');
+
+ cy.getButtonByText('Remove').click({ force: true });
+ getCreateDetectorButton().should('be.enabled');
+ });
+
+ it('...should show mappings warning', () => {
+ fillDetailsForm(detectorName, cypressIndexDns);
+
+ getDataSourceField().selectComboboxItem(cypressIndexWindows);
+ getDataSourceField().focus().blur();
+
+ cy.get('[data-test-subj="define-detector-diff-log-types-warning"]')
+ .should('be.visible')
+ .contains(
+ 'To avoid issues with field mappings, we recommend creating separate detectors for different log types.'
+ );
+ });
+ });
describe('...validate create detector flow', () => {
beforeEach(() => {
@@ -521,9 +500,5 @@ describe('Detectors', () => {
after(() => {
cy.cleanUpTests();
- cy.request(
- 'DELETE',
- 'http://localhost:9200/_plugins/_notifications/configs/sa_notification-channel_id'
- );
});
});
diff --git a/cypress/integration/2_rules.spec.js b/cypress/integration/2_rules.spec.js
index 18b18f6ca..3e90ed212 100644
--- a/cypress/integration/2_rules.spec.js
+++ b/cypress/integration/2_rules.spec.js
@@ -330,13 +330,20 @@ describe('Rules', () => {
it('...should validate selection map key field', () => {
getSelectionPanelByIndex(0).within(() => {
getMapKeyField().should('be.empty');
- getMapKeyField().focus().blur();
+ getMapKeyField()
+ .focus()
+ .blur()
+ .parents('.euiFormRow__fieldWrapper')
+ .find('.euiFormErrorText')
+ .should('not.exist');
+
+ getMapKeyField().type('hello@');
getMapKeyField()
.parentsUntil('.euiFormRow__fieldWrapper')
.siblings()
.contains('Invalid key name');
- getMapKeyField().type('FieldKey');
+ getMapKeyField().focus().type('{selectall}').type('FieldKey');
getMapKeyField()
.focus()
.blur()
@@ -446,7 +453,6 @@ describe('Rules', () => {
getSelectionPanelByIndex(0).within(() =>
getMapKeyField().type('{selectall}').type('{backspace}')
);
- toastShouldExist();
getSelectionPanelByIndex(0).within(() => getMapKeyField().type('FieldKey'));
// selection map value field
diff --git a/public/components/ContentPanel/ContentPanel.tsx b/public/components/ContentPanel/ContentPanel.tsx
index 57871bc65..c92ca6acc 100644
--- a/public/components/ContentPanel/ContentPanel.tsx
+++ b/public/components/ContentPanel/ContentPanel.tsx
@@ -38,7 +38,7 @@ const renderSubTitleText = (subTitleText: string | JSX.Element): JSX.Element | n
return subTitleText;
};
-const ContentPanel: React.SFC
+ A correlation will be created for the matching findings narrowed down with
+ data filter.
+
+ A correlation will be created when the values for the field values for each
+ data source match between the findings.
+ Select at least one query type Query {queryIdx + 1} Data source {queryIdx + 1} Select at least one query typeQuery type
+ Data filter
+ Group by field values
+ Fields
- Data filter
+