From 46659c2bd169d5075ef2b155902a4853c14bb6ee Mon Sep 17 00:00:00 2001 From: Evan Rusackas Date: Tue, 16 Dec 2025 15:44:30 -0800 Subject: [PATCH] fix(tests): resolve flaky ExploreChartHeader export menu tests (#36642) Co-authored-by: Claude Opus 4.5 --- .../ExploreChartHeader.test.tsx | 45 ++++++++----------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/superset-frontend/src/explore/components/ExploreChartHeader/ExploreChartHeader.test.tsx b/superset-frontend/src/explore/components/ExploreChartHeader/ExploreChartHeader.test.tsx index d3c899efe30..a8010f1c6a8 100644 --- a/superset-frontend/src/explore/components/ExploreChartHeader/ExploreChartHeader.test.tsx +++ b/superset-frontend/src/explore/components/ExploreChartHeader/ExploreChartHeader.test.tsx @@ -437,7 +437,7 @@ describe('Additional actions tests', () => { userEvent.click(screen.getByLabelText('Menu actions trigger')); - userEvent.hover(screen.getByText('Data Export Options')); + userEvent.hover(await screen.findByText('Data Export Options')); userEvent.hover(await screen.findByText('Export All Data')); expect(await screen.findByText('Export to .CSV')).toBeInTheDocument(); @@ -461,7 +461,7 @@ describe('Additional actions tests', () => { render(, { useRedux: true }); userEvent.click(screen.getByLabelText('Menu actions trigger')); - userEvent.hover(screen.getByText('Data Export Options')); + userEvent.hover(await screen.findByText('Data Export Options')); // Now the submenu should exist userEvent.hover(await screen.findByText('Export Current View')); @@ -575,19 +575,12 @@ describe('Additional actions tests', () => { test('Should call downloadAsImage when click on "Export screenshot (jpeg)"', async () => { const props = createProps(); - const spy = jest.spyOn(downloadAsImage, 'default'); render(, { useRedux: true, }); - await waitFor(() => { - expect( - screen.getByLabelText('Menu actions trigger'), - ).toBeInTheDocument(); - }); - userEvent.click(screen.getByLabelText('Menu actions trigger')); - userEvent.hover(screen.getByText('Data Export Options')); + userEvent.hover(await screen.findByText('Data Export Options')); userEvent.hover(await screen.findByText('Export All Data')); const downloadAsImageElement = await screen.findByText( @@ -596,7 +589,7 @@ describe('Additional actions tests', () => { userEvent.click(downloadAsImageElement); await waitFor(() => { - expect(spy).toHaveBeenCalledTimes(1); + expect(spyDownloadAsImage.callCount).toBe(1); }); }); @@ -606,7 +599,7 @@ describe('Additional actions tests', () => { useRedux: true, }); userEvent.click(screen.getByLabelText('Menu actions trigger')); - userEvent.hover(screen.getByText('Data Export Options')); + userEvent.hover(await screen.findByText('Data Export Options')); userEvent.hover(await screen.findByText('Export All Data')); const exportCSVElement = await screen.findByText('Export to .CSV'); userEvent.click(exportCSVElement); @@ -622,7 +615,7 @@ describe('Additional actions tests', () => { }); userEvent.click(screen.getByLabelText('Menu actions trigger')); - userEvent.hover(screen.getByText('Data Export Options')); + userEvent.hover(await screen.findByText('Data Export Options')); userEvent.hover(await screen.findByText('Export All Data')); const exportCSVElement = await screen.findByText('Export to .CSV'); userEvent.click(exportCSVElement); @@ -636,7 +629,7 @@ describe('Additional actions tests', () => { useRedux: true, }); userEvent.click(screen.getByLabelText('Menu actions trigger')); - userEvent.hover(screen.getByText('Data Export Options')); + userEvent.hover(await screen.findByText('Data Export Options')); userEvent.hover(await screen.findByText('Export All Data')); const exportJsonElement = await screen.findByText('Export to .JSON'); userEvent.click(exportJsonElement); @@ -652,7 +645,7 @@ describe('Additional actions tests', () => { }); userEvent.click(screen.getByLabelText('Menu actions trigger')); - userEvent.hover(screen.getByText('Data Export Options')); + userEvent.hover(await screen.findByText('Data Export Options')); userEvent.hover(await screen.findByText('Export All Data')); const exportJsonElement = await screen.findByText('Export to .JSON'); userEvent.click(exportJsonElement); @@ -667,7 +660,7 @@ describe('Additional actions tests', () => { }); userEvent.click(screen.getByLabelText('Menu actions trigger')); - userEvent.hover(screen.getByText('Data Export Options')); + userEvent.hover(await screen.findByText('Data Export Options')); userEvent.hover(await screen.findByText('Export All Data')); const exportCSVElement = await screen.findByText( 'Export to pivoted .CSV', @@ -685,7 +678,7 @@ describe('Additional actions tests', () => { }); userEvent.click(screen.getByLabelText('Menu actions trigger')); - userEvent.hover(screen.getByText('Data Export Options')); + userEvent.hover(await screen.findByText('Data Export Options')); userEvent.hover(await screen.findByText('Export All Data')); const exportCSVElement = await screen.findByText( 'Export to pivoted .CSV', @@ -700,7 +693,7 @@ describe('Additional actions tests', () => { useRedux: true, }); userEvent.click(screen.getByLabelText('Menu actions trigger')); - userEvent.hover(screen.getByText('Data Export Options')); + userEvent.hover(await screen.findByText('Data Export Options')); userEvent.hover(await screen.findByText('Export All Data')); const exportExcelElement = await screen.findByText('Export to Excel'); userEvent.click(exportExcelElement); @@ -715,7 +708,7 @@ describe('Additional actions tests', () => { useRedux: true, }); userEvent.click(screen.getByLabelText('Menu actions trigger')); - userEvent.hover(screen.getByText('Data Export Options')); + userEvent.hover(await screen.findByText('Data Export Options')); userEvent.hover(await screen.findByText('Export All Data')); const exportExcelElement = await screen.findByText('Export to Excel'); userEvent.click(exportExcelElement); @@ -788,7 +781,7 @@ describe('Additional actions tests', () => { render(, { useRedux: true }); userEvent.click(screen.getByLabelText('Menu actions trigger')); - userEvent.hover(screen.getByText('Data Export Options')); + userEvent.hover(await screen.findByText('Data Export Options')); userEvent.hover(await screen.findByText('Export Current View')); // clear previous calls on the sinon spy you created in beforeEach @@ -828,7 +821,7 @@ describe('Additional actions tests', () => { render(, { useRedux: true }); userEvent.click(screen.getByLabelText('Menu actions trigger')); - userEvent.hover(screen.getByText('Data Export Options')); + userEvent.hover(await screen.findByText('Data Export Options')); userEvent.hover(await screen.findByText('Export Current View')); spyExportChart.resetHistory(); @@ -858,7 +851,7 @@ describe('Additional actions tests', () => { render(, { useRedux: true }); userEvent.click(screen.getByLabelText('Menu actions trigger')); - userEvent.hover(screen.getByText('Data Export Options')); + userEvent.hover(await screen.findByText('Data Export Options')); userEvent.hover(await screen.findByText('Export Current View')); spyExportChart.resetHistory(); @@ -880,7 +873,7 @@ describe('Additional actions tests', () => { render(, { useRedux: true }); userEvent.click(screen.getByLabelText('Menu actions trigger')); - userEvent.hover(screen.getByText('Data Export Options')); + userEvent.hover(await screen.findByText('Data Export Options')); userEvent.hover(await screen.findByText('Export Current View')); spyExportChart.resetHistory(); @@ -911,7 +904,7 @@ describe('Additional actions tests', () => { render(, { useRedux: true }); userEvent.click(await screen.findByLabelText('Menu actions trigger')); - userEvent.hover(screen.getByText('Data Export Options')); + userEvent.hover(await screen.findByText('Data Export Options')); userEvent.hover(await screen.findByText('Export Current View')); spyExportChart.resetHistory(); @@ -931,7 +924,7 @@ describe('Additional actions tests', () => { render(, { useRedux: true }); userEvent.click(await screen.findByLabelText('Menu actions trigger')); - userEvent.hover(screen.getByText('Data Export Options')); + userEvent.hover(await screen.findByText('Data Export Options')); userEvent.hover(await screen.findByText('Export Current View')); spyExportChart.resetHistory(); @@ -963,7 +956,7 @@ describe('Additional actions tests', () => { render(, { useRedux: true }); userEvent.click(screen.getByLabelText('Menu actions trigger')); - userEvent.hover(screen.getByText('Data Export Options')); + userEvent.hover(await screen.findByText('Data Export Options')); userEvent.hover(await screen.findByText('Export Current View')); // server path expected → use the sinon spy and inspect call args