Skip to content

Commit

Permalink
[Dashboard] Fix missing state on short URL alias match redirect (#163658
Browse files Browse the repository at this point in the history
)

Fixes an issue where URL state from short URLs could be lost on an alias match redirect.
  • Loading branch information
ThomThomson committed Aug 11, 2023
1 parent f73746d commit 4de6111
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 2 deletions.
Expand Up @@ -51,14 +51,32 @@ 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'),
};
const dashboard = await createDashboard(creationOptions, 0, 'test-id');
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()
Expand Down
Expand Up @@ -137,7 +137,6 @@ export const initializeDashboard = async ({
useUnifiedSearchIntegration,
useSessionStorageIntegration,
} = creationOptions ?? {};
const overrideInput = getInitialInput?.();

// --------------------------------------------------------------------------------------
// Run validation.
Expand All @@ -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 ?? {}),
Expand Down

0 comments on commit 4de6111

Please sign in to comment.