diff --git a/site/src/components/PaginationWidget/PaginationWidgetBase.jest.tsx b/site/src/components/PaginationWidget/PaginationWidgetBase.test.tsx similarity index 96% rename from site/src/components/PaginationWidget/PaginationWidgetBase.jest.tsx rename to site/src/components/PaginationWidget/PaginationWidgetBase.test.tsx index eb9978386f..b0afc3a608 100644 --- a/site/src/components/PaginationWidget/PaginationWidgetBase.jest.tsx +++ b/site/src/components/PaginationWidget/PaginationWidgetBase.test.tsx @@ -17,7 +17,7 @@ describe(PaginationWidgetBase.name, () => { ]; for (const props of sampleProps) { - const onPageChange = jest.fn(); + const onPageChange = vi.fn(); const { unmount } = renderWithAuth( , ); @@ -39,7 +39,7 @@ describe(PaginationWidgetBase.name, () => { ]; for (const props of sampleProps) { - const onPageChange = jest.fn(); + const onPageChange = vi.fn(); const { unmount } = renderWithAuth( , ); @@ -61,7 +61,7 @@ describe(PaginationWidgetBase.name, () => { ]; for (const props of sampleProps) { - const onPageChange = jest.fn(); + const onPageChange = vi.fn(); const { unmount } = renderWithAuth( , ); diff --git a/site/src/contexts/ProxyContext.jest.tsx b/site/src/contexts/ProxyContext.test.tsx similarity index 98% rename from site/src/contexts/ProxyContext.jest.tsx rename to site/src/contexts/ProxyContext.test.tsx index 36a7a85eb3..02ef54f407 100644 --- a/site/src/contexts/ProxyContext.jest.tsx +++ b/site/src/contexts/ProxyContext.test.tsx @@ -22,13 +22,12 @@ import { } from "./ProxyContext"; import type * as ProxyLatency from "./useProxyLatency"; -// Mock useProxyLatency to use a hard-coded latency. 'jest.mock' must be called -// here and not inside a unit test. -jest.mock("contexts/useProxyLatency", () => ({ +// Mock useProxyLatency to use a hard-coded latency. +vi.mock("contexts/useProxyLatency", () => ({ useProxyLatency: () => { return { proxyLatencies: hardCodedLatencies, - refetch: jest.fn(), + refetch: vi.fn(), loaded: true, }; }, diff --git a/site/src/contexts/auth/RequireAuth.jest.tsx b/site/src/contexts/auth/RequireAuth.test.tsx similarity index 91% rename from site/src/contexts/auth/RequireAuth.jest.tsx rename to site/src/contexts/auth/RequireAuth.test.tsx index 518398b5e0..09036a8441 100644 --- a/site/src/contexts/auth/RequireAuth.jest.tsx +++ b/site/src/contexts/auth/RequireAuth.test.tsx @@ -48,9 +48,9 @@ const createAuthWrapper = (override: Partial) => { organizationIds: undefined, signInError: undefined, updateProfileError: undefined, - signOut: jest.fn(), - signIn: jest.fn(), - updateProfile: jest.fn(), + signOut: vi.fn(), + signIn: vi.fn(), + updateProfile: vi.fn(), ...override, }; const Wrapper: FC = ({ children }) => { @@ -66,7 +66,7 @@ const createAuthWrapper = (override: Partial) => { describe("useAuthenticated", () => { it("throws an error if it is used outside of a context with user", () => { - jest.spyOn(console, "error").mockImplementation(() => {}); + vi.spyOn(console, "error").mockImplementation(() => {}); expect(() => { renderHook(() => useAuthenticated(), { @@ -74,11 +74,11 @@ describe("useAuthenticated", () => { }); }).toThrow("User is not authenticated."); - jest.restoreAllMocks(); + vi.restoreAllMocks(); }); it("throws an error if it is used outside of a context with permissions", () => { - jest.spyOn(console, "error").mockImplementation(() => {}); + vi.spyOn(console, "error").mockImplementation(() => {}); expect(() => { renderHook(() => useAuthenticated(), { @@ -86,7 +86,7 @@ describe("useAuthenticated", () => { }); }).toThrow("Permissions are not available."); - jest.restoreAllMocks(); + vi.restoreAllMocks(); }); it("returns auth context values for authenticated context", () => { diff --git a/site/src/modules/dashboard/DashboardLayout.jest.tsx b/site/src/modules/dashboard/DashboardLayout.test.tsx similarity index 100% rename from site/src/modules/dashboard/DashboardLayout.jest.tsx rename to site/src/modules/dashboard/DashboardLayout.test.tsx diff --git a/site/src/modules/dashboard/useUpdateCheck.jest.tsx b/site/src/modules/dashboard/useUpdateCheck.test.tsx similarity index 100% rename from site/src/modules/dashboard/useUpdateCheck.jest.tsx rename to site/src/modules/dashboard/useUpdateCheck.test.tsx diff --git a/site/src/modules/workspaces/ClassicParameterFlowDeprecationWarning/ClassicParameterFlowDeprecationWarning.jest.tsx b/site/src/modules/workspaces/ClassicParameterFlowDeprecationWarning/ClassicParameterFlowDeprecationWarning.test.tsx similarity index 96% rename from site/src/modules/workspaces/ClassicParameterFlowDeprecationWarning/ClassicParameterFlowDeprecationWarning.jest.tsx rename to site/src/modules/workspaces/ClassicParameterFlowDeprecationWarning/ClassicParameterFlowDeprecationWarning.test.tsx index f68bb273f2..13b260315e 100644 --- a/site/src/modules/workspaces/ClassicParameterFlowDeprecationWarning/ClassicParameterFlowDeprecationWarning.jest.tsx +++ b/site/src/modules/workspaces/ClassicParameterFlowDeprecationWarning/ClassicParameterFlowDeprecationWarning.test.tsx @@ -1,7 +1,7 @@ import { render, screen } from "@testing-library/react"; import { ClassicParameterFlowDeprecationWarning } from "./ClassicParameterFlowDeprecationWarning"; -jest.mock("modules/navigation", () => ({ +vi.mock("modules/navigation", () => ({ useLinks: () => () => "/mock-link", linkToTemplate: () => "/mock-template-link", })); diff --git a/site/src/pages/AuditPage/AuditPage.jest.tsx b/site/src/pages/AuditPage/AuditPage.test.tsx similarity index 92% rename from site/src/pages/AuditPage/AuditPage.jest.tsx rename to site/src/pages/AuditPage/AuditPage.test.tsx index ea7e5d9c44..5abeccde23 100644 --- a/site/src/pages/AuditPage/AuditPage.jest.tsx +++ b/site/src/pages/AuditPage/AuditPage.test.tsx @@ -48,7 +48,7 @@ const renderPage = async ({ filter, page }: RenderPageOptions = {}) => { describe("AuditPage", () => { beforeEach(() => { // Mocking the dayjs module within the createDayString file - const mock = jest.spyOn(CreateDayString, "createDayString"); + const mock = vi.spyOn(CreateDayString, "createDayString"); mock.mockImplementation(() => "a minute ago"); // Mock the entitlements @@ -62,7 +62,7 @@ describe("AuditPage", () => { it("renders page 5", async () => { // Given const page = 5; - const getAuditLogsSpy = jest.spyOn(API, "getAuditLogs").mockResolvedValue({ + const getAuditLogsSpy = vi.spyOn(API, "getAuditLogs").mockResolvedValue({ audit_logs: [MockAuditLog, MockAuditLog2], count: 2, }); @@ -82,7 +82,7 @@ describe("AuditPage", () => { describe("Filtering", () => { it("filters by URL", async () => { - const getAuditLogsSpy = jest + const getAuditLogsSpy = vi .spyOn(API, "getAuditLogs") .mockResolvedValue({ audit_logs: [MockAuditLog], count: 1 }); @@ -99,7 +99,7 @@ describe("AuditPage", () => { it("resets page to 1 when filter is changed", async () => { await renderPage({ page: 2 }); - const getAuditLogsSpy = jest.spyOn(API, "getAuditLogs"); + const getAuditLogsSpy = vi.spyOn(API, "getAuditLogs"); getAuditLogsSpy.mockClear(); const filterField = screen.getByLabelText("Filter"); diff --git a/site/src/pages/ConnectionLogPage/ConnectionLogPage.jest.tsx b/site/src/pages/ConnectionLogPage/ConnectionLogPage.test.tsx similarity index 93% rename from site/src/pages/ConnectionLogPage/ConnectionLogPage.jest.tsx rename to site/src/pages/ConnectionLogPage/ConnectionLogPage.test.tsx index 2ce25e5a33..80ab26971a 100644 --- a/site/src/pages/ConnectionLogPage/ConnectionLogPage.jest.tsx +++ b/site/src/pages/ConnectionLogPage/ConnectionLogPage.test.tsx @@ -47,7 +47,7 @@ const renderPage = async ({ filter, page }: RenderPageOptions = {}) => { describe("ConnectionLogPage", () => { beforeEach(() => { // Mocking the dayjs module within the createDayString file - const mock = jest.spyOn(CreateDayString, "createDayString"); + const mock = vi.spyOn(CreateDayString, "createDayString"); mock.mockImplementation(() => "a minute ago"); // Mock the entitlements @@ -61,7 +61,7 @@ describe("ConnectionLogPage", () => { it("renders page 5", async () => { // Given const page = 5; - const getConnectionLogsSpy = jest + const getConnectionLogsSpy = vi .spyOn(API, "getConnectionLogs") .mockResolvedValue({ connection_logs: [ @@ -90,7 +90,7 @@ describe("ConnectionLogPage", () => { describe("Filtering", () => { it("filters by URL", async () => { - const getConnectionLogsSpy = jest + const getConnectionLogsSpy = vi .spyOn(API, "getConnectionLogs") .mockResolvedValue({ connection_logs: [MockConnectedSSHConnectionLog], @@ -110,7 +110,7 @@ describe("ConnectionLogPage", () => { it("resets page to 1 when filter is changed", async () => { await renderPage({ page: 2 }); - const getConnectionLogsSpy = jest.spyOn(API, "getConnectionLogs"); + const getConnectionLogsSpy = vi.spyOn(API, "getConnectionLogs"); getConnectionLogsSpy.mockClear(); const filterField = screen.getByLabelText("Filter"); diff --git a/site/src/pages/LoginPage/LoginPage.jest.tsx b/site/src/pages/LoginPage/LoginPage.test.tsx similarity index 100% rename from site/src/pages/LoginPage/LoginPage.jest.tsx rename to site/src/pages/LoginPage/LoginPage.test.tsx diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationMembersPage.jest.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationMembersPage.test.tsx similarity index 98% rename from site/src/pages/OrganizationSettingsPage/OrganizationMembersPage.jest.tsx rename to site/src/pages/OrganizationSettingsPage/OrganizationMembersPage.test.tsx index 713bc7e98d..d7d33c72d7 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationMembersPage.jest.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationMembersPage.test.tsx @@ -16,7 +16,7 @@ import type { SlimRole } from "api/typesGenerated"; import { HttpResponse, http } from "msw"; import OrganizationMembersPage from "./OrganizationMembersPage"; -jest.spyOn(console, "error").mockImplementation(() => {}); +vi.spyOn(console, "error").mockImplementation(() => {}); beforeEach(() => { server.use( diff --git a/site/src/pages/OrganizationSettingsPage/OrganizationRedirect.jest.tsx b/site/src/pages/OrganizationSettingsPage/OrganizationRedirect.test.tsx similarity index 98% rename from site/src/pages/OrganizationSettingsPage/OrganizationRedirect.jest.tsx rename to site/src/pages/OrganizationSettingsPage/OrganizationRedirect.test.tsx index 18c0eed0c2..3a85da1896 100644 --- a/site/src/pages/OrganizationSettingsPage/OrganizationRedirect.jest.tsx +++ b/site/src/pages/OrganizationSettingsPage/OrganizationRedirect.test.tsx @@ -12,7 +12,7 @@ import { screen } from "@testing-library/react"; import { HttpResponse, http } from "msw"; import OrganizationRedirect from "./OrganizationRedirect"; -jest.spyOn(console, "error").mockImplementation(() => {}); +vi.spyOn(console, "error").mockImplementation(() => {}); const renderPage = async () => { const { router } = renderWithOrganizationSettingsLayout( diff --git a/site/src/pages/SetupPage/SetupPage.jest.tsx b/site/src/pages/SetupPage/SetupPage.test.tsx similarity index 99% rename from site/src/pages/SetupPage/SetupPage.jest.tsx rename to site/src/pages/SetupPage/SetupPage.test.tsx index 386720ac5f..802171df37 100644 --- a/site/src/pages/SetupPage/SetupPage.jest.tsx +++ b/site/src/pages/SetupPage/SetupPage.test.tsx @@ -124,7 +124,7 @@ describe("Setup Page", () => { }); it("calls sendBeacon with telemetry", async () => { - const sendBeacon = jest.fn(); + const sendBeacon = vi.fn(); Object.defineProperty(window.navigator, "sendBeacon", { value: sendBeacon, }); diff --git a/site/src/pages/TemplatePage/TemplateRedirectController.jest.tsx b/site/src/pages/TemplatePage/TemplateRedirectController.test.tsx similarity index 90% rename from site/src/pages/TemplatePage/TemplateRedirectController.jest.tsx rename to site/src/pages/TemplatePage/TemplateRedirectController.test.tsx index 4bdc4e5bb2..f9dada64f2 100644 --- a/site/src/pages/TemplatePage/TemplateRedirectController.jest.tsx +++ b/site/src/pages/TemplatePage/TemplateRedirectController.test.tsx @@ -24,9 +24,10 @@ it("redirects from multi-org to single-org", async () => { }); it("redirects from single-org to multi-org", async () => { - jest - .spyOn(API, "getOrganizations") - .mockResolvedValueOnce([M.MockDefaultOrganization, M.MockOrganization2]); + vi.spyOn(API, "getOrganizations").mockResolvedValueOnce([ + M.MockDefaultOrganization, + M.MockOrganization2, + ]); const { router } = renderTemplateRedirectController( `/templates/${M.MockTemplate.name}`, diff --git a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.jest.tsx b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.test.tsx similarity index 92% rename from site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.jest.tsx rename to site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.test.tsx index ee9114f878..5ce54cc117 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.jest.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateSchedulePage/TemplateSchedulePage.test.tsx @@ -110,29 +110,27 @@ const fillAndSubmitForm = async ({ await user.click(confirmButton); }; -// One problem with the waitFor function is that if no additional config options -// are passed in, it will hang indefinitely as it keeps retrying an assertion. -// Even if Jest runs out of time and kills the test, you won't get a good error -// message. Adding options to force test to give up before test timeout +// By default, waitFor will lock until it succeeds or the test times out, and +// won't give a very informative error if the test times out. Setting a timeout +// slightly shorter than the test timeout helps give a more informative error +// because Vitest will act as if something specific went wrong rather than +// vaguely handwaving about something taking too long. function waitForWithCutoff(callback: () => void | Promise) { return waitFor(callback, { - // Defined to end 500ms before global cut-off time of 20s. Wanted to define - // this in terms of an exported constant from jest.config, but since Jest - // is CJS-based, that would've involved weird CJS-ESM interop issues - timeout: 19_500, + timeout: 4_500, }); } describe("TemplateSchedulePage", () => { beforeEach(() => { - jest - .spyOn(API, "getEntitlements") - .mockResolvedValue(MockEntitlementsWithScheduling); + vi.spyOn(API, "getEntitlements").mockResolvedValue( + MockEntitlementsWithScheduling, + ); }); it("Calls the API when user fills in and submits a form", async () => { await renderTemplateSchedulePage(); - jest.spyOn(API, "updateTemplateMeta").mockResolvedValueOnce({ + vi.spyOn(API, "updateTemplateMeta").mockResolvedValueOnce({ ...MockTemplate, ...validFormValues, }); @@ -146,7 +144,7 @@ describe("TemplateSchedulePage", () => { test("default is converted to and from hours", async () => { await renderTemplateSchedulePage(); - jest.spyOn(API, "updateTemplateMeta").mockResolvedValueOnce({ + vi.spyOn(API, "updateTemplateMeta").mockResolvedValueOnce({ ...MockTemplate, ...validFormValues, }); @@ -169,7 +167,7 @@ describe("TemplateSchedulePage", () => { test("failure, dormancy, and dormancy auto-deletion converted to and from days", async () => { await renderTemplateSchedulePage(); - jest.spyOn(API, "updateTemplateMeta").mockResolvedValueOnce({ + vi.spyOn(API, "updateTemplateMeta").mockResolvedValueOnce({ ...MockTemplate, ...validFormValues, }); diff --git a/site/src/pages/UserSettingsPage/AccountPage/AccountPage.jest.tsx b/site/src/pages/UserSettingsPage/AccountPage/AccountPage.test.tsx similarity index 92% rename from site/src/pages/UserSettingsPage/AccountPage/AccountPage.jest.tsx rename to site/src/pages/UserSettingsPage/AccountPage/AccountPage.test.tsx index 4215e62c44..d4b6cc9302 100644 --- a/site/src/pages/UserSettingsPage/AccountPage/AccountPage.jest.tsx +++ b/site/src/pages/UserSettingsPage/AccountPage/AccountPage.test.tsx @@ -25,7 +25,7 @@ const fillAndSubmitForm = async () => { describe("AccountPage", () => { describe("when it is a success", () => { it("shows the success message", async () => { - jest.spyOn(API, "updateProfile").mockImplementationOnce((userId, data) => + vi.spyOn(API, "updateProfile").mockImplementationOnce((userId, data) => Promise.resolve({ id: userId, email: "user@coder.com", @@ -53,7 +53,7 @@ describe("AccountPage", () => { describe("when the username is already taken", () => { it("shows an error", async () => { - jest.spyOn(API, "updateProfile").mockRejectedValueOnce( + vi.spyOn(API, "updateProfile").mockRejectedValueOnce( mockApiError({ message: "Invalid profile", validations: [ @@ -76,7 +76,7 @@ describe("AccountPage", () => { describe("when it is an unknown error", () => { it("shows a generic error message", async () => { - jest.spyOn(API, "updateProfile").mockRejectedValueOnce({ + vi.spyOn(API, "updateProfile").mockRejectedValueOnce({ data: "unknown error", }); diff --git a/site/src/pages/UserSettingsPage/AppearancePage/AppearancePage.jest.tsx b/site/src/pages/UserSettingsPage/AppearancePage/AppearancePage.test.tsx similarity index 91% rename from site/src/pages/UserSettingsPage/AppearancePage/AppearancePage.jest.tsx rename to site/src/pages/UserSettingsPage/AppearancePage/AppearancePage.test.tsx index c130764a83..355a1658a5 100644 --- a/site/src/pages/UserSettingsPage/AppearancePage/AppearancePage.jest.tsx +++ b/site/src/pages/UserSettingsPage/AppearancePage/AppearancePage.test.tsx @@ -9,7 +9,7 @@ describe("appearance page", () => { it("does nothing when selecting current theme", async () => { renderWithAuth(); - jest.spyOn(API, "updateAppearanceSettings").mockResolvedValueOnce({ + vi.spyOn(API, "updateAppearanceSettings").mockResolvedValueOnce({ ...MockUserOwner, theme_preference: "dark", terminal_font: "fira-code", @@ -25,7 +25,7 @@ describe("appearance page", () => { it("changes theme to light", async () => { renderWithAuth(); - jest.spyOn(API, "updateAppearanceSettings").mockResolvedValueOnce({ + vi.spyOn(API, "updateAppearanceSettings").mockResolvedValueOnce({ ...MockUserOwner, terminal_font: "ibm-plex-mono", theme_preference: "light", @@ -45,7 +45,7 @@ describe("appearance page", () => { it("changes font to fira code", async () => { renderWithAuth(); - jest.spyOn(API, "updateAppearanceSettings").mockResolvedValueOnce({ + vi.spyOn(API, "updateAppearanceSettings").mockResolvedValueOnce({ ...MockUserOwner, terminal_font: "fira-code", theme_preference: "dark", @@ -66,8 +66,7 @@ describe("appearance page", () => { renderWithAuth(); // given - jest - .spyOn(API, "updateAppearanceSettings") + vi.spyOn(API, "updateAppearanceSettings") .mockResolvedValueOnce({ ...MockUserOwner, terminal_font: "fira-code", diff --git a/site/src/pages/UserSettingsPage/SSHKeysPage/SSHKeysPage.jest.tsx b/site/src/pages/UserSettingsPage/SSHKeysPage/SSHKeysPage.test.tsx similarity index 95% rename from site/src/pages/UserSettingsPage/SSHKeysPage/SSHKeysPage.jest.tsx rename to site/src/pages/UserSettingsPage/SSHKeysPage/SSHKeysPage.test.tsx index f4124026ec..4ef4ac318e 100644 --- a/site/src/pages/UserSettingsPage/SSHKeysPage/SSHKeysPage.jest.tsx +++ b/site/src/pages/UserSettingsPage/SSHKeysPage/SSHKeysPage.test.tsx @@ -28,7 +28,7 @@ describe("SSH keys Page", () => { const newUserSSHKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDSC/ouD/LqiT1Rd99vDv/MwUmqzJuinLTMTpk5kVy66"; - jest.spyOn(API, "regenerateUserSSHKey").mockResolvedValueOnce({ + vi.spyOn(API, "regenerateUserSSHKey").mockResolvedValueOnce({ ...MockGitSSHKey, public_key: newUserSSHKey, }); @@ -57,7 +57,7 @@ describe("SSH keys Page", () => { // Wait to the ssh be rendered on the screen await screen.findByText(MockGitSSHKey.public_key); - jest.spyOn(API, "regenerateUserSSHKey").mockRejectedValueOnce( + vi.spyOn(API, "regenerateUserSSHKey").mockRejectedValueOnce( mockApiError({ message: SSHKeysPageLanguage.regenerationError, }), diff --git a/site/src/pages/UserSettingsPage/SchedulePage/SchedulePage.jest.tsx b/site/src/pages/UserSettingsPage/SchedulePage/SchedulePage.test.tsx similarity index 100% rename from site/src/pages/UserSettingsPage/SchedulePage/SchedulePage.jest.tsx rename to site/src/pages/UserSettingsPage/SchedulePage/SchedulePage.test.tsx diff --git a/site/src/pages/WorkspacePage/WorkspaceScheduleControls.jest.tsx b/site/src/pages/WorkspacePage/WorkspaceScheduleControls.test.tsx similarity index 96% rename from site/src/pages/WorkspacePage/WorkspaceScheduleControls.jest.tsx rename to site/src/pages/WorkspacePage/WorkspaceScheduleControls.test.tsx index 388f23625f..2f4d0f96df 100644 --- a/site/src/pages/WorkspacePage/WorkspaceScheduleControls.jest.tsx +++ b/site/src/pages/WorkspacePage/WorkspaceScheduleControls.test.tsx @@ -50,7 +50,7 @@ const renderScheduleControls = async () => { test("add 3 hours to deadline", async () => { const user = userEvent.setup(); - const updateDeadlineSpy = jest + const updateDeadlineSpy = vi .spyOn(API, "putWorkspaceExtension") .mockResolvedValue(); @@ -79,7 +79,7 @@ test("add 3 hours to deadline", async () => { test("remove 2 hours to deadline", async () => { const user = userEvent.setup(); - const updateDeadlineSpy = jest + const updateDeadlineSpy = vi .spyOn(API, "putWorkspaceExtension") .mockResolvedValue(); @@ -108,7 +108,7 @@ test("remove 2 hours to deadline", async () => { test("rollback to previous deadline on error", async () => { const user = userEvent.setup(); const initialScheduleMessage = "Stop in 3 hours"; - jest.spyOn(API, "putWorkspaceExtension").mockRejectedValue({}); + vi.spyOn(API, "putWorkspaceExtension").mockRejectedValue({}); await renderScheduleControls(); @@ -127,7 +127,7 @@ test("rollback to previous deadline on error", async () => { test("request is only sent once when clicking multiple times", async () => { const user = userEvent.setup(); - const updateDeadlineSpy = jest + const updateDeadlineSpy = vi .spyOn(API, "putWorkspaceExtension") .mockResolvedValue(); diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.jest.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.test.tsx similarity index 88% rename from site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.jest.tsx rename to site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.test.tsx index 90337e871e..c17e9ab65a 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.jest.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.test.tsx @@ -19,23 +19,23 @@ import WorkspaceParametersPage from "./WorkspaceParametersPage"; test("Submit the workspace settings page successfully", async () => { // Mock the API calls that loads data - jest - .spyOn(API, "getWorkspaceByOwnerAndName") - .mockResolvedValueOnce(MockWorkspace); - jest.spyOn(API, "getTemplateVersionRichParameters").mockResolvedValueOnce([ + vi.spyOn(API, "getWorkspaceByOwnerAndName").mockResolvedValueOnce( + MockWorkspace, + ); + vi.spyOn(API, "getTemplateVersionRichParameters").mockResolvedValueOnce([ MockTemplateVersionParameter1, MockTemplateVersionParameter2, // Immutable parameters MockTemplateVersionParameter4, ]); - jest.spyOn(API, "getWorkspaceBuildParameters").mockResolvedValueOnce([ + vi.spyOn(API, "getWorkspaceBuildParameters").mockResolvedValueOnce([ MockWorkspaceBuildParameter1, MockWorkspaceBuildParameter2, // Immutable value MockWorkspaceBuildParameter4, ]); // Mock the API calls that submit data - const postWorkspaceBuildSpy = jest + const postWorkspaceBuildSpy = vi .spyOn(API, "postWorkspaceBuild") .mockResolvedValue(MockWorkspaceBuild); // Setup event and rendering @@ -79,16 +79,16 @@ test("Submit the workspace settings page successfully", async () => { test("Submit button is only enabled when changes are made", async () => { // Mock the API calls that loads data - jest - .spyOn(API, "getWorkspaceByOwnerAndName") - .mockResolvedValueOnce(MockWorkspace); - jest.spyOn(API, "getTemplateVersionRichParameters").mockResolvedValueOnce([ + vi.spyOn(API, "getWorkspaceByOwnerAndName").mockResolvedValueOnce( + MockWorkspace, + ); + vi.spyOn(API, "getTemplateVersionRichParameters").mockResolvedValueOnce([ MockTemplateVersionParameter1, MockTemplateVersionParameter2, // Immutable parameters MockTemplateVersionParameter4, ]); - jest.spyOn(API, "getWorkspaceBuildParameters").mockResolvedValueOnce([ + vi.spyOn(API, "getWorkspaceBuildParameters").mockResolvedValueOnce([ MockWorkspaceBuildParameter1, MockWorkspaceBuildParameter2, // Immutable value diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.jest.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.test.tsx similarity index 95% rename from site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.jest.tsx rename to site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.test.tsx index c34e2a6a99..314b1747f7 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.jest.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceScheduleForm.test.tsx @@ -270,7 +270,7 @@ const defaultFormProps: WorkspaceScheduleFormProps = { describe("templateInheritance", () => { it("disables the entire autostart feature appropriately", async () => { - jest.spyOn(API, "getTemplateByName").mockResolvedValue(MockTemplate); + vi.spyOn(API, "getTemplateByName").mockResolvedValue(MockTemplate); const props = { ...defaultFormProps, template: { @@ -300,7 +300,7 @@ describe("templateInheritance", () => { it("disables the autostart days of the week appropriately", async () => { const enabledDayLabels = ["Sat", "Sun"]; - jest.spyOn(API, "getTemplateByName").mockResolvedValue(MockTemplate); + vi.spyOn(API, "getTemplateByName").mockResolvedValue(MockTemplate); const props = { ...defaultFormProps, template: { @@ -346,7 +346,7 @@ describe("templateInheritance", () => { allow_user_autostop: false, }, }; - jest.spyOn(API, "getTemplateByName").mockResolvedValue(MockTemplate); + vi.spyOn(API, "getTemplateByName").mockResolvedValue(MockTemplate); render(); const autoStopToggle = await screen.findByLabelText("Enable Autostop", { @@ -360,7 +360,7 @@ describe("templateInheritance", () => { expect(ttlInput).toBeDisabled(); }); it("disables secondary autostart fields if main feature switch is toggled off", async () => { - jest.spyOn(API, "getTemplateByName").mockResolvedValue(MockTemplate); + vi.spyOn(API, "getTemplateByName").mockResolvedValue(MockTemplate); render( { } }); it("disables secondary autostop fields if main feature switch is toggled off", async () => { - jest.spyOn(API, "getTemplateByName").mockResolvedValue(MockTemplate); + vi.spyOn(API, "getTemplateByName").mockResolvedValue(MockTemplate); render( { }); test("form should be enabled when both auto stop and auto start features are disabled, given that the template permits these actions", async () => { - jest.spyOn(API, "getTemplateByName").mockResolvedValue(MockTemplate); + vi.spyOn(API, "getTemplateByName").mockResolvedValue(MockTemplate); render( ); const submitButton = await screen.findByRole("button", { diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.jest.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.test.tsx similarity index 100% rename from site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.jest.tsx rename to site/src/pages/WorkspaceSettingsPage/WorkspaceSchedulePage/WorkspaceSchedulePage.test.tsx diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPage.jest.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPage.test.tsx similarity index 86% rename from site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPage.jest.tsx rename to site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPage.test.tsx index 2b4637200d..22da21eb26 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPage.jest.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPage.test.tsx @@ -10,13 +10,11 @@ import WorkspaceSettingsPage from "./WorkspaceSettingsPage"; test("Submit the workspace settings page successfully", async () => { // Mock the API calls that loads data - jest - .spyOn(API, "getWorkspaceByOwnerAndName") - .mockResolvedValueOnce({ ...MockWorkspace }); + vi.spyOn(API, "getWorkspaceByOwnerAndName").mockResolvedValueOnce({ + ...MockWorkspace, + }); // Mock the API calls that submit data - const patchWorkspaceSpy = jest - .spyOn(API, "patchWorkspace") - .mockResolvedValue(); + const patchWorkspaceSpy = vi.spyOn(API, "patchWorkspace").mockResolvedValue(); // Setup event and rendering const user = userEvent.setup(); renderWithWorkspaceSettingsLayout(, { @@ -42,9 +40,10 @@ test("Submit the workspace settings page successfully", async () => { test("Name field is disabled if renames are disabled", async () => { // Mock the API calls that loads data - jest - .spyOn(API, "getWorkspaceByOwnerAndName") - .mockResolvedValueOnce({ ...MockWorkspace, allow_renames: false }); + vi.spyOn(API, "getWorkspaceByOwnerAndName").mockResolvedValueOnce({ + ...MockWorkspace, + allow_renames: false, + }); renderWithWorkspaceSettingsLayout(, { route: "/@test-user/test-workspace/settings", path: "/:username/:workspace/settings", diff --git a/site/src/utils/formUtils.jest.ts b/site/src/utils/formUtils.test.ts similarity index 98% rename from site/src/utils/formUtils.jest.ts rename to site/src/utils/formUtils.test.ts index 2b3d6b3df1..9ed94c840f 100644 --- a/site/src/utils/formUtils.jest.ts +++ b/site/src/utils/formUtils.test.ts @@ -12,7 +12,7 @@ interface TestType { maxLengthOver: string; } -const mockHandleChange = jest.fn(); +const mockHandleChange = vi.fn(); const form = { errors: { @@ -43,12 +43,12 @@ const form = { maxLengthOver: "a".repeat(33), }, handleChange: mockHandleChange, - handleBlur: jest.fn(), + handleBlur: vi.fn(), getFieldProps: (name: keyof TestType) => { return { name, - onBlur: jest.fn(), - onChange: jest.fn(), + onBlur: vi.fn(), + onChange: vi.fn(), value: form.values[name] ?? "", }; }, diff --git a/site/test/setup/domStubs.ts b/site/test/setup/domStubs.ts index 039ec3bac9..3cc98d68e0 100644 --- a/site/test/setup/domStubs.ts +++ b/site/test/setup/domStubs.ts @@ -2,5 +2,6 @@ globalThis.HTMLElement.prototype.hasPointerCapture = vi .fn() .mockReturnValue(false); -globalThis.HTMLElement.prototype.setPointerCapture = vi.fn(); globalThis.HTMLElement.prototype.releasePointerCapture = vi.fn(); +globalThis.HTMLElement.prototype.scrollIntoView = vi.fn(); +globalThis.HTMLElement.prototype.setPointerCapture = vi.fn();