diff --git a/gradle/create_user.yaml b/gradle/create_user.yaml new file mode 100644 index 0000000000..70e1c2a92b --- /dev/null +++ b/gradle/create_user.yaml @@ -0,0 +1,2 @@ +- type: fixed + description: Create user diff --git a/scm-ui/e2e-tests/cypress/integration/create_user_spec.ts b/scm-ui/e2e-tests/cypress/integration/create_user_spec.ts new file mode 100644 index 0000000000..5467bf4299 --- /dev/null +++ b/scm-ui/e2e-tests/cypress/integration/create_user_spec.ts @@ -0,0 +1,53 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +import { hri } from "human-readable-ids"; + +describe("Create User", () => { + beforeEach(() => { + // Create user and login + const username = hri.random(); + const password = hri.random(); + cy.restCreateUser(username, password); + cy.restLogin(username, password); + cy.restSetUserPermissions(username, ["user:*"]); + }); + + it("should create new user", () => { + // Prepare data + const newUser = hri.random(); + const password = hri.random(); + + // Act + cy.visit("/users/create"); + cy.byTestId("input-username").type(newUser); + cy.byTestId("input-displayname").type(newUser); + cy.byTestId("input-password").type(password); + cy.byTestId("input-password-confirmation").type(password); + cy.byTestId("submit-button").click(); + + // Assert + cy.url().should("include", `/user/${newUser}`); + }); +}); diff --git a/scm-ui/ui-components/src/forms/PasswordConfirmation.tsx b/scm-ui/ui-components/src/forms/PasswordConfirmation.tsx index 5aeeb8ea5d..8933744461 100644 --- a/scm-ui/ui-components/src/forms/PasswordConfirmation.tsx +++ b/scm-ui/ui-components/src/forms/PasswordConfirmation.tsx @@ -82,6 +82,7 @@ const PasswordConfirmation: FC = ({ passwordChanged, passwordValidat errorMessage={t("password.passwordInvalid")} ref={innerRef} onReturnPressed={onReturnPressed} + testId="input-password" />
@@ -93,6 +94,7 @@ const PasswordConfirmation: FC = ({ passwordChanged, passwordValidat validationError={passwordConfirmationFailed} errorMessage={t("password.passwordConfirmFailed")} onReturnPressed={onReturnPressed} + testId="input-password-confirmation" />
diff --git a/scm-ui/ui-webapp/src/containers/Feedback.tsx b/scm-ui/ui-webapp/src/containers/Feedback.tsx index ddfdf178ab..ae985c780f 100644 --- a/scm-ui/ui-webapp/src/containers/Feedback.tsx +++ b/scm-ui/ui-webapp/src/containers/Feedback.tsx @@ -41,8 +41,8 @@ const useFeedbackUrl = (url: string): ApiResult => }); const createFeedbackFormUrl = (instanceId: string, scmVersion: string, theme: string, data?: HalRepresentation) => { - if (data) { - const formUrl = (data?._links.form as Link).href; + if (data?._links?.form) { + const formUrl = (data._links.form as Link).href; return `${formUrl}?${createQueryString({ instanceId, scmVersion, theme })}`; } return ""; diff --git a/scm-ui/ui-webapp/src/users/components/UserForm.tsx b/scm-ui/ui-webapp/src/users/components/UserForm.tsx index 500b6de8db..7c7b87c08a 100644 --- a/scm-ui/ui-webapp/src/users/components/UserForm.tsx +++ b/scm-ui/ui-webapp/src/users/components/UserForm.tsx @@ -104,8 +104,8 @@ const UserForm: FC = ({ submitForm, user, loading }) => { const passwordChangeField = ( { - setPasswordValid(!!password && passwordValid); + passwordChanged={(password, isPasswordValid) => { + setPasswordValid(isPasswordValid); setUserState({ ...userState, password }); }} /> @@ -126,6 +126,7 @@ const UserForm: FC = ({ submitForm, user, loading }) => { validationError={nameValidationError} errorMessage={t("validation.name-invalid")} helpText={t("help.usernameHelpText")} + testId="input-username" /> ); @@ -151,6 +152,7 @@ const UserForm: FC = ({ submitForm, user, loading }) => { validationError={displayNameValidationError} errorMessage={t("validation.displayname-invalid")} helpText={t("help.displayNameHelpText")} + testId="input-displayname" />
@@ -164,6 +166,7 @@ const UserForm: FC = ({ submitForm, user, loading }) => { validationError={mailValidationError} errorMessage={t("validation.mail-invalid")} helpText={t("help.mailHelpText")} + testId="input-mail" />