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{}, 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(); +}); 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); }