From 6ab80236f7e5fa038c57398dc93723858285be79 Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Mon, 10 Aug 2020 11:36:46 +0200 Subject: [PATCH] change cypress tests to ui only --- .../integration/anonymousAccess.spec.js | 155 +++++++++--------- .../ui-components/src/navigation/NavLink.tsx | 5 +- .../src/navigation/PrimaryNavigation.tsx | 2 +- .../src/navigation/PrimaryNavigationLink.tsx | 6 +- .../src/navigation/SubNavigation.tsx | 5 +- .../ui-webapp/src/admin/containers/Admin.tsx | 10 +- .../components/navLinks/EditUserNavLink.tsx | 2 +- .../navLinks/SetPasswordNavLink.tsx | 2 +- .../navLinks/SetPermissionsNavLink.tsx | 2 +- .../src/users/containers/SingleUser.tsx | 2 + 10 files changed, 98 insertions(+), 93 deletions(-) diff --git a/scm-ui/e2e-tests/cypress/integration/anonymousAccess.spec.js b/scm-ui/e2e-tests/cypress/integration/anonymousAccess.spec.js index 5c6d76568c..01d8029913 100644 --- a/scm-ui/e2e-tests/cypress/integration/anonymousAccess.spec.js +++ b/scm-ui/e2e-tests/cypress/integration/anonymousAccess.spec.js @@ -24,30 +24,55 @@ describe("With Anonymous mode disabled", () => { it("Should show login page without primary navigation", () => { - setUserPermissions("_anonymous", ["repository:read,pull:*"]); + loginUser("scmadmin", "scmadmin"); setAnonymousMode("OFF"); - cy.visit("http://localhost:8081/scm/repos/"); + cy.get("li") + .contains("Logout") + .click(); cy.contains("Please login to proceed"); cy.get("div").not("Login"); cy.get("div").not("Repositories"); }); it("Should redirect after login", () => { - cy.visit("http://localhost:8081/scm/me/"); - cy.get("div.field.username > div > input").type("scmadmin"); - cy.get("div.field.password > div > input").type("scmadmin"); - cy.get("button") - .contains("Login") - .click(); + loginUser("scmadmin", "scmadmin"); + + cy.visit("http://localhost:8081/scm/me"); cy.contains("Profile"); + cy.get("li") + .contains("Logout") + .click(); }); }); describe("With Anonymous mode protocol only enabled", () => { it("Should show login page without primary navigation", () => { - setUserPermissions("_anonymous", ["repository:read,pull:*"]); + loginUser("scmadmin", "scmadmin"); setAnonymousMode("PROTOCOL_ONLY"); + // Give anonymous user permissions + cy.get("li") + .contains("Users") + .click(); + cy.get("td") + .contains("_anonymous") + .click(); + cy.get("a") + .contains("Settings") + .click(); + cy.get("li") + .contains("Permissions") + .click(); + cy.get("label") + .contains("Read all repositories") + .click(); + cy.get("button") + .contains("Set permissions") + .click(); + + cy.get("li") + .contains("Logout") + .click(); cy.visit("http://localhost:8081/scm/repos/"); cy.contains("Please login to proceed"); cy.get("div").not("Login"); @@ -57,9 +82,12 @@ describe("With Anonymous mode protocol only enabled", () => { describe("With Anonymous mode fully enabled", () => { it("Should show repositories overview with Login button in primary navigation", () => { - setUserPermissions("_anonymous", ["repository:read,pull:*"]); + loginUser("scmadmin", "scmadmin"); setAnonymousMode("FULL"); + cy.get("li") + .contains("Logout") + .click(); cy.visit("http://localhost:8081/scm/repos/"); cy.contains("Overview of available repositories"); cy.contains("SCM Anonymous"); @@ -79,6 +107,9 @@ describe("With Anonymous mode fully enabled", () => { cy.visit("http://localhost:8081/scm/login"); cy.contains("SCM Administrator"); + cy.get("li") + .contains("Logout") + .click(); }); it("Should logout and direct to login page", () => { loginUser("scmadmin", "scmadmin"); @@ -98,75 +129,39 @@ describe("With Anonymous mode fully enabled", () => { }); }); +describe("Disable anonymous mode after tests", () => { + it("Disable anonymous mode after tests", () => { + loginUser("scmadmin", "scmadmin"); + setAnonymousMode("OFF"); + + cy.get("li") + .contains("Logout") + .click(); + }); +}); + +const setAnonymousMode = anonymousMode => { + cy.get("li") + .contains("Administration") + .click(); + cy.get("li") + .contains("Settings") + .click(); + cy.get("select") + .contains("Disabled") + .parent() + .select(anonymousMode) + .should("have.value", anonymousMode); + cy.get("button") + .contains("Submit") + .click(); +}; + const loginUser = (username, password) => { - const loginUrl = `http://localhost:8081/scm/api/v2/auth/access_token`; - - cy.request({ - method: "POST", - url: loginUrl, - body: { - cookie: true, - username: username, - password: password, - grantType: "password" - } - }); -}; - -const setUserPermissions = (user, permissions) => { - const MEDIA_TYPE = "application/vnd.scmm-permissionCollection+json;v=2"; - const userPermissionUrl = `http://localhost:8081/scm/api/v2/users/${user}/permissions`; - - cy.request({ - method: "PUT", - url: userPermissionUrl, - body: { permissions: permissions }, - headers: { "content-type": MEDIA_TYPE }, - auth: { - user: "scmadmin", - pass: "scmadmin", - sendImmediately: true - } - }); -}; - -const setAnonymousMode = anonMode => { - const MEDIA_TYPE = "application/vnd.scmm-config+json;v=2"; - - const content = { - adminGroups: [], - adminUsers: [], - anonymousMode: anonMode, - baseUrl: "http://localhost:8081/scm", - dateFormat: "YYYY-MM-DD HH:mm:ss", - disableGroupingGrid: false, - enableProxy: false, - enabledXsrfProtection: false, - forceBaseUrl: false, - loginAttemptLimit: 100, - loginAttemptLimitTimeout: 300, - loginInfoUrl: "https://login-info.scm-manager.org/api/v1/login-info", - namespaceStrategy: "UsernameNamespaceStrategy", - pluginUrl: - "https://oss.cloudogu.com/jenkins/job/scm-manager/job/scm-manager-bitbucket/job/plugin-snapshot/job/master/lastSuccessfulBuild/artifact/plugins/plugin-center.json", - proxyExcludes: [], - proxyPassword: null, - proxyPort: 8080, - proxyServer: "proxy.mydomain.com", - proxyUser: null, - realmDescription: "SONIA :: SCM Manager", - skipFailedAuthenticators: false - }; - - cy.request({ - method: "PUT", - url: "http://localhost:8081/scm/api/v2/config", - body: content, - headers: { "content-type": MEDIA_TYPE }, - auth: { - user: "scmadmin", - pass: "scmadmin", - sendImmediately: true - } - }); + cy.visit("http://localhost:8081/scm/login"); + cy.get("div.field.username > div > input").type(username); + cy.get("div.field.password > div > input").type(password); + cy.get("button") + .contains("Login") + .click(); }; diff --git a/scm-ui/ui-components/src/navigation/NavLink.tsx b/scm-ui/ui-components/src/navigation/NavLink.tsx index eba1373d9a..03c11c96d4 100644 --- a/scm-ui/ui-components/src/navigation/NavLink.tsx +++ b/scm-ui/ui-components/src/navigation/NavLink.tsx @@ -33,9 +33,10 @@ type Props = RoutingProps & { label: string; title?: string; icon?: string; + className?: string; }; -const NavLink: FC = ({ to, activeWhenMatch, activeOnlyWhenExact, icon, label, title }) => { +const NavLink: FC = ({ to, activeWhenMatch, activeOnlyWhenExact, icon, label, title, className }) => { const active = useActiveMatch({ to, activeWhenMatch, activeOnlyWhenExact }); const context = useMenuContext(); @@ -52,7 +53,7 @@ const NavLink: FC = ({ to, activeWhenMatch, activeOnlyWhenExact, icon, la return (
  • - + {showIcon} {collapsed ? null : label} diff --git a/scm-ui/ui-components/src/navigation/PrimaryNavigation.tsx b/scm-ui/ui-components/src/navigation/PrimaryNavigation.tsx index 890f0b5483..df5a594229 100644 --- a/scm-ui/ui-components/src/navigation/PrimaryNavigation.tsx +++ b/scm-ui/ui-components/src/navigation/PrimaryNavigation.tsx @@ -40,7 +40,7 @@ class PrimaryNavigation extends React.Component { return (to: string, match: string, label: string, linkName: string) => { const link = links[linkName]; if (link) { - const navigationItem = ; + const navigationItem = ; navigationItems.push(navigationItem); } }; diff --git a/scm-ui/ui-components/src/navigation/PrimaryNavigationLink.tsx b/scm-ui/ui-components/src/navigation/PrimaryNavigationLink.tsx index b27c4013a5..e834272168 100644 --- a/scm-ui/ui-components/src/navigation/PrimaryNavigationLink.tsx +++ b/scm-ui/ui-components/src/navigation/PrimaryNavigationLink.tsx @@ -23,19 +23,21 @@ */ import * as React from "react"; import { Route, Link } from "react-router-dom"; +import classNames from "classnames"; type Props = { to: string; label: string; match?: string; activeOnlyWhenExact?: boolean; + className?: string; }; class PrimaryNavigationLink extends React.Component { renderLink = (route: any) => { - const { to, label } = this.props; + const { to, label, className } = this.props; return ( -
  • +
  • {label}
  • ); diff --git a/scm-ui/ui-components/src/navigation/SubNavigation.tsx b/scm-ui/ui-components/src/navigation/SubNavigation.tsx index a59c271257..17a1012026 100644 --- a/scm-ui/ui-components/src/navigation/SubNavigation.tsx +++ b/scm-ui/ui-components/src/navigation/SubNavigation.tsx @@ -32,9 +32,10 @@ type Props = RoutingProps & { label: string; title?: string; icon?: string; + className?: string; }; -const SubNavigation: FC = ({ to, activeOnlyWhenExact, activeWhenMatch, icon, title, label, children }) => { +const SubNavigation: FC = ({ to, activeOnlyWhenExact, activeWhenMatch, icon, title, label, children, className }) => { const context = useMenuContext(); const collapsed = context.isCollapsed(); @@ -60,7 +61,7 @@ const SubNavigation: FC = ({ to, activeOnlyWhenExact, activeWhenMatch, ic return (
  • - + {collapsed ? "" : label} {childrenList} diff --git a/scm-ui/ui-webapp/src/admin/containers/Admin.tsx b/scm-ui/ui-webapp/src/admin/containers/Admin.tsx index 51308f5af1..fa4749165a 100644 --- a/scm-ui/ui-webapp/src/admin/containers/Admin.tsx +++ b/scm-ui/ui-webapp/src/admin/containers/Admin.tsx @@ -133,6 +133,7 @@ class Admin extends React.Component { icon="fas fa-info-circle" label={t("admin.menu.informationNavLink")} title={t("admin.menu.informationNavLink")} + className={t("admin.menu.informationNavLink")} /> {(availablePluginsLink || installedPluginsLink) && ( { icon="fas fa-puzzle-piece" label={t("plugins.menu.pluginsNavLink")} title={t("plugins.menu.pluginsNavLink")} + className={t("plugins.menu.pluginsNavLink")} > {installedPluginsLink && ( - + )} {availablePluginsLink && ( - + )} )} @@ -154,6 +156,7 @@ class Admin extends React.Component { icon="fas fa-user-shield" label={t("repositoryRole.navLink")} title={t("repositoryRole.navLink")} + className={t("repositoryRole.navLink")} activeWhenMatch={this.matchesRoles} activeOnlyWhenExact={false} /> @@ -162,8 +165,9 @@ class Admin extends React.Component { to={`${url}/settings/general`} label={t("admin.menu.settingsNavLink")} title={t("admin.menu.settingsNavLink")} + className={t("admin.menu.settingsNavLink")} > - + diff --git a/scm-ui/ui-webapp/src/users/components/navLinks/EditUserNavLink.tsx b/scm-ui/ui-webapp/src/users/components/navLinks/EditUserNavLink.tsx index a772b68af7..13da52ae38 100644 --- a/scm-ui/ui-webapp/src/users/components/navLinks/EditUserNavLink.tsx +++ b/scm-ui/ui-webapp/src/users/components/navLinks/EditUserNavLink.tsx @@ -42,7 +42,7 @@ class EditUserNavLink extends React.Component { if (!this.isEditable()) { return null; } - return ; + return ; } } diff --git a/scm-ui/ui-webapp/src/users/components/navLinks/SetPasswordNavLink.tsx b/scm-ui/ui-webapp/src/users/components/navLinks/SetPasswordNavLink.tsx index 3c7dd9e9c8..5db8adb4e4 100644 --- a/scm-ui/ui-webapp/src/users/components/navLinks/SetPasswordNavLink.tsx +++ b/scm-ui/ui-webapp/src/users/components/navLinks/SetPasswordNavLink.tsx @@ -38,7 +38,7 @@ class ChangePasswordNavLink extends React.Component { if (!this.hasPermissionToSetPassword()) { return null; } - return ; + return ; } hasPermissionToSetPassword = () => { diff --git a/scm-ui/ui-webapp/src/users/components/navLinks/SetPermissionsNavLink.tsx b/scm-ui/ui-webapp/src/users/components/navLinks/SetPermissionsNavLink.tsx index 73d7c7541c..adba12fb75 100644 --- a/scm-ui/ui-webapp/src/users/components/navLinks/SetPermissionsNavLink.tsx +++ b/scm-ui/ui-webapp/src/users/components/navLinks/SetPermissionsNavLink.tsx @@ -38,7 +38,7 @@ class ChangePermissionNavLink extends React.Component { if (!this.hasPermissionToSetPermission()) { return null; } - return ; + return ; } hasPermissionToSetPermission = () => { diff --git a/scm-ui/ui-webapp/src/users/containers/SingleUser.tsx b/scm-ui/ui-webapp/src/users/containers/SingleUser.tsx index ff2c57f0e6..c70d8aba47 100644 --- a/scm-ui/ui-webapp/src/users/containers/SingleUser.tsx +++ b/scm-ui/ui-webapp/src/users/containers/SingleUser.tsx @@ -114,11 +114,13 @@ class SingleUser extends React.Component { icon="fas fa-info-circle" label={t("singleUser.menu.informationNavLink")} title={t("singleUser.menu.informationNavLink")} + className={t("singleUser.menu.informationNavLink")} />