diff --git a/frontend/package.json b/frontend/package.json
index eb7f3ddff6f..924e9bd5fea 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -117,7 +117,8 @@
],
"testRegex": ".*\\.spec\\.(ts|tsx|js|jsx)$",
"testEnvironmentOptions": {
- "url": "http://localhost"
+ "url": "http://localhost",
+ "globalsCleanup": "on"
},
"setupFiles": [
"./__mocks__/fetch.ts",
diff --git a/frontend/packages/console-dynamic-plugin-sdk/src/api/__tests__/api.spec.ts b/frontend/packages/console-dynamic-plugin-sdk/src/api/__tests__/api.spec.ts
index 3b8543b6ca9..a3995cfe354 100644
--- a/frontend/packages/console-dynamic-plugin-sdk/src/api/__tests__/api.spec.ts
+++ b/frontend/packages/console-dynamic-plugin-sdk/src/api/__tests__/api.spec.ts
@@ -2,17 +2,13 @@ import * as coreApi from '../core-api';
import * as internalApi from '../internal-api';
describe('@openshift-console/dynamic-plugin-sdk/lib/api/core-api', () => {
- Object.entries(coreApi).forEach(([exportName, exportValue]) => {
- it(`should export ${exportName}`, () => {
- expect(exportValue).toBeDefined();
- });
+ it.each(Object.entries(coreApi))('should export %s (export %$)', (_name, exportValue) => {
+ expect(exportValue).toBeDefined();
});
});
describe('@openshift-console/dynamic-plugin-sdk-internal/lib/api/internal-api', () => {
- Object.entries(internalApi).forEach(([exportName, exportValue]) => {
- it(`should export ${exportName}`, () => {
- expect(exportValue).toBeDefined();
- });
+ it.each(Object.entries(internalApi))('should export %s (export %$)', (_name, exportValue) => {
+ expect(exportValue).toBeDefined();
});
});
diff --git a/frontend/packages/console-shared/src/components/dropdown/__tests__/ResourceDropdown.spec.tsx b/frontend/packages/console-shared/src/components/dropdown/__tests__/ResourceDropdown.spec.tsx
index f8790581140..a8019944a0f 100644
--- a/frontend/packages/console-shared/src/components/dropdown/__tests__/ResourceDropdown.spec.tsx
+++ b/frontend/packages/console-shared/src/components/dropdown/__tests__/ResourceDropdown.spec.tsx
@@ -199,6 +199,7 @@ describe('ResourceDropdown', () => {
});
it('should callback selected item from dropdown and change the title to selected item', async () => {
+ const user = userEvent.setup();
const spy = jest.fn();
const { rerender } = render(
@@ -229,7 +230,7 @@ describe('ResourceDropdown', () => {
// Click the dropdown button to open it
const dropdownButton = screen.getByRole('button');
- await userEvent.click(dropdownButton);
+ await user.click(dropdownButton);
// Wait for dropdown to open and find the menu item
await waitFor(() => {
@@ -238,7 +239,7 @@ describe('ResourceDropdown', () => {
// Find and click the third item (app-group-3)
const menuItem = screen.getByRole('option', { name: /app-group-3/ });
- await userEvent.click(menuItem);
+ await user.click(menuItem);
// Verify the dropdown button text has changed
await waitFor(() => {
diff --git a/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/EnvironmentVariablesSection.spec.tsx b/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/EnvironmentVariablesSection.spec.tsx
index 38ec8e22d66..ed19afa19b0 100644
--- a/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/EnvironmentVariablesSection.spec.tsx
+++ b/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/EnvironmentVariablesSection.spec.tsx
@@ -119,6 +119,7 @@ describe('EnvironmentVariablesSection', () => {
});
it('should update formik data', async () => {
+ const user = userEvent.setup();
const initialValues: EnvironmentVariablesSectionFormData = {
formData: {
environmentVariables: [],
@@ -132,8 +133,8 @@ describe('EnvironmentVariablesSection', () => {
,
);
- await userEvent.click(renderResult.getByText('Add value'));
- await userEvent.click(renderResult.getByText('Add value'));
+ await user.click(renderResult.getByText('Add value'));
+ await user.click(renderResult.getByText('Add value'));
expect(renderResult.queryAllByPlaceholderText('Name')).toHaveLength(3);
expect(renderResult.queryAllByPlaceholderText('Value')).toHaveLength(3);
@@ -141,16 +142,16 @@ describe('EnvironmentVariablesSection', () => {
const [name1, name2, name3] = renderResult.queryAllByPlaceholderText('Name');
const [value1, value2, value3] = renderResult.queryAllByPlaceholderText('Value');
- await userEvent.type(name1, 'env key 1');
- await userEvent.type(value1, 'env value 1');
- await userEvent.type(name2, 'env key 2');
- await userEvent.type(value2, 'env value 2');
- await userEvent.type(name3, 'env key 3');
- await userEvent.type(value3, 'env value 3');
+ await user.type(name1, 'env key 1');
+ await user.type(value1, 'env value 1');
+ await user.type(name2, 'env key 2');
+ await user.type(value2, 'env value 2');
+ await user.type(name3, 'env key 3');
+ await user.type(value3, 'env value 3');
// Submit
const submitButton = renderResult.getByRole('button', { name: 'Submit' });
- await userEvent.click(submitButton);
+ await user.click(submitButton);
await waitFor(() => {
expect(onSubmit).toHaveBeenCalledTimes(1);
});
@@ -165,5 +166,5 @@ describe('EnvironmentVariablesSection', () => {
},
};
expect(onSubmit).toHaveBeenLastCalledWith(expectedFormData, expect.anything());
- });
+ }, 30000); // userEvent.type is slow
});
diff --git a/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/HooksSection.spec.tsx b/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/HooksSection.spec.tsx
index 7eb7c7412d1..913c0bf9ed4 100644
--- a/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/HooksSection.spec.tsx
+++ b/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/HooksSection.spec.tsx
@@ -63,6 +63,7 @@ describe('HooksSection', () => {
});
it('should render more fields when checkbox is clicked', async () => {
+ const user = userEvent.setup();
const initialValues: HooksSectionFormData = {
formData: {
hooks: {
@@ -88,7 +89,7 @@ describe('HooksSection', () => {
const [checkbox] = renderResult.getAllByRole('checkbox') as HTMLInputElement[];
expect(checkbox.checked).toBeFalsy();
- await userEvent.click(checkbox);
+ await user.click(checkbox);
await waitFor(() => {
expect(checkbox.checked).toBeTruthy();
@@ -144,6 +145,7 @@ describe('HooksSection', () => {
});
it('should not render commands when hook type is changed to script', async () => {
+ const user = userEvent.setup();
const initialValues: HooksSectionFormData = {
formData: {
hooks: {
@@ -167,8 +169,8 @@ describe('HooksSection', () => {
expect(renderResult.queryAllByPlaceholderText('Command')).toHaveLength(2);
expect(renderResult.queryAllByPlaceholderText('Argument')).toHaveLength(2);
- await userEvent.click(renderResult.getByTestId('type'));
- await userEvent.click(renderResult.getByText('Shell script'));
+ await user.click(renderResult.getByTestId('type'));
+ await user.click(renderResult.getByText('Shell script'));
await waitFor(() => {
expect(renderResult.baseElement.querySelector('textarea')).toBeTruthy();
@@ -178,6 +180,7 @@ describe('HooksSection', () => {
});
it('should not render commands when hook type is changed to argsOnly', async () => {
+ const user = userEvent.setup();
const initialValues: HooksSectionFormData = {
formData: {
hooks: {
@@ -201,8 +204,8 @@ describe('HooksSection', () => {
expect(renderResult.queryAllByPlaceholderText('Command')).toHaveLength(2);
expect(renderResult.queryAllByPlaceholderText('Argument')).toHaveLength(2);
- await userEvent.click(renderResult.getByTestId('type'));
- await userEvent.click(renderResult.getByText('Arguments to default image entry point'));
+ await user.click(renderResult.getByTestId('type'));
+ await user.click(renderResult.getByText('Arguments to default image entry point'));
await waitFor(() => {
expect(renderResult.baseElement.querySelector('textarea')).toBeFalsy();
@@ -212,6 +215,7 @@ describe('HooksSection', () => {
});
it('should update formik data', async () => {
+ const user = userEvent.setup();
const initialValues: HooksSectionFormData = {
formData: {
hooks: {
@@ -232,7 +236,7 @@ describe('HooksSection', () => {
);
const [checkbox] = renderResult.getAllByRole('checkbox') as HTMLInputElement[];
- await userEvent.click(checkbox);
+ await user.click(checkbox);
// Wait for subform
await waitFor(() => {
@@ -246,16 +250,16 @@ describe('HooksSection', () => {
// Fill out subform
const [command1] = renderResult.getAllByPlaceholderText('Command');
- await userEvent.type(command1, 'echo');
- await userEvent.click(renderResult.getByText('Add argument'));
- await userEvent.click(renderResult.getByText('Add argument'));
+ await user.type(command1, 'echo');
+ await user.click(renderResult.getByText('Add argument'));
+ await user.click(renderResult.getByText('Add argument'));
const [argument1, argument2] = renderResult.getAllByPlaceholderText('Argument');
- await userEvent.type(argument1, 'hello');
- await userEvent.type(argument2, 'world');
+ await user.type(argument1, 'hello');
+ await user.type(argument2, 'world');
// Submit
const submitButton = renderResult.getByRole('button', { name: 'Submit' });
- await userEvent.click(submitButton);
+ await user.click(submitButton);
await waitFor(() => {
expect(onSubmit).toHaveBeenCalledTimes(1);
});
@@ -272,5 +276,5 @@ describe('HooksSection', () => {
},
};
expect(onSubmit).toHaveBeenLastCalledWith(expectedFormData, expect.anything());
- });
+ }, 30000); // userEvent.type is slow
});
diff --git a/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/ImagesSection.spec.tsx b/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/ImagesSection.spec.tsx
index dae59498355..7ba8c5eb963 100644
--- a/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/ImagesSection.spec.tsx
+++ b/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/ImagesSection.spec.tsx
@@ -142,6 +142,7 @@ describe('ImagesSection', () => {
});
it('should provide three options for build from image (no none option until strategy is Docker)', async () => {
+ const user = userEvent.setup();
const onSubmit = jest.fn();
const renderResult = render(
@@ -155,7 +156,7 @@ describe('ImagesSection', () => {
renderResult.getByText('None');
// Open first dropdown
- await userEvent.click(renderResult.getByText('Please select'));
+ await user.click(renderResult.getByText('Please select'));
// Assert options
const menuList = document.querySelector('[data-test="console-select-menu-list"]');
@@ -171,6 +172,7 @@ describe('ImagesSection', () => {
});
it('should provide four options for build from image (when build strategy is Docker)', async () => {
+ const user = userEvent.setup();
const initialValues = _.cloneDeep(emptyInitialValues);
initialValues.formData.images.strategyType = BuildStrategyType.Docker;
const onSubmit = jest.fn();
@@ -185,7 +187,7 @@ describe('ImagesSection', () => {
expect(renderResult.queryAllByText('None')).toHaveLength(2);
// Open first dropdown
- await userEvent.click(renderResult.getAllByText('None')[0]);
+ await user.click(renderResult.getAllByText('None')[0]);
// Assert options
const menuList = document.querySelector('[data-test="console-select-menu-list"]');
@@ -202,6 +204,7 @@ describe('ImagesSection', () => {
});
it('should provide three options (incl. none) for push to image', async () => {
+ const user = userEvent.setup();
const onSubmit = jest.fn();
const renderResult = render(
@@ -215,7 +218,7 @@ describe('ImagesSection', () => {
renderResult.getByText('None');
// Open second dropdown
- await userEvent.click(renderResult.getByText('None'));
+ await user.click(renderResult.getByText('None'));
// Assert options
const menuList = document.querySelector('[data-test="console-select-menu-list"]');
@@ -231,6 +234,7 @@ describe('ImagesSection', () => {
});
it('should show a subform when user selects image stream tag', async () => {
+ const user = userEvent.setup();
const onSubmit = jest.fn();
const renderResult = render(
@@ -239,8 +243,8 @@ describe('ImagesSection', () => {
,
);
- await userEvent.click(renderResult.getByText('Please select'));
- await userEvent.click(renderResult.getByText('Image Stream Tag'));
+ await user.click(renderResult.getByText('Please select'));
+ await user.click(renderResult.getByText('Image Stream Tag'));
renderResult.getByText('Project');
renderResult.getByText('Image Stream');
@@ -250,6 +254,7 @@ describe('ImagesSection', () => {
});
it('should show a subform when user selects image stream image', async () => {
+ const user = userEvent.setup();
const onSubmit = jest.fn();
const renderResult = render(
@@ -258,8 +263,8 @@ describe('ImagesSection', () => {
,
);
- await userEvent.click(renderResult.getByText('Please select'));
- await userEvent.click(renderResult.getByText('Image Stream Image'));
+ await user.click(renderResult.getByText('Please select'));
+ await user.click(renderResult.getByText('Image Stream Image'));
expect(renderResult.getAllByRole('textbox')).toHaveLength(1);
@@ -267,6 +272,7 @@ describe('ImagesSection', () => {
});
it('should show a subform when user selects dockerfile', async () => {
+ const user = userEvent.setup();
const onSubmit = jest.fn();
const renderResult = render(
@@ -275,16 +281,16 @@ describe('ImagesSection', () => {
,
);
- await userEvent.click(renderResult.getByText('Please select'));
- await userEvent.click(renderResult.getByText('External container image'));
+ await user.click(renderResult.getByText('Please select'));
+ await user.click(renderResult.getByText('External container image'));
expect(renderResult.getAllByRole('textbox')).toHaveLength(1);
expect(onSubmit).toHaveBeenCalledTimes(0);
});
- // Disabling as this test is flaking. @vikram-raj to investigate.
- xit('should submit right form data when user fills out an image stream tag', async () => {
+ it('should submit right form data when user fills out an image stream tag', async () => {
+ const user = userEvent.setup();
const onSubmit = jest.fn();
const renderResult = render(
@@ -293,20 +299,20 @@ describe('ImagesSection', () => {
,
);
- await userEvent.click(renderResult.getByText('Please select'));
- await userEvent.click(renderResult.getByText('Image Stream Tag'));
+ await user.click(renderResult.getByText('Please select'));
+ await user.click(renderResult.getByText('Image Stream Tag'));
// Fill form
- await userEvent.click(renderResult.getByText('Select Project'));
- await userEvent.click(renderResult.getByText('project-a'));
- await userEvent.click(renderResult.getByText('Select Image Stream'));
- await userEvent.click(renderResult.getByText('imagestream-a'));
- await userEvent.click(renderResult.getByText('Select tag'));
- await userEvent.click(renderResult.getByText('latest'));
+ await user.click(renderResult.getByText('Select Project'));
+ await user.click(renderResult.getByText('project-a'));
+ await user.click(renderResult.getByText('Select Image Stream'));
+ await user.click(renderResult.getByText('imagestream-a'));
+ await user.click(renderResult.getByText('Select tag'));
+ await user.click(renderResult.getByText('latest'));
// Submit
const submitButton = renderResult.getByRole('button', { name: 'Submit' });
- await userEvent.click(submitButton);
+ await user.click(submitButton);
await waitFor(() => {
expect(onSubmit).toHaveBeenCalledTimes(1);
});
@@ -355,9 +361,10 @@ describe('ImagesSection', () => {
},
};
expect(onSubmit).toHaveBeenLastCalledWith(expectedFormData, expect.anything());
- });
+ }, 30000); // userEvent.type is slow
it('should submit right form data when user fills out an image stream image', async () => {
+ const user = userEvent.setup();
const onSubmit = jest.fn();
const renderResult = render(
@@ -367,13 +374,13 @@ describe('ImagesSection', () => {
);
// Fill form
- await userEvent.click(renderResult.getByText('Please select'));
- await userEvent.click(renderResult.getByText('Image Stream Image'));
- await userEvent.type(renderResult.getByRole('textbox'), 'my-namespace/an-image');
+ await user.click(renderResult.getByText('Please select'));
+ await user.click(renderResult.getByText('Image Stream Image'));
+ await user.type(renderResult.getByRole('textbox'), 'my-namespace/an-image');
// Submit
const submitButton = renderResult.getByRole('button', { name: 'Submit' });
- await userEvent.click(submitButton);
+ await user.click(submitButton);
await waitFor(() => {
expect(onSubmit).toHaveBeenCalledTimes(1);
});
@@ -397,9 +404,10 @@ describe('ImagesSection', () => {
},
};
expect(onSubmit).toHaveBeenLastCalledWith(expectedFormData, expect.anything());
- });
+ }, 30000); // userEvent.type is slow
it('should submit right form data when user fills out an dockerfile', async () => {
+ const user = userEvent.setup();
const onSubmit = jest.fn();
const renderResult = render(
@@ -409,13 +417,13 @@ describe('ImagesSection', () => {
);
// Fill form
- await userEvent.click(renderResult.getByText('Please select'));
- await userEvent.click(renderResult.getByText('External container image'));
- await userEvent.type(renderResult.getByRole('textbox'), 'centos');
+ await user.click(renderResult.getByText('Please select'));
+ await user.click(renderResult.getByText('External container image'));
+ await user.type(renderResult.getByRole('textbox'), 'centos');
// Submit
const submitButton = renderResult.getByRole('button', { name: 'Submit' });
- await userEvent.click(submitButton);
+ await user.click(submitButton);
await waitFor(() => {
expect(onSubmit).toHaveBeenCalledTimes(1);
});
@@ -439,5 +447,5 @@ describe('ImagesSection', () => {
},
};
expect(onSubmit).toHaveBeenLastCalledWith(expectedFormData, expect.anything());
- });
+ }, 30000); // userEvent.type is slow
});
diff --git a/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/NameSection.spec.tsx b/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/NameSection.spec.tsx
index dae5c12096e..e196151c368 100644
--- a/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/NameSection.spec.tsx
+++ b/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/NameSection.spec.tsx
@@ -84,6 +84,7 @@ describe('NameSection', () => {
});
it('should update formik data', async () => {
+ const user = userEvent.setup();
const initialValues: NameSectionFormData = { formData: { name: '' } };
const onSubmit = jest.fn();
@@ -98,7 +99,7 @@ describe('NameSection', () => {
expect(nameInput.value).toEqual('');
expect(nameInput.disabled).toBeFalsy();
- await userEvent.type(nameInput, 'changed name');
+ await user.type(nameInput, 'changed name');
await waitFor(() => {
expect(screen.getAllByRole('textbox')[0].getAttribute('value')).toEqual('changed name');
@@ -109,12 +110,12 @@ describe('NameSection', () => {
// Submit
const submitButton = renderResult.getByRole('button', { name: 'Submit' });
- await userEvent.click(submitButton);
+ await user.click(submitButton);
await waitFor(() => {
expect(onSubmit).toHaveBeenCalledTimes(1);
});
const expectedFormData: NameSectionFormData = { formData: { name: 'changed name' } };
expect(onSubmit).toHaveBeenLastCalledWith(expectedFormData, expect.anything());
- });
+ }, 30000); // userEvent.type is slow
});
diff --git a/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/PolicySection.spec.tsx b/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/PolicySection.spec.tsx
index d0690b8d755..30f3c9b8f08 100644
--- a/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/PolicySection.spec.tsx
+++ b/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/PolicySection.spec.tsx
@@ -51,6 +51,7 @@ describe('PolicySectionFormData', () => {
});
it('should submit the right value when switching to parallel', async () => {
+ const user = userEvent.setup();
const onSubmit = jest.fn();
const renderResult = render(
@@ -59,12 +60,12 @@ describe('PolicySectionFormData', () => {
,
);
- await userEvent.click(renderResult.getByText('Serial'));
- await userEvent.click(renderResult.getByText('Parallel'));
+ await user.click(renderResult.getByText('Serial'));
+ await user.click(renderResult.getByText('Parallel'));
// Submit
const submitButton = renderResult.getByRole('button', { name: 'Submit' });
- await userEvent.click(submitButton);
+ await user.click(submitButton);
await waitFor(() => {
expect(onSubmit).toHaveBeenCalledTimes(1);
});
@@ -80,6 +81,7 @@ describe('PolicySectionFormData', () => {
});
it('should submit the right value when switching to serial latest only', async () => {
+ const user = userEvent.setup();
const onSubmit = jest.fn();
const renderResult = render(
@@ -88,12 +90,12 @@ describe('PolicySectionFormData', () => {
,
);
- await userEvent.click(renderResult.getByText('Serial'));
- await userEvent.click(renderResult.getByText('Serial latest only'));
+ await user.click(renderResult.getByText('Serial'));
+ await user.click(renderResult.getByText('Serial latest only'));
// Submit
const submitButton = renderResult.getByRole('button', { name: 'Submit' });
- await userEvent.click(submitButton);
+ await user.click(submitButton);
await waitFor(() => {
expect(onSubmit).toHaveBeenCalledTimes(1);
});
diff --git a/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/SecretsSection.spec.tsx b/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/SecretsSection.spec.tsx
index aedf4f56816..e697403071d 100644
--- a/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/SecretsSection.spec.tsx
+++ b/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/SecretsSection.spec.tsx
@@ -52,6 +52,7 @@ describe('SecretsSection', () => {
});
it('should render a secrets and mount point table after selecting add secret', async () => {
+ const user = userEvent.setup();
const initialValues: SecretsSectionFormData = {
formData: {
secrets: [],
@@ -69,7 +70,7 @@ describe('SecretsSection', () => {
expect(renderResult.queryByText('Secret')).toBeFalsy();
expect(renderResult.queryByText('Mount point')).toBeFalsy();
- await userEvent.click(renderResult.getByText('Add secret'));
+ await user.click(renderResult.getByText('Add secret'));
// Now expecting that there is a table to select a secret
renderResult.getByText('Secret');
diff --git a/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/SourceSection.spec.tsx b/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/SourceSection.spec.tsx
index d0ec7f70331..d5be3ed9aaf 100644
--- a/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/SourceSection.spec.tsx
+++ b/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/SourceSection.spec.tsx
@@ -132,6 +132,7 @@ describe('SourceSection', () => {
});
it('should render git input field when user selects git', async () => {
+ const user = userEvent.setup();
const onSubmit = jest.fn();
spyUseAccessReview.mockReturnValue([true]);
const renderResult = render(
@@ -141,8 +142,8 @@ describe('SourceSection', () => {
);
// Select git
- await userEvent.click(renderResult.getByText('Please select your source type'));
- await userEvent.click(renderResult.getByText('Git'));
+ await user.click(renderResult.getByText('Please select your source type'));
+ await user.click(renderResult.getByText('Git'));
// Assert subforms
await waitFor(() => {
@@ -155,6 +156,7 @@ describe('SourceSection', () => {
});
it('should render dockerfile input field when user selects dockerfile ', async () => {
+ const user = userEvent.setup();
const onSubmit = jest.fn();
const renderResult = render(
@@ -165,10 +167,10 @@ describe('SourceSection', () => {
// Select Dockerfile
expect(renderResult.queryAllByText('Dockerfile')).toHaveLength(0);
- await userEvent.click(renderResult.getByText('Please select your source type'));
+ await user.click(renderResult.getByText('Please select your source type'));
expect(renderResult.queryAllByText('Dockerfile')).toHaveLength(1);
- await userEvent.click(renderResult.getByText('Dockerfile'));
+ await user.click(renderResult.getByText('Dockerfile'));
// Assert subforms
await waitFor(() => {
@@ -181,6 +183,7 @@ describe('SourceSection', () => {
});
it('should update form data correct after entering a git url and branch (ref)', async () => {
+ const user = userEvent.setup();
const onSubmit = jest.fn();
spyUseAccessReview.mockReturnValue([true]);
const renderResult = render(
@@ -190,19 +193,18 @@ describe('SourceSection', () => {
);
// Fill out subform
- await userEvent.click(renderResult.getByText('Please select your source type'));
- await userEvent.click(renderResult.getByText('Git'));
- await userEvent.click(renderResult.getByText('Show advanced Git options'));
+ await user.click(renderResult.getByText('Please select your source type'));
+ await user.click(renderResult.getByText('Git'));
+ await user.click(renderResult.getByText('Show advanced Git options'));
- await userEvent.type(
+ await user.type(
getPatternFlyInputForLabel('Git Repo URL'),
'https://github.com/openshift/console',
);
- // TODO doesn't work at the moment?! userEvent.type(getPatternFlyInputForLabel('Git reference'), 'master');
// Submit
const submitButton = renderResult.getByRole('button', { name: 'Submit' });
- await userEvent.click(submitButton);
+ await user.click(submitButton);
await waitFor(() => {
expect(onSubmit).toHaveBeenCalledTimes(1);
});
@@ -233,9 +235,10 @@ describe('SourceSection', () => {
},
};
expect(onSubmit).toHaveBeenLastCalledWith(expectedFormData, expect.anything());
- });
+ }, 30000); // userEvent.type is slow
it('should update form data correct after selecting and entering a dockerfile', async () => {
+ const user = userEvent.setup();
const onSubmit = jest.fn();
spyEvaluateFunc.mockReturnValue({
isBuilderS2I: false,
@@ -248,13 +251,13 @@ describe('SourceSection', () => {
);
// Fill out subform
- await userEvent.click(renderResult.getByText('Please select your source type'));
- await userEvent.click(renderResult.getByText('Dockerfile'));
- await userEvent.type(renderResult.getByRole('textbox'), 'FROM: centos\nRUN echo hello world');
+ await user.click(renderResult.getByText('Please select your source type'));
+ await user.click(renderResult.getByText('Dockerfile'));
+ await user.type(renderResult.getByRole('textbox'), 'FROM: centos\nRUN echo hello world');
// Submit
const submitButton = renderResult.getByRole('button', { name: 'Submit' });
- await userEvent.click(submitButton);
+ await user.click(submitButton);
await waitFor(() => {
expect(onSubmit).toHaveBeenCalledTimes(1);
});
@@ -285,5 +288,5 @@ describe('SourceSection', () => {
},
};
expect(onSubmit).toHaveBeenLastCalledWith(expectedFormData, expect.anything());
- });
+ }, 30000); // userEvent.type is slow
});
diff --git a/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/TriggersSection.spec.tsx b/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/TriggersSection.spec.tsx
index 22a0c0d2f3e..0168ee0c0e0 100644
--- a/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/TriggersSection.spec.tsx
+++ b/frontend/packages/dev-console/src/components/buildconfig/sections/__tests__/TriggersSection.spec.tsx
@@ -53,6 +53,7 @@ describe('TriggersSection', () => {
});
it('should allow user to change config change checkbox trigger and save this data', async () => {
+ const user = userEvent.setup();
const onSubmit = jest.fn();
const renderResult = render(
@@ -62,11 +63,11 @@ describe('TriggersSection', () => {
);
// Change form
- await userEvent.click(renderResult.getByTestId('config-change checkbox'));
+ await user.click(renderResult.getByTestId('config-change checkbox'));
// Submit
const submitButton = renderResult.getByRole('button', { name: 'Submit' });
- await userEvent.click(submitButton);
+ await user.click(submitButton);
await waitFor(() => {
expect(onSubmit).toHaveBeenCalledTimes(1);
});
@@ -84,6 +85,7 @@ describe('TriggersSection', () => {
});
it('should allow user to change image change checkbox trigger and save this data', async () => {
+ const user = userEvent.setup();
const onSubmit = jest.fn();
const renderResult = render(
@@ -93,11 +95,11 @@ describe('TriggersSection', () => {
);
// Change form
- await userEvent.click(renderResult.getByTestId('image-change checkbox'));
+ await user.click(renderResult.getByTestId('image-change checkbox'));
// Submit
const submitButton = renderResult.getByRole('button', { name: 'Submit' });
- await userEvent.click(submitButton);
+ await user.click(submitButton);
await waitFor(() => {
expect(onSubmit).toHaveBeenCalledTimes(1);
});
diff --git a/frontend/packages/topology/src/components/export-app/__tests__/ExportViewLogButton.spec.tsx b/frontend/packages/topology/src/components/export-app/__tests__/ExportViewLogButton.spec.tsx
index fc131e010aa..b83232ac6ee 100644
--- a/frontend/packages/topology/src/components/export-app/__tests__/ExportViewLogButton.spec.tsx
+++ b/frontend/packages/topology/src/components/export-app/__tests__/ExportViewLogButton.spec.tsx
@@ -49,12 +49,13 @@ describe('ExportViewLogButton', () => {
});
it('should call onViewLog callback', async () => {
+ const user = userEvent.setup();
const viewLogCallback = jest.fn();
renderWithProviders(
,
);
const logButton = screen.getByTestId('export-view-log-btn');
- await userEvent.click(logButton);
+ await user.click(logButton);
expect(viewLogCallback).toHaveBeenCalled();
});
@@ -90,6 +91,7 @@ describe('ExportViewLogButton', () => {
});
it('should render correct tooltip', async () => {
+ const user = userEvent.setup();
mockK8sWatchResource.mockImplementation((res) => {
if (!res) return [null, true, null];
switch (res?.kind) {
@@ -113,7 +115,7 @@ describe('ExportViewLogButton', () => {
renderWithProviders();
const logButton = screen.getByTestId('export-view-log-btn');
- await userEvent.hover(logButton);
+ await user.hover(logButton);
const tooltip = await screen.findByText('Logs not available yet');
expect(tooltip).toBeInTheDocument();
diff --git a/frontend/packages/topology/src/filters/__tests__/KindFilterDropdown.spec.tsx b/frontend/packages/topology/src/filters/__tests__/KindFilterDropdown.spec.tsx
index 52b882403b8..143016994eb 100644
--- a/frontend/packages/topology/src/filters/__tests__/KindFilterDropdown.spec.tsx
+++ b/frontend/packages/topology/src/filters/__tests__/KindFilterDropdown.spec.tsx
@@ -133,6 +133,7 @@ describe(KindFilterDropdown.displayName, () => {
});
it('should call onChange when a kind is selected', async () => {
+ const user = userEvent.setup();
render(
{
);
const checkbox = screen.getByRole('checkbox', { name: /kind-a/i });
- await userEvent.click(checkbox);
+ await user.click(checkbox);
expect(onChange).toHaveBeenCalled();
});
diff --git a/frontend/public/components/__tests__/environment.spec.tsx b/frontend/public/components/__tests__/environment.spec.tsx
index 7946241fcd8..98059d8a11e 100644
--- a/frontend/public/components/__tests__/environment.spec.tsx
+++ b/frontend/public/components/__tests__/environment.spec.tsx
@@ -1,9 +1,11 @@
import { screen, waitFor } from '@testing-library/react';
+import { fromJS, Map as ImmutableMap } from 'immutable';
import { EnvironmentPage } from '../environment';
import * as rbacModule from '@console/dynamic-plugin-sdk/src/app/components/utils/rbac';
import * as k8sResourceModule from '@console/dynamic-plugin-sdk/src/utils/k8s/k8s-resource';
import { renderWithProviders } from '@console/shared/src/test-utils/unit-test-utils';
+import { DeploymentModel } from '../../models';
jest.mock('@console/dynamic-plugin-sdk/src/app/components/utils/rbac', () => ({
...jest.requireActual('@console/dynamic-plugin-sdk/src/app/components/utils/rbac'),
@@ -18,6 +20,18 @@ jest.mock('@console/dynamic-plugin-sdk/src/utils/k8s/k8s-resource', () => ({
const checkAccessMock = rbacModule.checkAccess as jest.Mock;
const k8sGetMock = k8sResourceModule.k8sGet as jest.Mock;
+// Provide DeploymentModel in the Redux store so checkEditAccess proceeds
+// past the `!model` guard and actually calls checkAccess.
+const initialState = {
+ k8s: fromJS({
+ RESOURCES: {
+ models: ImmutableMap().set('Deployment', DeploymentModel),
+ inFlight: false,
+ loaded: true,
+ },
+ }),
+};
+
describe('EnvironmentPage', () => {
const obj = { kind: 'Deployment', metadata: { namespace: 'test', name: 'test-deployment' } };
const sampleEnvData = {
@@ -81,9 +95,10 @@ describe('EnvironmentPage', () => {
jest.clearAllMocks();
});
- it.skip('restricts editing capabilities when user lacks update permissions', async () => {
+ it('restricts editing capabilities when user lacks update permissions', async () => {
renderWithProviders(
,
+ { initialState },
);
await waitFor(() => {
@@ -96,7 +111,7 @@ describe('EnvironmentPage', () => {
});
});
- it('does not display save and reload buttons without permission', () => {
+ it('does not display save and reload buttons without permission', async () => {
renderWithProviders(
{
envPath={[]}
readOnly={false}
/>,
+ { initialState },
);
+ // Wait for k8sGet and checkAccess to settle
+ await waitFor(() => {
+ expect(screen.getByDisplayValue('test')).toBeVisible();
+ });
+
expect(screen.queryByRole('button', { name: 'Save' })).not.toBeInTheDocument();
expect(screen.queryByRole('button', { name: 'Reload' })).not.toBeInTheDocument();
});
- it.skip('does not show field level help when user lacks permissions', async () => {
+ it('does not show field level help when user lacks permissions', async () => {
renderWithProviders(
{
envPath={[]}
readOnly={false}
/>,
+ { initialState },
);
await waitFor(() => {
@@ -150,6 +172,7 @@ describe('EnvironmentPage', () => {
envPath={[]}
readOnly={false}
/>,
+ { initialState },
);
await waitFor(() => {
@@ -167,6 +190,7 @@ describe('EnvironmentPage', () => {
envPath={[]}
readOnly={false}
/>,
+ { initialState },
);
await waitFor(() => {
diff --git a/frontend/public/components/cluster-settings/__tests__/test-utils.ts b/frontend/public/components/cluster-settings/__tests__/test-utils.ts
index 4f523d20139..7ff866b0d52 100644
--- a/frontend/public/components/cluster-settings/__tests__/test-utils.ts
+++ b/frontend/public/components/cluster-settings/__tests__/test-utils.ts
@@ -129,6 +129,8 @@ export const verifyIDPFileFields = async ({
fileName?: string;
fileContent?: string;
}) => {
+ const user = userEvent.setup();
+
// Wait for the async component to load and find the filename input by its aria-label
const filenameInput = await screen.findByLabelText(`${inputLabel} filename`);
verifyFormElementBasics(filenameInput, 'text', '');
@@ -156,7 +158,7 @@ export const verifyIDPFileFields = async ({
const file = new File([fileContent], fileName, { type: 'text/plain' });
// Simulate user selecting a file
- await userEvent.upload(fileInput, file);
+ await user.upload(fileInput, file);
// Verify the file was properly selected and assigned to the input element
expect(fileInput.files).toBeTruthy();
diff --git a/frontend/public/components/utils/__tests__/firehose.spec.tsx b/frontend/public/components/utils/__tests__/firehose.spec.tsx
index 2bbd6b8f257..415bb4bccc5 100644
--- a/frontend/public/components/utils/__tests__/firehose.spec.tsx
+++ b/frontend/public/components/utils/__tests__/firehose.spec.tsx
@@ -1368,8 +1368,7 @@ describe('Firehose together with useK8sWatchResources', () => {
});
});
- // FIXME crashs
- xit('should return an array for useK8sWatchResources isList=true even when Firehose isList=false is called without a name (Firehose first)', async () => {
+ it('should return an array for useK8sWatchResources isList=true even when Firehose isList=false is called without a name (Firehose first)', async () => {
// Without a name the k8sGet API is called, but it returns a list anyway.
k8sGetMock.mockReturnValue(Promise.resolve(podList));
@@ -1484,8 +1483,7 @@ describe('Firehose together with useK8sWatchResources', () => {
});
});
- // FIXME crashs
- xit('should return an array for useK8sWatchResources isList=true even when Firehose isList=false is called without a name (useK8sWatchResources first)', async () => {
+ it('should return an array for useK8sWatchResources isList=true even when Firehose isList=false is called without a name (useK8sWatchResources first)', async () => {
// Without a name the k8sGet API is called, but it returns a list anyway.
k8sGetMock.mockReturnValue(Promise.resolve(podList));