From cdd4d93dbd93ec84e33a6598fd101224e16dc8cb Mon Sep 17 00:00:00 2001 From: Justin Fowler Date: Tue, 10 Sep 2024 11:15:23 -0500 Subject: [PATCH 1/3] fix(site): strip version build info from docs link URLs (#14601) (cherry picked from commit 85cc695dc68944707b1ceb6eec20acba46f42958) --- site/src/utils/docs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/src/utils/docs.ts b/site/src/utils/docs.ts index 1a10c3e808ae8..162f94a354544 100644 --- a/site/src/utils/docs.ts +++ b/site/src/utils/docs.ts @@ -9,7 +9,7 @@ function defaultDocsUrl(): string { } // Strip the postfix version info that's not part of the link. - const i = version?.indexOf("-") ?? -1; + const i = version?.match(/[+-]/)?.index ?? -1; if (i >= 0) { version = version.slice(0, i); } From 94acb3609a44201cebafea1ecc6768d0f37dc0ab Mon Sep 17 00:00:00 2001 From: Ethan <39577870+ethanndickson@users.noreply.github.com> Date: Tue, 10 Sep 2024 20:55:50 +1000 Subject: [PATCH 2/3] fix: remove coderdtest dependency from codersdk (#14633) (cherry picked from commit 2a9234e9ba878e65aeb58aa2084b30d674dfeaf7) --- codersdk/users_test.go | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/codersdk/users_test.go b/codersdk/users_test.go index f1c691323bffd..1d7ee951d46c5 100644 --- a/codersdk/users_test.go +++ b/codersdk/users_test.go @@ -7,7 +7,6 @@ import ( "github.com/google/uuid" "github.com/stretchr/testify/require" - "github.com/coder/coder/v2/coderd/coderdtest" "github.com/coder/coder/v2/codersdk" ) @@ -109,9 +108,9 @@ func TestCreateUserRequestJSON(t *testing.T) { t.Parallel() req := codersdk.CreateUserRequestWithOrgs{ - Email: coderdtest.RandomName(t), - Username: coderdtest.RandomName(t), - Name: coderdtest.RandomName(t), + Email: "alice@coder.com", + Username: "alice", + Name: "Alice User", Password: "", UserLoginType: codersdk.LoginTypePassword, OrganizationIDs: []uuid.UUID{uuid.New(), uuid.New()}, @@ -123,9 +122,9 @@ func TestCreateUserRequestJSON(t *testing.T) { t.Parallel() req := codersdk.CreateUserRequestWithOrgs{ - Email: coderdtest.RandomName(t), - Username: coderdtest.RandomName(t), - Name: coderdtest.RandomName(t), + Email: "alice@coder.com", + Username: "alice", + Name: "Alice User", Password: "", UserLoginType: codersdk.LoginTypePassword, OrganizationIDs: []uuid.UUID{uuid.New()}, @@ -137,9 +136,9 @@ func TestCreateUserRequestJSON(t *testing.T) { t.Parallel() req := codersdk.CreateUserRequestWithOrgs{ - Email: coderdtest.RandomName(t), - Username: coderdtest.RandomName(t), - Name: coderdtest.RandomName(t), + Email: "alice@coder.com", + Username: "alice", + Name: "Alice User", Password: "", UserLoginType: codersdk.LoginTypePassword, OrganizationIDs: []uuid.UUID{}, From c17d65a4ff9d9768cb062f7f8bb0912348bad0ae Mon Sep 17 00:00:00 2001 From: Danielle Maywood Date: Fri, 13 Sep 2024 16:19:17 +0100 Subject: [PATCH 3/3] fix: only allow submitting form if changes have been made (#14602) * fix: only allow submitting form if dirty * test: add test for submit button behaviour * fix: apply 'make fmt' * chore: rename 'Submit' to 'Submit and restart' * test: fix tests (cherry picked from commit 9006b217580923b609202b7f94f7ab564f30f231) --- .../WorkspaceParametersForm.tsx | 3 +- .../WorkspaceParametersPage.test.tsx | 59 ++++++++++++++++++- 2 files changed, 60 insertions(+), 2 deletions(-) diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersForm.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersForm.tsx index 3963e1ec806f7..db0667ea8eba7 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersForm.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersForm.tsx @@ -154,7 +154,8 @@ export const WorkspaceParametersForm: FC = ({ diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.test.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.test.tsx index 763fe12fde825..4c97a40e33139 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.test.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceParametersPage/WorkspaceParametersPage.test.tsx @@ -61,7 +61,9 @@ test("Submit the workspace settings page successfully", async () => { ); await user.clear(parameter2); await user.type(parameter2, "1"); - await user.click(within(form).getByRole("button", { name: "Submit" })); + await user.click( + within(form).getByRole("button", { name: "Submit and restart" }), + ); // Assert that the API calls were made with the correct data await waitFor(() => { expect(postWorkspaceBuildSpy).toHaveBeenCalledWith(MockWorkspace.id, { @@ -73,3 +75,58 @@ 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([ + MockTemplateVersionParameter1, + MockTemplateVersionParameter2, + // Immutable parameters + MockTemplateVersionParameter4, + ]); + jest.spyOn(API, "getWorkspaceBuildParameters").mockResolvedValueOnce([ + MockWorkspaceBuildParameter1, + MockWorkspaceBuildParameter2, + // Immutable value + MockWorkspaceBuildParameter4, + ]); + // Setup event and rendering + const user = userEvent.setup(); + renderWithWorkspaceSettingsLayout(, { + route: "/@test-user/test-workspace/settings", + path: "/:username/:workspace/settings", + // Need this because after submit the user is redirected + extraRoutes: [{ path: "/:username/:workspace", element:
}], + }); + await waitForLoaderToBeRemoved(); + + const submitButton: HTMLButtonElement = screen.getByRole("button", { + name: "Submit and restart", + }); + + const form = screen.getByTestId("form"); + const parameter1 = within(form).getByLabelText( + MockWorkspaceBuildParameter1.name, + { exact: false }, + ); + + // There are no changes, the button should be disabled. + expect(submitButton.disabled).toBeTruthy(); + + // Make changes to the form + await user.clear(parameter1); + await user.type(parameter1, "new-value"); + + // There are now changes, the button should be enabled. + expect(submitButton.disabled).toBeFalsy(); + + // Change form value back to default + await user.clear(parameter1); + await user.type(parameter1, MockWorkspaceBuildParameter1.value); + + // There are now no changes, the button should be disabled. + expect(submitButton.disabled).toBeTruthy(); +});