diff --git a/jsx/package-lock.json b/jsx/package-lock.json index 170522ae..d9d3744c 100644 --- a/jsx/package-lock.json +++ b/jsx/package-lock.json @@ -30,7 +30,7 @@ "@babel/preset-react": "^7.24.7", "@testing-library/jest-dom": "^6.5.0", "@testing-library/react": "^12.1.5", - "@testing-library/user-event": "^13.5.0", + "@testing-library/user-event": "^14.5.2", "@webpack-cli/serve": "^2.0.1", "babel-jest": "^29.7.0", "babel-loader": "^9.1.3", @@ -2835,14 +2835,12 @@ } }, "node_modules/@testing-library/user-event": { - "version": "13.5.0", + "version": "14.5.2", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz", + "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, "engines": { - "node": ">=10", + "node": ">=12", "npm": ">=6" }, "peerDependencies": { @@ -8310,11 +8308,13 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { diff --git a/jsx/package.json b/jsx/package.json index e87295b5..69cd3429 100644 --- a/jsx/package.json +++ b/jsx/package.json @@ -50,7 +50,7 @@ "@babel/preset-react": "^7.24.7", "@testing-library/jest-dom": "^6.5.0", "@testing-library/react": "^12.1.5", - "@testing-library/user-event": "^13.5.0", + "@testing-library/user-event": "^14.5.2", "@webpack-cli/serve": "^2.0.1", "babel-jest": "^29.7.0", "babel-loader": "^9.1.3", diff --git a/jsx/src/components/AddUser/AddUser.test.js b/jsx/src/components/AddUser/AddUser.test.js index bb5d35f6..408ce6f5 100644 --- a/jsx/src/components/AddUser/AddUser.test.js +++ b/jsx/src/components/AddUser/AddUser.test.js @@ -67,7 +67,7 @@ test("Removes users when they fail Regex", async () => { fireEvent.blur(textarea, { target: { value: "foo \n bar\na@b.co\n \n\n" } }); await act(async () => { - fireEvent.click(submit); + await fireEvent.click(submit); }); expect(callbackSpy).toHaveBeenCalledWith(["foo", "bar", "a@b.co"], false); @@ -84,10 +84,10 @@ test("Correctly submits admin", async () => { let submit = screen.getByTestId("submit"); let check = screen.getByTestId("check"); - userEvent.click(check); + await userEvent.click(check); fireEvent.blur(textarea, { target: { value: "foo" } }); await act(async () => { - fireEvent.click(submit); + await fireEvent.click(submit); }); expect(callbackSpy).toHaveBeenCalledWith(["foo"], true); @@ -103,7 +103,7 @@ test("Shows a UI error dialogue when user creation fails", async () => { let submit = screen.getByTestId("submit"); await act(async () => { - fireEvent.click(submit); + await fireEvent.click(submit); }); let errorDialog = screen.getByText("Failed to create user."); @@ -122,7 +122,7 @@ test("Shows a more specific UI error dialogue when user creation returns an impr let submit = screen.getByTestId("submit"); await act(async () => { - fireEvent.click(submit); + await fireEvent.click(submit); }); let errorDialog = screen.getByText( diff --git a/jsx/src/components/CreateGroup/CreateGroup.test.js b/jsx/src/components/CreateGroup/CreateGroup.test.js index f05f1693..8debfa72 100644 --- a/jsx/src/components/CreateGroup/CreateGroup.test.js +++ b/jsx/src/components/CreateGroup/CreateGroup.test.js @@ -63,9 +63,10 @@ test("Calls createGroup on submit", async () => { let input = screen.getByTestId("group-input"); let submit = screen.getByTestId("submit"); + const user = userEvent.setup({ advanceTimers: jest.advanceTimersByTime }); - userEvent.type(input, "groupname"); - await act(async () => fireEvent.click(submit)); + await user.type(input, "groupname"); + await act(async () => await fireEvent.click(submit)); expect(callbackSpy).toHaveBeenNthCalledWith(1, "groupname"); }); @@ -80,7 +81,7 @@ test("Shows a UI error dialogue when group creation fails", async () => { let submit = screen.getByTestId("submit"); await act(async () => { - fireEvent.click(submit); + await fireEvent.click(submit); }); let errorDialog = screen.getByText("Failed to create group."); @@ -99,7 +100,7 @@ test("Shows a more specific UI error dialogue when user creation returns an impr let submit = screen.getByTestId("submit"); await act(async () => { - fireEvent.click(submit); + await fireEvent.click(submit); }); let errorDialog = screen.getByText( diff --git a/jsx/src/components/EditUser/EditUser.test.js b/jsx/src/components/EditUser/EditUser.test.js index 486e2517..56223e64 100644 --- a/jsx/src/components/EditUser/EditUser.test.js +++ b/jsx/src/components/EditUser/EditUser.test.js @@ -80,7 +80,7 @@ test("Calls the delete user function when the button is pressed", async () => { let deleteUser = screen.getByTestId("delete-user"); await act(async () => { - fireEvent.click(deleteUser); + await fireEvent.click(deleteUser); }); expect(callbackSpy).toHaveBeenCalled(); @@ -95,7 +95,7 @@ test("Submits the edits when the button is pressed", async () => { let submit = screen.getByTestId("submit"); await act(async () => { - fireEvent.click(submit); + await fireEvent.click(submit); }); expect(callbackSpy).toHaveBeenCalled(); @@ -113,7 +113,7 @@ test("Shows a UI error dialogue when user edit fails", async () => { fireEvent.blur(usernameInput, { target: { value: "whatever" } }); await act(async () => { - fireEvent.click(submit); + await fireEvent.click(submit); }); let errorDialog = screen.getByText("Failed to edit user."); @@ -134,7 +134,7 @@ test("Shows a UI error dialogue when user edit returns an improper status code", fireEvent.blur(usernameInput, { target: { value: "whatever" } }); await act(async () => { - fireEvent.click(submit); + await fireEvent.click(submit); }); let errorDialog = screen.getByText("Failed to edit user."); diff --git a/jsx/src/components/GroupEdit/GroupEdit.test.jsx b/jsx/src/components/GroupEdit/GroupEdit.test.jsx index a18e2715..137075b2 100644 --- a/jsx/src/components/GroupEdit/GroupEdit.test.jsx +++ b/jsx/src/components/GroupEdit/GroupEdit.test.jsx @@ -80,13 +80,13 @@ test("Adds user from input to user selectables on button click", async () => { let input = screen.getByTestId("username-input"); let validateUser = screen.getByTestId("validate-user"); let submit = screen.getByTestId("submit"); - - userEvent.type(input, "bar"); - fireEvent.click(validateUser); + const user = userEvent.setup({ advanceTimers: jest.advanceTimersByTime }); + await user.type(input, "bar"); + await fireEvent.click(validateUser); await act(async () => okPacket); await act(async () => { - fireEvent.click(submit); + await fireEvent.click(submit); }); expect(callbackSpy).toHaveBeenNthCalledWith(1, ["bar"], "group"); @@ -100,7 +100,7 @@ test("Removes a user recently added from input from the selectables list", async }); let selectedUser = screen.getByText("foo"); - fireEvent.click(selectedUser); + await await fireEvent.click(selectedUser); let unselectedUser = screen.getByText("foo"); @@ -117,14 +117,14 @@ test("Grays out a user, already in the group, when unselected and calls deleteUs let submit = screen.getByTestId("submit"); let groupUser = screen.getByText("foo"); - fireEvent.click(groupUser); + await fireEvent.click(groupUser); let unselectedUser = screen.getByText("foo"); expect(unselectedUser.className).toBe("item unselected"); // test deleteUser call await act(async () => { - fireEvent.click(submit); + await fireEvent.click(submit); }); expect(callbackSpy).toHaveBeenNthCalledWith(1, ["foo"], "group"); @@ -140,7 +140,7 @@ test("Calls deleteGroup on button click", async () => { let deleteGroup = screen.getByTestId("delete-group"); await act(async () => { - fireEvent.click(deleteGroup); + await fireEvent.click(deleteGroup); }); expect(callbackSpy).toHaveBeenNthCalledWith(1, "group"); @@ -154,12 +154,12 @@ test("Shows a UI error dialogue when group edit fails", async () => { }); let groupUser = screen.getByText("foo"); - fireEvent.click(groupUser); + await fireEvent.click(groupUser); let submit = screen.getByTestId("submit"); await act(async () => { - fireEvent.click(submit); + await fireEvent.click(submit); }); let errorDialog = screen.getByText("Failed to edit group."); @@ -176,12 +176,12 @@ test("Shows a UI error dialogue when group edit returns an improper status code" }); let groupUser = screen.getByText("foo"); - fireEvent.click(groupUser); + await fireEvent.click(groupUser); let submit = screen.getByTestId("submit"); await act(async () => { - fireEvent.click(submit); + await fireEvent.click(submit); }); let errorDialog = screen.getByText("Failed to edit group."); @@ -200,7 +200,7 @@ test("Shows a UI error dialogue when group delete fails", async () => { let deleteGroup = screen.getByTestId("delete-group"); await act(async () => { - fireEvent.click(deleteGroup); + await fireEvent.click(deleteGroup); }); let errorDialog = screen.getByText("Failed to delete group."); @@ -219,7 +219,7 @@ test("Shows a UI error dialogue when group delete returns an improper status cod let deleteGroup = screen.getByTestId("delete-group"); await act(async () => { - fireEvent.click(deleteGroup); + await fireEvent.click(deleteGroup); }); let errorDialog = screen.getByText("Failed to delete group."); diff --git a/jsx/src/components/Groups/Groups.test.js b/jsx/src/components/Groups/Groups.test.js index dd5ed172..0eb4dd12 100644 --- a/jsx/src/components/Groups/Groups.test.js +++ b/jsx/src/components/Groups/Groups.test.js @@ -138,7 +138,7 @@ test("Interacting with PaginationFooter causes page refresh", async () => { let next = screen.getByTestId("paginate-next"); await act(async () => { - fireEvent.click(next); + await fireEvent.click(next); }); expect(updateGroupsSpy).toBeCalledWith(2, 2); // mocked updateGroups means callback after load doesn't fire diff --git a/jsx/src/components/ServerDashboard/ServerDashboard.jsx b/jsx/src/components/ServerDashboard/ServerDashboard.jsx index d1b0a3a0..f143c323 100644 --- a/jsx/src/components/ServerDashboard/ServerDashboard.jsx +++ b/jsx/src/components/ServerDashboard/ServerDashboard.jsx @@ -453,7 +453,7 @@ const ServerDashboard = (props) => { setStateFilter(event.target.checked ? "active" : null); }} /> - + {"only active servers"} diff --git a/jsx/src/components/ServerDashboard/ServerDashboard.test.js b/jsx/src/components/ServerDashboard/ServerDashboard.test.js index 03e1d1f1..ace9e462 100644 --- a/jsx/src/components/ServerDashboard/ServerDashboard.test.js +++ b/jsx/src/components/ServerDashboard/ServerDashboard.test.js @@ -291,7 +291,7 @@ test("Invokes the startServer event on button click", async () => { expect(start_elems.length).toBe(Object.keys(bar_servers).length); await act(async () => { - fireEvent.click(start_elems[0]); + await fireEvent.click(start_elems[0]); }); expect(callbackSpy).toHaveBeenCalled(); @@ -307,7 +307,7 @@ test("Invokes the stopServer event on button click", async () => { let stop = screen.getByText("Stop Server"); await act(async () => { - fireEvent.click(stop); + await fireEvent.click(stop); }); expect(callbackSpy).toHaveBeenCalled(); @@ -323,7 +323,7 @@ test("Invokes the shutdownHub event on button click", async () => { let shutdown = screen.getByText("Shutdown Hub"); await act(async () => { - fireEvent.click(shutdown); + await fireEvent.click(shutdown); }); expect(callbackSpy).toHaveBeenCalled(); @@ -338,7 +338,7 @@ test("Sorts according to username", async () => { expect(searchParams.get("sort")).toEqual(null); let handler = screen.getByTestId(testId); - fireEvent.click(handler); + await fireEvent.click(handler); expect(searchParams.get("sort")).toEqual("name"); await act(async () => { @@ -346,7 +346,7 @@ test("Sorts according to username", async () => { handler = screen.getByTestId(testId); }); - fireEvent.click(handler); + await fireEvent.click(handler); expect(searchParams.get("sort")).toEqual("-name"); await act(async () => { @@ -354,7 +354,7 @@ test("Sorts according to username", async () => { handler = screen.getByTestId(testId); }); - fireEvent.click(handler); + await fireEvent.click(handler); expect(searchParams.get("sort")).toEqual("name"); }); @@ -367,7 +367,7 @@ test("Sorts according to last activity", async () => { expect(searchParams.get("sort")).toEqual(null); let handler = screen.getByTestId(testId); - fireEvent.click(handler); + await fireEvent.click(handler); expect(searchParams.get("sort")).toEqual("last_activity"); await act(async () => { @@ -375,7 +375,7 @@ test("Sorts according to last activity", async () => { handler = screen.getByTestId(testId); }); - fireEvent.click(handler); + await fireEvent.click(handler); expect(searchParams.get("sort")).toEqual("-last_activity"); await act(async () => { @@ -383,7 +383,7 @@ test("Sorts according to last activity", async () => { handler = screen.getByTestId(testId); }); - fireEvent.click(handler); + await fireEvent.click(handler); expect(searchParams.get("sort")).toEqual("last_activity"); }); @@ -397,7 +397,7 @@ test("Filter according to server status (running/not running)", async () => { const label = "only active servers"; let handler = screen.getByLabelText(label); expect(handler.checked).toEqual(false); - fireEvent.click(handler); + await fireEvent.click(handler); // FIXME: need to force a rerender to get updated checkbox // I don't think this should be required @@ -408,7 +408,7 @@ test("Filter according to server status (running/not running)", async () => { expect(searchParams.get("state")).toEqual("active"); expect(handler.checked).toEqual(true); - fireEvent.click(handler); + await fireEvent.click(handler); await act(async () => { rerender(serverDashboardJsx()); @@ -433,7 +433,7 @@ test("Shows server details with button click", async () => { expect(collapseBar).not.toHaveClass("show"); await act(async () => { - fireEvent.click(button); + await fireEvent.click(button); jest.runAllTimers(); }); @@ -441,7 +441,7 @@ test("Shows server details with button click", async () => { expect(collapseBar).not.toHaveClass("show"); await act(async () => { - fireEvent.click(button); + await fireEvent.click(button); jest.runAllTimers(); }); @@ -450,7 +450,7 @@ test("Shows server details with button click", async () => { expect(collapseBar).not.toHaveClass("show"); await act(async () => { - fireEvent.click(button); + await fireEvent.click(button); jest.runAllTimers(); }); @@ -480,7 +480,7 @@ test("Shows a UI error dialogue when start all servers fails", async () => { let startAll = screen.getByTestId("start-all"); await act(async () => { - fireEvent.click(startAll); + await fireEvent.click(startAll); }); let errorDialog = screen.getByText("Failed to start servers."); @@ -496,7 +496,7 @@ test("Shows a UI error dialogue when stop all servers fails", async () => { let stopAll = screen.getByTestId("stop-all"); await act(async () => { - fireEvent.click(stopAll); + await fireEvent.click(stopAll); }); let errorDialog = screen.getByText("Failed to stop servers."); @@ -513,7 +513,7 @@ test("Shows a UI error dialogue when start user server fails", async () => { expect(start_elems.length).toBe(Object.keys(bar_servers).length); await act(async () => { - fireEvent.click(start_elems[0]); + await fireEvent.click(start_elems[0]); }); let errorDialog = screen.getByText("Failed to start server."); @@ -531,7 +531,7 @@ test("Shows a UI error dialogue when start user server returns an improper statu expect(start_elems.length).toBe(Object.keys(bar_servers).length); await act(async () => { - fireEvent.click(start_elems[0]); + await fireEvent.click(start_elems[0]); }); let errorDialog = screen.getByText("Failed to start server."); @@ -550,7 +550,7 @@ test("Shows a UI error dialogue when stop user servers fails", async () => { let stop = screen.getByText("Stop Server"); await act(async () => { - fireEvent.click(stop); + await fireEvent.click(stop); }); let errorDialog = screen.getByText("Failed to stop server."); @@ -569,7 +569,7 @@ test("Shows a UI error dialogue when stop user server returns an improper status let stop = screen.getByText("Stop Server"); await act(async () => { - fireEvent.click(stop); + await fireEvent.click(stop); }); let errorDialog = screen.getByText("Failed to stop server."); @@ -584,12 +584,13 @@ test("Search for user calls updateUsers with name filter", async () => { render(serverDashboardJsx()); }); + const user = userEvent.setup({ advanceTimers: jest.advanceTimersByTime }); let search = screen.getByLabelText("user-search"); expect(mockUpdateUsers.mock.calls).toHaveLength(1); expect(searchParams.get("offset")).toEqual("2"); - userEvent.type(search, "a"); + await user.type(search, "a"); expect(search.value).toEqual("a"); await act(async () => { jest.runAllTimers(); @@ -599,7 +600,7 @@ test("Search for user calls updateUsers with name filter", async () => { // FIXME: useSelector mocks prevent updateUsers from being called // expect(mockUpdateUsers.mock.calls).toHaveLength(2); // expect(mockUpdateUsers).toBeCalledWith(0, 100, "a"); - userEvent.type(search, "b"); + await user.type(search, "b"); expect(search.value).toEqual("ab"); await act(async () => { jest.runAllTimers(); @@ -672,7 +673,7 @@ test("Start server and confirm pending state", async () => { expect(buttons[2].textContent).toBe("Edit User"); await act(async () => { - fireEvent.click(buttons[0]); + await fireEvent.click(buttons[0]); }); expect(mockUpdateUsers.mock.calls).toHaveLength(1);