From a95b247f58304263f2f5a620b7a2b5cf9eace8de Mon Sep 17 00:00:00 2001 From: Ricky Ang Date: Thu, 2 Dec 2021 17:30:36 -0800 Subject: [PATCH 1/6] added Cypress script from Tuesday Demo, need to fix Yarn script and add POST method --- .../cypress/integration/session_view.spec.ts | 37 ++++++++++++++++--- .../cypress/screens/common/page.ts | 8 ++++ 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/x-pack/plugins/session_view/cypress/integration/session_view.spec.ts b/x-pack/plugins/session_view/cypress/integration/session_view.spec.ts index a7d3a751cdd8d..ebf7c87a65def 100644 --- a/x-pack/plugins/session_view/cypress/integration/session_view.spec.ts +++ b/x-pack/plugins/session_view/cypress/integration/session_view.spec.ts @@ -10,20 +10,47 @@ import { loginAndWaitForPage } from '../tasks/login'; import { SESSION_VIEW_URL } from '../urls/navigation'; import { cleanKibana } from '../tasks/common'; -import { TEST } from '../screens/common/page'; + +import { TEST, DETAILS_PANEL, DETAILS_PANEL_TOGGLE, SEARCH_BAR } from '../screens/common/page'; describe('Display session view test page', () => { before(() => { cleanKibana(); }); - it('navigates to session view home page', () => { + it('Navigates to session view home page', () => { loginAndWaitForPage(SESSION_VIEW_URL); cy.get(TEST).should('exist'); }); - it('navigates to session view path 1 page', () => { - loginAndWaitForPage(`${SESSION_VIEW_URL}/path_1`); - cy.get(TEST).contains('current path:').should('have.text', 'current path: /path_1'); + it('General Layout for Session View', () => { + loginAndWaitForPage(SESSION_VIEW_URL); + cy.contains("Process Tree").click().wait(1000) + //Checking Search bar exist + cy.get(SEARCH_BAR).should('be.visible') + //Making sure commands from POST curl shows up + cy.contains("ls --color=auto").click() + //Checking Details panel exist + cy.get(DETAILS_PANEL_TOGGLE).contains("Detail panel").click() + //Checking Command, Session, Server Detail exist + cy.get(DETAILS_PANEL).contains("Command detail") + cy.get(DETAILS_PANEL).contains("Session detail") + cy.get(DETAILS_PANEL).contains("Server detail") }); + + it('Search Functionality',()=>{ + loginAndWaitForPage(SESSION_VIEW_URL); + cy.contains("Process Tree").click().wait(1000) + //STILL NEED TO FIX THIS PART + cy.get(SEARCH_BAR).last().click().type('ls{enter}') + cy.get('span[style="[object Object]]').first().should('be.visible') +}); + +it('Alerts Check',()=>{ + loginAndWaitForPage(SESSION_VIEW_URL); + cy.contains("Process Tree").click().wait(1000) + cy.contains('Alerts').first().click() + cy.contains('View rule').first().click() + cy.contains("LS RULES",{timeout:5000}).should('be.visible') +}) }); diff --git a/x-pack/plugins/session_view/cypress/screens/common/page.ts b/x-pack/plugins/session_view/cypress/screens/common/page.ts index 33bb6a9277b42..99204aa352ac5 100644 --- a/x-pack/plugins/session_view/cypress/screens/common/page.ts +++ b/x-pack/plugins/session_view/cypress/screens/common/page.ts @@ -6,3 +6,11 @@ */ export const TEST = '[data-test-subj="sessionViewTestPage"]'; + +export const DETAILS_PANEL = 'span.euiTitle.euiTitle--small'; + +export const DETAILS_PANEL_TOGGLE = 'span.euiButton__text'; + +//export const SEARCH_BAR = '[aria-label="This is a search bar. After typing your query, hit enter to filter the results lower in the page."]' + +export const SEARCH_BAR = 'input.euiFieldSearch.euiFieldSearch--fullWidth' \ No newline at end of file From a204da589054cd802cbc9e665ee3ed6acbc460a8 Mon Sep 17 00:00:00 2001 From: Ricky Ang Date: Fri, 3 Dec 2021 01:25:21 -0800 Subject: [PATCH 2/6] added resolver generator in order to enable data to flow through --- .../scripts/endpoint/resolver_generator_script.ts | 4 ++-- .../session_view/cypress/integration/session_view.spec.ts | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/security_solution/scripts/endpoint/resolver_generator_script.ts b/x-pack/plugins/security_solution/scripts/endpoint/resolver_generator_script.ts index da0810bead47e..b3221b13daa66 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/resolver_generator_script.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/resolver_generator_script.ts @@ -47,13 +47,13 @@ async function main() { node: { alias: 'n', describe: 'elasticsearch node url', - default: 'http://elastic:changeme@localhost:9200', + default: 'http://elastic:changeme@localhost:9220', type: 'string', }, kibana: { alias: 'k', describe: 'kibana url', - default: 'http://elastic:changeme@localhost:5601', + default: 'http://elastic:changeme@localhost:5620', type: 'string', }, eventIndex: { diff --git a/x-pack/plugins/session_view/cypress/integration/session_view.spec.ts b/x-pack/plugins/session_view/cypress/integration/session_view.spec.ts index ebf7c87a65def..e0ebd4f3ca868 100644 --- a/x-pack/plugins/session_view/cypress/integration/session_view.spec.ts +++ b/x-pack/plugins/session_view/cypress/integration/session_view.spec.ts @@ -7,6 +7,8 @@ import { loginAndWaitForPage } from '../tasks/login'; +import { resolverGenerator } from '../tasks/resolver_generator'; + import { SESSION_VIEW_URL } from '../urls/navigation'; import { cleanKibana } from '../tasks/common'; @@ -16,6 +18,7 @@ import { TEST, DETAILS_PANEL, DETAILS_PANEL_TOGGLE, SEARCH_BAR } from '../scree describe('Display session view test page', () => { before(() => { cleanKibana(); + resolverGenerator() }); it('Navigates to session view home page', () => { From e2c33c8541d6b733da2bf22418ceef14c2c4f46c Mon Sep 17 00:00:00 2001 From: Ricky Ang Date: Fri, 3 Dec 2021 08:42:19 -0800 Subject: [PATCH 3/6] added the correct file --- .../session_view/cypress/tasks/resolver_generator.ts | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 x-pack/plugins/session_view/cypress/tasks/resolver_generator.ts diff --git a/x-pack/plugins/session_view/cypress/tasks/resolver_generator.ts b/x-pack/plugins/session_view/cypress/tasks/resolver_generator.ts new file mode 100644 index 0000000000000..ebc620dcefc73 --- /dev/null +++ b/x-pack/plugins/session_view/cypress/tasks/resolver_generator.ts @@ -0,0 +1,9 @@ + + +/** + * Authenticates with Kibana, visits the specified `url`, and waits for the + * Kibana global nav to be displayed before continuing + */ +export const resolverGenerator = () => { + cy.exec('node ../security_solution/scripts/endpoint/resolver_generator --fleet '); +}; From 2bdf7522397bc4f26e318216b8c12dbf11ce994a Mon Sep 17 00:00:00 2001 From: Zizhou Wang Date: Mon, 6 Dec 2021 10:51:34 -0500 Subject: [PATCH 4/6] Revert changes in security solutions cypress generator script --- .../scripts/endpoint/resolver_generator_script.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/security_solution/scripts/endpoint/resolver_generator_script.ts b/x-pack/plugins/security_solution/scripts/endpoint/resolver_generator_script.ts index b3221b13daa66..da0810bead47e 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/resolver_generator_script.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/resolver_generator_script.ts @@ -47,13 +47,13 @@ async function main() { node: { alias: 'n', describe: 'elasticsearch node url', - default: 'http://elastic:changeme@localhost:9220', + default: 'http://elastic:changeme@localhost:9200', type: 'string', }, kibana: { alias: 'k', describe: 'kibana url', - default: 'http://elastic:changeme@localhost:5620', + default: 'http://elastic:changeme@localhost:5601', type: 'string', }, eventIndex: { From 4f119416dc61c5de0f683871ad03ad0f0b24f219 Mon Sep 17 00:00:00 2001 From: Zizhou Wang Date: Wed, 8 Dec 2021 16:53:55 -0500 Subject: [PATCH 5/6] Add es archives data --- x-pack/plugins/session_view/cypress/README.md | 4 +- .../cypress/integration/session_view.spec.ts | 74 +- .../session_view/cypress/tasks/es_archiver.ts | 24 +- .../cypress/tasks/resolver_generator.ts | 9 - .../es_archives/sessions/data.json.gz | Bin 0 -> 68908 bytes .../es_archives/sessions/mappings.json | 4052 +++++++++++++++++ 6 files changed, 4095 insertions(+), 68 deletions(-) delete mode 100644 x-pack/plugins/session_view/cypress/tasks/resolver_generator.ts create mode 100644 x-pack/test/session_view_cypress/es_archives/sessions/data.json.gz create mode 100644 x-pack/test/session_view_cypress/es_archives/sessions/mappings.json diff --git a/x-pack/plugins/session_view/cypress/README.md b/x-pack/plugins/session_view/cypress/README.md index 6022a95a418cc..6967714e44174 100644 --- a/x-pack/plugins/session_view/cypress/README.md +++ b/x-pack/plugins/session_view/cypress/README.md @@ -218,13 +218,13 @@ We use es_archiver to manage the data that our Cypress tests need. 3. When you are sure that you have all the data you need run the following command from: `x-pack/plugins/session_view` ```sh -node ../../../scripts/es_archiver save --dir ../../test/session_view_cypress/es_archives --config ../../../test/functional/config.js --es-url http://:@: +node ../../../scripts/es_archiver save ../../test/session_view_cypress/es_archives --config ../../../test/functional/config.js --es-url http://:@: ``` Example: ```sh -node ../../../scripts/es_archiver save custom_rules ".kibana",".siem-signal*" --dir ../../test/session_view_cypress/es_archives --config ../../../test/functional/config.js --es-url http://elastic:changeme@localhost:9220 +node ../../../scripts/es_archiver save ../../test/session_view_cypress/es_archives ".kibana",".siem-signal*","cmd","cmd_entry_leader" --config ../../../test/functional/config.js --es-url http://elastic:changeme@localhost:9200 ``` Note that the command will create the folder if it does not exist. diff --git a/x-pack/plugins/session_view/cypress/integration/session_view.spec.ts b/x-pack/plugins/session_view/cypress/integration/session_view.spec.ts index e0ebd4f3ca868..e08c0d78925d1 100644 --- a/x-pack/plugins/session_view/cypress/integration/session_view.spec.ts +++ b/x-pack/plugins/session_view/cypress/integration/session_view.spec.ts @@ -6,54 +6,56 @@ */ import { loginAndWaitForPage } from '../tasks/login'; - -import { resolverGenerator } from '../tasks/resolver_generator'; - import { SESSION_VIEW_URL } from '../urls/navigation'; - import { cleanKibana } from '../tasks/common'; - -import { TEST, DETAILS_PANEL, DETAILS_PANEL_TOGGLE, SEARCH_BAR } from '../screens/common/page'; +import { esArchiverLoad } from '../tasks/es_archiver'; +import { DETAILS_PANEL, DETAILS_PANEL_TOGGLE, SEARCH_BAR } from '../screens/common/page'; describe('Display session view test page', () => { - before(() => { + beforeEach(() => { cleanKibana(); - resolverGenerator() - }); - - it('Navigates to session view home page', () => { + esArchiverLoad('sessions'); loginAndWaitForPage(SESSION_VIEW_URL); - cy.get(TEST).should('exist'); }); it('General Layout for Session View', () => { loginAndWaitForPage(SESSION_VIEW_URL); - cy.contains("Process Tree").click().wait(1000) - //Checking Search bar exist - cy.get(SEARCH_BAR).should('be.visible') - //Making sure commands from POST curl shows up - cy.contains("ls --color=auto").click() - //Checking Details panel exist - cy.get(DETAILS_PANEL_TOGGLE).contains("Detail panel").click() - //Checking Command, Session, Server Detail exist - cy.get(DETAILS_PANEL).contains("Command detail") - cy.get(DETAILS_PANEL).contains("Session detail") - cy.get(DETAILS_PANEL).contains("Server detail") + cy.contains('Process Tree').click().wait(1000); + // Checking Search bar exist + cy.get(SEARCH_BAR).should('be.visible'); + // Making sure commands from POST curl shows up + cy.contains('ls --color=auto').click(); + // Checking Details panel exist + cy.get(DETAILS_PANEL_TOGGLE).contains('Detail panel').click(); + // Checking Command, Session, Server Detail exist + cy.get(DETAILS_PANEL).contains('Command detail'); + cy.get(DETAILS_PANEL).contains('Session detail'); + cy.get(DETAILS_PANEL).contains('Server detail'); + + cy.contains('vi EventConverter/package.json').click(); + // Checking Command, Session, Server, Alert Detail exist + cy.get(DETAILS_PANEL).contains('Command detail'); + cy.get(DETAILS_PANEL).contains('Session detail'); + cy.get(DETAILS_PANEL).contains('Server detail'); + cy.get(DETAILS_PANEL).contains('Alert detail'); }); - it('Search Functionality',()=>{ - loginAndWaitForPage(SESSION_VIEW_URL); - cy.contains("Process Tree").click().wait(1000) - //STILL NEED TO FIX THIS PART - cy.get(SEARCH_BAR).last().click().type('ls{enter}') - cy.get('span[style="[object Object]]').first().should('be.visible') -}); + // it('Search Functionality', () => { + // loginAndWaitForPage(SESSION_VIEW_URL); + // cy.contains('Process Tree').click().wait(1000); + // // STILL NEED TO FIX THIS PART + // cy.get(SEARCH_BAR).last().click().type('ls{enter}'); + // cy.get('span[style="[object Object]]').first().should('be.visible'); + // }); -it('Alerts Check',()=>{ + it('Alerts Check', () => { loginAndWaitForPage(SESSION_VIEW_URL); - cy.contains("Process Tree").click().wait(1000) - cy.contains('Alerts').first().click() - cy.contains('View rule').first().click() - cy.contains("LS RULES",{timeout:5000}).should('be.visible') -}) + cy.contains('Process Tree').click().wait(1000); + cy.contains('Alerts').first().click(); + cy.contains('View rule').first().click(); + cy.location('pathname').should( + 'contain', + 'app/security/rules/id/15b43080-5204-11ec-a8f5-f507bc52c10c' + ); + }); }); diff --git a/x-pack/plugins/session_view/cypress/tasks/es_archiver.ts b/x-pack/plugins/session_view/cypress/tasks/es_archiver.ts index 83ec1536baf0f..e56d73099f375 100644 --- a/x-pack/plugins/session_view/cypress/tasks/es_archiver.ts +++ b/x-pack/plugins/session_view/cypress/tasks/es_archiver.ts @@ -7,17 +7,15 @@ import Path from 'path'; -const ES_ARCHIVE_DIR = '../../test/security_solution_cypress/es_archives'; +const ES_ARCHIVE_DIR = '../../test/session_view_cypress/es_archives'; const CONFIG_PATH = '../../test/functional/config.js'; const ES_URL = Cypress.env('ELASTICSEARCH_URL'); const KIBANA_URL = Cypress.config().baseUrl; -const CCS_ES_URL = Cypress.env('CCS_ELASTICSEARCH_URL'); -const CCS_KIBANA_URL = Cypress.env('CCS_KIBANA_URL'); // Otherwise cy.exec would inject NODE_TLS_REJECT_UNAUTHORIZED=0 and node would abort if used over https const NODE_TLS_REJECT_UNAUTHORIZED = '1'; -export const esArchiverLoad = (folder: string) => { +export const esArchiverLoad = (folder: string = '') => { const path = Path.join(ES_ARCHIVE_DIR, folder); cy.exec( `node ../../../scripts/es_archiver load "${path}" --config "${CONFIG_PATH}" --es-url "${ES_URL}" --kibana-url "${KIBANA_URL}"`, @@ -25,7 +23,7 @@ export const esArchiverLoad = (folder: string) => { ); }; -export const esArchiverUnload = (folder: string) => { +export const esArchiverUnload = (folder: string = '') => { const path = Path.join(ES_ARCHIVE_DIR, folder); cy.exec( `node ../../../scripts/es_archiver unload "${path}" --config "${CONFIG_PATH}" --es-url "${ES_URL}" --kibana-url "${KIBANA_URL}"`, @@ -39,19 +37,3 @@ export const esArchiverResetKibana = () => { { env: { NODE_TLS_REJECT_UNAUTHORIZED }, failOnNonZeroExit: false } ); }; - -export const esArchiverCCSLoad = (folder: string) => { - const path = Path.join(ES_ARCHIVE_DIR, folder); - cy.exec( - `node ../../../scripts/es_archiver load "${path}" --config "${CONFIG_PATH}" --es-url "${CCS_ES_URL}" --kibana-url "${CCS_KIBANA_URL}"`, - { env: { NODE_TLS_REJECT_UNAUTHORIZED } } - ); -}; - -export const esArchiverCCSUnload = (folder: string) => { - const path = Path.join(ES_ARCHIVE_DIR, folder); - cy.exec( - `node ../../../scripts/es_archiver unload "${path}" --config "${CONFIG_PATH}" --es-url "${CCS_ES_URL}" --kibana-url "${CCS_KIBANA_URL}"`, - { env: { NODE_TLS_REJECT_UNAUTHORIZED } } - ); -}; diff --git a/x-pack/plugins/session_view/cypress/tasks/resolver_generator.ts b/x-pack/plugins/session_view/cypress/tasks/resolver_generator.ts deleted file mode 100644 index ebc620dcefc73..0000000000000 --- a/x-pack/plugins/session_view/cypress/tasks/resolver_generator.ts +++ /dev/null @@ -1,9 +0,0 @@ - - -/** - * Authenticates with Kibana, visits the specified `url`, and waits for the - * Kibana global nav to be displayed before continuing - */ -export const resolverGenerator = () => { - cy.exec('node ../security_solution/scripts/endpoint/resolver_generator --fleet '); -}; diff --git a/x-pack/test/session_view_cypress/es_archives/sessions/data.json.gz b/x-pack/test/session_view_cypress/es_archives/sessions/data.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..be5e0e7a65ea951a4617a4ea14f7f1dbdef4e83e GIT binary patch literal 68908 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 gYCy7Wqe2s*`SI|5{G+H#K47o; Date: Wed, 8 Dec 2021 19:49:03 -0500 Subject: [PATCH 6/6] Clean up cypress tests --- x-pack/plugins/session_view/cypress/README.md | 2 +- .../cypress/integration/session_view.spec.ts | 71 +++++++++++++------ .../cypress/screens/common/page.ts | 20 +++--- .../session_view/cypress/urls/navigation.ts | 2 +- .../public/components/ProcessTree/index.tsx | 2 +- .../components/ProcessTreeNode/index.tsx | 1 + .../public/components/SessionView/index.tsx | 7 +- .../SessionViewDetailPanel/index.tsx | 1 + 8 files changed, 73 insertions(+), 33 deletions(-) diff --git a/x-pack/plugins/session_view/cypress/README.md b/x-pack/plugins/session_view/cypress/README.md index 6967714e44174..7e97c80aa7a74 100644 --- a/x-pack/plugins/session_view/cypress/README.md +++ b/x-pack/plugins/session_view/cypress/README.md @@ -224,7 +224,7 @@ node ../../../scripts/es_archiver save ../../test/session_view_cypress/es_archiv Example: ```sh -node ../../../scripts/es_archiver save ../../test/session_view_cypress/es_archives ".kibana",".siem-signal*","cmd","cmd_entry_leader" --config ../../../test/functional/config.js --es-url http://elastic:changeme@localhost:9200 +node ../../../scripts/es_archiver save ../../test/session_view_cypress/es_archives ".siem-signal*","cmd","cmd_entry_leader" --config ../../../test/functional/config.js --es-url http://elastic:changeme@localhost:9200 ``` Note that the command will create the folder if it does not exist. diff --git a/x-pack/plugins/session_view/cypress/integration/session_view.spec.ts b/x-pack/plugins/session_view/cypress/integration/session_view.spec.ts index e08c0d78925d1..c199234656298 100644 --- a/x-pack/plugins/session_view/cypress/integration/session_view.spec.ts +++ b/x-pack/plugins/session_view/cypress/integration/session_view.spec.ts @@ -9,7 +9,26 @@ import { loginAndWaitForPage } from '../tasks/login'; import { SESSION_VIEW_URL } from '../urls/navigation'; import { cleanKibana } from '../tasks/common'; import { esArchiverLoad } from '../tasks/es_archiver'; -import { DETAILS_PANEL, DETAILS_PANEL_TOGGLE, SEARCH_BAR } from '../screens/common/page'; +import { + PROCESS_TREE, + PROCESS_TREE_NODE, + PROCESS_TREE_NODE_ALERT, + DETAILS_PANEL, + DETAILS_PANEL_TOGGLE, + DETAILS_PANEL_ALERT, + DETAILS_PANEL_COMMAND, + DETAILS_PANEL_SESSION, + DETAILS_PANEL_SERVER, + SEARCH_BAR, + getProcessTreeNodeAlertDetailViewRule, +} from '../screens/common/page'; + +const LS_TEST_COMMAND = 'ls --color=auto'; +const ALERT_TEST_COMMAND = 'vi EventConverter/package.json'; +const ALERT_NODE_TEST_ID = getProcessTreeNodeAlertDetailViewRule( + '1900f4bb07c6fcc64eb754ed97a83a952aa7698eaffe14749709e83f7b6bdb0d' +); +const ALERT_RULE_ID = '15b43080-5204-11ec-a8f5-f507bc52c10c'; describe('Display session view test page', () => { beforeEach(() => { @@ -20,24 +39,38 @@ describe('Display session view test page', () => { it('General Layout for Session View', () => { loginAndWaitForPage(SESSION_VIEW_URL); - cy.contains('Process Tree').click().wait(1000); // Checking Search bar exist cy.get(SEARCH_BAR).should('be.visible'); - // Making sure commands from POST curl shows up - cy.contains('ls --color=auto').click(); + + // Check detail panel and its toggle work correctly + cy.get(DETAILS_PANEL).should('not.exist'); // Checking Details panel exist - cy.get(DETAILS_PANEL_TOGGLE).contains('Detail panel').click(); - // Checking Command, Session, Server Detail exist - cy.get(DETAILS_PANEL).contains('Command detail'); - cy.get(DETAILS_PANEL).contains('Session detail'); - cy.get(DETAILS_PANEL).contains('Server detail'); + cy.get(DETAILS_PANEL_TOGGLE).click(); + cy.get(DETAILS_PANEL).should('be.visible'); + + // Only Session, Server Detail exist when no commands selected when detail panel is open + cy.get(DETAILS_PANEL_ALERT).should('not.exist'); + cy.get(DETAILS_PANEL_COMMAND).should('not.exist'); + cy.get(DETAILS_PANEL_SESSION).should('be.visible'); + cy.get(DETAILS_PANEL_SERVER).should('exist'); + + const lsCommandNode = cy.get(`${PROCESS_TREE} ${PROCESS_TREE_NODE}`).eq(1); + lsCommandNode.contains(LS_TEST_COMMAND).should('be.visible'); + lsCommandNode.click(); + // Checking Command, Session, Server Detail exist for a command without alert + cy.get(DETAILS_PANEL_ALERT).should('not.exist'); + cy.get(DETAILS_PANEL_COMMAND).should('be.visible'); + cy.get(DETAILS_PANEL_SESSION).should('exist'); + cy.get(DETAILS_PANEL_SERVER).should('exist'); - cy.contains('vi EventConverter/package.json').click(); + const viCommand = cy.get(`${PROCESS_TREE} ${PROCESS_TREE_NODE}`).eq(3); + viCommand.contains(ALERT_TEST_COMMAND).should('be.visible'); + viCommand.click(); // Checking Command, Session, Server, Alert Detail exist - cy.get(DETAILS_PANEL).contains('Command detail'); - cy.get(DETAILS_PANEL).contains('Session detail'); - cy.get(DETAILS_PANEL).contains('Server detail'); - cy.get(DETAILS_PANEL).contains('Alert detail'); + cy.get(DETAILS_PANEL_ALERT).should('exist'); + cy.get(DETAILS_PANEL_COMMAND).should('be.visible'); + cy.get(DETAILS_PANEL_SESSION).should('exist'); + cy.get(DETAILS_PANEL_SERVER).should('exist'); }); // it('Search Functionality', () => { @@ -50,12 +83,8 @@ describe('Display session view test page', () => { it('Alerts Check', () => { loginAndWaitForPage(SESSION_VIEW_URL); - cy.contains('Process Tree').click().wait(1000); - cy.contains('Alerts').first().click(); - cy.contains('View rule').first().click(); - cy.location('pathname').should( - 'contain', - 'app/security/rules/id/15b43080-5204-11ec-a8f5-f507bc52c10c' - ); + cy.get(PROCESS_TREE_NODE_ALERT).first().click(); + cy.get(ALERT_NODE_TEST_ID).first().click(); + cy.location('pathname').should('contain', `app/security/rules/id/${ALERT_RULE_ID}`); }); }); diff --git a/x-pack/plugins/session_view/cypress/screens/common/page.ts b/x-pack/plugins/session_view/cypress/screens/common/page.ts index 99204aa352ac5..3d26a0b8097a1 100644 --- a/x-pack/plugins/session_view/cypress/screens/common/page.ts +++ b/x-pack/plugins/session_view/cypress/screens/common/page.ts @@ -4,13 +4,17 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +export const PROCESS_TREE = '[data-test-subj="sessionViewProcessTree"]'; +export const PROCESS_TREE_NODE = '[data-test-subj="processTreeNode"]'; +export const PROCESS_TREE_NODE_ALERT = '[data-test-subj="processTreeNodeAlertButton"]'; +export const SEARCH_BAR = '[data-test-subj="sessionViewProcessEventsSearch"]'; -export const TEST = '[data-test-subj="sessionViewTestPage"]'; +export const DETAILS_PANEL = '[data-test-subj="sessionViewDetailPanel"]'; +export const DETAILS_PANEL_TOGGLE = '[data-test-subj="sessionViewDetailPanelToggle"]'; +export const DETAILS_PANEL_ALERT = '[data-test-subj="sessionViewDetailPanelAlertDetail"]'; +export const DETAILS_PANEL_COMMAND = '[data-test-subj="sessionViewDetailPanelCommandDetail"]'; +export const DETAILS_PANEL_SESSION = '[data-test-subj="sessionViewDetailPanelSessionDetail"]'; +export const DETAILS_PANEL_SERVER = '[data-test-subj="sessionViewDetailPanelServerDetail"]'; -export const DETAILS_PANEL = 'span.euiTitle.euiTitle--small'; - -export const DETAILS_PANEL_TOGGLE = 'span.euiButton__text'; - -//export const SEARCH_BAR = '[aria-label="This is a search bar. After typing your query, hit enter to filter the results lower in the page."]' - -export const SEARCH_BAR = 'input.euiFieldSearch.euiFieldSearch--fullWidth' \ No newline at end of file +export const getProcessTreeNodeAlertDetailViewRule = (alertUUID: string) => + `[data-test-subj="sessionViewAlertDetailViewRule-${alertUUID}"]`; diff --git a/x-pack/plugins/session_view/cypress/urls/navigation.ts b/x-pack/plugins/session_view/cypress/urls/navigation.ts index fc632b9646dfa..2dde79d487785 100644 --- a/x-pack/plugins/session_view/cypress/urls/navigation.ts +++ b/x-pack/plugins/session_view/cypress/urls/navigation.ts @@ -5,4 +5,4 @@ * 2.0. */ -export const SESSION_VIEW_URL = 'app/sessionView'; +export const SESSION_VIEW_URL = 'app/sessionView/process_tree'; diff --git a/x-pack/plugins/session_view/public/components/ProcessTree/index.tsx b/x-pack/plugins/session_view/public/components/ProcessTree/index.tsx index 22a5a66245cbc..b6a95ca18e5dc 100644 --- a/x-pack/plugins/session_view/public/components/ProcessTree/index.tsx +++ b/x-pack/plugins/session_view/public/components/ProcessTree/index.tsx @@ -141,7 +141,7 @@ export const ProcessTree = ({ }; return ( -
+
{sessionLeader && ( setAlertsExpanded(!alertsExpanded)} + data-test-subj="processTreeNodeAlertButton" > diff --git a/x-pack/plugins/session_view/public/components/SessionView/index.tsx b/x-pack/plugins/session_view/public/components/SessionView/index.tsx index a4bfccf1f31d5..aea67e214bec4 100644 --- a/x-pack/plugins/session_view/public/components/SessionView/index.tsx +++ b/x-pack/plugins/session_view/public/components/SessionView/index.tsx @@ -134,7 +134,12 @@ export const SessionView = ({ sessionEntityId, height }: SessionViewDeps) => { - + {renderSelectedProcessCommandDetail()}