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));