Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/kbn-test/src/jest/utils/testbed/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ export interface TestBed<T = string> {
*
* @param switchTestSubject The test subject of the EuiSwitch (can be a nested path. e.g. "myForm.mySwitch").
*/
toggleEuiSwitch: (switchTestSubject: T, isChecked?: boolean) => void;
toggleEuiSwitch: (switchTestSubject: T) => void;
/**
* The EUI ComboBox is a special input as it needs the ENTER key to be pressed
* in order to register the value set. This helpers automatically does that.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,29 @@
* 2.0.
*/

import { act } from 'react-dom/test-utils';
import { TestBedConfig } from '@kbn/test/jest';

import { AppServicesContext } from '../../../public/types';

import {
Phase,
createEnablePhaseAction,
createNodeAllocationActions,
createFormToggleAction,
createFormSetValueAction,
setReplicas,
savePolicy,
createSearchableSnapshotActions,
createTogglePhaseAction,
createSavePolicyAction,
createErrorsActions,
createRolloverActions,
createSetWaitForSnapshotAction,
createMinAgeActions,
createShrinkActions,
createFreezeActions,
createForceMergeActions,
createReadonlyActions,
createIndexPriorityActions,
} from '../helpers';

import { initTestBed } from './init_test_bed';

type SetupReturn = ReturnType<typeof setup>;
Expand All @@ -30,242 +39,57 @@ export const setup = async (arg?: {
}) => {
const testBed = await initTestBed(arg);

const { find, component, form, exists } = testBed;

const createFormCheckboxAction = (dataTestSubject: string) => async (checked: boolean) => {
await act(async () => {
form.selectCheckBox(dataTestSubject, checked);
});
component.update();
};

const setWaitForSnapshotPolicy = async (snapshotPolicyName: string) => {
act(() => {
find('snapshotPolicyCombobox').simulate('change', [{ label: snapshotPolicyName }]);
});
component.update();
};

const toggleDefaultRollover = createFormToggleAction(testBed, 'useDefaultRolloverSwitch');

const toggleRollover = createFormToggleAction(testBed, 'rolloverSwitch');

const setMaxPrimaryShardSize = async (value: string, units?: string) => {
await act(async () => {
find('hot-selectedMaxPrimaryShardSize').simulate('change', { target: { value } });
if (units) {
find('hot-selectedMaxPrimaryShardSize.select').simulate('change', {
target: { value: units },
});
}
});
component.update();
};

const setMaxSize = async (value: string, units?: string) => {
await act(async () => {
find('hot-selectedMaxSizeStored').simulate('change', { target: { value } });
if (units) {
find('hot-selectedMaxSizeStoredUnits.select').simulate('change', {
target: { value: units },
});
}
});
component.update();
};

const setMaxDocs = createFormSetValueAction(testBed, 'hot-selectedMaxDocuments');

const setMaxAge = async (value: string, units?: string) => {
await act(async () => {
find('hot-selectedMaxAge').simulate('change', { target: { value } });
if (units) {
find('hot-selectedMaxAgeUnits.select').simulate('change', { target: { value: units } });
}
});
component.update();
};

const createForceMergeActions = (phase: Phase) => {
const toggleSelector = `${phase}-forceMergeSwitch`;
return {
forceMergeFieldExists: () => exists(toggleSelector),
toggleForceMerge: createFormToggleAction(testBed, toggleSelector),
setForcemergeSegmentsCount: createFormSetValueAction(
testBed,
`${phase}-selectedForceMergeSegments`
),
setBestCompression: createFormCheckboxAction(`${phase}-bestCompression`),
};
};

const createIndexPriorityActions = (phase: Phase) => {
const toggleSelector = `${phase}-indexPrioritySwitch`;
return {
indexPriorityExists: () => exists(toggleSelector),
toggleIndexPriority: createFormToggleAction(testBed, toggleSelector),
setIndexPriority: createFormSetValueAction(testBed, `${phase}-indexPriority`),
};
};

const createMinAgeActions = (phase: Phase) => {
return {
hasMinAgeInput: () => exists(`${phase}-selectedMinimumAge`),
setMinAgeValue: createFormSetValueAction(testBed, `${phase}-selectedMinimumAge`),
setMinAgeUnits: createFormSetValueAction(testBed, `${phase}-selectedMinimumAgeUnits`),
hasRolloverTipOnMinAge: () => exists(`${phase}-rolloverMinAgeInputIconTip`),
};
};

const createShrinkActions = (phase: Phase) => {
const toggleSelector = `${phase}-shrinkSwitch`;
return {
shrinkExists: () => exists(toggleSelector),
toggleShrink: createFormToggleAction(testBed, toggleSelector),
setShrink: createFormSetValueAction(testBed, `${phase}-primaryShardCount`),
};
};

const createSetFreeze = (phase: Phase) =>
createFormToggleAction(testBed, `${phase}-freezeSwitch`);
const createFreezeExists = (phase: Phase) => () => exists(`${phase}-freezeSwitch`);

const createReadonlyActions = (phase: Phase) => {
const toggleSelector = `${phase}-readonlySwitch`;
return {
readonlyExists: () => exists(toggleSelector),
toggleReadonly: createFormToggleAction(testBed, toggleSelector),
};
};

const createSearchableSnapshotActions = (phase: Phase) => {
const fieldSelector = `searchableSnapshotField-${phase}`;
const licenseCalloutSelector = `${fieldSelector}.searchableSnapshotDisabledDueToLicense`;
const toggleSelector = `${fieldSelector}.searchableSnapshotToggle`;

const toggleSearchableSnapshot = createFormToggleAction(testBed, toggleSelector);
return {
searchableSnapshotDisabled: () =>
exists(licenseCalloutSelector) && find(licenseCalloutSelector).props().disabled === true,
searchableSnapshotsExists: () => exists(fieldSelector),
findSearchableSnapshotToggle: () => find(toggleSelector),
searchableSnapshotDisabledDueToLicense: () =>
exists(`${fieldSelector}.searchableSnapshotDisabledDueToLicense`),
toggleSearchableSnapshot,
setSearchableSnapshot: async (value: string) => {
if (!exists(`searchableSnapshotField-${phase}.searchableSnapshotCombobox`)) {
await toggleSearchableSnapshot(true);
}
act(() => {
find(`searchableSnapshotField-${phase}.searchableSnapshotCombobox`).simulate('change', [
{ label: value },
]);
});
component.update();
},
};
};

const enableDeletePhase = async (isEnabled: boolean) => {
const buttonSelector = isEnabled ? 'enableDeletePhaseButton' : 'disableDeletePhaseButton';
await act(async () => {
find(buttonSelector).simulate('click');
});
component.update();
};

const hasRolloverSettingRequiredCallout = (): boolean => exists('rolloverSettingsRequired');

const expectErrorMessages = (expectedMessages: string[]) => {
const errorMessages = component.find('.euiFormErrorText');
expect(errorMessages.length).toBe(expectedMessages.length);
expectedMessages.forEach((expectedErrorMessage) => {
let foundErrorMessage;
for (let i = 0; i < errorMessages.length; i++) {
if (errorMessages.at(i).text() === expectedErrorMessage) {
foundErrorMessage = true;
}
}
expect(foundErrorMessage).toBe(true);
});
};

/*
* We rely on a setTimeout (dedounce) to display error messages under the form fields.
* This handler runs all the timers so we can assert for errors in our tests.
*/
const runTimers = () => {
act(() => {
jest.runAllTimers();
});
component.update();
};
const { exists } = testBed;

return {
...testBed,
runTimers,
actions: {
saveAsNewPolicy: createFormToggleAction(testBed, 'saveAsNewSwitch'),
togglePhase: createTogglePhaseAction(testBed),
savePolicy: createSavePolicyAction(testBed),
toggleSaveAsNewPolicy: createFormToggleAction(testBed, 'saveAsNewSwitch'),
setPolicyName: createFormSetValueAction(testBed, 'policyNameField'),
setWaitForSnapshotPolicy,
savePolicy: () => savePolicy(testBed),
hasGlobalErrorCallout: () => exists('policyFormErrorsCallout'),
expectErrorMessages,
errors: {
...createErrorsActions(testBed),
},
timeline: {
hasHotPhase: () => exists('ilmTimelineHotPhase'),
hasWarmPhase: () => exists('ilmTimelineWarmPhase'),
hasColdPhase: () => exists('ilmTimelineColdPhase'),
hasFrozenPhase: () => exists('ilmTimelineFrozenPhase'),
hasDeletePhase: () => exists('ilmTimelineDeletePhase'),
hasPhase: (phase: Phase) => exists(`ilmTimelinePhase-${phase}`),
},
rollover: {
...createRolloverActions(testBed),
},
hot: {
setMaxSize,
setMaxDocs,
setMaxAge,
setMaxPrimaryShardSize,
toggleRollover,
toggleDefaultRollover,
hasRolloverSettingRequiredCallout,
hasErrorIndicator: () => exists('phaseErrorIndicator-hot'),
...createForceMergeActions('hot'),
...createIndexPriorityActions('hot'),
...createShrinkActions('hot'),
...createReadonlyActions('hot'),
...createSearchableSnapshotActions('hot'),
...createForceMergeActions(testBed, 'hot'),
...createIndexPriorityActions(testBed, 'hot'),
...createShrinkActions(testBed, 'hot'),
...createReadonlyActions(testBed, 'hot'),
...createSearchableSnapshotActions(testBed, 'hot'),
},
warm: {
enable: createEnablePhaseAction(testBed, 'warm'),
...createMinAgeActions('warm'),
...createMinAgeActions(testBed, 'warm'),
setReplicas: (value: string) => setReplicas(testBed, 'warm', value),
hasErrorIndicator: () => exists('phaseErrorIndicator-warm'),
...createShrinkActions('warm'),
...createForceMergeActions('warm'),
...createReadonlyActions('warm'),
...createIndexPriorityActions('warm'),
...createShrinkActions(testBed, 'warm'),
...createForceMergeActions(testBed, 'warm'),
...createReadonlyActions(testBed, 'warm'),
...createIndexPriorityActions(testBed, 'warm'),
...createNodeAllocationActions(testBed, 'warm'),
},
cold: {
enable: createEnablePhaseAction(testBed, 'cold'),
...createMinAgeActions('cold'),
...createMinAgeActions(testBed, 'cold'),
setReplicas: (value: string) => setReplicas(testBed, 'cold', value),
setFreeze: createSetFreeze('cold'),
freezeExists: createFreezeExists('cold'),
...createReadonlyActions('cold'),
hasErrorIndicator: () => exists('phaseErrorIndicator-cold'),
...createIndexPriorityActions('cold'),
...createSearchableSnapshotActions('cold'),
...createFreezeActions(testBed, 'cold'),
...createReadonlyActions(testBed, 'cold'),
...createIndexPriorityActions(testBed, 'cold'),
...createSearchableSnapshotActions(testBed, 'cold'),
...createNodeAllocationActions(testBed, 'cold'),
},
frozen: {
enable: createEnablePhaseAction(testBed, 'frozen'),
...createMinAgeActions('frozen'),
hasErrorIndicator: () => exists('phaseErrorIndicator-frozen'),
...createSearchableSnapshotActions('frozen'),
...createMinAgeActions(testBed, 'frozen'),
...createSearchableSnapshotActions(testBed, 'frozen'),
},
delete: {
isShown: () => exists('delete-phaseContent'),
enable: enableDeletePhase,
...createMinAgeActions('delete'),
isShown: () => exists('delete-phase'),
...createMinAgeActions(testBed, 'delete'),
setWaitForSnapshotPolicy: createSetWaitForSnapshotAction(testBed),
},
},
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import { act } from 'react-dom/test-utils';
import { setupEnvironment } from '../../helpers/setup_environment';
import { EditPolicyTestBed, setup } from '../edit_policy.helpers';
import { getDefaultHotPhasePolicy } from '../constants';

describe('<EditPolicy /> cold phase', () => {
let testBed: EditPolicyTestBed;
Expand All @@ -24,16 +23,7 @@ describe('<EditPolicy /> cold phase', () => {
});

beforeEach(async () => {
httpRequestsMockHelpers.setLoadPolicies([getDefaultHotPhasePolicy('my_policy')]);
httpRequestsMockHelpers.setListNodes({
nodesByRoles: { data: ['node1'] },
nodesByAttributes: { 'attribute:true': ['node1'] },
isUsingDeprecatedDataRoleConfig: true,
});
httpRequestsMockHelpers.setNodesDetails('attribute:true', [
{ nodeId: 'testNodeId', stats: { name: 'testNodeName', host: 'testHost' } },
]);
httpRequestsMockHelpers.setLoadSnapshotPolicies([]);
httpRequestsMockHelpers.setDefaultResponses();

await act(async () => {
testBed = await setup();
Expand All @@ -46,7 +36,7 @@ describe('<EditPolicy /> cold phase', () => {
test('shows timing only when enabled', async () => {
const { actions } = testBed;
expect(actions.cold.hasMinAgeInput()).toBeFalsy();
await actions.cold.enable(true);
await actions.togglePhase('cold');
expect(actions.cold.hasMinAgeInput()).toBeTruthy();
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,10 @@ describe('<EditPolicy /> delete phase', () => {
component.update();

expect(actions.delete.isShown()).toBeFalsy();
await actions.delete.enable(true);
await actions.togglePhase('delete');
expect(actions.delete.isShown()).toBeTruthy();
await actions.togglePhase('delete');
expect(actions.delete.isShown()).toBeFalsy();
});

test('shows timing after it was enabled', async () => {
Expand All @@ -65,7 +67,7 @@ describe('<EditPolicy /> delete phase', () => {
component.update();

expect(actions.delete.hasMinAgeInput()).toBeFalsy();
await actions.delete.enable(true);
await actions.togglePhase('delete');
expect(actions.delete.hasMinAgeInput()).toBeTruthy();
});

Expand All @@ -81,7 +83,7 @@ describe('<EditPolicy /> delete phase', () => {
test('updates snapshot policy name', async () => {
const { actions } = testBed;

await actions.setWaitForSnapshotPolicy(NEW_SNAPSHOT_POLICY_NAME);
await actions.delete.setWaitForSnapshotPolicy(NEW_SNAPSHOT_POLICY_NAME);
await actions.savePolicy();

const expected = {
Expand Down Expand Up @@ -109,7 +111,7 @@ describe('<EditPolicy /> delete phase', () => {
test('shows a callout when the input is not an existing policy', async () => {
const { actions } = testBed;

await actions.setWaitForSnapshotPolicy('my_custom_policy');
await actions.delete.setWaitForSnapshotPolicy('my_custom_policy');
expect(testBed.find('noPoliciesCallout').exists()).toBeFalsy();
expect(testBed.find('policiesErrorCallout').exists()).toBeFalsy();
expect(testBed.find('customPolicyCallout').exists()).toBeTruthy();
Expand All @@ -118,7 +120,7 @@ describe('<EditPolicy /> delete phase', () => {
test('removes the action if field is empty', async () => {
const { actions } = testBed;

await actions.setWaitForSnapshotPolicy('');
await actions.delete.setWaitForSnapshotPolicy('');
await actions.savePolicy();

const expected = {
Expand Down
Loading