From 1be22edea4d4b0af4e5292a6d1fc300a78962680 Mon Sep 17 00:00:00 2001 From: Davis McPhee Date: Thu, 7 Nov 2024 22:35:26 -0400 Subject: [PATCH] Update functional tests --- .../context_awareness/_data_source_profile.ts | 242 ------------ .../discover/context_awareness/_framework.ts | 96 +++++ .../context_awareness/_root_profile.ts | 55 --- .../discover/context_awareness/_telemetry.ts | 2 +- .../extensions/_get_cell_renderers.ts | 330 +++------------- .../extensions/_get_doc_viewer.ts | 96 ++--- .../extensions/_get_row_indicator_provider.ts | 140 +------ .../apps/discover/context_awareness/index.ts | 3 +- .../context_awareness/_data_source_profile.ts | 238 ------------ .../discover/context_awareness/_framework.ts | 102 +++++ .../context_awareness/_root_profile.ts | 53 --- .../extensions/_get_cell_renderers.ts | 355 ++++-------------- .../extensions/_get_doc_viewer.ts | 118 ++---- .../extensions/_get_row_indicator_provider.ts | 134 +------ .../discover/context_awareness/index.ts | 3 +- .../context_awareness/_get_cell_renderers.ts | 353 +++++++++++++++++ .../context_awareness/_get_doc_viewer.ts | 127 +++++++ .../_get_row_indicator_provider.ts | 144 +++++++ .../discover/context_awareness/index.ts | 42 +++ .../test_suites/observability/index.ts | 1 + 20 files changed, 1076 insertions(+), 1558 deletions(-) delete mode 100644 test/functional/apps/discover/context_awareness/_data_source_profile.ts create mode 100644 test/functional/apps/discover/context_awareness/_framework.ts delete mode 100644 test/functional/apps/discover/context_awareness/_root_profile.ts delete mode 100644 x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/_data_source_profile.ts create mode 100644 x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/_framework.ts delete mode 100644 x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/_root_profile.ts create mode 100644 x-pack/test_serverless/functional/test_suites/observability/discover/context_awareness/_get_cell_renderers.ts create mode 100644 x-pack/test_serverless/functional/test_suites/observability/discover/context_awareness/_get_doc_viewer.ts create mode 100644 x-pack/test_serverless/functional/test_suites/observability/discover/context_awareness/_get_row_indicator_provider.ts create mode 100644 x-pack/test_serverless/functional/test_suites/observability/discover/context_awareness/index.ts diff --git a/test/functional/apps/discover/context_awareness/_data_source_profile.ts b/test/functional/apps/discover/context_awareness/_data_source_profile.ts deleted file mode 100644 index eeffafa38cd4e..0000000000000 --- a/test/functional/apps/discover/context_awareness/_data_source_profile.ts +++ /dev/null @@ -1,242 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import kbnRison from '@kbn/rison'; -import expect from '@kbn/expect'; -import type { FtrProviderContext } from '../ftr_provider_context'; - -export default function ({ getService, getPageObjects }: FtrProviderContext) { - const { common, discover, unifiedFieldList } = getPageObjects([ - 'common', - 'discover', - 'unifiedFieldList', - ]); - const testSubjects = getService('testSubjects'); - const dataViews = getService('dataViews'); - const dataGrid = getService('dataGrid'); - const retry = getService('retry'); - - describe('data source profile', () => { - describe('ES|QL mode', () => { - describe('cell renderers', () => { - it('should render custom @timestamp but not custom log.level', async () => { - const state = kbnRison.encode({ - dataSource: { type: 'esql' }, - query: { esql: 'from my-example-* | sort @timestamp desc' }, - }); - await common.navigateToActualUrl('discover', `?_a=${state}`, { - ensureCurrentUrl: false, - }); - await discover.waitUntilSearchingHasFinished(); - await unifiedFieldList.clickFieldListItemAdd('@timestamp'); - await unifiedFieldList.clickFieldListItemAdd('log.level'); - const timestamps = await testSubjects.findAll('exampleRootProfileTimestamp'); - expect(timestamps).to.have.length(6); - expect(await timestamps[0].getVisibleText()).to.be('2024-06-10T16:30:00.000Z'); - expect(await timestamps[5].getVisibleText()).to.be('2024-06-10T14:00:00.000Z'); - const logLevels = await testSubjects.findAll('exampleDataSourceProfileLogLevel', 2500); - expect(logLevels).to.have.length(0); - }); - - it('should render custom @timestamp and custom log.level', async () => { - const state = kbnRison.encode({ - dataSource: { type: 'esql' }, - query: { esql: 'from my-example-logs | sort @timestamp desc' }, - }); - await common.navigateToActualUrl('discover', `?_a=${state}`, { - ensureCurrentUrl: false, - }); - await discover.waitUntilSearchingHasFinished(); - await unifiedFieldList.clickFieldListItemAdd('@timestamp'); - await unifiedFieldList.clickFieldListItemAdd('log.level'); - const timestamps = await testSubjects.findAll('exampleRootProfileTimestamp'); - expect(timestamps).to.have.length(3); - expect(await timestamps[0].getVisibleText()).to.be('2024-06-10T16:00:00.000Z'); - expect(await timestamps[2].getVisibleText()).to.be('2024-06-10T14:00:00.000Z'); - const logLevels = await testSubjects.findAll('exampleDataSourceProfileLogLevel'); - expect(logLevels).to.have.length(3); - expect(await logLevels[0].getVisibleText()).to.be('Debug'); - expect(await logLevels[2].getVisibleText()).to.be('Info'); - }); - }); - - describe('doc viewer extension', () => { - it('should not render custom doc viewer view', async () => { - const state = kbnRison.encode({ - dataSource: { type: 'esql' }, - query: { esql: 'from my-example-* | sort @timestamp desc' }, - }); - await common.navigateToActualUrl('discover', `?_a=${state}`, { - ensureCurrentUrl: false, - }); - await discover.waitUntilSearchingHasFinished(); - await dataGrid.clickRowToggle({ rowIndex: 0 }); - await testSubjects.existOrFail('docViewerTab-doc_view_table'); - await testSubjects.existOrFail('docViewerTab-doc_view_source'); - await testSubjects.missingOrFail('docViewerTab-doc_view_example'); - expect(await testSubjects.getVisibleText('docViewerRowDetailsTitle')).to.be('Result'); - }); - - it('should render custom doc viewer view', async () => { - const state = kbnRison.encode({ - dataSource: { type: 'esql' }, - query: { esql: 'from my-example-logs | sort @timestamp desc' }, - }); - await common.navigateToActualUrl('discover', `?_a=${state}`, { - ensureCurrentUrl: false, - }); - await discover.waitUntilSearchingHasFinished(); - await dataGrid.clickRowToggle({ rowIndex: 0 }); - await testSubjects.existOrFail('docViewerTab-doc_view_table'); - await testSubjects.existOrFail('docViewerTab-doc_view_source'); - await testSubjects.existOrFail('docViewerTab-doc_view_example'); - expect(await testSubjects.getVisibleText('docViewerRowDetailsTitle')).to.be('Record #0'); - }); - }); - - describe('custom context', () => { - it('should render formatted record in doc viewer using formatter from custom context', async () => { - const state = kbnRison.encode({ - dataSource: { type: 'esql' }, - query: { esql: 'from my-example-logs | sort @timestamp desc' }, - }); - await common.navigateToActualUrl('discover', `?_a=${state}`, { - ensureCurrentUrl: false, - }); - await discover.waitUntilSearchingHasFinished(); - await dataGrid.clickRowToggle({ rowIndex: 0, defaultTabId: 'doc_view_example' }); - await retry.try(async () => { - const formattedRecord = await testSubjects.find( - 'exampleDataSourceProfileDocViewRecord' - ); - expect(await formattedRecord.getVisibleText()).to.be( - JSON.stringify( - { - '@timestamp': '2024-06-10T16:00:00.000Z', - 'agent.name': 'java', - 'agent.name.text': 'java', - 'data_stream.type': 'logs', - 'log.level': 'debug', - message: 'This is a debug log', - 'service.name': 'product', - 'service.name.text': 'product', - }, - null, - 2 - ) - ); - }); - }); - }); - }); - - describe('data view mode', () => { - describe('cell renderers', () => { - it('should render custom @timestamp but not custom log.level', async () => { - await common.navigateToActualUrl('discover', undefined, { - ensureCurrentUrl: false, - }); - await dataViews.switchTo('my-example-*'); - await discover.waitUntilSearchingHasFinished(); - await unifiedFieldList.clickFieldListItemAdd('@timestamp'); - await unifiedFieldList.clickFieldListItemAdd('log.level'); - const timestamps = await testSubjects.findAll('exampleRootProfileTimestamp'); - expect(timestamps).to.have.length(6); - expect(await timestamps[0].getVisibleText()).to.be('2024-06-10T16:30:00.000Z'); - expect(await timestamps[5].getVisibleText()).to.be('2024-06-10T14:00:00.000Z'); - const logLevels = await testSubjects.findAll('exampleDataSourceProfileLogLevel', 2500); - expect(logLevels).to.have.length(0); - }); - - it('should render custom @timestamp and custom log.level', async () => { - await common.navigateToActualUrl('discover', undefined, { - ensureCurrentUrl: false, - }); - await dataViews.switchTo('my-example-logs'); - await discover.waitUntilSearchingHasFinished(); - await unifiedFieldList.clickFieldListItemAdd('@timestamp'); - await unifiedFieldList.clickFieldListItemAdd('log.level'); - const timestamps = await testSubjects.findAll('exampleRootProfileTimestamp'); - expect(timestamps).to.have.length(3); - expect(await timestamps[0].getVisibleText()).to.be('2024-06-10T16:00:00.000Z'); - expect(await timestamps[2].getVisibleText()).to.be('2024-06-10T14:00:00.000Z'); - const logLevels = await testSubjects.findAll('exampleDataSourceProfileLogLevel'); - expect(logLevels).to.have.length(3); - expect(await logLevels[0].getVisibleText()).to.be('Debug'); - expect(await logLevels[2].getVisibleText()).to.be('Info'); - }); - }); - - describe('doc viewer extension', () => { - it('should not render custom doc viewer view', async () => { - await common.navigateToActualUrl('discover', undefined, { - ensureCurrentUrl: false, - }); - await dataViews.switchTo('my-example-*'); - await discover.waitUntilSearchingHasFinished(); - await dataGrid.clickRowToggle({ rowIndex: 0 }); - await testSubjects.existOrFail('docViewerTab-doc_view_table'); - await testSubjects.existOrFail('docViewerTab-doc_view_source'); - await testSubjects.missingOrFail('docViewerTab-doc_view_example'); - expect(await testSubjects.getVisibleText('docViewerRowDetailsTitle')).to.be('Document'); - }); - - it('should render custom doc viewer view', async () => { - await common.navigateToActualUrl('discover', undefined, { - ensureCurrentUrl: false, - }); - await dataViews.switchTo('my-example-logs'); - await discover.waitUntilSearchingHasFinished(); - await dataGrid.clickRowToggle({ rowIndex: 0 }); - await testSubjects.existOrFail('docViewerTab-doc_view_table'); - await testSubjects.existOrFail('docViewerTab-doc_view_source'); - await testSubjects.existOrFail('docViewerTab-doc_view_example'); - expect(await testSubjects.getVisibleText('docViewerRowDetailsTitle')).to.be( - 'Record #my-example-logs::XdQFDpABfGznVC1bCHLo::' - ); - }); - }); - - describe('custom context', () => { - it('should render formatted record in doc viewer using formatter from custom context', async () => { - await common.navigateToActualUrl('discover', undefined, { - ensureCurrentUrl: false, - }); - await dataViews.switchTo('my-example-logs'); - await discover.waitUntilSearchingHasFinished(); - await dataGrid.clickRowToggle({ rowIndex: 0, defaultTabId: 'doc_view_example' }); - await retry.try(async () => { - const formattedRecord = await testSubjects.find( - 'exampleDataSourceProfileDocViewRecord' - ); - expect(await formattedRecord.getVisibleText()).to.be( - JSON.stringify( - { - '@timestamp': ['2024-06-10T16:00:00.000Z'], - 'agent.name': ['java'], - 'agent.name.text': ['java'], - 'data_stream.type': ['logs'], - 'log.level': ['debug'], - message: ['This is a debug log'], - 'service.name': ['product'], - 'service.name.text': ['product'], - _id: 'XdQFDpABfGznVC1bCHLo', - _index: 'my-example-logs', - _score: null, - }, - null, - 2 - ) - ); - }); - }); - }); - }); - }); -} diff --git a/test/functional/apps/discover/context_awareness/_framework.ts b/test/functional/apps/discover/context_awareness/_framework.ts new file mode 100644 index 0000000000000..31b5bd83c7b40 --- /dev/null +++ b/test/functional/apps/discover/context_awareness/_framework.ts @@ -0,0 +1,96 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import kbnRison from '@kbn/rison'; +import expect from '@kbn/expect'; +import type { FtrProviderContext } from '../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const { common, discover } = getPageObjects(['common', 'discover']); + const testSubjects = getService('testSubjects'); + const dataViews = getService('dataViews'); + const dataGrid = getService('dataGrid'); + const retry = getService('retry'); + + describe('framework', () => { + describe('ES|QL mode', () => { + describe('custom context', () => { + it('should render formatted record in doc viewer using formatter from custom context', async () => { + const state = kbnRison.encode({ + dataSource: { type: 'esql' }, + query: { esql: 'from my-example-logs | sort @timestamp desc' }, + }); + await common.navigateToActualUrl('discover', `?_a=${state}`, { + ensureCurrentUrl: false, + }); + await discover.waitUntilSearchingHasFinished(); + await dataGrid.clickRowToggle({ rowIndex: 0, defaultTabId: 'doc_view_example' }); + await retry.try(async () => { + const formattedRecord = await testSubjects.find( + 'exampleDataSourceProfileDocViewRecord' + ); + expect(await formattedRecord.getVisibleText()).to.be( + JSON.stringify( + { + '@timestamp': '2024-06-10T16:00:00.000Z', + 'agent.name': 'java', + 'agent.name.text': 'java', + 'data_stream.type': 'logs', + 'log.level': 'debug', + message: 'This is a debug log', + 'service.name': 'product', + 'service.name.text': 'product', + }, + null, + 2 + ) + ); + }); + }); + }); + }); + + describe('data view mode', () => { + describe('custom context', () => { + it('should render formatted record in doc viewer using formatter from custom context', async () => { + await common.navigateToActualUrl('discover', undefined, { + ensureCurrentUrl: false, + }); + await dataViews.switchTo('my-example-logs'); + await discover.waitUntilSearchingHasFinished(); + await dataGrid.clickRowToggle({ rowIndex: 0, defaultTabId: 'doc_view_example' }); + await retry.try(async () => { + const formattedRecord = await testSubjects.find( + 'exampleDataSourceProfileDocViewRecord' + ); + expect(await formattedRecord.getVisibleText()).to.be( + JSON.stringify( + { + '@timestamp': ['2024-06-10T16:00:00.000Z'], + 'agent.name': ['java'], + 'agent.name.text': ['java'], + 'data_stream.type': ['logs'], + 'log.level': ['debug'], + message: ['This is a debug log'], + 'service.name': ['product'], + 'service.name.text': ['product'], + _id: 'XdQFDpABfGznVC1bCHLo', + _index: 'my-example-logs', + _score: null, + }, + null, + 2 + ) + ); + }); + }); + }); + }); + }); +} diff --git a/test/functional/apps/discover/context_awareness/_root_profile.ts b/test/functional/apps/discover/context_awareness/_root_profile.ts deleted file mode 100644 index 59856d8ba8c1f..0000000000000 --- a/test/functional/apps/discover/context_awareness/_root_profile.ts +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import kbnRison from '@kbn/rison'; -import expect from '@kbn/expect'; -import type { FtrProviderContext } from '../ftr_provider_context'; - -export default function ({ getService, getPageObjects }: FtrProviderContext) { - const { common, discover } = getPageObjects(['common', 'discover']); - const testSubjects = getService('testSubjects'); - const dataViews = getService('dataViews'); - - describe('root profile', () => { - describe('ES|QL mode', () => { - describe('cell renderers', () => { - it('should render custom @timestamp', async () => { - const state = kbnRison.encode({ - dataSource: { type: 'esql' }, - query: { esql: 'from my-example-* | sort @timestamp desc' }, - }); - await common.navigateToActualUrl('discover', `?_a=${state}`, { - ensureCurrentUrl: false, - }); - await discover.waitUntilSearchingHasFinished(); - const timestamps = await testSubjects.findAll('exampleRootProfileTimestamp'); - expect(timestamps).to.have.length(6); - expect(await timestamps[0].getVisibleText()).to.be('2024-06-10T16:30:00.000Z'); - expect(await timestamps[5].getVisibleText()).to.be('2024-06-10T14:00:00.000Z'); - }); - }); - }); - - describe('data view mode', () => { - describe('cell renderers', () => { - it('should render custom @timestamp', async () => { - await common.navigateToActualUrl('discover', undefined, { - ensureCurrentUrl: false, - }); - await dataViews.switchTo('my-example-*'); - await discover.waitUntilSearchingHasFinished(); - const timestamps = await testSubjects.findAll('exampleRootProfileTimestamp'); - expect(timestamps).to.have.length(6); - expect(await timestamps[0].getVisibleText()).to.be('2024-06-10T16:30:00.000Z'); - expect(await timestamps[5].getVisibleText()).to.be('2024-06-10T14:00:00.000Z'); - }); - }); - }); - }); -} diff --git a/test/functional/apps/discover/context_awareness/_telemetry.ts b/test/functional/apps/discover/context_awareness/_telemetry.ts index 587de698f9336..6dbb297a8319c 100644 --- a/test/functional/apps/discover/context_awareness/_telemetry.ts +++ b/test/functional/apps/discover/context_awareness/_telemetry.ts @@ -29,7 +29,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const kibanaServer = getService('kibanaServer'); const dashboardAddPanel = getService('dashboardAddPanel'); - describe('telemetry', () => { + describe.only('telemetry', () => { describe('context', () => { before(async () => { await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); diff --git a/test/functional/apps/discover/context_awareness/extensions/_get_cell_renderers.ts b/test/functional/apps/discover/context_awareness/extensions/_get_cell_renderers.ts index e18f6c5860dd2..1a01735b77d65 100644 --- a/test/functional/apps/discover/context_awareness/extensions/_get_cell_renderers.ts +++ b/test/functional/apps/discover/context_awareness/extensions/_get_cell_renderers.ts @@ -9,23 +9,17 @@ import kbnRison from '@kbn/rison'; import expect from '@kbn/expect'; -import type { WebElementWrapper } from '@kbn/ftr-common-functional-ui-services'; import type { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { - const { common, discover, unifiedFieldList, header } = getPageObjects([ + const { common, discover, unifiedFieldList } = getPageObjects([ 'common', 'discover', 'unifiedFieldList', - 'header', ]); const esArchiver = getService('esArchiver'); const testSubjects = getService('testSubjects'); - const dataGrid = getService('dataGrid'); const dataViews = getService('dataViews'); - const queryBar = getService('queryBar'); - const browser = getService('browser'); - const retry = getService('retry'); describe('extension getCellRenderers', () => { before(async () => { @@ -37,316 +31,114 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); describe('ES|QL mode', () => { - describe('Log Level Badge Cell', () => { - it('should render log.level badge cell', async () => { + describe('root profile', () => { + it('should render custom @timestamp', async () => { const state = kbnRison.encode({ dataSource: { type: 'esql' }, - query: { - esql: 'from my-example-logs,logstash* | sort @timestamp desc | where `log.level` is not null', - }, + query: { esql: 'from my-example-* | sort @timestamp desc' }, }); await common.navigateToActualUrl('discover', `?_a=${state}`, { ensureCurrentUrl: false, }); - await header.waitUntilLoadingHasFinished(); await discover.waitUntilSearchingHasFinished(); - await unifiedFieldList.clickFieldListItemAdd('log.level'); - await header.waitUntilLoadingHasFinished(); - await discover.waitUntilSearchingHasFinished(); - - const firstCell = await dataGrid.getCellElementExcludingControlColumns(0, 0); - const logLevelBadge = await firstCell.findByTestSubject('*logLevelBadgeCell-'); - expect(await logLevelBadge.getVisibleText()).to.be('debug'); - expect(await logLevelBadge.getComputedStyle('background-color')).to.be( - 'rgba(190, 207, 227, 1)' - ); - }); - - it("should not render log.level badge cell if it's not a logs data source", async () => { - const state = kbnRison.encode({ - dataSource: { type: 'esql' }, - query: { - esql: 'from my-example* | sort @timestamp desc | where `log.level` is not null', - }, - }); - await common.navigateToActualUrl('discover', `?_a=${state}`, { - ensureCurrentUrl: false, - }); - await header.waitUntilLoadingHasFinished(); - await discover.waitUntilSearchingHasFinished(); - await unifiedFieldList.clickFieldListItemAdd('log.level'); - await header.waitUntilLoadingHasFinished(); - await discover.waitUntilSearchingHasFinished(); - - await retry.try(async () => { - const firstCell = await dataGrid.getCellElementExcludingControlColumns(0, 0); - expect(await firstCell.getVisibleText()).to.be('debug'); - await testSubjects.missingOrFail('*logLevelBadgeCell-'); - }); + const timestamps = await testSubjects.findAll('exampleRootProfileTimestamp'); + expect(timestamps).to.have.length(6); + expect(await timestamps[0].getVisibleText()).to.be('2024-06-10T16:30:00.000Z'); + expect(await timestamps[5].getVisibleText()).to.be('2024-06-10T14:00:00.000Z'); }); }); - describe('Service Name Cell', () => { - it('should render service.name cell', async () => { + describe('data source profile', () => { + it('should render custom @timestamp but not custom log.level', async () => { const state = kbnRison.encode({ dataSource: { type: 'esql' }, - query: { - esql: 'from my-example-logs,logstash* | sort @timestamp desc | where `service.name` is not null', - }, + query: { esql: 'from my-example-* | sort @timestamp desc' }, }); await common.navigateToActualUrl('discover', `?_a=${state}`, { ensureCurrentUrl: false, }); - await header.waitUntilLoadingHasFinished(); await discover.waitUntilSearchingHasFinished(); - await unifiedFieldList.clickFieldListItemAdd('service.name'); - await header.waitUntilLoadingHasFinished(); - await discover.waitUntilSearchingHasFinished(); - - const firstCell = await dataGrid.getCellElementExcludingControlColumns(0, 0); - const lastCell = await dataGrid.getCellElementExcludingControlColumns(2, 0); - const firstServiceNameCell = await firstCell.findByTestSubject( - 'dataTableCellActionsPopover_service.name' - ); - const lastServiceNameCell = await lastCell.findByTestSubject( - 'dataTableCellActionsPopover_service.name' - ); - expect(await firstServiceNameCell.getVisibleText()).to.be('product'); - expect(await lastServiceNameCell.getVisibleText()).to.be('accounting'); - }); - - it("should not render service.name cell if it's not a logs data source", async () => { - const state = kbnRison.encode({ - dataSource: { type: 'esql' }, - query: { - esql: 'from my-example* | sort @timestamp desc | where `service.name` is not null', - }, - }); - await common.navigateToActualUrl('discover', `?_a=${state}`, { - ensureCurrentUrl: false, - }); - await header.waitUntilLoadingHasFinished(); - await discover.waitUntilSearchingHasFinished(); - await unifiedFieldList.clickFieldListItemAdd('service.name'); - await header.waitUntilLoadingHasFinished(); - await discover.waitUntilSearchingHasFinished(); - - await retry.try(async () => { - const firstCell = await dataGrid.getCellElementExcludingControlColumns(0, 0); - expect(await firstCell.getVisibleText()).to.be('product'); - await testSubjects.missingOrFail('dataTableCellActionsPopover_service.name'); - }); - }); - }); - - describe('Summary column', () => { - it('should render a summary of the log entry replacing the original document', async () => { - const state = kbnRison.encode({ - dataSource: { type: 'esql' }, - query: { - esql: 'from my-example-logs,logstash* | sort @timestamp desc | where `message` is not null', - }, - }); - await common.navigateToActualUrl('discover', `?_a=${state}`, { - ensureCurrentUrl: false, - }); - await header.waitUntilLoadingHasFinished(); - await discover.waitUntilSearchingHasFinished(); - - await testSubjects.existOrFail('discoverDataTableMessageValue'); + await unifiedFieldList.clickFieldListItemAdd('@timestamp'); + await unifiedFieldList.clickFieldListItemAdd('log.level'); + const timestamps = await testSubjects.findAll('exampleRootProfileTimestamp'); + expect(timestamps).to.have.length(6); + expect(await timestamps[0].getVisibleText()).to.be('2024-06-10T16:30:00.000Z'); + expect(await timestamps[5].getVisibleText()).to.be('2024-06-10T14:00:00.000Z'); + const logLevels = await testSubjects.findAll('exampleDataSourceProfileLogLevel', 2500); + expect(logLevels).to.have.length(0); }); - it('should NOT render the summary column if the source does not match logs', async () => { + it('should render custom @timestamp and custom log.level', async () => { const state = kbnRison.encode({ dataSource: { type: 'esql' }, - query: { - esql: 'from my-example-*', - }, + query: { esql: 'from my-example-logs | sort @timestamp desc' }, }); await common.navigateToActualUrl('discover', `?_a=${state}`, { ensureCurrentUrl: false, }); - await header.waitUntilLoadingHasFinished(); await discover.waitUntilSearchingHasFinished(); - - await testSubjects.missingOrFail('discoverDataTableMessageValue'); + await unifiedFieldList.clickFieldListItemAdd('@timestamp'); + await unifiedFieldList.clickFieldListItemAdd('log.level'); + const timestamps = await testSubjects.findAll('exampleRootProfileTimestamp'); + expect(timestamps).to.have.length(3); + expect(await timestamps[0].getVisibleText()).to.be('2024-06-10T16:00:00.000Z'); + expect(await timestamps[2].getVisibleText()).to.be('2024-06-10T14:00:00.000Z'); + const logLevels = await testSubjects.findAll('exampleDataSourceProfileLogLevel'); + expect(logLevels).to.have.length(3); + expect(await logLevels[0].getVisibleText()).to.be('Debug'); + expect(await logLevels[2].getVisibleText()).to.be('Info'); }); }); }); describe('data view mode', () => { - describe('Log Level Badge Cell', () => { - it('should render log.level badge cell', async () => { - await common.navigateToActualUrl('discover', undefined, { - ensureCurrentUrl: false, - }); - await header.waitUntilLoadingHasFinished(); - await discover.waitUntilSearchingHasFinished(); - await dataViews.switchToAndValidate('my-example-logs,logstash*'); - await queryBar.setQuery('log.level:*'); - await queryBar.submitQuery(); - await header.waitUntilLoadingHasFinished(); - await discover.waitUntilSearchingHasFinished(); - await unifiedFieldList.clickFieldListItemAdd('log.level'); - await header.waitUntilLoadingHasFinished(); - await discover.waitUntilSearchingHasFinished(); - - let firstCell: WebElementWrapper; - let logLevelBadge: WebElementWrapper; - - await retry.try(async () => { - firstCell = await dataGrid.getCellElementExcludingControlColumns(0, 1); - logLevelBadge = await firstCell.findByTestSubject('*logLevelBadgeCell-'); - expect(await logLevelBadge.getVisibleText()).to.be('debug'); - expect(await logLevelBadge.getComputedStyle('background-color')).to.be( - 'rgba(190, 207, 227, 1)' - ); - }); - - // check Surrounding docs page - await dataGrid.clickRowToggle(); - const [, surroundingActionEl] = await dataGrid.getRowActions(); - await surroundingActionEl.click(); - await header.waitUntilLoadingHasFinished(); - await browser.refresh(); - await header.waitUntilLoadingHasFinished(); - - await retry.try(async () => { - firstCell = await dataGrid.getCellElementExcludingControlColumns(0, 1); - logLevelBadge = await firstCell.findByTestSubject('*logLevelBadgeCell-'); - expect(await logLevelBadge.getVisibleText()).to.be('debug'); - expect(await logLevelBadge.getComputedStyle('background-color')).to.be( - 'rgba(190, 207, 227, 1)' - ); - }); - }); - - it("should not render log.level badge cell if it's not a logs data source", async () => { + describe('root profile', () => { + it('should render custom @timestamp', async () => { await common.navigateToActualUrl('discover', undefined, { ensureCurrentUrl: false, }); - await header.waitUntilLoadingHasFinished(); - await discover.waitUntilSearchingHasFinished(); - await dataViews.switchToAndValidate('my-example-*'); - await queryBar.setQuery('log.level:*'); - await queryBar.submitQuery(); - await header.waitUntilLoadingHasFinished(); - await discover.waitUntilSearchingHasFinished(); - await unifiedFieldList.clickFieldListItemAdd('log.level'); - await header.waitUntilLoadingHasFinished(); + await dataViews.switchTo('my-example-*'); await discover.waitUntilSearchingHasFinished(); - - let firstCell: WebElementWrapper; - - await retry.try(async () => { - firstCell = await dataGrid.getCellElementExcludingControlColumns(0, 1); - expect(await firstCell.getVisibleText()).to.be('debug'); - await testSubjects.missingOrFail('*logLevelBadgeCell-'); - }); - - // check Surrounding docs page - await dataGrid.clickRowToggle(); - const [, surroundingActionEl] = await dataGrid.getRowActions(); - await surroundingActionEl.click(); - await header.waitUntilLoadingHasFinished(); - await browser.refresh(); - await header.waitUntilLoadingHasFinished(); - - await retry.try(async () => { - firstCell = await dataGrid.getCellElementExcludingControlColumns(1, 1); - expect(await firstCell.getVisibleText()).to.be('debug'); - await testSubjects.missingOrFail('*logLevelBadgeCell-'); - }); + const timestamps = await testSubjects.findAll('exampleRootProfileTimestamp'); + expect(timestamps).to.have.length(6); + expect(await timestamps[0].getVisibleText()).to.be('2024-06-10T16:30:00.000Z'); + expect(await timestamps[5].getVisibleText()).to.be('2024-06-10T14:00:00.000Z'); }); }); - describe('Service Name Cell', () => { - it('should render service.name cell', async () => { + describe('data source profile', () => { + it('should render custom @timestamp but not custom log.level', async () => { await common.navigateToActualUrl('discover', undefined, { ensureCurrentUrl: false, }); - await header.waitUntilLoadingHasFinished(); + await dataViews.switchTo('my-example-*'); await discover.waitUntilSearchingHasFinished(); - await dataViews.switchToAndValidate('my-example-logs,logstash*'); - await queryBar.setQuery('service.name:*'); - await queryBar.submitQuery(); - await header.waitUntilLoadingHasFinished(); - await discover.waitUntilSearchingHasFinished(); - await unifiedFieldList.clickFieldListItemAdd('service.name'); - await header.waitUntilLoadingHasFinished(); - await discover.waitUntilSearchingHasFinished(); - - let firstCell: WebElementWrapper; - let lastCell: WebElementWrapper; - - await retry.try(async () => { - firstCell = await dataGrid.getCellElementExcludingControlColumns(0, 1); - lastCell = await dataGrid.getCellElementExcludingControlColumns(2, 1); - const firstServiceNameCell = await firstCell.findByTestSubject( - 'dataTableCellActionsPopover_service.name' - ); - const lastServiceNameCell = await lastCell.findByTestSubject( - 'dataTableCellActionsPopover_service.name' - ); - expect(await firstServiceNameCell.getVisibleText()).to.be('product'); - expect(await lastServiceNameCell.getVisibleText()).to.be('accounting'); - }); - }); - - it("should not render service.name cell if it's not a logs data source", async () => { - await common.navigateToActualUrl('discover', undefined, { - ensureCurrentUrl: false, - }); - await header.waitUntilLoadingHasFinished(); - await discover.waitUntilSearchingHasFinished(); - await dataViews.switchToAndValidate('my-example-*'); - await queryBar.setQuery('service.name:*'); - await queryBar.submitQuery(); - await header.waitUntilLoadingHasFinished(); - await discover.waitUntilSearchingHasFinished(); - await unifiedFieldList.clickFieldListItemAdd('service.name'); - await header.waitUntilLoadingHasFinished(); - await discover.waitUntilSearchingHasFinished(); - - let firstCell: WebElementWrapper; - let lastCell: WebElementWrapper; - - await retry.try(async () => { - firstCell = await dataGrid.getCellElementExcludingControlColumns(0, 1); - lastCell = await dataGrid.getCellElementExcludingControlColumns(2, 1); - - expect(await firstCell.getVisibleText()).to.be('product'); - expect(await lastCell.getVisibleText()).to.be('accounting'); - await testSubjects.missingOrFail('dataTableCellActionsPopover_service.name'); - }); - }); - }); - - describe('Summary column', () => { - it('should render a summary of the log entry replacing the original document', async () => { - await common.navigateToActualUrl('discover', undefined, { - ensureCurrentUrl: false, - }); - await header.waitUntilLoadingHasFinished(); - await discover.waitUntilSearchingHasFinished(); - await dataViews.switchToAndValidate('my-example-logs,logstash*'); - - await retry.try(async () => { - await testSubjects.existOrFail('discoverDataTableMessageValue'); - }); + await unifiedFieldList.clickFieldListItemAdd('@timestamp'); + await unifiedFieldList.clickFieldListItemAdd('log.level'); + const timestamps = await testSubjects.findAll('exampleRootProfileTimestamp'); + expect(timestamps).to.have.length(6); + expect(await timestamps[0].getVisibleText()).to.be('2024-06-10T16:30:00.000Z'); + expect(await timestamps[5].getVisibleText()).to.be('2024-06-10T14:00:00.000Z'); + const logLevels = await testSubjects.findAll('exampleDataSourceProfileLogLevel', 2500); + expect(logLevels).to.have.length(0); }); - it('should NOT render the summary column if the source does not match logs', async () => { + it('should render custom @timestamp and custom log.level', async () => { await common.navigateToActualUrl('discover', undefined, { ensureCurrentUrl: false, }); - await header.waitUntilLoadingHasFinished(); + await dataViews.switchTo('my-example-logs'); await discover.waitUntilSearchingHasFinished(); - await dataViews.switchToAndValidate('my-example-*'); - - await retry.try(async () => { - await testSubjects.missingOrFail('discoverDataTableMessageValue'); - }); + await unifiedFieldList.clickFieldListItemAdd('@timestamp'); + await unifiedFieldList.clickFieldListItemAdd('log.level'); + const timestamps = await testSubjects.findAll('exampleRootProfileTimestamp'); + expect(timestamps).to.have.length(3); + expect(await timestamps[0].getVisibleText()).to.be('2024-06-10T16:00:00.000Z'); + expect(await timestamps[2].getVisibleText()).to.be('2024-06-10T14:00:00.000Z'); + const logLevels = await testSubjects.findAll('exampleDataSourceProfileLogLevel'); + expect(logLevels).to.have.length(3); + expect(await logLevels[0].getVisibleText()).to.be('Debug'); + expect(await logLevels[2].getVisibleText()).to.be('Info'); }); }); }); diff --git a/test/functional/apps/discover/context_awareness/extensions/_get_doc_viewer.ts b/test/functional/apps/discover/context_awareness/extensions/_get_doc_viewer.ts index 2bc410f00ac27..ac3ed7c7c6d5d 100644 --- a/test/functional/apps/discover/context_awareness/extensions/_get_doc_viewer.ts +++ b/test/functional/apps/discover/context_awareness/extensions/_get_doc_viewer.ts @@ -8,117 +8,77 @@ */ import kbnRison from '@kbn/rison'; +import expect from '@kbn/expect'; import type { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { - const { common, discover, header } = getPageObjects(['common', 'discover', 'header']); + const { common, discover } = getPageObjects(['common', 'discover']); const testSubjects = getService('testSubjects'); const dataViews = getService('dataViews'); const dataGrid = getService('dataGrid'); - const browser = getService('browser'); describe('extension getDocViewer', () => { describe('ES|QL mode', () => { - it('should render logs overview tab for logs data source', async () => { + it('should not render custom doc viewer view', async () => { const state = kbnRison.encode({ dataSource: { type: 'esql' }, - query: { esql: 'from my-example-logs | sort @timestamp desc' }, + query: { esql: 'from my-example-* | sort @timestamp desc' }, }); await common.navigateToActualUrl('discover', `?_a=${state}`, { ensureCurrentUrl: false, }); await discover.waitUntilSearchingHasFinished(); - await dataGrid.clickRowToggle(); + await dataGrid.clickRowToggle({ rowIndex: 0 }); await testSubjects.existOrFail('docViewerTab-doc_view_table'); - await testSubjects.existOrFail('docViewerTab-doc_view_logs_overview'); - await dataGrid.clickDocViewerTab('doc_view_logs_overview'); - await testSubjects.existOrFail('unifiedDocViewLogsOverviewHeader'); + await testSubjects.existOrFail('docViewerTab-doc_view_source'); + await testSubjects.missingOrFail('docViewerTab-doc_view_example'); + expect(await testSubjects.getVisibleText('docViewerRowDetailsTitle')).to.be('Result'); }); - it('should not render logs overview tab for non-logs data source', async () => { + it('should render custom doc viewer view', async () => { const state = kbnRison.encode({ dataSource: { type: 'esql' }, - query: { esql: 'from my-example-metrics | sort @timestamp desc' }, + query: { esql: 'from my-example-logs | sort @timestamp desc' }, }); await common.navigateToActualUrl('discover', `?_a=${state}`, { ensureCurrentUrl: false, }); await discover.waitUntilSearchingHasFinished(); - await dataGrid.clickRowToggle(); + await dataGrid.clickRowToggle({ rowIndex: 0 }); await testSubjects.existOrFail('docViewerTab-doc_view_table'); - await testSubjects.missingOrFail('docViewerTab-doc_view_logs_overview'); + await testSubjects.existOrFail('docViewerTab-doc_view_source'); + await testSubjects.existOrFail('docViewerTab-doc_view_example'); + expect(await testSubjects.getVisibleText('docViewerRowDetailsTitle')).to.be('Record #0'); }); }); describe('data view mode', () => { - it('should render logs overview tab for logs data source', async () => { + it('should not render custom doc viewer view', async () => { await common.navigateToActualUrl('discover', undefined, { ensureCurrentUrl: false, }); - await dataViews.switchTo('my-example-logs'); + await dataViews.switchTo('my-example-*'); await discover.waitUntilSearchingHasFinished(); - await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('docViewerTab-doc_view_table'); - await testSubjects.existOrFail('docViewerTab-doc_view_logs_overview'); - await dataGrid.clickDocViewerTab('doc_view_logs_overview'); - await testSubjects.existOrFail('unifiedDocViewLogsOverviewHeader'); - - // check Surrounding docs page - const [, surroundingActionEl] = await dataGrid.getRowActions(); - await surroundingActionEl.click(); - await header.waitUntilLoadingHasFinished(); - await browser.refresh(); - await header.waitUntilLoadingHasFinished(); - - await dataGrid.clickRowToggle({ isAnchorRow: true }); - await testSubjects.existOrFail('docViewerTab-doc_view_table'); - await testSubjects.existOrFail('docViewerTab-doc_view_logs_overview'); - await dataGrid.clickDocViewerTab('doc_view_logs_overview'); - await testSubjects.existOrFail('unifiedDocViewLogsOverviewHeader'); - - // check Single doc page - const [singleDocActionEl] = await dataGrid.getRowActions(); - await singleDocActionEl.click(); - await header.waitUntilLoadingHasFinished(); - await browser.refresh(); - await header.waitUntilLoadingHasFinished(); - + await dataGrid.clickRowToggle({ rowIndex: 0 }); await testSubjects.existOrFail('docViewerTab-doc_view_table'); - await testSubjects.existOrFail('docViewerTab-doc_view_logs_overview'); - await dataGrid.clickDocViewerTab('doc_view_logs_overview'); - await testSubjects.existOrFail('unifiedDocViewLogsOverviewHeader'); + await testSubjects.existOrFail('docViewerTab-doc_view_source'); + await testSubjects.missingOrFail('docViewerTab-doc_view_example'); + expect(await testSubjects.getVisibleText('docViewerRowDetailsTitle')).to.be('Document'); }); - it('should not render logs overview tab for non-logs data source', async () => { + it('should render custom doc viewer view', async () => { await common.navigateToActualUrl('discover', undefined, { ensureCurrentUrl: false, }); - await dataViews.switchTo('my-example-metrics'); + await dataViews.switchTo('my-example-logs'); await discover.waitUntilSearchingHasFinished(); - await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('docViewerTab-doc_view_table'); - await testSubjects.missingOrFail('docViewerTab-doc_view_logs_overview'); - - // check Surrounding docs page - const [, surroundingActionEl] = await dataGrid.getRowActions(); - await surroundingActionEl.click(); - await header.waitUntilLoadingHasFinished(); - await browser.refresh(); - await header.waitUntilLoadingHasFinished(); - - await dataGrid.clickRowToggle({ isAnchorRow: true }); - await testSubjects.existOrFail('docViewerTab-doc_view_table'); - await testSubjects.missingOrFail('docViewerTab-doc_view_logs_overview'); - - // check Single doc page - const [singleDocActionEl] = await dataGrid.getRowActions(); - await singleDocActionEl.click(); - await header.waitUntilLoadingHasFinished(); - await browser.refresh(); - await header.waitUntilLoadingHasFinished(); - + await dataGrid.clickRowToggle({ rowIndex: 0 }); await testSubjects.existOrFail('docViewerTab-doc_view_table'); - await testSubjects.missingOrFail('docViewerTab-doc_view_logs_overview'); + await testSubjects.existOrFail('docViewerTab-doc_view_source'); + await testSubjects.existOrFail('docViewerTab-doc_view_example'); + expect(await testSubjects.getVisibleText('docViewerRowDetailsTitle')).to.be( + 'Record #my-example-logs::XdQFDpABfGznVC1bCHLo::' + ); }); }); }); diff --git a/test/functional/apps/discover/context_awareness/extensions/_get_row_indicator_provider.ts b/test/functional/apps/discover/context_awareness/extensions/_get_row_indicator_provider.ts index 014c86d1fd296..eec9ad526624f 100644 --- a/test/functional/apps/discover/context_awareness/extensions/_get_row_indicator_provider.ts +++ b/test/functional/apps/discover/context_awareness/extensions/_get_row_indicator_provider.ts @@ -7,146 +7,10 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import kbnRison from '@kbn/rison'; -import expect from '@kbn/expect'; import type { FtrProviderContext } from '../../ftr_provider_context'; -export default function ({ getService, getPageObjects }: FtrProviderContext) { - const { common, timePicker, discover, header } = getPageObjects([ - 'common', - 'timePicker', - 'discover', - 'header', - ]); - const esArchiver = getService('esArchiver'); - const testSubjects = getService('testSubjects'); - const dataGrid = getService('dataGrid'); - const browser = getService('browser'); - const dataViews = getService('dataViews'); - +export default function ({}: FtrProviderContext) { describe('extension getRowIndicatorProvider', () => { - before(async () => { - await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); - }); - - after(async () => { - await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); - }); - - it('should not render log.level row indicators for logs data source without a log.level field', async () => { - const state = kbnRison.encode({ - dataSource: { type: 'esql' }, - query: { esql: 'from logstash* | sort @timestamp desc' }, - }); - await common.navigateToActualUrl('discover', `?_a=${state}`, { - ensureCurrentUrl: false, - }); - await discover.waitUntilSearchingHasFinished(); - await timePicker.setDefaultAbsoluteRange(); - await discover.waitUntilSearchingHasFinished(); - // logstash does not have log.level field, so the color indicator should not be rendered - await testSubjects.existOrFail('euiDataGridBody'); - await testSubjects.missingOrFail('dataGridHeaderCell-colorIndicator'); - - // switch the time frame back - await browser.goBack(); - await discover.waitUntilSearchingHasFinished(); - }); - - it('should not render log.level row indicators if not a logs data source', async () => { - const state = kbnRison.encode({ - dataSource: { type: 'esql' }, - query: { esql: 'from my-example* | sort @timestamp desc' }, - }); - await common.navigateToActualUrl('discover', `?_a=${state}`, { - ensureCurrentUrl: false, - }); - await discover.waitUntilSearchingHasFinished(); - // my-example* has a log.level field, but it's not matching the logs profile, so the color indicator should not be rendered - await testSubjects.existOrFail('euiDataGridBody'); - await testSubjects.missingOrFail('dataGridHeaderCell-colorIndicator'); - }); - - it('should render log.level row indicators', async () => { - const state = kbnRison.encode({ - dataSource: { type: 'esql' }, - query: { - esql: 'from my-example-logs,logstash* | sort @timestamp desc | where `log.level` is not null', - }, - }); - await common.navigateToActualUrl('discover', `?_a=${state}`, { - ensureCurrentUrl: false, - }); - await discover.waitUntilSearchingHasFinished(); - // in this case it's matching the logs data source profile and has a log.level field, so the color indicator should be rendered - await testSubjects.existOrFail('dataGridHeaderCell-colorIndicator'); - const firstCell = await dataGrid.getCellElement(0, 0); - const firstColorIndicator = await firstCell.findByTestSubject( - 'unifiedDataTableRowColorIndicatorCell' - ); - expect(await firstColorIndicator.getComputedStyle('background-color')).to.be( - 'rgba(190, 207, 227, 1)' - ); - expect(await firstColorIndicator.getAttribute('title')).to.be('Debug'); - - const secondCell = await dataGrid.getCellElement(1, 0); - const secondColorIndicator = await secondCell.findByTestSubject( - 'unifiedDataTableRowColorIndicatorCell' - ); - expect(await secondColorIndicator.getComputedStyle('background-color')).to.be( - 'rgba(223, 147, 82, 1)' - ); - expect(await secondColorIndicator.getAttribute('title')).to.be('Error'); - }); - - it('should render log.level row indicators on Surrounding documents page', async () => { - await common.navigateToApp('discover'); - await dataViews.switchTo('my-example-logs,logstash*'); - await discover.waitUntilSearchingHasFinished(); - await dataGrid.clickRowToggle({ rowIndex: 0 }); - const [, surroundingActionEl] = await dataGrid.getRowActions(); - await surroundingActionEl.click(); - await header.waitUntilLoadingHasFinished(); - - let anchorCell = await dataGrid.getCellElement(0, 0); - let anchorColorIndicator = await anchorCell.findByTestSubject( - 'unifiedDataTableRowColorIndicatorCell' - ); - expect(await anchorColorIndicator.getAttribute('title')).to.be('Debug'); - expect(await anchorColorIndicator.getComputedStyle('background-color')).to.be( - 'rgba(190, 207, 227, 1)' - ); - - let nextCell = await dataGrid.getCellElement(1, 0); - let nextColorIndicator = await nextCell.findByTestSubject( - 'unifiedDataTableRowColorIndicatorCell' - ); - expect(await nextColorIndicator.getAttribute('title')).to.be('Error'); - expect(await nextColorIndicator.getComputedStyle('background-color')).to.be( - 'rgba(223, 147, 82, 1)' - ); - - await browser.refresh(); - await header.waitUntilLoadingHasFinished(); - await discover.waitUntilSearchingHasFinished(); - - anchorCell = await dataGrid.getCellElement(0, 0); - anchorColorIndicator = await anchorCell.findByTestSubject( - 'unifiedDataTableRowColorIndicatorCell' - ); - expect(await anchorColorIndicator.getAttribute('title')).to.be('Debug'); - expect(await anchorColorIndicator.getComputedStyle('background-color')).to.be( - 'rgba(190, 207, 227, 1)' - ); - - nextCell = await dataGrid.getCellElement(1, 0); - nextColorIndicator = await nextCell.findByTestSubject( - 'unifiedDataTableRowColorIndicatorCell' - ); - expect(await nextColorIndicator.getAttribute('title')).to.be('Error'); - expect(await nextColorIndicator.getComputedStyle('background-color')).to.be( - 'rgba(223, 147, 82, 1)' - ); - }); + // TODO: Add an example profile implementation to test here }); } diff --git a/test/functional/apps/discover/context_awareness/index.ts b/test/functional/apps/discover/context_awareness/index.ts index 0edf18b7e9027..67ed647be728a 100644 --- a/test/functional/apps/discover/context_awareness/index.ts +++ b/test/functional/apps/discover/context_awareness/index.ts @@ -36,8 +36,7 @@ export default function ({ getService, getPageObjects, loadTestFile }: FtrProvid await timePicker.resetDefaultAbsoluteRangeViaUiSettings(); }); - loadTestFile(require.resolve('./_root_profile')); - loadTestFile(require.resolve('./_data_source_profile')); + loadTestFile(require.resolve('./_framework')); loadTestFile(require.resolve('./_telemetry')); loadTestFile(require.resolve('./extensions/_get_row_indicator_provider')); loadTestFile(require.resolve('./extensions/_get_row_additional_leading_controls')); diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/_data_source_profile.ts b/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/_data_source_profile.ts deleted file mode 100644 index 960a79d4bba5d..0000000000000 --- a/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/_data_source_profile.ts +++ /dev/null @@ -1,238 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import kbnRison from '@kbn/rison'; -import expect from '@kbn/expect'; -import type { FtrProviderContext } from '../../../../ftr_provider_context'; - -export default function ({ getService, getPageObjects }: FtrProviderContext) { - const PageObjects = getPageObjects([ - 'svlCommonPage', - 'common', - 'timePicker', - 'discover', - 'unifiedFieldList', - ]); - const testSubjects = getService('testSubjects'); - const dataViews = getService('dataViews'); - const dataGrid = getService('dataGrid'); - const retry = getService('retry'); - - describe('data source profile', () => { - before(async () => { - await PageObjects.svlCommonPage.loginAsAdmin(); - }); - - describe('ES|QL mode', () => { - describe('cell renderers', () => { - it('should not render custom @timestamp or log.level', async () => { - const state = kbnRison.encode({ - dataSource: { type: 'esql' }, - query: { esql: 'from my-example-* | sort @timestamp desc' }, - }); - await PageObjects.common.navigateToActualUrl('discover', `?_a=${state}`, { - ensureCurrentUrl: false, - }); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await PageObjects.unifiedFieldList.clickFieldListItemAdd('@timestamp'); - await PageObjects.unifiedFieldList.clickFieldListItemAdd('log.level'); - const timestamps = await testSubjects.findAll('exampleRootProfileTimestamp', 2500); - expect(timestamps).to.have.length(0); - const logLevels = await testSubjects.findAll('exampleDataSourceProfileLogLevel', 2500); - expect(logLevels).to.have.length(0); - }); - - it('should not render custom @timestamp but should render custom log.level', async () => { - const state = kbnRison.encode({ - dataSource: { type: 'esql' }, - query: { esql: 'from my-example-logs | sort @timestamp desc' }, - }); - await PageObjects.common.navigateToActualUrl('discover', `?_a=${state}`, { - ensureCurrentUrl: false, - }); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await PageObjects.unifiedFieldList.clickFieldListItemAdd('@timestamp'); - await PageObjects.unifiedFieldList.clickFieldListItemAdd('log.level'); - const timestamps = await testSubjects.findAll('exampleRootProfileTimestamp', 2500); - expect(timestamps).to.have.length(0); - const logLevels = await testSubjects.findAll('exampleDataSourceProfileLogLevel'); - expect(logLevels).to.have.length(3); - expect(await logLevels[0].getVisibleText()).to.be('Debug'); - expect(await logLevels[2].getVisibleText()).to.be('Info'); - }); - }); - - describe('doc viewer extension', () => { - it('should not render custom doc viewer view', async () => { - const state = kbnRison.encode({ - dataSource: { type: 'esql' }, - query: { esql: 'from my-example-* | sort @timestamp desc' }, - }); - await PageObjects.common.navigateToActualUrl('discover', `?_a=${state}`, { - ensureCurrentUrl: false, - }); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await dataGrid.clickRowToggle({ rowIndex: 0 }); - await testSubjects.existOrFail('docViewerTab-doc_view_table'); - await testSubjects.existOrFail('docViewerTab-doc_view_source'); - await testSubjects.missingOrFail('docViewerTab-doc_view_example'); - expect(await testSubjects.getVisibleText('docViewerRowDetailsTitle')).to.be('Result'); - }); - - it('should render custom doc viewer view', async () => { - const state = kbnRison.encode({ - dataSource: { type: 'esql' }, - query: { esql: 'from my-example-logs | sort @timestamp desc' }, - }); - await PageObjects.common.navigateToActualUrl('discover', `?_a=${state}`, { - ensureCurrentUrl: false, - }); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await dataGrid.clickRowToggle({ rowIndex: 0 }); - await testSubjects.existOrFail('docViewerTab-doc_view_table'); - await testSubjects.existOrFail('docViewerTab-doc_view_source'); - await testSubjects.existOrFail('docViewerTab-doc_view_example'); - expect(await testSubjects.getVisibleText('docViewerRowDetailsTitle')).to.be('Record #0'); - }); - }); - - describe('custom context', () => { - it('should render formatted record in doc viewer using formatter from custom context', async () => { - const state = kbnRison.encode({ - dataSource: { type: 'esql' }, - query: { esql: 'from my-example-logs | sort @timestamp desc' }, - }); - await PageObjects.common.navigateToActualUrl('discover', `?_a=${state}`, { - ensureCurrentUrl: false, - }); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await dataGrid.clickRowToggle({ rowIndex: 0, defaultTabId: 'doc_view_example' }); - await retry.try(async () => { - const formattedRecord = await testSubjects.find( - 'exampleDataSourceProfileDocViewRecord' - ); - expect(await formattedRecord.getVisibleText()).to.be( - JSON.stringify( - { - '@timestamp': '2024-06-10T16:00:00.000Z', - 'agent.name': 'java', - 'agent.name.text': 'java', - 'data_stream.type': 'logs', - 'log.level': 'debug', - message: 'This is a debug log', - 'service.name': 'product', - 'service.name.text': 'product', - }, - null, - 2 - ) - ); - }); - }); - }); - }); - - describe('data view mode', () => { - describe('cell renderers', () => { - it('should not render custom @timestamp or log.level', async () => { - await PageObjects.common.navigateToActualUrl('discover', undefined, { - ensureCurrentUrl: false, - }); - await dataViews.switchTo('my-example-*'); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await PageObjects.unifiedFieldList.clickFieldListItemAdd('@timestamp'); - await PageObjects.unifiedFieldList.clickFieldListItemAdd('log.level'); - const timestamps = await testSubjects.findAll('exampleRootProfileTimestamp', 2500); - expect(timestamps).to.have.length(0); - const logLevels = await testSubjects.findAll('exampleDataSourceProfileLogLevel', 2500); - expect(logLevels).to.have.length(0); - }); - - it('should not render custom @timestamp but should render custom log.level', async () => { - await PageObjects.common.navigateToActualUrl('discover', undefined, { - ensureCurrentUrl: false, - }); - await dataViews.switchTo('my-example-logs'); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await PageObjects.unifiedFieldList.clickFieldListItemAdd('@timestamp'); - await PageObjects.unifiedFieldList.clickFieldListItemAdd('log.level'); - const timestamps = await testSubjects.findAll('exampleRootProfileTimestamp', 2500); - expect(timestamps).to.have.length(0); - const logLevels = await testSubjects.findAll('exampleDataSourceProfileLogLevel'); - expect(logLevels).to.have.length(3); - expect(await logLevels[0].getVisibleText()).to.be('Debug'); - expect(await logLevels[2].getVisibleText()).to.be('Info'); - }); - }); - - describe('doc viewer extension', () => { - it('should not render custom doc viewer view', async () => { - await PageObjects.common.navigateToActualUrl('discover', undefined, { - ensureCurrentUrl: false, - }); - await dataViews.switchTo('my-example-*'); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await dataGrid.clickRowToggle({ rowIndex: 0 }); - await testSubjects.existOrFail('docViewerTab-doc_view_table'); - await testSubjects.existOrFail('docViewerTab-doc_view_source'); - await testSubjects.missingOrFail('docViewerTab-doc_view_example'); - expect(await testSubjects.getVisibleText('docViewerRowDetailsTitle')).to.be('Document'); - }); - - it('should render custom doc viewer view', async () => { - await PageObjects.common.navigateToActualUrl('discover', undefined, { - ensureCurrentUrl: false, - }); - await dataViews.switchTo('my-example-logs'); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await dataGrid.clickRowToggle({ rowIndex: 0 }); - await testSubjects.existOrFail('docViewerTab-doc_view_table'); - await testSubjects.existOrFail('docViewerTab-doc_view_source'); - await testSubjects.existOrFail('docViewerTab-doc_view_example'); - expect(await testSubjects.getVisibleText('docViewerRowDetailsTitle')).to.be( - 'Record #my-example-logs::XdQFDpABfGznVC1bCHLo::' - ); - }); - }); - - describe('custom context', () => { - it('should render formatted record in doc viewer using formatter from custom context', async () => { - await PageObjects.common.navigateToActualUrl('discover', undefined, { - ensureCurrentUrl: false, - }); - await dataViews.switchTo('my-example-logs'); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await dataGrid.clickRowToggle({ rowIndex: 0, defaultTabId: 'doc_view_example' }); - await retry.try(async () => { - const formattedRecord = await testSubjects.find( - 'exampleDataSourceProfileDocViewRecord' - ); - expect(await formattedRecord.getVisibleText()).to.be( - JSON.stringify( - { - '@timestamp': ['2024-06-10T16:00:00.000Z'], - 'agent.name': ['java'], - 'agent.name.text': ['java'], - 'data_stream.type': ['logs'], - 'log.level': ['debug'], - message: ['This is a debug log'], - 'service.name': ['product'], - 'service.name.text': ['product'], - _id: 'XdQFDpABfGznVC1bCHLo', - _index: 'my-example-logs', - _score: null, - }, - null, - 2 - ) - ); - }); - }); - }); - }); - }); -} diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/_framework.ts b/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/_framework.ts new file mode 100644 index 0000000000000..77204f0612d1b --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/_framework.ts @@ -0,0 +1,102 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import kbnRison from '@kbn/rison'; +import expect from '@kbn/expect'; +import type { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const { common, discover, svlCommonPage } = getPageObjects([ + 'common', + 'discover', + 'svlCommonPage', + ]); + const testSubjects = getService('testSubjects'); + const dataViews = getService('dataViews'); + const dataGrid = getService('dataGrid'); + const retry = getService('retry'); + + describe('framework', () => { + before(async () => { + await svlCommonPage.loginAsAdmin(); + }); + + describe('ES|QL mode', () => { + describe('custom context', () => { + it('should render formatted record in doc viewer using formatter from custom context', async () => { + const state = kbnRison.encode({ + dataSource: { type: 'esql' }, + query: { esql: 'from my-example-logs | sort @timestamp desc' }, + }); + await common.navigateToActualUrl('discover', `?_a=${state}`, { + ensureCurrentUrl: false, + }); + await discover.waitUntilSearchingHasFinished(); + await dataGrid.clickRowToggle({ rowIndex: 0, defaultTabId: 'doc_view_example' }); + await retry.try(async () => { + const formattedRecord = await testSubjects.find( + 'exampleDataSourceProfileDocViewRecord' + ); + expect(await formattedRecord.getVisibleText()).to.be( + JSON.stringify( + { + '@timestamp': '2024-06-10T16:00:00.000Z', + 'agent.name': 'java', + 'agent.name.text': 'java', + 'data_stream.type': 'logs', + 'log.level': 'debug', + message: 'This is a debug log', + 'service.name': 'product', + 'service.name.text': 'product', + }, + null, + 2 + ) + ); + }); + }); + }); + }); + + describe('data view mode', () => { + describe('custom context', () => { + it('should render formatted record in doc viewer using formatter from custom context', async () => { + await common.navigateToActualUrl('discover', undefined, { + ensureCurrentUrl: false, + }); + await dataViews.switchTo('my-example-logs'); + await discover.waitUntilSearchingHasFinished(); + await dataGrid.clickRowToggle({ rowIndex: 0, defaultTabId: 'doc_view_example' }); + await retry.try(async () => { + const formattedRecord = await testSubjects.find( + 'exampleDataSourceProfileDocViewRecord' + ); + expect(await formattedRecord.getVisibleText()).to.be( + JSON.stringify( + { + '@timestamp': ['2024-06-10T16:00:00.000Z'], + 'agent.name': ['java'], + 'agent.name.text': ['java'], + 'data_stream.type': ['logs'], + 'log.level': ['debug'], + message: ['This is a debug log'], + 'service.name': ['product'], + 'service.name.text': ['product'], + _id: 'XdQFDpABfGznVC1bCHLo', + _index: 'my-example-logs', + _score: null, + }, + null, + 2 + ) + ); + }); + }); + }); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/_root_profile.ts b/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/_root_profile.ts deleted file mode 100644 index e7eb75384d67c..0000000000000 --- a/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/_root_profile.ts +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import kbnRison from '@kbn/rison'; -import expect from '@kbn/expect'; -import type { FtrProviderContext } from '../../../../ftr_provider_context'; - -export default function ({ getService, getPageObjects }: FtrProviderContext) { - const PageObjects = getPageObjects(['common', 'timePicker', 'discover', 'svlCommonPage']); - const testSubjects = getService('testSubjects'); - const dataViews = getService('dataViews'); - - describe('root profile', () => { - before(async () => { - await PageObjects.svlCommonPage.loginAsAdmin(); - }); - - describe('ES|QL mode', () => { - describe('cell renderers', () => { - it('should not render custom @timestamp', async () => { - const state = kbnRison.encode({ - dataSource: { type: 'esql' }, - query: { esql: 'from my-example-* | sort @timestamp desc' }, - }); - await PageObjects.common.navigateToActualUrl('discover', `?_a=${state}`, { - ensureCurrentUrl: false, - }); - await PageObjects.discover.waitUntilSearchingHasFinished(); - const timestamps = await testSubjects.findAll('exampleRootProfileTimestamp', 2500); - expect(timestamps).to.have.length(0); - }); - }); - }); - - describe('data view mode', () => { - describe('cell renderers', () => { - it('should not render custom @timestamp', async () => { - await PageObjects.common.navigateToActualUrl('discover', undefined, { - ensureCurrentUrl: false, - }); - await dataViews.switchTo('my-example-*'); - await PageObjects.discover.waitUntilSearchingHasFinished(); - const timestamps = await testSubjects.findAll('exampleRootProfileTimestamp', 2500); - expect(timestamps).to.have.length(0); - }); - }); - }); - }); -} diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_cell_renderers.ts b/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_cell_renderers.ts index b8503e0f8dcab..3cde279de80ca 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_cell_renderers.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_cell_renderers.ts @@ -7,28 +7,22 @@ import kbnRison from '@kbn/rison'; import expect from '@kbn/expect'; -import type { WebElementWrapper } from '@kbn/ftr-common-functional-ui-services'; import type { FtrProviderContext } from '../../../../../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { - const PageObjects = getPageObjects([ + const { common, discover, unifiedFieldList, svlCommonPage } = getPageObjects([ 'common', 'discover', 'unifiedFieldList', 'svlCommonPage', - 'header', ]); const esArchiver = getService('esArchiver'); const testSubjects = getService('testSubjects'); - const dataGrid = getService('dataGrid'); const dataViews = getService('dataViews'); - const queryBar = getService('queryBar'); - const browser = getService('browser'); - const retry = getService('retry'); describe('extension getCellRenderers', () => { before(async () => { - await PageObjects.svlCommonPage.loginAsAdmin(); + await svlCommonPage.loginAsAdmin(); await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); }); @@ -37,315 +31,114 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); describe('ES|QL mode', () => { - describe('Log Level Badge Cell', () => { - it('should render log.level badge cell', async () => { + describe('root profile', () => { + it('should render custom @timestamp', async () => { const state = kbnRison.encode({ dataSource: { type: 'esql' }, - query: { - esql: 'from my-example-logs,logstash* | sort @timestamp desc | where `log.level` is not null', - }, + query: { esql: 'from my-example-* | sort @timestamp desc' }, }); - await PageObjects.common.navigateToActualUrl('discover', `?_a=${state}`, { + await common.navigateToActualUrl('discover', `?_a=${state}`, { ensureCurrentUrl: false, }); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await PageObjects.unifiedFieldList.clickFieldListItemAdd('log.level'); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.discover.waitUntilSearchingHasFinished(); - - const firstCell = await dataGrid.getCellElementExcludingControlColumns(0, 0); - const logLevelBadge = await firstCell.findByTestSubject('*logLevelBadgeCell-'); - expect(await logLevelBadge.getVisibleText()).to.be('debug'); - expect(await logLevelBadge.getComputedStyle('background-color')).to.be( - 'rgba(190, 207, 227, 1)' - ); - }); - - it("should not render log.level badge cell if it's not a logs data source", async () => { - const state = kbnRison.encode({ - dataSource: { type: 'esql' }, - query: { - esql: 'from my-example* | sort @timestamp desc | where `log.level` is not null', - }, - }); - await PageObjects.common.navigateToActualUrl('discover', `?_a=${state}`, { - ensureCurrentUrl: false, - }); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await PageObjects.unifiedFieldList.clickFieldListItemAdd('log.level'); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.discover.waitUntilSearchingHasFinished(); - - await retry.try(async () => { - const firstCell = await dataGrid.getCellElementExcludingControlColumns(0, 0); - expect(await firstCell.getVisibleText()).to.be('debug'); - await testSubjects.missingOrFail('*logLevelBadgeCell-'); - }); + await discover.waitUntilSearchingHasFinished(); + const timestamps = await testSubjects.findAll('exampleRootProfileTimestamp'); + expect(timestamps).to.have.length(6); + expect(await timestamps[0].getVisibleText()).to.be('2024-06-10T16:30:00.000Z'); + expect(await timestamps[5].getVisibleText()).to.be('2024-06-10T14:00:00.000Z'); }); }); - describe('Service Name Cell', () => { - it('should render service.name cell', async () => { + describe('data source profile', () => { + it('should render custom @timestamp but not custom log.level', async () => { const state = kbnRison.encode({ dataSource: { type: 'esql' }, - query: { - esql: 'from my-example-logs,logstash* | sort @timestamp desc | where `service.name` is not null', - }, + query: { esql: 'from my-example-* | sort @timestamp desc' }, }); - await PageObjects.common.navigateToActualUrl('discover', `?_a=${state}`, { + await common.navigateToActualUrl('discover', `?_a=${state}`, { ensureCurrentUrl: false, }); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await PageObjects.unifiedFieldList.clickFieldListItemAdd('service.name'); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.discover.waitUntilSearchingHasFinished(); - - const firstCell = await dataGrid.getCellElementExcludingControlColumns(0, 0); - const lastCell = await dataGrid.getCellElementExcludingControlColumns(2, 0); - const firstServiceNameCell = await firstCell.findByTestSubject( - 'dataTableCellActionsPopover_service.name' - ); - const lastServiceNameCell = await lastCell.findByTestSubject( - 'dataTableCellActionsPopover_service.name' - ); - expect(await firstServiceNameCell.getVisibleText()).to.be('product'); - expect(await lastServiceNameCell.getVisibleText()).to.be('accounting'); + await discover.waitUntilSearchingHasFinished(); + await unifiedFieldList.clickFieldListItemAdd('@timestamp'); + await unifiedFieldList.clickFieldListItemAdd('log.level'); + const timestamps = await testSubjects.findAll('exampleRootProfileTimestamp'); + expect(timestamps).to.have.length(6); + expect(await timestamps[0].getVisibleText()).to.be('2024-06-10T16:30:00.000Z'); + expect(await timestamps[5].getVisibleText()).to.be('2024-06-10T14:00:00.000Z'); + const logLevels = await testSubjects.findAll('exampleDataSourceProfileLogLevel', 2500); + expect(logLevels).to.have.length(0); }); - it("should not render service.name cell if it's not a logs data source", async () => { + it('should render custom @timestamp and custom log.level', async () => { const state = kbnRison.encode({ dataSource: { type: 'esql' }, - query: { - esql: 'from my-example* | sort @timestamp desc | where `service.name` is not null', - }, + query: { esql: 'from my-example-logs | sort @timestamp desc' }, }); - await PageObjects.common.navigateToActualUrl('discover', `?_a=${state}`, { + await common.navigateToActualUrl('discover', `?_a=${state}`, { ensureCurrentUrl: false, }); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await PageObjects.unifiedFieldList.clickFieldListItemAdd('service.name'); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.discover.waitUntilSearchingHasFinished(); - - await retry.try(async () => { - const firstCell = await dataGrid.getCellElementExcludingControlColumns(0, 0); - expect(await firstCell.getVisibleText()).to.be('product'); - await testSubjects.missingOrFail('dataTableCellActionsPopover_service.name'); - }); - }); - }); - - describe('Summary column', () => { - it('should render a summary of the log entry replacing the original document', async () => { - const state = kbnRison.encode({ - dataSource: { type: 'esql' }, - query: { - esql: 'from my-example-logs,logstash* | sort @timestamp desc | where `message` is not null', - }, - }); - await PageObjects.common.navigateToActualUrl('discover', `?_a=${state}`, { - ensureCurrentUrl: false, - }); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.discover.waitUntilSearchingHasFinished(); - - await testSubjects.existOrFail('discoverDataTableMessageValue'); - }); - - it('should NOT render the summary column if the source does not match logs', async () => { - const state = kbnRison.encode({ - dataSource: { type: 'esql' }, - query: { - esql: 'from my-example-*', - }, - }); - await PageObjects.common.navigateToActualUrl('discover', `?_a=${state}`, { - ensureCurrentUrl: false, - }); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.discover.waitUntilSearchingHasFinished(); - - await testSubjects.missingOrFail('discoverDataTableMessageValue'); + await discover.waitUntilSearchingHasFinished(); + await unifiedFieldList.clickFieldListItemAdd('@timestamp'); + await unifiedFieldList.clickFieldListItemAdd('log.level'); + const timestamps = await testSubjects.findAll('exampleRootProfileTimestamp'); + expect(timestamps).to.have.length(3); + expect(await timestamps[0].getVisibleText()).to.be('2024-06-10T16:00:00.000Z'); + expect(await timestamps[2].getVisibleText()).to.be('2024-06-10T14:00:00.000Z'); + const logLevels = await testSubjects.findAll('exampleDataSourceProfileLogLevel'); + expect(logLevels).to.have.length(3); + expect(await logLevels[0].getVisibleText()).to.be('Debug'); + expect(await logLevels[2].getVisibleText()).to.be('Info'); }); }); }); describe('data view mode', () => { - describe('Log Level Badge Cell', () => { - it('should render log.level badge cell', async () => { - await PageObjects.common.navigateToActualUrl('discover', undefined, { + describe('root profile', () => { + it('should render custom @timestamp', async () => { + await common.navigateToActualUrl('discover', undefined, { ensureCurrentUrl: false, }); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await dataViews.switchToAndValidate('my-example-logs,logstash*'); - await queryBar.setQuery('log.level:*'); - await queryBar.submitQuery(); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await PageObjects.unifiedFieldList.clickFieldListItemAdd('log.level'); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.discover.waitUntilSearchingHasFinished(); - - let firstCell: WebElementWrapper; - let logLevelBadge: WebElementWrapper; - - await retry.try(async () => { - firstCell = await dataGrid.getCellElementExcludingControlColumns(0, 1); - logLevelBadge = await firstCell.findByTestSubject('*logLevelBadgeCell-'); - expect(await logLevelBadge.getVisibleText()).to.be('debug'); - expect(await logLevelBadge.getComputedStyle('background-color')).to.be( - 'rgba(190, 207, 227, 1)' - ); - }); - - // check Surrounding docs page - await dataGrid.clickRowToggle(); - const [, surroundingActionEl] = await dataGrid.getRowActions(); - await surroundingActionEl.click(); - await PageObjects.header.waitUntilLoadingHasFinished(); - await browser.refresh(); - await PageObjects.header.waitUntilLoadingHasFinished(); - - await retry.try(async () => { - firstCell = await dataGrid.getCellElementExcludingControlColumns(0, 1); - logLevelBadge = await firstCell.findByTestSubject('*logLevelBadgeCell-'); - expect(await logLevelBadge.getVisibleText()).to.be('debug'); - expect(await logLevelBadge.getComputedStyle('background-color')).to.be( - 'rgba(190, 207, 227, 1)' - ); - }); - }); - - it("should not render log.level badge cell if it's not a logs data source", async () => { - await PageObjects.common.navigateToActualUrl('discover', undefined, { - ensureCurrentUrl: false, - }); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await dataViews.switchToAndValidate('my-example-*'); - await queryBar.setQuery('log.level:*'); - await queryBar.submitQuery(); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await PageObjects.unifiedFieldList.clickFieldListItemAdd('log.level'); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.discover.waitUntilSearchingHasFinished(); - - let firstCell: WebElementWrapper; - - await retry.try(async () => { - firstCell = await dataGrid.getCellElementExcludingControlColumns(0, 1); - expect(await firstCell.getVisibleText()).to.be('debug'); - await testSubjects.missingOrFail('*logLevelBadgeCell-'); - }); - - // check Surrounding docs page - await dataGrid.clickRowToggle(); - const [, surroundingActionEl] = await dataGrid.getRowActions(); - await surroundingActionEl.click(); - await PageObjects.header.waitUntilLoadingHasFinished(); - await browser.refresh(); - await PageObjects.header.waitUntilLoadingHasFinished(); - - await retry.try(async () => { - firstCell = await dataGrid.getCellElementExcludingControlColumns(1, 1); - expect(await firstCell.getVisibleText()).to.be('debug'); - await testSubjects.missingOrFail('*logLevelBadgeCell-'); - }); - }); - }); - describe('Service Name Cell', () => { - it('should render service.name cell', async () => { - await PageObjects.common.navigateToActualUrl('discover', undefined, { - ensureCurrentUrl: false, - }); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await dataViews.switchToAndValidate('my-example-logs,logstash*'); - await queryBar.setQuery('service.name:*'); - await queryBar.submitQuery(); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await PageObjects.unifiedFieldList.clickFieldListItemAdd('service.name'); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.discover.waitUntilSearchingHasFinished(); - - let firstCell: WebElementWrapper; - let lastCell: WebElementWrapper; - - await retry.try(async () => { - firstCell = await dataGrid.getCellElementExcludingControlColumns(0, 1); - lastCell = await dataGrid.getCellElementExcludingControlColumns(2, 1); - const firstServiceNameCell = await firstCell.findByTestSubject( - 'dataTableCellActionsPopover_service.name' - ); - const lastServiceNameCell = await lastCell.findByTestSubject( - 'dataTableCellActionsPopover_service.name' - ); - expect(await firstServiceNameCell.getVisibleText()).to.be('product'); - expect(await lastServiceNameCell.getVisibleText()).to.be('accounting'); - }); - }); - - it("should not render service.name cell if it's not a logs data source", async () => { - await PageObjects.common.navigateToActualUrl('discover', undefined, { - ensureCurrentUrl: false, - }); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await dataViews.switchToAndValidate('my-example-*'); - await queryBar.setQuery('service.name:*'); - await queryBar.submitQuery(); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await PageObjects.unifiedFieldList.clickFieldListItemAdd('service.name'); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.discover.waitUntilSearchingHasFinished(); - - let firstCell: WebElementWrapper; - let lastCell: WebElementWrapper; - - await retry.try(async () => { - firstCell = await dataGrid.getCellElementExcludingControlColumns(0, 1); - lastCell = await dataGrid.getCellElementExcludingControlColumns(2, 1); - - expect(await firstCell.getVisibleText()).to.be('product'); - expect(await lastCell.getVisibleText()).to.be('accounting'); - await testSubjects.missingOrFail('dataTableCellActionsPopover_service.name'); - }); + await dataViews.switchTo('my-example-*'); + await discover.waitUntilSearchingHasFinished(); + const timestamps = await testSubjects.findAll('exampleRootProfileTimestamp'); + expect(timestamps).to.have.length(6); + expect(await timestamps[0].getVisibleText()).to.be('2024-06-10T16:30:00.000Z'); + expect(await timestamps[5].getVisibleText()).to.be('2024-06-10T14:00:00.000Z'); }); }); - describe('Summary column', () => { - it('should render a summary of the log entry replacing the original document', async () => { - await PageObjects.common.navigateToActualUrl('discover', undefined, { + describe('data source profile', () => { + it('should render custom @timestamp but not custom log.level', async () => { + await common.navigateToActualUrl('discover', undefined, { ensureCurrentUrl: false, }); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await dataViews.switchToAndValidate('my-example-logs,logstash*'); - - await retry.try(async () => { - await testSubjects.existOrFail('discoverDataTableMessageValue'); - }); + await dataViews.switchTo('my-example-*'); + await discover.waitUntilSearchingHasFinished(); + await unifiedFieldList.clickFieldListItemAdd('@timestamp'); + await unifiedFieldList.clickFieldListItemAdd('log.level'); + const timestamps = await testSubjects.findAll('exampleRootProfileTimestamp'); + expect(timestamps).to.have.length(6); + expect(await timestamps[0].getVisibleText()).to.be('2024-06-10T16:30:00.000Z'); + expect(await timestamps[5].getVisibleText()).to.be('2024-06-10T14:00:00.000Z'); + const logLevels = await testSubjects.findAll('exampleDataSourceProfileLogLevel', 2500); + expect(logLevels).to.have.length(0); }); - it('should NOT render the summary column if the source does not match logs', async () => { - await PageObjects.common.navigateToActualUrl('discover', undefined, { + it('should render custom @timestamp and custom log.level', async () => { + await common.navigateToActualUrl('discover', undefined, { ensureCurrentUrl: false, }); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await dataViews.switchToAndValidate('my-example-*'); - - await retry.try(async () => { - await testSubjects.missingOrFail('discoverDataTableMessageValue'); - }); + await dataViews.switchTo('my-example-logs'); + await discover.waitUntilSearchingHasFinished(); + await unifiedFieldList.clickFieldListItemAdd('@timestamp'); + await unifiedFieldList.clickFieldListItemAdd('log.level'); + const timestamps = await testSubjects.findAll('exampleRootProfileTimestamp'); + expect(timestamps).to.have.length(3); + expect(await timestamps[0].getVisibleText()).to.be('2024-06-10T16:00:00.000Z'); + expect(await timestamps[2].getVisibleText()).to.be('2024-06-10T14:00:00.000Z'); + const logLevels = await testSubjects.findAll('exampleDataSourceProfileLogLevel'); + expect(logLevels).to.have.length(3); + expect(await logLevels[0].getVisibleText()).to.be('Debug'); + expect(await logLevels[2].getVisibleText()).to.be('Info'); }); }); }); diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_doc_viewer.ts b/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_doc_viewer.ts index d214d295e1a7e..1c5e7a44db7e6 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_doc_viewer.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_doc_viewer.ts @@ -6,121 +6,85 @@ */ import kbnRison from '@kbn/rison'; +import expect from '@kbn/expect'; import type { FtrProviderContext } from '../../../../../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { - const PageObjects = getPageObjects(['common', 'discover', 'svlCommonPage', 'header']); + const { common, discover, svlCommonPage } = getPageObjects([ + 'common', + 'discover', + 'svlCommonPage', + ]); const testSubjects = getService('testSubjects'); const dataViews = getService('dataViews'); const dataGrid = getService('dataGrid'); - const browser = getService('browser'); describe('extension getDocViewer', () => { before(async () => { - await PageObjects.svlCommonPage.loginAsAdmin(); + await svlCommonPage.loginAsAdmin(); }); describe('ES|QL mode', () => { - it('should render logs overview tab for logs data source', async () => { + it('should not render custom doc viewer view', async () => { const state = kbnRison.encode({ dataSource: { type: 'esql' }, - query: { esql: 'from my-example-logs | sort @timestamp desc' }, + query: { esql: 'from my-example-* | sort @timestamp desc' }, }); - await PageObjects.common.navigateToActualUrl('discover', `?_a=${state}`, { + await common.navigateToActualUrl('discover', `?_a=${state}`, { ensureCurrentUrl: false, }); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await dataGrid.clickRowToggle(); + await discover.waitUntilSearchingHasFinished(); + await dataGrid.clickRowToggle({ rowIndex: 0 }); await testSubjects.existOrFail('docViewerTab-doc_view_table'); - await testSubjects.existOrFail('docViewerTab-doc_view_logs_overview'); - await dataGrid.clickDocViewerTab('doc_view_logs_overview'); - await testSubjects.existOrFail('unifiedDocViewLogsOverviewHeader'); + await testSubjects.existOrFail('docViewerTab-doc_view_source'); + await testSubjects.missingOrFail('docViewerTab-doc_view_example'); + expect(await testSubjects.getVisibleText('docViewerRowDetailsTitle')).to.be('Result'); }); - it('should not render logs overview tab for non-logs data source', async () => { + it('should render custom doc viewer view', async () => { const state = kbnRison.encode({ dataSource: { type: 'esql' }, - query: { esql: 'from my-example-metrics | sort @timestamp desc' }, + query: { esql: 'from my-example-logs | sort @timestamp desc' }, }); - await PageObjects.common.navigateToActualUrl('discover', `?_a=${state}`, { + await common.navigateToActualUrl('discover', `?_a=${state}`, { ensureCurrentUrl: false, }); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await dataGrid.clickRowToggle(); + await discover.waitUntilSearchingHasFinished(); + await dataGrid.clickRowToggle({ rowIndex: 0 }); await testSubjects.existOrFail('docViewerTab-doc_view_table'); - await testSubjects.missingOrFail('docViewerTab-doc_view_logs_overview'); + await testSubjects.existOrFail('docViewerTab-doc_view_source'); + await testSubjects.existOrFail('docViewerTab-doc_view_example'); + expect(await testSubjects.getVisibleText('docViewerRowDetailsTitle')).to.be('Record #0'); }); }); describe('data view mode', () => { - it('should render logs overview tab for logs data source', async () => { - await PageObjects.common.navigateToActualUrl('discover', undefined, { + it('should not render custom doc viewer view', async () => { + await common.navigateToActualUrl('discover', undefined, { ensureCurrentUrl: false, }); - await dataViews.switchTo('my-example-logs'); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('docViewerTab-doc_view_table'); - await testSubjects.existOrFail('docViewerTab-doc_view_logs_overview'); - await dataGrid.clickDocViewerTab('doc_view_logs_overview'); - await testSubjects.existOrFail('unifiedDocViewLogsOverviewHeader'); - - // check Surrounding docs page - const [, surroundingActionEl] = await dataGrid.getRowActions(); - await surroundingActionEl.click(); - await PageObjects.header.waitUntilLoadingHasFinished(); - await browser.refresh(); - await PageObjects.header.waitUntilLoadingHasFinished(); - - await dataGrid.clickRowToggle({ isAnchorRow: true }); - await testSubjects.existOrFail('docViewerTab-doc_view_table'); - await testSubjects.existOrFail('docViewerTab-doc_view_logs_overview'); - await dataGrid.clickDocViewerTab('doc_view_logs_overview'); - await testSubjects.existOrFail('unifiedDocViewLogsOverviewHeader'); - - // check Single doc page - const [singleDocActionEl] = await dataGrid.getRowActions(); - await singleDocActionEl.click(); - await PageObjects.header.waitUntilLoadingHasFinished(); - await browser.refresh(); - await PageObjects.header.waitUntilLoadingHasFinished(); - + await dataViews.switchTo('my-example-*'); + await discover.waitUntilSearchingHasFinished(); + await dataGrid.clickRowToggle({ rowIndex: 0 }); await testSubjects.existOrFail('docViewerTab-doc_view_table'); - await testSubjects.existOrFail('docViewerTab-doc_view_logs_overview'); - await dataGrid.clickDocViewerTab('doc_view_logs_overview'); - await testSubjects.existOrFail('unifiedDocViewLogsOverviewHeader'); + await testSubjects.existOrFail('docViewerTab-doc_view_source'); + await testSubjects.missingOrFail('docViewerTab-doc_view_example'); + expect(await testSubjects.getVisibleText('docViewerRowDetailsTitle')).to.be('Document'); }); - it('should not render logs overview tab for non-logs data source', async () => { - await PageObjects.common.navigateToActualUrl('discover', undefined, { + it('should render custom doc viewer view', async () => { + await common.navigateToActualUrl('discover', undefined, { ensureCurrentUrl: false, }); - await dataViews.switchTo('my-example-metrics'); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await dataGrid.clickRowToggle(); - await testSubjects.existOrFail('docViewerTab-doc_view_table'); - await testSubjects.missingOrFail('docViewerTab-doc_view_logs_overview'); - - // check Surrounding docs page - const [, surroundingActionEl] = await dataGrid.getRowActions(); - await surroundingActionEl.click(); - await PageObjects.header.waitUntilLoadingHasFinished(); - await browser.refresh(); - await PageObjects.header.waitUntilLoadingHasFinished(); - - await dataGrid.clickRowToggle({ isAnchorRow: true }); - await testSubjects.existOrFail('docViewerTab-doc_view_table'); - await testSubjects.missingOrFail('docViewerTab-doc_view_logs_overview'); - - // check Single doc page - const [singleDocActionEl] = await dataGrid.getRowActions(); - await singleDocActionEl.click(); - await PageObjects.header.waitUntilLoadingHasFinished(); - await browser.refresh(); - await PageObjects.header.waitUntilLoadingHasFinished(); - + await dataViews.switchTo('my-example-logs'); + await discover.waitUntilSearchingHasFinished(); + await dataGrid.clickRowToggle({ rowIndex: 0 }); await testSubjects.existOrFail('docViewerTab-doc_view_table'); - await testSubjects.missingOrFail('docViewerTab-doc_view_logs_overview'); + await testSubjects.existOrFail('docViewerTab-doc_view_source'); + await testSubjects.existOrFail('docViewerTab-doc_view_example'); + expect(await testSubjects.getVisibleText('docViewerRowDetailsTitle')).to.be( + 'Record #my-example-logs::XdQFDpABfGznVC1bCHLo::' + ); }); }); }); diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_row_indicator_provider.ts b/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_row_indicator_provider.ts index f52de21b2aaa3..6a5fc64c7ee7b 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_row_indicator_provider.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/extensions/_get_row_indicator_provider.ts @@ -5,140 +5,10 @@ * 2.0. */ -import kbnRison from '@kbn/rison'; -import expect from '@kbn/expect'; import type { FtrProviderContext } from '../../../../../ftr_provider_context'; -export default function ({ getService, getPageObjects }: FtrProviderContext) { - const PageObjects = getPageObjects([ - 'common', - 'timePicker', - 'discover', - 'unifiedFieldList', - 'svlCommonPage', - 'header', - ]); - const esArchiver = getService('esArchiver'); - const testSubjects = getService('testSubjects'); - const dataGrid = getService('dataGrid'); - const browser = getService('browser'); - const dataViews = getService('dataViews'); - +export default function ({}: FtrProviderContext) { describe('extension getRowIndicatorProvider', () => { - before(async () => { - await PageObjects.svlCommonPage.loginAsAdmin(); - await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); - }); - - after(async () => { - await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); - }); - - it('should not render log.level row indicators for logs data source without a log.level field', async () => { - const state = kbnRison.encode({ - dataSource: { type: 'esql' }, - query: { esql: 'from logstash* | sort @timestamp desc' }, - }); - await PageObjects.common.navigateToActualUrl('discover', `?_a=${state}`, { - ensureCurrentUrl: false, - }); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await PageObjects.timePicker.setDefaultAbsoluteRange(); - await PageObjects.discover.waitUntilSearchingHasFinished(); - // logstash does not have log.level field, so the color indicator should not be rendered - await testSubjects.existOrFail('euiDataGridBody'); - await testSubjects.missingOrFail('dataGridHeaderCell-colorIndicator'); - - // switch the time frame back - await browser.goBack(); - await PageObjects.discover.waitUntilSearchingHasFinished(); - }); - - it('should not render log.level row indicators if not a logs data source', async () => { - const state = kbnRison.encode({ - dataSource: { type: 'esql' }, - query: { esql: 'from my-example* | sort @timestamp desc' }, - }); - await PageObjects.common.navigateToActualUrl('discover', `?_a=${state}`, { - ensureCurrentUrl: false, - }); - await PageObjects.discover.waitUntilSearchingHasFinished(); - // my-example* has a log.level field, but it's not matching the logs profile, so the color indicator should not be rendered - await testSubjects.existOrFail('euiDataGridBody'); - await testSubjects.missingOrFail('dataGridHeaderCell-colorIndicator'); - }); - - it('should render log.level row indicators', async () => { - const state = kbnRison.encode({ - dataSource: { type: 'esql' }, - query: { - esql: 'from my-example-logs,logstash* | sort @timestamp desc | where `log.level` is not null', - }, - }); - await PageObjects.common.navigateToActualUrl('discover', `?_a=${state}`, { - ensureCurrentUrl: false, - }); - await PageObjects.discover.waitUntilSearchingHasFinished(); - // in this case it's matching the logs data source profile and has a log.level field, so the color indicator should be rendered - await testSubjects.existOrFail('dataGridHeaderCell-colorIndicator'); - const firstCell = await dataGrid.getCellElement(0, 0); - const firstColorIndicator = await firstCell.findByTestSubject( - 'unifiedDataTableRowColorIndicatorCell' - ); - expect(await firstColorIndicator.getComputedStyle('background-color')).to.be( - 'rgba(190, 207, 227, 1)' - ); - expect(await firstColorIndicator.getAttribute('title')).to.be('Debug'); - }); - - it('should render log.level row indicators on Surrounding documents page', async () => { - await PageObjects.common.navigateToApp('discover'); - await dataViews.switchTo('my-example-logs,logstash*'); - await PageObjects.discover.waitUntilSearchingHasFinished(); - await dataGrid.clickRowToggle({ rowIndex: 0 }); - const [, surroundingActionEl] = await dataGrid.getRowActions(); - await surroundingActionEl.click(); - await PageObjects.header.waitUntilLoadingHasFinished(); - - let anchorCell = await dataGrid.getCellElement(0, 0); - let anchorColorIndicator = await anchorCell.findByTestSubject( - 'unifiedDataTableRowColorIndicatorCell' - ); - expect(await anchorColorIndicator.getAttribute('title')).to.be('Debug'); - expect(await anchorColorIndicator.getComputedStyle('background-color')).to.be( - 'rgba(190, 207, 227, 1)' - ); - - let nextCell = await dataGrid.getCellElement(1, 0); - let nextColorIndicator = await nextCell.findByTestSubject( - 'unifiedDataTableRowColorIndicatorCell' - ); - expect(await nextColorIndicator.getAttribute('title')).to.be('Error'); - expect(await nextColorIndicator.getComputedStyle('background-color')).to.be( - 'rgba(223, 147, 82, 1)' - ); - - await browser.refresh(); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.discover.waitUntilSearchingHasFinished(); - - anchorCell = await dataGrid.getCellElement(0, 0); - anchorColorIndicator = await anchorCell.findByTestSubject( - 'unifiedDataTableRowColorIndicatorCell' - ); - expect(await anchorColorIndicator.getAttribute('title')).to.be('Debug'); - expect(await anchorColorIndicator.getComputedStyle('background-color')).to.be( - 'rgba(190, 207, 227, 1)' - ); - - nextCell = await dataGrid.getCellElement(1, 0); - nextColorIndicator = await nextCell.findByTestSubject( - 'unifiedDataTableRowColorIndicatorCell' - ); - expect(await nextColorIndicator.getAttribute('title')).to.be('Error'); - expect(await nextColorIndicator.getComputedStyle('background-color')).to.be( - 'rgba(223, 147, 82, 1)' - ); - }); + // TODO: Add an example profile implementation to test here }); } diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/index.ts b/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/index.ts index 9fb95c5ccd962..431c338c61e2f 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/index.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/index.ts @@ -35,8 +35,7 @@ export default function ({ getService, getPageObjects, loadTestFile }: FtrProvid await PageObjects.timePicker.resetDefaultAbsoluteRangeViaUiSettings(); }); - loadTestFile(require.resolve('./_root_profile')); - loadTestFile(require.resolve('./_data_source_profile')); + loadTestFile(require.resolve('./_framework')); loadTestFile(require.resolve('./extensions/_get_row_indicator_provider')); loadTestFile(require.resolve('./extensions/_get_row_additional_leading_controls')); loadTestFile(require.resolve('./extensions/_get_doc_viewer')); diff --git a/x-pack/test_serverless/functional/test_suites/observability/discover/context_awareness/_get_cell_renderers.ts b/x-pack/test_serverless/functional/test_suites/observability/discover/context_awareness/_get_cell_renderers.ts new file mode 100644 index 0000000000000..4fb26ff1a23d2 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/observability/discover/context_awareness/_get_cell_renderers.ts @@ -0,0 +1,353 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import kbnRison from '@kbn/rison'; +import expect from '@kbn/expect'; +import type { WebElementWrapper } from '@kbn/ftr-common-functional-ui-services'; +import type { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const PageObjects = getPageObjects([ + 'common', + 'discover', + 'unifiedFieldList', + 'svlCommonPage', + 'header', + ]); + const esArchiver = getService('esArchiver'); + const testSubjects = getService('testSubjects'); + const dataGrid = getService('dataGrid'); + const dataViews = getService('dataViews'); + const queryBar = getService('queryBar'); + const browser = getService('browser'); + const retry = getService('retry'); + + describe('extension getCellRenderers', () => { + before(async () => { + await PageObjects.svlCommonPage.loginAsAdmin(); + await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); + }); + + after(async () => { + await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); + }); + + describe('ES|QL mode', () => { + describe('Log Level Badge Cell', () => { + it('should render log.level badge cell', async () => { + const state = kbnRison.encode({ + dataSource: { type: 'esql' }, + query: { + esql: 'from my-example-logs,logstash* | sort @timestamp desc | where `log.level` is not null', + }, + }); + await PageObjects.common.navigateToActualUrl('discover', `?_a=${state}`, { + ensureCurrentUrl: false, + }); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.unifiedFieldList.clickFieldListItemAdd('log.level'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + const firstCell = await dataGrid.getCellElementExcludingControlColumns(0, 0); + const logLevelBadge = await firstCell.findByTestSubject('*logLevelBadgeCell-'); + expect(await logLevelBadge.getVisibleText()).to.be('debug'); + expect(await logLevelBadge.getComputedStyle('background-color')).to.be( + 'rgba(190, 207, 227, 1)' + ); + }); + + it("should not render log.level badge cell if it's not a logs data source", async () => { + const state = kbnRison.encode({ + dataSource: { type: 'esql' }, + query: { + esql: 'from my-example* | sort @timestamp desc | where `log.level` is not null', + }, + }); + await PageObjects.common.navigateToActualUrl('discover', `?_a=${state}`, { + ensureCurrentUrl: false, + }); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.unifiedFieldList.clickFieldListItemAdd('log.level'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + await retry.try(async () => { + const firstCell = await dataGrid.getCellElementExcludingControlColumns(0, 0); + expect(await firstCell.getVisibleText()).to.be('debug'); + await testSubjects.missingOrFail('*logLevelBadgeCell-'); + }); + }); + }); + + describe('Service Name Cell', () => { + it('should render service.name cell', async () => { + const state = kbnRison.encode({ + dataSource: { type: 'esql' }, + query: { + esql: 'from my-example-logs,logstash* | sort @timestamp desc | where `service.name` is not null', + }, + }); + await PageObjects.common.navigateToActualUrl('discover', `?_a=${state}`, { + ensureCurrentUrl: false, + }); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.unifiedFieldList.clickFieldListItemAdd('service.name'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + const firstCell = await dataGrid.getCellElementExcludingControlColumns(0, 0); + const lastCell = await dataGrid.getCellElementExcludingControlColumns(2, 0); + const firstServiceNameCell = await firstCell.findByTestSubject( + 'dataTableCellActionsPopover_service.name' + ); + const lastServiceNameCell = await lastCell.findByTestSubject( + 'dataTableCellActionsPopover_service.name' + ); + expect(await firstServiceNameCell.getVisibleText()).to.be('product'); + expect(await lastServiceNameCell.getVisibleText()).to.be('accounting'); + }); + + it("should not render service.name cell if it's not a logs data source", async () => { + const state = kbnRison.encode({ + dataSource: { type: 'esql' }, + query: { + esql: 'from my-example* | sort @timestamp desc | where `service.name` is not null', + }, + }); + await PageObjects.common.navigateToActualUrl('discover', `?_a=${state}`, { + ensureCurrentUrl: false, + }); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.unifiedFieldList.clickFieldListItemAdd('service.name'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + await retry.try(async () => { + const firstCell = await dataGrid.getCellElementExcludingControlColumns(0, 0); + expect(await firstCell.getVisibleText()).to.be('product'); + await testSubjects.missingOrFail('dataTableCellActionsPopover_service.name'); + }); + }); + }); + + describe('Summary column', () => { + it('should render a summary of the log entry replacing the original document', async () => { + const state = kbnRison.encode({ + dataSource: { type: 'esql' }, + query: { + esql: 'from my-example-logs,logstash* | sort @timestamp desc | where `message` is not null', + }, + }); + await PageObjects.common.navigateToActualUrl('discover', `?_a=${state}`, { + ensureCurrentUrl: false, + }); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + await testSubjects.existOrFail('discoverDataTableMessageValue'); + }); + + it('should NOT render the summary column if the source does not match logs', async () => { + const state = kbnRison.encode({ + dataSource: { type: 'esql' }, + query: { + esql: 'from my-example-*', + }, + }); + await PageObjects.common.navigateToActualUrl('discover', `?_a=${state}`, { + ensureCurrentUrl: false, + }); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + await testSubjects.missingOrFail('discoverDataTableMessageValue'); + }); + }); + }); + + describe('data view mode', () => { + describe('Log Level Badge Cell', () => { + it('should render log.level badge cell', async () => { + await PageObjects.common.navigateToActualUrl('discover', undefined, { + ensureCurrentUrl: false, + }); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await dataViews.switchToAndValidate('my-example-logs,logstash*'); + await queryBar.setQuery('log.level:*'); + await queryBar.submitQuery(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.unifiedFieldList.clickFieldListItemAdd('log.level'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + let firstCell: WebElementWrapper; + let logLevelBadge: WebElementWrapper; + + await retry.try(async () => { + firstCell = await dataGrid.getCellElementExcludingControlColumns(0, 1); + logLevelBadge = await firstCell.findByTestSubject('*logLevelBadgeCell-'); + expect(await logLevelBadge.getVisibleText()).to.be('debug'); + expect(await logLevelBadge.getComputedStyle('background-color')).to.be( + 'rgba(190, 207, 227, 1)' + ); + }); + + // check Surrounding docs page + await dataGrid.clickRowToggle(); + const [, surroundingActionEl] = await dataGrid.getRowActions(); + await surroundingActionEl.click(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await browser.refresh(); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await retry.try(async () => { + firstCell = await dataGrid.getCellElementExcludingControlColumns(0, 1); + logLevelBadge = await firstCell.findByTestSubject('*logLevelBadgeCell-'); + expect(await logLevelBadge.getVisibleText()).to.be('debug'); + expect(await logLevelBadge.getComputedStyle('background-color')).to.be( + 'rgba(190, 207, 227, 1)' + ); + }); + }); + + it("should not render log.level badge cell if it's not a logs data source", async () => { + await PageObjects.common.navigateToActualUrl('discover', undefined, { + ensureCurrentUrl: false, + }); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await dataViews.switchToAndValidate('my-example-*'); + await queryBar.setQuery('log.level:*'); + await queryBar.submitQuery(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.unifiedFieldList.clickFieldListItemAdd('log.level'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + let firstCell: WebElementWrapper; + + await retry.try(async () => { + firstCell = await dataGrid.getCellElementExcludingControlColumns(0, 1); + expect(await firstCell.getVisibleText()).to.be('debug'); + await testSubjects.missingOrFail('*logLevelBadgeCell-'); + }); + + // check Surrounding docs page + await dataGrid.clickRowToggle(); + const [, surroundingActionEl] = await dataGrid.getRowActions(); + await surroundingActionEl.click(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await browser.refresh(); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await retry.try(async () => { + firstCell = await dataGrid.getCellElementExcludingControlColumns(1, 1); + expect(await firstCell.getVisibleText()).to.be('debug'); + await testSubjects.missingOrFail('*logLevelBadgeCell-'); + }); + }); + }); + describe('Service Name Cell', () => { + it('should render service.name cell', async () => { + await PageObjects.common.navigateToActualUrl('discover', undefined, { + ensureCurrentUrl: false, + }); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await dataViews.switchToAndValidate('my-example-logs,logstash*'); + await queryBar.setQuery('service.name:*'); + await queryBar.submitQuery(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.unifiedFieldList.clickFieldListItemAdd('service.name'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + let firstCell: WebElementWrapper; + let lastCell: WebElementWrapper; + + await retry.try(async () => { + firstCell = await dataGrid.getCellElementExcludingControlColumns(0, 1); + lastCell = await dataGrid.getCellElementExcludingControlColumns(2, 1); + const firstServiceNameCell = await firstCell.findByTestSubject( + 'dataTableCellActionsPopover_service.name' + ); + const lastServiceNameCell = await lastCell.findByTestSubject( + 'dataTableCellActionsPopover_service.name' + ); + expect(await firstServiceNameCell.getVisibleText()).to.be('product'); + expect(await lastServiceNameCell.getVisibleText()).to.be('accounting'); + }); + }); + + it("should not render service.name cell if it's not a logs data source", async () => { + await PageObjects.common.navigateToActualUrl('discover', undefined, { + ensureCurrentUrl: false, + }); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await dataViews.switchToAndValidate('my-example-*'); + await queryBar.setQuery('service.name:*'); + await queryBar.submitQuery(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.unifiedFieldList.clickFieldListItemAdd('service.name'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + let firstCell: WebElementWrapper; + let lastCell: WebElementWrapper; + + await retry.try(async () => { + firstCell = await dataGrid.getCellElementExcludingControlColumns(0, 1); + lastCell = await dataGrid.getCellElementExcludingControlColumns(2, 1); + + expect(await firstCell.getVisibleText()).to.be('product'); + expect(await lastCell.getVisibleText()).to.be('accounting'); + await testSubjects.missingOrFail('dataTableCellActionsPopover_service.name'); + }); + }); + }); + + describe('Summary column', () => { + it('should render a summary of the log entry replacing the original document', async () => { + await PageObjects.common.navigateToActualUrl('discover', undefined, { + ensureCurrentUrl: false, + }); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await dataViews.switchToAndValidate('my-example-logs,logstash*'); + + await retry.try(async () => { + await testSubjects.existOrFail('discoverDataTableMessageValue'); + }); + }); + + it('should NOT render the summary column if the source does not match logs', async () => { + await PageObjects.common.navigateToActualUrl('discover', undefined, { + ensureCurrentUrl: false, + }); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await dataViews.switchToAndValidate('my-example-*'); + + await retry.try(async () => { + await testSubjects.missingOrFail('discoverDataTableMessageValue'); + }); + }); + }); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/observability/discover/context_awareness/_get_doc_viewer.ts b/x-pack/test_serverless/functional/test_suites/observability/discover/context_awareness/_get_doc_viewer.ts new file mode 100644 index 0000000000000..adc466f238a5c --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/observability/discover/context_awareness/_get_doc_viewer.ts @@ -0,0 +1,127 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import kbnRison from '@kbn/rison'; +import type { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const PageObjects = getPageObjects(['common', 'discover', 'svlCommonPage', 'header']); + const testSubjects = getService('testSubjects'); + const dataViews = getService('dataViews'); + const dataGrid = getService('dataGrid'); + const browser = getService('browser'); + + describe('extension getDocViewer', () => { + before(async () => { + await PageObjects.svlCommonPage.loginAsAdmin(); + }); + + describe('ES|QL mode', () => { + it('should render logs overview tab for logs data source', async () => { + const state = kbnRison.encode({ + dataSource: { type: 'esql' }, + query: { esql: 'from my-example-logs | sort @timestamp desc' }, + }); + await PageObjects.common.navigateToActualUrl('discover', `?_a=${state}`, { + ensureCurrentUrl: false, + }); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await dataGrid.clickRowToggle(); + await testSubjects.existOrFail('docViewerTab-doc_view_table'); + await testSubjects.existOrFail('docViewerTab-doc_view_logs_overview'); + await dataGrid.clickDocViewerTab('doc_view_logs_overview'); + await testSubjects.existOrFail('unifiedDocViewLogsOverviewHeader'); + }); + + it('should not render logs overview tab for non-logs data source', async () => { + const state = kbnRison.encode({ + dataSource: { type: 'esql' }, + query: { esql: 'from my-example-metrics | sort @timestamp desc' }, + }); + await PageObjects.common.navigateToActualUrl('discover', `?_a=${state}`, { + ensureCurrentUrl: false, + }); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await dataGrid.clickRowToggle(); + await testSubjects.existOrFail('docViewerTab-doc_view_table'); + await testSubjects.missingOrFail('docViewerTab-doc_view_logs_overview'); + }); + }); + + describe('data view mode', () => { + it('should render logs overview tab for logs data source', async () => { + await PageObjects.common.navigateToActualUrl('discover', undefined, { + ensureCurrentUrl: false, + }); + await dataViews.switchTo('my-example-logs'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await dataGrid.clickRowToggle(); + await testSubjects.existOrFail('docViewerTab-doc_view_table'); + await testSubjects.existOrFail('docViewerTab-doc_view_logs_overview'); + await dataGrid.clickDocViewerTab('doc_view_logs_overview'); + await testSubjects.existOrFail('unifiedDocViewLogsOverviewHeader'); + + // check Surrounding docs page + const [, surroundingActionEl] = await dataGrid.getRowActions(); + await surroundingActionEl.click(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await browser.refresh(); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await dataGrid.clickRowToggle({ isAnchorRow: true }); + await testSubjects.existOrFail('docViewerTab-doc_view_table'); + await testSubjects.existOrFail('docViewerTab-doc_view_logs_overview'); + await dataGrid.clickDocViewerTab('doc_view_logs_overview'); + await testSubjects.existOrFail('unifiedDocViewLogsOverviewHeader'); + + // check Single doc page + const [singleDocActionEl] = await dataGrid.getRowActions(); + await singleDocActionEl.click(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await browser.refresh(); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await testSubjects.existOrFail('docViewerTab-doc_view_table'); + await testSubjects.existOrFail('docViewerTab-doc_view_logs_overview'); + await dataGrid.clickDocViewerTab('doc_view_logs_overview'); + await testSubjects.existOrFail('unifiedDocViewLogsOverviewHeader'); + }); + + it('should not render logs overview tab for non-logs data source', async () => { + await PageObjects.common.navigateToActualUrl('discover', undefined, { + ensureCurrentUrl: false, + }); + await dataViews.switchTo('my-example-metrics'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await dataGrid.clickRowToggle(); + await testSubjects.existOrFail('docViewerTab-doc_view_table'); + await testSubjects.missingOrFail('docViewerTab-doc_view_logs_overview'); + + // check Surrounding docs page + const [, surroundingActionEl] = await dataGrid.getRowActions(); + await surroundingActionEl.click(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await browser.refresh(); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await dataGrid.clickRowToggle({ isAnchorRow: true }); + await testSubjects.existOrFail('docViewerTab-doc_view_table'); + await testSubjects.missingOrFail('docViewerTab-doc_view_logs_overview'); + + // check Single doc page + const [singleDocActionEl] = await dataGrid.getRowActions(); + await singleDocActionEl.click(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await browser.refresh(); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await testSubjects.existOrFail('docViewerTab-doc_view_table'); + await testSubjects.missingOrFail('docViewerTab-doc_view_logs_overview'); + }); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/observability/discover/context_awareness/_get_row_indicator_provider.ts b/x-pack/test_serverless/functional/test_suites/observability/discover/context_awareness/_get_row_indicator_provider.ts new file mode 100644 index 0000000000000..ddc3c18270553 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/observability/discover/context_awareness/_get_row_indicator_provider.ts @@ -0,0 +1,144 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import kbnRison from '@kbn/rison'; +import expect from '@kbn/expect'; +import type { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const PageObjects = getPageObjects([ + 'common', + 'timePicker', + 'discover', + 'unifiedFieldList', + 'svlCommonPage', + 'header', + ]); + const esArchiver = getService('esArchiver'); + const testSubjects = getService('testSubjects'); + const dataGrid = getService('dataGrid'); + const browser = getService('browser'); + const dataViews = getService('dataViews'); + + describe('extension getRowIndicatorProvider', () => { + before(async () => { + await PageObjects.svlCommonPage.loginAsAdmin(); + await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); + }); + + after(async () => { + await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); + }); + + it('should not render log.level row indicators for logs data source without a log.level field', async () => { + const state = kbnRison.encode({ + dataSource: { type: 'esql' }, + query: { esql: 'from logstash* | sort @timestamp desc' }, + }); + await PageObjects.common.navigateToActualUrl('discover', `?_a=${state}`, { + ensureCurrentUrl: false, + }); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.timePicker.setDefaultAbsoluteRange(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + // logstash does not have log.level field, so the color indicator should not be rendered + await testSubjects.existOrFail('euiDataGridBody'); + await testSubjects.missingOrFail('dataGridHeaderCell-colorIndicator'); + + // switch the time frame back + await browser.goBack(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + }); + + it('should not render log.level row indicators if not a logs data source', async () => { + const state = kbnRison.encode({ + dataSource: { type: 'esql' }, + query: { esql: 'from my-example* | sort @timestamp desc' }, + }); + await PageObjects.common.navigateToActualUrl('discover', `?_a=${state}`, { + ensureCurrentUrl: false, + }); + await PageObjects.discover.waitUntilSearchingHasFinished(); + // my-example* has a log.level field, but it's not matching the logs profile, so the color indicator should not be rendered + await testSubjects.existOrFail('euiDataGridBody'); + await testSubjects.missingOrFail('dataGridHeaderCell-colorIndicator'); + }); + + it('should render log.level row indicators', async () => { + const state = kbnRison.encode({ + dataSource: { type: 'esql' }, + query: { + esql: 'from my-example-logs,logstash* | sort @timestamp desc | where `log.level` is not null', + }, + }); + await PageObjects.common.navigateToActualUrl('discover', `?_a=${state}`, { + ensureCurrentUrl: false, + }); + await PageObjects.discover.waitUntilSearchingHasFinished(); + // in this case it's matching the logs data source profile and has a log.level field, so the color indicator should be rendered + await testSubjects.existOrFail('dataGridHeaderCell-colorIndicator'); + const firstCell = await dataGrid.getCellElement(0, 0); + const firstColorIndicator = await firstCell.findByTestSubject( + 'unifiedDataTableRowColorIndicatorCell' + ); + expect(await firstColorIndicator.getComputedStyle('background-color')).to.be( + 'rgba(190, 207, 227, 1)' + ); + expect(await firstColorIndicator.getAttribute('title')).to.be('Debug'); + }); + + it('should render log.level row indicators on Surrounding documents page', async () => { + await PageObjects.common.navigateToApp('discover'); + await dataViews.switchTo('my-example-logs,logstash*'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await dataGrid.clickRowToggle({ rowIndex: 0 }); + const [, surroundingActionEl] = await dataGrid.getRowActions(); + await surroundingActionEl.click(); + await PageObjects.header.waitUntilLoadingHasFinished(); + + let anchorCell = await dataGrid.getCellElement(0, 0); + let anchorColorIndicator = await anchorCell.findByTestSubject( + 'unifiedDataTableRowColorIndicatorCell' + ); + expect(await anchorColorIndicator.getAttribute('title')).to.be('Debug'); + expect(await anchorColorIndicator.getComputedStyle('background-color')).to.be( + 'rgba(190, 207, 227, 1)' + ); + + let nextCell = await dataGrid.getCellElement(1, 0); + let nextColorIndicator = await nextCell.findByTestSubject( + 'unifiedDataTableRowColorIndicatorCell' + ); + expect(await nextColorIndicator.getAttribute('title')).to.be('Error'); + expect(await nextColorIndicator.getComputedStyle('background-color')).to.be( + 'rgba(223, 147, 82, 1)' + ); + + await browser.refresh(); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + anchorCell = await dataGrid.getCellElement(0, 0); + anchorColorIndicator = await anchorCell.findByTestSubject( + 'unifiedDataTableRowColorIndicatorCell' + ); + expect(await anchorColorIndicator.getAttribute('title')).to.be('Debug'); + expect(await anchorColorIndicator.getComputedStyle('background-color')).to.be( + 'rgba(190, 207, 227, 1)' + ); + + nextCell = await dataGrid.getCellElement(1, 0); + nextColorIndicator = await nextCell.findByTestSubject( + 'unifiedDataTableRowColorIndicatorCell' + ); + expect(await nextColorIndicator.getAttribute('title')).to.be('Error'); + expect(await nextColorIndicator.getComputedStyle('background-color')).to.be( + 'rgba(223, 147, 82, 1)' + ); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/observability/discover/context_awareness/index.ts b/x-pack/test_serverless/functional/test_suites/observability/discover/context_awareness/index.ts new file mode 100644 index 0000000000000..9284e74a6c987 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/observability/discover/context_awareness/index.ts @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { FtrProviderContext } from '../../../../ftr_provider_context'; + +export default function ({ getService, getPageObjects, loadTestFile }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + const PageObjects = getPageObjects(['timePicker', 'svlCommonPage']); + const from = '2024-06-10T14:00:00.000Z'; + const to = '2024-06-10T16:30:00.000Z'; + + describe('discover/observabilitySolution/context_awareness', function () { + this.tags(['esGate']); + + before(async () => { + await esArchiver.load('test/functional/fixtures/es_archiver/discover/context_awareness'); + await kibanaServer.importExport.load( + 'test/functional/fixtures/kbn_archiver/discover/context_awareness' + ); + await kibanaServer.uiSettings.update({ + 'timepicker:timeDefaults': `{ "from": "${from}", "to": "${to}"}`, + }); + }); + + after(async () => { + await esArchiver.unload('test/functional/fixtures/es_archiver/discover/context_awareness'); + await kibanaServer.importExport.unload( + 'test/functional/fixtures/kbn_archiver/discover/context_awareness' + ); + await PageObjects.timePicker.resetDefaultAbsoluteRangeViaUiSettings(); + }); + + loadTestFile(require.resolve('./_get_row_indicator_provider')); + loadTestFile(require.resolve('./_get_doc_viewer')); + loadTestFile(require.resolve('./_get_cell_renderers')); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/observability/index.ts b/x-pack/test_serverless/functional/test_suites/observability/index.ts index 566f2b8e6854e..0885a319636b1 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/index.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/index.ts @@ -15,6 +15,7 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./navigation')); loadTestFile(require.resolve('./observability_logs_explorer')); loadTestFile(require.resolve('./dataset_quality')); + loadTestFile(require.resolve('./discover/context_awareness')); loadTestFile(require.resolve('./onboarding')); loadTestFile(require.resolve('./rules/rules_list')); loadTestFile(require.resolve('./cases'));