diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.test.ts b/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.test.ts index 5c1165dc68c5d..43e8f5ea5933e 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.test.ts +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.test.ts @@ -51,7 +51,7 @@ test('throws error when provided validation function returns invalid', async () }).rejects.toThrow('Dashboard failed saved object result validation'); }); -test('returns undefined when provided validation function returns redireted', async () => { +test('returns undefined when provided validation function returns redirected', async () => { const creationOptions: DashboardCreationOptions = { validateLoadedSavedObject: jest.fn().mockImplementation(() => 'redirected'), }; @@ -59,6 +59,24 @@ test('returns undefined when provided validation function returns redireted', as expect(dashboard).toBeUndefined(); }); +/** + * Because the getInitialInput function may have side effects, we only want to call it once we are certain that the + * the loaded saved object passes validation. + * + * This is especially relevant in the Dashboard App case where calling the getInitialInput function removes the _a + * param from the URL. In alais match situations this caused a bug where the state from the URL wasn't properly applied + * after the redirect. + */ +test('does not get initial input when provided validation function returns redirected', async () => { + const creationOptions: DashboardCreationOptions = { + validateLoadedSavedObject: jest.fn().mockImplementation(() => 'redirected'), + getInitialInput: jest.fn(), + }; + const dashboard = await createDashboard(creationOptions, 0, 'test-id'); + expect(dashboard).toBeUndefined(); + expect(creationOptions.getInitialInput).not.toHaveBeenCalled(); +}); + test('pulls state from dashboard saved object when given a saved object id', async () => { pluginServices.getServices().dashboardContentManagement.loadDashboardState = jest .fn() diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.ts b/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.ts index a595bca8c1841..753b881e5a94e 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.ts +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.ts @@ -137,7 +137,6 @@ export const initializeDashboard = async ({ useUnifiedSearchIntegration, useSessionStorageIntegration, } = creationOptions ?? {}; - const overrideInput = getInitialInput?.(); // -------------------------------------------------------------------------------------- // Run validation. @@ -161,6 +160,7 @@ export const initializeDashboard = async ({ // -------------------------------------------------------------------------------------- // Combine input from saved object, session storage, & passed input to create initial input. // -------------------------------------------------------------------------------------- + const overrideInput = getInitialInput?.(); const initialInput: DashboardContainerInput = cloneDeep({ ...DEFAULT_DASHBOARD_INPUT, ...(loadDashboardReturn?.dashboardInput ?? {}),