From 8814e430e757dd6b3ec1ffec6eaa394e16d36cbd Mon Sep 17 00:00:00 2001 From: Marco Antonio Ghiani Date: Wed, 27 Nov 2024 11:39:23 +0100 Subject: [PATCH] [Dataset Quality] Fix loading on dataset quality summary (#201757) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 📓 Summary Closes #186549 Refreshing the page didn't give enough time for the data ingestion to process correctly, hopefully navigating to the page, which is gated by an assertion on loading indicators, should check that data is loaded correctly. Also, running the test in isolation raised a bug in the code, where the loading of the summary details was not synced with the loaded data from the table. This resulted in the summary always being 0 at first load, and then immediately update once the table is ready, which broke the test. Syncing their loading indicators fixed the issue and tests passes in isolation too. --------- Co-authored-by: Marco Antonio Ghiani --- .../public/hooks/use_summary_panel.ts | 13 +++++--- .../functional/apps/dataset_quality/config.ts | 30 +++++++++++++++++-- .../dataset_quality_details.ts | 2 +- .../dataset_quality_summary.ts | 12 ++++---- 4 files changed, 43 insertions(+), 14 deletions(-) diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_summary_panel.ts b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_summary_panel.ts index 014d9f578eb60..8b8b92404d8d5 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_summary_panel.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_summary_panel.ts @@ -14,8 +14,12 @@ import { filterInactiveDatasets } from '../utils'; const useSummaryPanel = () => { const { service } = useDatasetQualityContext(); - const { filteredItems, canUserMonitorDataset, canUserMonitorAnyDataStream, loading } = - useDatasetQualityTable(); + const { + filteredItems, + canUserMonitorDataset, + canUserMonitorAnyDataStream, + loading: isTableLoading, + } = useDatasetQualityTable(); const { timeRange } = useSelector(service, (state) => state.context.filters); @@ -27,9 +31,10 @@ const useSummaryPanel = () => { percentages: filteredItems.map((item) => item.degradedDocs.percentage), }; - const isDatasetsQualityLoading = useSelector(service, (state) => + const isDegradedDocsLoading = useSelector(service, (state) => state.matches('stats.degradedDocs.fetching') ); + const isDatasetsQualityLoading = isDegradedDocsLoading || isTableLoading; /* User Authorization @@ -38,7 +43,7 @@ const useSummaryPanel = () => { (item) => item.userPrivileges?.canMonitor ?? true ); - const isUserAuthorizedForDataset = !loading + const isUserAuthorizedForDataset = !isTableLoading ? canUserMonitorDataset && canUserMonitorAnyDataStream && canUserMonitorAllFilteredDataStreams : true; diff --git a/x-pack/test/functional/apps/dataset_quality/config.ts b/x-pack/test/functional/apps/dataset_quality/config.ts index c7e72325d6c07..2293af3face42 100644 --- a/x-pack/test/functional/apps/dataset_quality/config.ts +++ b/x-pack/test/functional/apps/dataset_quality/config.ts @@ -9,7 +9,33 @@ import { FtrConfigProviderContext, GenericFtrProviderContext } from '@kbn/test'; import { createLogger, LogLevel, LogsSynthtraceEsClient } from '@kbn/apm-synthtrace'; import { FtrProviderContext } from '../../ftr_provider_context'; -export default async function createTestConfig({ readConfigFile }: FtrConfigProviderContext) { +import { FtrProviderContext as InheritedFtrProviderContext } from '../../ftr_provider_context'; + +export type InheritedServices = InheritedFtrProviderContext extends GenericFtrProviderContext< + infer TServices, + {} +> + ? TServices + : {}; + +export type InheritedPageObjects = InheritedFtrProviderContext extends GenericFtrProviderContext< + infer TServices, + infer TPageObjects +> + ? TPageObjects + : {}; + +interface DatasetQualityConfig { + services: InheritedServices & { + logSynthtraceEsClient: ( + context: InheritedFtrProviderContext + ) => Promise; + }; +} + +export default async function createTestConfig({ + readConfigFile, +}: FtrConfigProviderContext): Promise { const functionalConfig = await readConfigFile(require.resolve('../../config.base.js')); const services = functionalConfig.get('services'); const pageObjects = functionalConfig.get('pageObjects'); @@ -34,7 +60,7 @@ export default async function createTestConfig({ readConfigFile }: FtrConfigProv export type CreateTestConfig = Awaited>; export type DatasetQualityServices = CreateTestConfig['services']; -export type DatasetQualityPageObject = CreateTestConfig['pageObjects']; +export type DatasetQualityPageObject = InheritedPageObjects; export type DatasetQualityFtrProviderContext = GenericFtrProviderContext< DatasetQualityServices, diff --git a/x-pack/test/functional/apps/dataset_quality/dataset_quality_details.ts b/x-pack/test/functional/apps/dataset_quality/dataset_quality_details.ts index 3b93f0ceccfeb..01dbbe1a0fc80 100644 --- a/x-pack/test/functional/apps/dataset_quality/dataset_quality_details.ts +++ b/x-pack/test/functional/apps/dataset_quality/dataset_quality_details.ts @@ -423,7 +423,7 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid ); }); - countColumn.sort('ascending'); + await countColumn.sort('ascending'); await retry.tryForTime(5000, async () => { const currentUrl = await browser.getCurrentUrl(); diff --git a/x-pack/test/functional/apps/dataset_quality/dataset_quality_summary.ts b/x-pack/test/functional/apps/dataset_quality/dataset_quality_summary.ts index 491a3b20c8004..2c744279fcacb 100644 --- a/x-pack/test/functional/apps/dataset_quality/dataset_quality_summary.ts +++ b/x-pack/test/functional/apps/dataset_quality/dataset_quality_summary.ts @@ -19,7 +19,7 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid const synthtrace = getService('logSynthtraceEsClient'); const to = '2024-01-01T12:00:00.000Z'; - const ingestDataForSummary = async () => { + const ingestDataForSummary = () => { // Ingest documents for 3 type of datasets return synthtrace.index([ // Ingest good data to all 3 datasets @@ -48,16 +48,14 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid }; describe('Dataset quality summary', () => { - before(async () => { - await synthtrace.index(getInitialTestLogs({ to, count: 4 })); - await PageObjects.datasetQuality.navigateTo(); - }); - afterEach(async () => { await synthtrace.clean(); }); it('shows poor, degraded and good count as 0 and all dataset as healthy', async () => { + await synthtrace.index(getInitialTestLogs({ to, count: 4 })); + await PageObjects.datasetQuality.navigateTo(); + const summary = await PageObjects.datasetQuality.parseSummaryPanel(); expect(summary).to.eql({ datasetHealthPoor: '0', @@ -70,7 +68,7 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid it('shows updated count for poor, degraded and good datasets, estimated size and updates active datasets', async () => { await ingestDataForSummary(); - await PageObjects.datasetQuality.refreshTable(); + await PageObjects.datasetQuality.navigateTo(); const summary = await PageObjects.datasetQuality.parseSummaryPanel(); const { estimatedData, ...restOfSummary } = summary;