From df9f69227434efe06171f295ea1c9ac07eefd0b5 Mon Sep 17 00:00:00 2001 From: Joe D'Amore Date: Fri, 8 Mar 2024 10:43:47 -0500 Subject: [PATCH 01/10] Remove calls to "act" to resolve "The current testing environment is not configured to support act" errors --- .../APITokens/EditAPITokenDrawer.test.tsx | 48 ++++++++----------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/packages/manager/src/features/Profile/APITokens/EditAPITokenDrawer.test.tsx b/packages/manager/src/features/Profile/APITokens/EditAPITokenDrawer.test.tsx index 05c526a8bf6..e102124db4c 100644 --- a/packages/manager/src/features/Profile/APITokens/EditAPITokenDrawer.test.tsx +++ b/packages/manager/src/features/Profile/APITokens/EditAPITokenDrawer.test.tsx @@ -1,4 +1,4 @@ -import { act, waitFor } from '@testing-library/react'; +import { waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import * as React from 'react'; @@ -33,44 +33,38 @@ describe('Edit API Token Drawer', () => { expect(cancelBtn).not.toHaveAttribute('aria-disabled', 'true'); expect(cancelBtn).toBeVisible(); }); + it('Save button should become enabled when label is changed', async () => { const { getByTestId } = renderWithTheme(); - const saveButton = getByTestId('save-button'); - expect(saveButton).toHaveAttribute('aria-disabled', 'true'); - - await act(async () => { - const labelField = getByTestId('textfield-input'); - - await userEvent.type(labelField, 'updated-token-label'); + expect(getByTestId('save-button')).toHaveAttribute('aria-disabled', 'true'); - const saveButton = getByTestId('save-button'); + const labelField = getByTestId('textfield-input'); - await waitFor(() => - expect(saveButton).toHaveAttribute('aria-disabled', 'false') - ); - }); + await userEvent.type(labelField, 'updated-token-label'); + await waitFor(() => + expect(getByTestId('save-button')).toHaveAttribute( + 'aria-disabled', + 'false' + ) + ); }); + it('Should close when updating a label and saving', async () => { // @note: this test uses handlers for PUT */profile/tokens/:id in serverHandlers.ts const { getByTestId } = renderWithTheme(); - await act(async () => { - const labelField = getByTestId('textfield-input'); - - await userEvent.type(labelField, 'my-token-updated'); - - const saveButton = getByTestId('save-button'); - - await waitFor(() => - expect(saveButton).toHaveAttribute('aria-disabled', 'false') - ); - - await userEvent.click(saveButton); + const labelField = getByTestId('textfield-input'); + await userEvent.type(labelField, 'my-token-updated'); - await waitFor(() => expect(props.onClose).toBeCalled()); - }); + const saveButton = getByTestId('save-button'); + await waitFor(() => + expect(saveButton).toHaveAttribute('aria-disabled', 'false') + ); + await userEvent.click(saveButton); + await waitFor(() => expect(props.onClose).toBeCalled()); }); + it('Should close when Cancel is pressed', async () => { const { getByText } = renderWithTheme(); const cancelButton = getByText(/Cancel/); From 573d3a8067d1482cc59818220ce4b0eb6eb8777c Mon Sep 17 00:00:00 2001 From: Joe D'Amore Date: Fri, 8 Mar 2024 11:35:42 -0500 Subject: [PATCH 02/10] Increase wait timeout to give time for Password input module to load --- .../LinodeSettings/ImageAndPassword.test.tsx | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/ImageAndPassword.test.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/ImageAndPassword.test.tsx index ec9be4b2720..52bff96c23a 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/ImageAndPassword.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/ImageAndPassword.test.tsx @@ -1,4 +1,5 @@ import * as React from 'react'; +import { waitFor } from '@testing-library/react'; import { profileFactory } from 'src/factories'; import { accountUserFactory } from 'src/factories/accountUsers'; @@ -26,12 +27,17 @@ describe('ImageAndPassword', () => { expect(getByLabelText('Image')).toBeEnabled(); }); it('should render a password error if defined', async () => { + const waitTimeout = 2500; const passwordError = 'Unable to set password.'; - const { findByText } = renderWithTheme( + const { getByText } = renderWithTheme( ); - - expect(await findByText(passwordError)).toBeVisible(); + await waitFor( + () => { + expect(getByText(passwordError)).toBeVisible(); + }, + { timeout: waitTimeout } + ); }); it('should render an SSH Keys section', async () => { const { getByText } = renderWithTheme(); From dda913893e9a51e72a427d12c45d182b0b8a9a28 Mon Sep 17 00:00:00 2001 From: Joe D'Amore Date: Mon, 11 Mar 2024 16:47:07 -0400 Subject: [PATCH 03/10] Clean up test warnings --- .../PlacementGroupsDeleteModal.test.tsx | 26 +++++++------------ 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/packages/manager/src/features/PlacementGroups/PlacementGroupsDeleteModal.test.tsx b/packages/manager/src/features/PlacementGroups/PlacementGroupsDeleteModal.test.tsx index 66fff87a554..e92a261391e 100644 --- a/packages/manager/src/features/PlacementGroups/PlacementGroupsDeleteModal.test.tsx +++ b/packages/manager/src/features/PlacementGroups/PlacementGroupsDeleteModal.test.tsx @@ -1,4 +1,4 @@ -import { act, fireEvent } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; import * as React from 'react'; import { @@ -10,8 +10,6 @@ import { renderWithTheme } from 'src/utilities/testHelpers'; import { PlacementGroupsDeleteModal } from './PlacementGroupsDeleteModal'; -import type { RenderResult } from '@testing-library/react'; - const queryMocks = vi.hoisted(() => ({ useAllLinodesQuery: vi.fn().mockReturnValue({}), useDeletePlacementGroup: vi.fn().mockReturnValue({ @@ -100,12 +98,9 @@ describe('PlacementGroupsDeleteModal', () => { }), }); - let renderResult: RenderResult; - await act(async () => { - renderResult = renderWithTheme(); - }); - - const { getByRole, getByTestId, getByText } = renderResult!; + const { getByRole, getByTestId, getByText } = renderWithTheme( + + ); expect( getByRole('heading', { @@ -136,12 +131,9 @@ describe('PlacementGroupsDeleteModal', () => { }), }); - let renderResult: RenderResult; - await act(async () => { - renderResult = renderWithTheme(); - }); - - const { getByRole, getByTestId, getByText } = renderResult!; + const { getByRole, getByTestId, getByText } = renderWithTheme( + + ); expect(getByText('No Linodes assigned to this Placement Group.')); @@ -151,10 +143,10 @@ describe('PlacementGroupsDeleteModal', () => { expect(textField).toBeEnabled(); expect(deleteButton).toBeDisabled(); - fireEvent.change(textField, { target: { value: 'PG-to-delete' } }); + await userEvent.type(textField, 'PG-to-delete'); expect(deleteButton).toBeEnabled(); - fireEvent.click(deleteButton); + await userEvent.click(deleteButton); expect(queryMocks.useDeletePlacementGroup).toHaveBeenCalled(); }); From 00664b510f9ad8e33048af84debf7258ff19b6d6 Mon Sep 17 00:00:00 2001 From: Joe D'Amore Date: Tue, 12 Mar 2024 09:18:50 -0400 Subject: [PATCH 04/10] Resolve RegEx global flag warnings --- .../BillingPanels/BillingSummary/BillingSummary.test.tsx | 6 +++--- .../LongviewDetail/DetailTabs/Disks/Graphs.test.tsx | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/manager/src/features/Billing/BillingPanels/BillingSummary/BillingSummary.test.tsx b/packages/manager/src/features/Billing/BillingPanels/BillingSummary/BillingSummary.test.tsx index b9605c9cbde..35688591d00 100644 --- a/packages/manager/src/features/Billing/BillingPanels/BillingSummary/BillingSummary.test.tsx +++ b/packages/manager/src/features/Billing/BillingPanels/BillingSummary/BillingSummary.test.tsx @@ -31,7 +31,7 @@ describe('BillingSummary', () => { ); - within(screen.getByTestId(accountBalanceText)).getByText(/no balance/gi); + within(screen.getByTestId(accountBalanceText)).getByText(/no balance/i); within(screen.getByTestId(accountBalanceValue)).getByText('$0.00'); }); @@ -45,7 +45,7 @@ describe('BillingSummary', () => { /> ); - within(screen.getByTestId(accountBalanceText)).getByText(/credit/gi); + within(screen.getByTestId(accountBalanceText)).getByText(/credit/i); within(screen.getByTestId(accountBalanceValue)).getByText('$10.00'); }); @@ -59,7 +59,7 @@ describe('BillingSummary', () => { /> ); - within(screen.getByTestId(accountBalanceText)).getByText(/Balance/gi); + within(screen.getByTestId(accountBalanceText)).getByText(/Balance/i); within(screen.getByTestId(accountBalanceValue)).getByText('$10.00'); }); diff --git a/packages/manager/src/features/Longview/LongviewDetail/DetailTabs/Disks/Graphs.test.tsx b/packages/manager/src/features/Longview/LongviewDetail/DetailTabs/Disks/Graphs.test.tsx index 6b4c3b31cb6..821e0339fe8 100644 --- a/packages/manager/src/features/Longview/LongviewDetail/DetailTabs/Disks/Graphs.test.tsx +++ b/packages/manager/src/features/Longview/LongviewDetail/DetailTabs/Disks/Graphs.test.tsx @@ -42,7 +42,7 @@ describe('UI', () => { expect(queryByTestId('space-graph')).toBeNull(); expect(queryByTestId('diskio-graph')).toBeInTheDocument(); - expect(getByText(/gather space and inode data/gim)); + expect(getByText(/gather space and inode data/im)); }); it('should not render Disk I/O graph for OpenVZ Configs', () => { @@ -55,7 +55,7 @@ describe('UI', () => { expect(queryByTestId('inodes-graph')).toBeInTheDocument(); expect(queryByTestId('diskio-graph')).toBeNull(); - expect(getByText(/gather Disk I\/O on OpenVZ Linodes/gim)); + expect(getByText(/gather Disk I\/O on OpenVZ Linodes/im)); }); it('should render warning text for ChildOf Disks', () => { @@ -68,7 +68,7 @@ describe('UI', () => { expect(queryByTestId('space-graph')).toBeNull(); expect(queryByTestId('diskio-graph')).toBeNull(); - expect(getByText(/doesn't gather data on this type of device/gim)); + expect(getByText(/doesn't gather data on this type of device/im)); }); it('should render warning text for unmounted disks', () => { @@ -81,6 +81,6 @@ describe('UI', () => { expect(queryByTestId('space-graph')).toBeNull(); expect(queryByTestId('diskio-graph')).toBeInTheDocument(); - expect(getByText(/gather Space and Inode data on unmounted disks/gim)); + expect(getByText(/gather Space and Inode data on unmounted disks/im)); }); }); From e583433c6d9650731a554400603a010a56397b33 Mon Sep 17 00:00:00 2001 From: Joe D'Amore Date: Tue, 12 Mar 2024 10:50:48 -0400 Subject: [PATCH 05/10] Remove act --- .../EditCertificateDrawer.test.tsx | 19 +++++++------------ .../LongviewLanding/LongviewLanding.test.tsx | 7 ++++--- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/Certificates/EditCertificateDrawer.test.tsx b/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/Certificates/EditCertificateDrawer.test.tsx index d727d4ad7cc..9f77e663998 100644 --- a/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/Certificates/EditCertificateDrawer.test.tsx +++ b/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/Certificates/EditCertificateDrawer.test.tsx @@ -1,4 +1,4 @@ -import { act, waitFor } from '@testing-library/react'; +import { waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import React from 'react'; @@ -82,10 +82,8 @@ describe('EditCertificateDrawer', () => { expect(labelInput).toHaveDisplayValue(mockCACertificate.label); expect(certInput).toHaveDisplayValue(mockCACertificate.certificate.trim()); - await act(async () => { - await userEvent.type(labelInput, 'my-updated-cert-0'); - await userEvent.click(getByTestId('submit')); - }); + await userEvent.type(labelInput, 'my-updated-cert-0'); + await userEvent.click(getByTestId('submit')); await waitFor(() => expect(onClose).toBeCalled()); }); @@ -105,13 +103,10 @@ describe('EditCertificateDrawer', () => { const certInput = getByLabelText('TLS Certificate'); const keyInput = getByLabelText('Private Key'); - await act(async () => { - await userEvent.type(labelInput, 'my-cert-0'); - await userEvent.type(certInput, 'massive cert'); - await userEvent.type(keyInput, 'massive key'); - - await userEvent.click(getByTestId('submit')); - }); + await userEvent.type(labelInput, 'my-cert-0'); + await userEvent.type(certInput, 'massive cert'); + await userEvent.type(keyInput, 'massive key'); + await userEvent.click(getByTestId('submit')); await waitFor(() => expect(onClose).toBeCalled()); }); diff --git a/packages/manager/src/features/Longview/LongviewLanding/LongviewLanding.test.tsx b/packages/manager/src/features/Longview/LongviewLanding/LongviewLanding.test.tsx index 47bd119b2da..1ff3d36970f 100644 --- a/packages/manager/src/features/Longview/LongviewLanding/LongviewLanding.test.tsx +++ b/packages/manager/src/features/Longview/LongviewLanding/LongviewLanding.test.tsx @@ -107,9 +107,10 @@ describe('Longview clients list view', () => { expect(props.getLongviewClients).toHaveBeenCalledTimes(1); }); - it('should have an Add Client button', () => { - const { queryByText } = renderWithTheme(); - expect(queryByText('Add Client')).toBeInTheDocument(); + it('should have an Add Client button', async () => { + const { findByText } = renderWithTheme(); + const addButton = await findByText('Add Client'); + expect(addButton).toBeInTheDocument(); }); it('should attempt to add a new client when the Add Client button is clicked', async () => { From 3960d8eb9fffef1d75cada04595be0299148ae58 Mon Sep 17 00:00:00 2001 From: Joe D'Amore Date: Tue, 12 Mar 2024 16:33:10 -0400 Subject: [PATCH 06/10] Upgrade Vitest --- packages/manager/package.json | 2 +- yarn.lock | 95 ++++++++++++++++++++++++++++++++++- 2 files changed, 95 insertions(+), 2 deletions(-) diff --git a/packages/manager/package.json b/packages/manager/package.json index 4773be9940c..73ab9eadb17 100644 --- a/packages/manager/package.json +++ b/packages/manager/package.json @@ -204,7 +204,7 @@ "ts-node": "^10.9.2", "vite": "^5.0.12", "vite-plugin-svgr": "^3.2.0", - "vitest": "^1.2.0" + "vitest": "^1.3.1" }, "browserslist": [ ">1%", diff --git a/yarn.lock b/yarn.lock index def2ec61922..f8e2306f09a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4440,6 +4440,15 @@ "@vitest/utils" "1.2.2" chai "^4.3.10" +"@vitest/expect@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-1.3.1.tgz#d4c14b89c43a25fd400a6b941f51ba27fe0cb918" + integrity sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw== + dependencies: + "@vitest/spy" "1.3.1" + "@vitest/utils" "1.3.1" + chai "^4.3.10" + "@vitest/runner@1.2.2": version "1.2.2" resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-1.2.2.tgz#8b060a56ecf8b3d607b044d79f5f50d3cd9fee2f" @@ -4449,6 +4458,15 @@ p-limit "^5.0.0" pathe "^1.1.1" +"@vitest/runner@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-1.3.1.tgz#e7f96cdf74842934782bfd310eef4b8695bbfa30" + integrity sha512-5FzF9c3jG/z5bgCnjr8j9LNq/9OxV2uEBAITOXfoe3rdZJTdO7jzThth7FXv/6b+kdY65tpRQB7WaKhNZwX+Kg== + dependencies: + "@vitest/utils" "1.3.1" + p-limit "^5.0.0" + pathe "^1.1.1" + "@vitest/snapshot@1.2.2": version "1.2.2" resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-1.2.2.tgz#f56fd575569774968f3eeba9382a166c26201042" @@ -4458,6 +4476,15 @@ pathe "^1.1.1" pretty-format "^29.7.0" +"@vitest/snapshot@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-1.3.1.tgz#193a5d7febf6ec5d22b3f8c5a093f9e4322e7a88" + integrity sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ== + dependencies: + magic-string "^0.30.5" + pathe "^1.1.1" + pretty-format "^29.7.0" + "@vitest/spy@1.2.2": version "1.2.2" resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-1.2.2.tgz#8fc2aeccb96cecbbdd192c643729bd5f97a01c86" @@ -4465,6 +4492,13 @@ dependencies: tinyspy "^2.2.0" +"@vitest/spy@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-1.3.1.tgz#814245d46d011b99edd1c7528f5725c64e85a88b" + integrity sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig== + dependencies: + tinyspy "^2.2.0" + "@vitest/ui@^1.0.4": version "1.2.2" resolved "https://registry.yarnpkg.com/@vitest/ui/-/ui-1.2.2.tgz#62dddb1ec12bdc5c186e7f2425490bb8b5080695" @@ -4488,6 +4522,16 @@ loupe "^2.3.7" pretty-format "^29.7.0" +"@vitest/utils@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@vitest/utils/-/utils-1.3.1.tgz#7b05838654557544f694a372de767fcc9594d61a" + integrity sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ== + dependencies: + diff-sequences "^29.6.3" + estree-walker "^3.0.3" + loupe "^2.3.7" + pretty-format "^29.7.0" + "@xmldom/xmldom@^0.8.3": version "0.8.10" resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" @@ -8912,6 +8956,11 @@ js-levenshtein@^1.1.6: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-tokens@^8.0.2: + version "8.0.3" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-8.0.3.tgz#1c407ec905643603b38b6be6977300406ec48775" + integrity sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw== + js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" @@ -12687,6 +12736,13 @@ strip-literal@^1.3.0: dependencies: acorn "^8.10.0" +strip-literal@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-2.0.0.tgz#5d063580933e4e03ebb669b12db64d2200687527" + integrity sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA== + dependencies: + js-tokens "^8.0.2" + stylis@4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" @@ -13596,6 +13652,17 @@ vite-node@1.2.2: picocolors "^1.0.0" vite "^5.0.0" +vite-node@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-1.3.1.tgz#a93f7372212f5d5df38e945046b945ac3f4855d2" + integrity sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng== + dependencies: + cac "^6.7.14" + debug "^4.3.4" + pathe "^1.1.1" + picocolors "^1.0.0" + vite "^5.0.0" + vite-plugin-svgr@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/vite-plugin-svgr/-/vite-plugin-svgr-3.3.0.tgz#024f083c0f0831497d8507b82e49a8ee2b29701a" @@ -13616,7 +13683,7 @@ vite@^5.0.0, vite@^5.0.12: optionalDependencies: fsevents "~2.3.3" -vitest@^1.0.1, vitest@^1.2.0: +vitest@^1.0.1: version "1.2.2" resolved "https://registry.yarnpkg.com/vitest/-/vitest-1.2.2.tgz#9e29ad2a74a5df553c30c5798c57a062d58ce299" integrity sha512-d5Ouvrnms3GD9USIK36KG8OZ5bEvKEkITFtnGv56HFaSlbItJuYr7hv2Lkn903+AvRAgSixiamozUVfORUekjw== @@ -13643,6 +13710,32 @@ vitest@^1.0.1, vitest@^1.2.0: vite-node "1.2.2" why-is-node-running "^2.2.2" +vitest@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/vitest/-/vitest-1.3.1.tgz#2d7e9861f030d88a4669392a4aecb40569d90937" + integrity sha512-/1QJqXs8YbCrfv/GPQ05wAZf2eakUPLPa18vkJAKE7RXOKfVHqMZZ1WlTjiwl6Gcn65M5vpNUB6EFLnEdRdEXQ== + dependencies: + "@vitest/expect" "1.3.1" + "@vitest/runner" "1.3.1" + "@vitest/snapshot" "1.3.1" + "@vitest/spy" "1.3.1" + "@vitest/utils" "1.3.1" + acorn-walk "^8.3.2" + chai "^4.3.10" + debug "^4.3.4" + execa "^8.0.1" + local-pkg "^0.5.0" + magic-string "^0.30.5" + pathe "^1.1.1" + picocolors "^1.0.0" + std-env "^3.5.0" + strip-literal "^2.0.0" + tinybench "^2.5.1" + tinypool "^0.8.2" + vite "^5.0.0" + vite-node "1.3.1" + why-is-node-running "^2.2.2" + w3c-xmlserializer@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" From 1c4e75812be52c8633e4e4577f999ef62be0b9a5 Mon Sep 17 00:00:00 2001 From: Joe D'Amore Date: Wed, 13 Mar 2024 10:43:47 -0400 Subject: [PATCH 07/10] Increase test timeout for CreateAPITokenDrawer and CreateCertificateDrawer tests --- .../CreateCertificateDrawer.test.tsx | 52 ++++++++++--------- .../APITokens/CreateAPITokenDrawer.test.tsx | 46 +++++++++------- 2 files changed, 54 insertions(+), 44 deletions(-) diff --git a/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/Certificates/CreateCertificateDrawer.test.tsx b/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/Certificates/CreateCertificateDrawer.test.tsx index eb99d893cab..7d28ba7a98a 100644 --- a/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/Certificates/CreateCertificateDrawer.test.tsx +++ b/packages/manager/src/features/LoadBalancers/LoadBalancerDetail/Certificates/CreateCertificateDrawer.test.tsx @@ -7,28 +7,32 @@ import { renderWithTheme } from 'src/utilities/testHelpers'; import { CreateCertificateDrawer } from './CreateCertificateDrawer'; describe('CreateCertificateDrawer', () => { - it('should be submittable when form is filled out correctly', async () => { - const onClose = vi.fn(); - - const { getByLabelText, getByTestId } = renderWithTheme( - - ); - - const labelInput = getByLabelText('Label'); - const certInput = getByLabelText('TLS Certificate'); - const keyInput = getByLabelText('Private Key'); - - await userEvent.type(labelInput, 'my-cert-0'); - await userEvent.type(certInput, 'massive cert'); - await userEvent.type(keyInput, 'massive key'); - - await userEvent.click(getByTestId('submit')); - - await waitFor(() => expect(onClose).toBeCalled()); - }); + it( + 'should be submittable when form is filled out correctly', + async () => { + const onClose = vi.fn(); + + const { getByLabelText, getByTestId } = renderWithTheme( + + ); + + const labelInput = getByLabelText('Label'); + const certInput = getByLabelText('TLS Certificate'); + const keyInput = getByLabelText('Private Key'); + + await userEvent.type(labelInput, 'my-cert-0'); + await userEvent.type(certInput, 'massive cert'); + await userEvent.type(keyInput, 'massive key'); + + await userEvent.click(getByTestId('submit')); + + await waitFor(() => expect(onClose).toBeCalled()); + }, + { timeout: 10000 } + ); }); diff --git a/packages/manager/src/features/Profile/APITokens/CreateAPITokenDrawer.test.tsx b/packages/manager/src/features/Profile/APITokens/CreateAPITokenDrawer.test.tsx index 5bc24a3c019..8eb89c5567c 100644 --- a/packages/manager/src/features/Profile/APITokens/CreateAPITokenDrawer.test.tsx +++ b/packages/manager/src/features/Profile/APITokens/CreateAPITokenDrawer.test.tsx @@ -53,26 +53,32 @@ describe('Create API Token Drawer', () => { expect(cancelBtn).toBeVisible(); }); - it('Should see secret modal with secret when you type a label and submit the form successfully', async () => { - server.use( - rest.post('*/profile/tokens', (req, res, ctx) => { - return res(ctx.json(appTokenFactory.build({ token: 'secret-value' }))); - }) - ); - - const { getByTestId, getByText } = renderWithTheme( - - ); - - const labelField = getByTestId('textfield-input'); - await userEvent.type(labelField, 'my-test-token'); - const submit = getByText('Create Token'); - await userEvent.click(submit); - - await waitFor(() => - expect(props.showSecret).toBeCalledWith('secret-value') - ); - }); + it( + 'Should see secret modal with secret when you type a label and submit the form successfully', + async () => { + server.use( + rest.post('*/profile/tokens', (req, res, ctx) => { + return res( + ctx.json(appTokenFactory.build({ token: 'secret-value' })) + ); + }) + ); + + const { getByTestId, getByText } = renderWithTheme( + + ); + + const labelField = getByTestId('textfield-input'); + await userEvent.type(labelField, 'my-test-token'); + const submit = getByText('Create Token'); + await userEvent.click(submit); + + await waitFor(() => + expect(props.showSecret).toBeCalledWith('secret-value') + ); + }, + { timeout: 10000 } + ); it('Should default to None for all scopes', () => { const { getByLabelText } = renderWithTheme( From 4e63e1d1b7a0d08d2a0eba7f0da2b085ca6ce666 Mon Sep 17 00:00:00 2001 From: Joe D'Amore Date: Wed, 13 Mar 2024 12:20:41 -0400 Subject: [PATCH 08/10] Clean up --- .../LinodeSettings/ImageAndPassword.test.tsx | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/ImageAndPassword.test.tsx b/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/ImageAndPassword.test.tsx index 52bff96c23a..2cbf4bf81f1 100644 --- a/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/ImageAndPassword.test.tsx +++ b/packages/manager/src/features/Linodes/LinodesDetail/LinodeSettings/ImageAndPassword.test.tsx @@ -1,6 +1,4 @@ import * as React from 'react'; -import { waitFor } from '@testing-library/react'; - import { profileFactory } from 'src/factories'; import { accountUserFactory } from 'src/factories/accountUsers'; import { grantsFactory } from 'src/factories/grants'; @@ -27,17 +25,15 @@ describe('ImageAndPassword', () => { expect(getByLabelText('Image')).toBeEnabled(); }); it('should render a password error if defined', async () => { - const waitTimeout = 2500; - const passwordError = 'Unable to set password.'; - const { getByText } = renderWithTheme( - - ); - await waitFor( - () => { - expect(getByText(passwordError)).toBeVisible(); - }, - { timeout: waitTimeout } + const errorMessage = 'Unable to set password.'; + const { findByText } = renderWithTheme( + ); + + const passwordError = await findByText(errorMessage, undefined, { + timeout: 2500, + }); + expect(passwordError).toBeVisible(); }); it('should render an SSH Keys section', async () => { const { getByText } = renderWithTheme(); From f7b8509fefa38f92da505045e4c37506fca07993 Mon Sep 17 00:00:00 2001 From: Joe D'Amore Date: Wed, 13 Mar 2024 12:24:38 -0400 Subject: [PATCH 09/10] Added changeset: Improve unit test suite stability --- packages/manager/.changeset/pr-10278-tests-1710347078555.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 packages/manager/.changeset/pr-10278-tests-1710347078555.md diff --git a/packages/manager/.changeset/pr-10278-tests-1710347078555.md b/packages/manager/.changeset/pr-10278-tests-1710347078555.md new file mode 100644 index 00000000000..6bb98190d06 --- /dev/null +++ b/packages/manager/.changeset/pr-10278-tests-1710347078555.md @@ -0,0 +1,5 @@ +--- +"@linode/manager": Tests +--- + +Improve unit test suite stability ([#10278](https://github.com/linode/manager/pull/10278)) From 0cdb44ec0dd23c5cab1f3177b653d95fb9ecacda Mon Sep 17 00:00:00 2001 From: Joe D'Amore Date: Thu, 14 Mar 2024 09:57:08 -0400 Subject: [PATCH 10/10] Upgrade APIv4 to Vitest 1.3.x --- packages/api-v4/package.json | 2 +- yarn.lock | 81 +----------------------------------- 2 files changed, 2 insertions(+), 81 deletions(-) diff --git a/packages/api-v4/package.json b/packages/api-v4/package.json index 4b13695ece2..63a5a4c3509 100644 --- a/packages/api-v4/package.json +++ b/packages/api-v4/package.json @@ -67,7 +67,7 @@ "lint-staged": "^13.2.2", "prettier": "~2.2.1", "tsup": "^7.2.0", - "vitest": "^1.0.1" + "vitest": "^1.3.1" }, "lint-staged": { "*.{ts,tsx,js}": [ diff --git a/yarn.lock b/yarn.lock index a484e00bfa6..9b237a11e86 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4431,15 +4431,6 @@ test-exclude "^6.0.0" v8-to-istanbul "^9.2.0" -"@vitest/expect@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-1.2.2.tgz#39ea22e849bbf404b7e5272786551aa99e2663d0" - integrity sha512-3jpcdPAD7LwHUUiT2pZTj2U82I2Tcgg2oVPvKxhn6mDI2On6tfvPQTjAI4628GUGDZrCm4Zna9iQHm5cEexOAg== - dependencies: - "@vitest/spy" "1.2.2" - "@vitest/utils" "1.2.2" - chai "^4.3.10" - "@vitest/expect@1.3.1": version "1.3.1" resolved "https://registry.yarnpkg.com/@vitest/expect/-/expect-1.3.1.tgz#d4c14b89c43a25fd400a6b941f51ba27fe0cb918" @@ -4449,15 +4440,6 @@ "@vitest/utils" "1.3.1" chai "^4.3.10" -"@vitest/runner@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-1.2.2.tgz#8b060a56ecf8b3d607b044d79f5f50d3cd9fee2f" - integrity sha512-JctG7QZ4LSDXr5CsUweFgcpEvrcxOV1Gft7uHrvkQ+fsAVylmWQvnaAr/HDp3LAH1fztGMQZugIheTWjaGzYIg== - dependencies: - "@vitest/utils" "1.2.2" - p-limit "^5.0.0" - pathe "^1.1.1" - "@vitest/runner@1.3.1": version "1.3.1" resolved "https://registry.yarnpkg.com/@vitest/runner/-/runner-1.3.1.tgz#e7f96cdf74842934782bfd310eef4b8695bbfa30" @@ -4467,15 +4449,6 @@ p-limit "^5.0.0" pathe "^1.1.1" -"@vitest/snapshot@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-1.2.2.tgz#f56fd575569774968f3eeba9382a166c26201042" - integrity sha512-SmGY4saEw1+bwE1th6S/cZmPxz/Q4JWsl7LvbQIky2tKE35US4gd0Mjzqfr84/4OD0tikGWaWdMja/nWL5NIPA== - dependencies: - magic-string "^0.30.5" - pathe "^1.1.1" - pretty-format "^29.7.0" - "@vitest/snapshot@1.3.1": version "1.3.1" resolved "https://registry.yarnpkg.com/@vitest/snapshot/-/snapshot-1.3.1.tgz#193a5d7febf6ec5d22b3f8c5a093f9e4322e7a88" @@ -4485,13 +4458,6 @@ pathe "^1.1.1" pretty-format "^29.7.0" -"@vitest/spy@1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-1.2.2.tgz#8fc2aeccb96cecbbdd192c643729bd5f97a01c86" - integrity sha512-k9Gcahssw8d7X3pSLq3e3XEu/0L78mUkCjivUqCQeXJm9clfXR/Td8+AP+VC1O6fKPIDLcHDTAmBOINVuv6+7g== - dependencies: - tinyspy "^2.2.0" - "@vitest/spy@1.3.1": version "1.3.1" resolved "https://registry.yarnpkg.com/@vitest/spy/-/spy-1.3.1.tgz#814245d46d011b99edd1c7528f5725c64e85a88b" @@ -4608,7 +4574,7 @@ acorn@^7.1.1, acorn@^7.4.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.10.0, acorn@^8.11.3, acorn@^8.4.1, acorn@^8.9.0: +acorn@^8.11.3, acorn@^8.4.1, acorn@^8.9.0: version "8.11.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== @@ -12734,13 +12700,6 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -strip-literal@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-1.3.0.tgz#db3942c2ec1699e6836ad230090b84bb458e3a07" - integrity sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg== - dependencies: - acorn "^8.10.0" - strip-literal@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-2.0.0.tgz#5d063580933e4e03ebb669b12db64d2200687527" @@ -13646,17 +13605,6 @@ victory-vendor@^36.6.8: d3-time "^3.0.0" d3-timer "^3.0.1" -vite-node@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-1.2.2.tgz#f6d329b06f9032130ae6eac1dc773f3663903c25" - integrity sha512-1as4rDTgVWJO3n1uHmUYqq7nsFgINQ9u+mRcXpjeOMJUmviqNKjcZB7UfRZrlM7MjYXMKpuWp5oGkjaFLnjawg== - dependencies: - cac "^6.7.14" - debug "^4.3.4" - pathe "^1.1.1" - picocolors "^1.0.0" - vite "^5.0.0" - vite-node@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-1.3.1.tgz#a93f7372212f5d5df38e945046b945ac3f4855d2" @@ -13688,33 +13636,6 @@ vite@^5.0.0, vite@^5.0.12: optionalDependencies: fsevents "~2.3.3" -vitest@^1.0.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/vitest/-/vitest-1.2.2.tgz#9e29ad2a74a5df553c30c5798c57a062d58ce299" - integrity sha512-d5Ouvrnms3GD9USIK36KG8OZ5bEvKEkITFtnGv56HFaSlbItJuYr7hv2Lkn903+AvRAgSixiamozUVfORUekjw== - dependencies: - "@vitest/expect" "1.2.2" - "@vitest/runner" "1.2.2" - "@vitest/snapshot" "1.2.2" - "@vitest/spy" "1.2.2" - "@vitest/utils" "1.2.2" - acorn-walk "^8.3.2" - cac "^6.7.14" - chai "^4.3.10" - debug "^4.3.4" - execa "^8.0.1" - local-pkg "^0.5.0" - magic-string "^0.30.5" - pathe "^1.1.1" - picocolors "^1.0.0" - std-env "^3.5.0" - strip-literal "^1.3.0" - tinybench "^2.5.1" - tinypool "^0.8.2" - vite "^5.0.0" - vite-node "1.2.2" - why-is-node-running "^2.2.2" - vitest@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/vitest/-/vitest-1.3.1.tgz#2d7e9861f030d88a4669392a4aecb40569d90937"