diff --git a/gradle/changelog/branch_creation_e2e_tests.yaml b/gradle/changelog/branch_creation_e2e_tests.yaml new file mode 100644 index 0000000000..d86f164ff2 --- /dev/null +++ b/gradle/changelog/branch_creation_e2e_tests.yaml @@ -0,0 +1,2 @@ +- type: added + description: Added e2e tests for branch creation diff --git a/scm-ui/e2e-tests/cypress/integration/create_branch_spec.ts b/scm-ui/e2e-tests/cypress/integration/create_branch_spec.ts new file mode 100644 index 0000000000..ac1d49a6e8 --- /dev/null +++ b/scm-ui/e2e-tests/cypress/integration/create_branch_spec.ts @@ -0,0 +1,83 @@ +/* + * 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 Branch", () => { + const username = hri.random(); + const password = hri.random(); + const repoNamespace = hri.random(); + const repoName = hri.random(); + + before(() => { + cy.restCreateUser(username, password); + cy.restCreateRepo("git", repoNamespace, repoName, true); + cy.restSetUserPermissions(username, ["repository:*"]); + }) + + beforeEach(() => { + // Create user and login + cy.restLogin(username, password); + }); + + [ + {randomPrefix: hri.random(), branchName: "develop", expectedBranchUrlFragment: "develop"}, + {randomPrefix: hri.random(), branchName: "feature/e2e", expectedBranchUrlFragment: "feature%2Fe2e"}, + {randomPrefix: hri.random(), branchName: "feature%2Fe2e", expectedBranchUrlFragment: "feature%252Fe2e"}, + {randomPrefix: hri.random(), branchName: "Да", expectedBranchUrlFragment: "%D0%94%D0%B0"}, + {randomPrefix: hri.random(), branchName: "はい", expectedBranchUrlFragment: "%E3%81%AF%E3%81%84"}, + {randomPrefix: hri.random(), branchName: "%3F", expectedBranchUrlFragment: "%253F"}, + {randomPrefix: hri.random(), branchName: "%", expectedBranchUrlFragment: "%25"}, + {randomPrefix: hri.random(), branchName: "%%", expectedBranchUrlFragment: "%25%25"}, + {randomPrefix: hri.random(), branchName: "%25", expectedBranchUrlFragment: "%2525"}, + {randomPrefix: hri.random(), branchName: "&", expectedBranchUrlFragment: "%26"}, + {randomPrefix: hri.random(), branchName: "&&", expectedBranchUrlFragment: "%26%26"}, + {randomPrefix: hri.random(), branchName: "&26", expectedBranchUrlFragment: "%2626"}, + {randomPrefix: hri.random(), branchName: "%&", expectedBranchUrlFragment: "%25%26"}, + ].forEach(data => { + it(`should create branch ${data.branchName} with url ${data.expectedBranchUrlFragment}`, () => { + cy.visit(`/repo/${repoNamespace}/${repoName}/branches/create`); + cy.byTestId("input-branch-name").type(`${data.randomPrefix}-${data.branchName}`); + cy.byTestId("submit-button").click(); + + cy.contains(data.branchName).should("be.visible"); + cy.url().should("include", `/repo/${repoNamespace}/${repoName}/branch/${data.randomPrefix}-${data.expectedBranchUrlFragment}`); + }); + }) + + it("should not create branch with trailing slash", () => { + cy.visit(`/repo/${repoNamespace}/${repoName}/branches/create`); + cy.byTestId("input-branch-name").type("/"); + cy.byTestId("submit-button").click(); + + cy.contains("1wR7ZBe7H1").should("be.visible"); + }) + + it("? should not be allowed in branch name", () => { + cy.visit(`/repo/${repoNamespace}/${repoName}/branches/create`); + cy.byTestId("input-branch-name").type("?"); + + cy.byTestId("submit-button").should("be.disabled"); + }) +}); diff --git a/scm-ui/ui-webapp/src/repos/branches/components/BranchForm.tsx b/scm-ui/ui-webapp/src/repos/branches/components/BranchForm.tsx index 389d8b191b..e218c30342 100644 --- a/scm-ui/ui-webapp/src/repos/branches/components/BranchForm.tsx +++ b/scm-ui/ui-webapp/src/repos/branches/components/BranchForm.tsx @@ -84,6 +84,7 @@ const BranchForm: FC = ({ submitForm, branches, disabled, transmittedName validationError={!nameValid} errorMessage={t("validation.branch.nameInvalid")} disabled={!!transmittedName || disabled} + testId="input-branch-name" />