diff --git a/scm-ui/ui-components/package.json b/scm-ui/ui-components/package.json index b2bf33fb31..a431e60a9e 100644 --- a/scm-ui/ui-components/package.json +++ b/scm-ui/ui-components/package.json @@ -16,16 +16,18 @@ "storybook": "start-storybook" }, "devDependencies": { + "@scm-manager/ui-tests": "2.0.0-SNAPSHOT", "@storybook/addon-actions": "^5.2.3", "@storybook/addon-storyshots": "^5.2.3", "@storybook/react": "^5.2.3", "enzyme": "^3.5.0", "enzyme-adapter-react-16": "^1.3.1", + "enzyme-context": "^1.1.2", + "enzyme-context-react-router-4": "^2.0.0", "fetch-mock": "^7.5.1", "flow-bin": "^0.109.0", "flow-typed": "^2.5.1", "raf": "^3.4.0", - "react-router-enzyme-context": "^1.2.0", "storybook-addon-i18next": "^1.2.1", "storybook-react-router": "^1.0.8" }, @@ -45,7 +47,9 @@ "react-syntax-highlighter": "^11.0.2" }, "babel": { - "presets": ["@scm-manager/babel-preset"] + "presets": [ + "@scm-manager/babel-preset" + ] }, "jest": { "preset": "@scm-manager/jest-preset" diff --git a/scm-ui/ui-components/src/Paginator.test.js b/scm-ui/ui-components/src/Paginator.test.js index d32b4df702..9c34629d9d 100644 --- a/scm-ui/ui-components/src/Paginator.test.js +++ b/scm-ui/ui-components/src/Paginator.test.js @@ -1,8 +1,8 @@ // @flow import React from "react"; import { mount, shallow } from "enzyme"; -import "./tests/enzyme"; -import "./tests/i18n"; +import "@scm-manager/ui-tests/enzyme"; +import "@scm-manager/ui-tests/i18n"; import ReactRouterEnzymeContext from "react-router-enzyme-context"; import Paginator from "./Paginator"; diff --git a/scm-ui/ui-components/src/tests/styleMock.js b/scm-ui/ui-components/src/tests/styleMock.js deleted file mode 100644 index f053ebf797..0000000000 --- a/scm-ui/ui-components/src/tests/styleMock.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = {}; diff --git a/scm-ui/ui-tests/enzyme-router.js b/scm-ui/ui-tests/enzyme-router.js new file mode 100644 index 0000000000..69da77bae0 --- /dev/null +++ b/scm-ui/ui-tests/enzyme-router.js @@ -0,0 +1,11 @@ +import "./enzyme"; + +import { createMount, createShallow } from "enzyme-context"; +import { routerContext } from "enzyme-context-react-router-4"; + +const plugins = { + history: routerContext() +}; + +export const mount = createMount(plugins); +export const shallow = createShallow(plugins); diff --git a/scm-ui/ui-components/src/tests/enzyme.js b/scm-ui/ui-tests/enzyme.js similarity index 100% rename from scm-ui/ui-components/src/tests/enzyme.js rename to scm-ui/ui-tests/enzyme.js diff --git a/scm-ui/ui-components/src/tests/i18n.js b/scm-ui/ui-tests/i18n.js similarity index 100% rename from scm-ui/ui-components/src/tests/i18n.js rename to scm-ui/ui-tests/i18n.js diff --git a/scm-ui/ui-tests/package.json b/scm-ui/ui-tests/package.json new file mode 100644 index 0000000000..6061d078f6 --- /dev/null +++ b/scm-ui/ui-tests/package.json @@ -0,0 +1,15 @@ +{ + "name": "@scm-manager/ui-tests", + "version": "2.0.0-SNAPSHOT", + "description": "UI-Tests helpers", + "author": "Sebastian Sdorra ", + "license": "BSD-3-Clause", + "private": false, + "dependencies": { + "enzyme": "^3.10.0", + "enzyme-context": "^1.1.2", + "enzyme-context-react-router-4": "^2.0.0", + "jest": "^24.9.0", + "raf": "^3.4.1" + } +} diff --git a/scm-ui/ui-webapp/package.json b/scm-ui/ui-webapp/package.json index dde89db508..c91fa8fda8 100644 --- a/scm-ui/ui-webapp/package.json +++ b/scm-ui/ui-webapp/package.json @@ -44,6 +44,7 @@ "pre-commit": "jest && flow && eslint src" }, "devDependencies": { + "@scm-manager/ui-tests": "2.0.0-SNAPSHOT", "concat": "^1.0.3", "copyfiles": "^2.0.0", "enzyme": "^3.3.0", diff --git a/scm-ui/ui-webapp/src/groups/components/navLinks/EditGroupNavLink.test.js b/scm-ui/ui-webapp/src/groups/components/navLinks/EditGroupNavLink.test.js index 7399f4f714..9a1cff25ae 100644 --- a/scm-ui/ui-webapp/src/groups/components/navLinks/EditGroupNavLink.test.js +++ b/scm-ui/ui-webapp/src/groups/components/navLinks/EditGroupNavLink.test.js @@ -2,8 +2,8 @@ import React from "react"; import { shallow } from "enzyme"; -import "../../../tests/enzyme"; -import "../../../tests/i18n"; +import "@scm-manager/ui-tests/enzyme"; +import "@scm-manager/ui-tests/i18n"; import EditGroupNavLink from "./EditGroupNavLink"; it("should render nothing, if the edit link is missing", () => { diff --git a/scm-ui/ui-webapp/src/repos/components/EditRepoNavLink.test.js b/scm-ui/ui-webapp/src/repos/components/EditRepoNavLink.test.js index 22bb06fae0..3995f104d9 100644 --- a/scm-ui/ui-webapp/src/repos/components/EditRepoNavLink.test.js +++ b/scm-ui/ui-webapp/src/repos/components/EditRepoNavLink.test.js @@ -1,12 +1,11 @@ import React from "react"; -import { shallow, mount } from "enzyme"; -import "../../tests/enzyme"; -import "../../tests/i18n"; -import ReactRouterEnzymeContext from "react-router-enzyme-context"; +import { shallow, mount } from "@scm-manager/ui-tests/enzyme-router"; +import "@scm-manager/ui-tests/enzyme"; +import "@scm-manager/ui-tests/i18n"; + import EditRepoNavLink from "./EditRepoNavLink"; describe("GeneralNavLink", () => { - const options = new ReactRouterEnzymeContext(); it("should render nothing, if the modify link is missing", () => { const repository = { @@ -14,8 +13,7 @@ describe("GeneralNavLink", () => { }; const navLink = shallow( - , - options.get() + ); expect(navLink.text()).toBe(""); }); @@ -30,8 +28,7 @@ describe("GeneralNavLink", () => { }; const navLink = mount( - , - options.get() + ); expect(navLink.text()).toBe("repositoryRoot.menu.generalNavLink"); }); diff --git a/scm-ui/ui-webapp/src/repos/components/PermissionsNavLink.test.js b/scm-ui/ui-webapp/src/repos/components/PermissionsNavLink.test.js index 3f6a95fe7d..286b99fc05 100644 --- a/scm-ui/ui-webapp/src/repos/components/PermissionsNavLink.test.js +++ b/scm-ui/ui-webapp/src/repos/components/PermissionsNavLink.test.js @@ -1,7 +1,6 @@ import React from "react"; -import { mount, shallow } from "enzyme"; -import "../../tests/enzyme"; -import "../../tests/i18n"; +import {mount, shallow } from "@scm-manager/ui-tests/enzyme-router"; +import "@scm-manager/ui-tests/i18n"; import ReactRouterEnzymeContext from "react-router-enzyme-context"; import PermissionsNavLink from "./PermissionsNavLink"; diff --git a/scm-ui/ui-webapp/src/repos/components/RepositoryNavLink.test.js b/scm-ui/ui-webapp/src/repos/components/RepositoryNavLink.test.js index a4c060dfe0..bdaf296874 100644 --- a/scm-ui/ui-webapp/src/repos/components/RepositoryNavLink.test.js +++ b/scm-ui/ui-webapp/src/repos/components/RepositoryNavLink.test.js @@ -1,13 +1,12 @@ // @flow import React from "react"; -import { shallow, mount } from "enzyme"; -import "../../tests/enzyme"; -import "../../tests/i18n"; -import ReactRouterEnzymeContext from "react-router-enzyme-context"; +import { shallow, mount } from "@scm-manager/ui-tests/enzyme-router"; +import "@scm-manager/ui-tests/enzyme"; +import "@scm-manager/ui-tests/i18n"; + import RepositoryNavLink from "./RepositoryNavLink"; describe("RepositoryNavLink", () => { - const options = new ReactRouterEnzymeContext(); it("should render nothing, if the sources link is missing", () => { const repository = { @@ -24,8 +23,7 @@ describe("RepositoryNavLink", () => { to="/sources" label="Sources" activeOnlyWhenExact={true} - />, - options.get() + /> ); expect(navLink.text()).toBe(""); }); @@ -49,8 +47,7 @@ describe("RepositoryNavLink", () => { to="/sources" label="Sources" activeOnlyWhenExact={true} - />, - options.get() + /> ); expect(navLink.text()).toBe("Sources"); }); diff --git a/scm-ui/ui-webapp/src/repos/permissions/components/buttons/DeletePermissionButton.test.js b/scm-ui/ui-webapp/src/repos/permissions/components/buttons/DeletePermissionButton.test.js index 03eebe3c50..8beb10e548 100644 --- a/scm-ui/ui-webapp/src/repos/permissions/components/buttons/DeletePermissionButton.test.js +++ b/scm-ui/ui-webapp/src/repos/permissions/components/buttons/DeletePermissionButton.test.js @@ -1,18 +1,16 @@ import React from "react"; -import { mount, shallow } from "enzyme"; -import "../../../../tests/enzyme"; -import "../../../../tests/i18n"; +import { shallow, mount } from "@scm-manager/ui-tests/enzyme-router"; +import "@scm-manager/ui-tests/enzyme"; +import "@scm-manager/ui-tests/i18n"; import DeletePermissionButton from "./DeletePermissionButton"; import { confirmAlert } from "@scm-manager/ui-components"; -import ReactRouterEnzymeContext from "react-router-enzyme-context"; jest.mock("@scm-manager/ui-components", () => ({ confirmAlert: jest.fn(), DeleteButton: require.requireActual("@scm-manager/ui-components").DeleteButton })); describe("DeletePermissionButton", () => { - const options = new ReactRouterEnzymeContext(); it("should render nothing, if the delete link is missing", () => { const permission = { @@ -23,8 +21,7 @@ describe("DeletePermissionButton", () => { {}} - />, - options.get() + /> ); expect(navLink.text()).toBe(""); }); @@ -42,8 +39,7 @@ describe("DeletePermissionButton", () => { {}} - />, - options.get() + /> ); expect(deleteIcon.html()).not.toBe(""); }); @@ -61,8 +57,7 @@ describe("DeletePermissionButton", () => { {}} - />, - options.get() + /> ); button.find(".fa-trash").simulate("click"); @@ -88,8 +83,7 @@ describe("DeletePermissionButton", () => { permission={permission} confirmDialog={false} deletePermission={capture} - />, - options.get() + /> ); button.find(".fa-trash").simulate("click"); diff --git a/scm-ui/ui-webapp/src/tests/enzyme.js b/scm-ui/ui-webapp/src/tests/enzyme.js deleted file mode 100644 index dd538876a4..0000000000 --- a/scm-ui/ui-webapp/src/tests/enzyme.js +++ /dev/null @@ -1,12 +0,0 @@ -import "raf/polyfill"; -import { configure } from "enzyme"; -import Adapter from "enzyme-adapter-react-16"; - -// Temporary hack to suppress error -// https://github.com/facebook/create-react-app/issues/3199#issuecomment-345024029 -window.requestAnimationFrame = function(callback) { - setTimeout(callback, 0); - return 0; -}; - -configure({ adapter: new Adapter() }); diff --git a/scm-ui/ui-webapp/src/tests/i18n.js b/scm-ui/ui-webapp/src/tests/i18n.js deleted file mode 100644 index 4f0dcc8f77..0000000000 --- a/scm-ui/ui-webapp/src/tests/i18n.js +++ /dev/null @@ -1,7 +0,0 @@ -jest.mock("react-i18next", () => ({ - // this mock makes sure any components using the translate HoC receive the t function as a prop - translate: () => Component => { - Component.defaultProps = { ...Component.defaultProps, t: key => key }; - return Component; - } -})); diff --git a/scm-ui/ui-webapp/src/users/components/navLinks/EditUserNavLink.test.js b/scm-ui/ui-webapp/src/users/components/navLinks/EditUserNavLink.test.js index ec46c531a1..402c0af0c9 100644 --- a/scm-ui/ui-webapp/src/users/components/navLinks/EditUserNavLink.test.js +++ b/scm-ui/ui-webapp/src/users/components/navLinks/EditUserNavLink.test.js @@ -1,7 +1,7 @@ import React from "react"; import { shallow } from "enzyme"; -import "../../../tests/enzyme"; -import "../../../tests/i18n"; +import "@scm-manager/ui-tests/enzyme"; +import "@scm-manager/ui-tests/i18n"; import EditUserNavLink from "./EditUserNavLink"; it("should render nothing, if the edit link is missing", () => { diff --git a/scm-ui/ui-webapp/src/users/components/navLinks/SetPasswordNavLink.test.js b/scm-ui/ui-webapp/src/users/components/navLinks/SetPasswordNavLink.test.js index 75ce4e58cf..78bc87cc78 100644 --- a/scm-ui/ui-webapp/src/users/components/navLinks/SetPasswordNavLink.test.js +++ b/scm-ui/ui-webapp/src/users/components/navLinks/SetPasswordNavLink.test.js @@ -1,7 +1,7 @@ import React from "react"; import { shallow } from "enzyme"; -import "../../../tests/enzyme"; -import "../../../tests/i18n"; +import "@scm-manager/ui-tests/enzyme"; +import "@scm-manager/ui-tests/i18n"; import ChangePasswordNavLink from "./SetPasswordNavLink"; it("should render nothing, if the password link is missing", () => { diff --git a/scm-ui/ui-webapp/src/users/components/navLinks/SetPermissionsNavLink.test.js b/scm-ui/ui-webapp/src/users/components/navLinks/SetPermissionsNavLink.test.js index 0e5fcf4125..f0d44a2606 100644 --- a/scm-ui/ui-webapp/src/users/components/navLinks/SetPermissionsNavLink.test.js +++ b/scm-ui/ui-webapp/src/users/components/navLinks/SetPermissionsNavLink.test.js @@ -1,7 +1,7 @@ import React from "react"; import { shallow } from "enzyme"; -import "../../../tests/enzyme"; -import "../../../tests/i18n"; +import "@scm-manager/ui-tests/enzyme"; +import "@scm-manager/ui-tests/i18n"; import SetPermissionsNavLink from "./SetPermissionsNavLink"; it("should render nothing, if the permissions link is missing", () => { diff --git a/yarn.lock b/yarn.lock index a36dd34e4f..ca8b0d728a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1786,7 +1786,7 @@ "@types/minimatch" "*" "@types/node" "*" -"@types/history@*": +"@types/history@*", "@types/history@^4.7.3": version "4.7.3" resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.3.tgz#856c99cdc1551d22c22b18b5402719affec9839a" integrity sha512-cS5owqtwzLN5kY+l+KgKdRJ/Cee8tlmQoGQuIE9tWnSmS3JMKzmxo2HIAk2wODMifGwO20d62xZQLYz+RLfXmw== @@ -1816,6 +1816,18 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" +"@types/lodash.merge@^4.6.4": + version "4.6.6" + resolved "https://registry.yarnpkg.com/@types/lodash.merge/-/lodash.merge-4.6.6.tgz#b84b403c1d31bc42d51772d1cd5557fa008cd3d6" + integrity sha512-IB90krzMf7YpfgP3u/EvZEdXVvm4e3gJbUvh5ieuI+o+XqiNEt6fCzqNRaiLlPVScLI59RxIGZMQ3+Ko/DJ8vQ== + dependencies: + "@types/lodash" "*" + +"@types/lodash@*": + version "4.14.144" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.144.tgz#12e57fc99064bce45e5ab3c8bc4783feb75eab8e" + integrity sha512-ogI4g9W5qIQQUhXAclq6zhqgqNUr7UlFaqDHbch7WLSLeeM/7d3CRaw7GLajxvyFvhJqw4Rpcz5bhoaYtIx6Tg== + "@types/minimatch@*": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" @@ -2512,11 +2524,6 @@ babel-code-frame@^6.22.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@7.0.0-bridge.0: - version "7.0.0-bridge.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" - integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== - babel-eslint@^10.0.3: version "10.0.3" resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.3.tgz#81a2c669be0f205e19462fed2482d33e4687a88a" @@ -4769,7 +4776,31 @@ enzyme-adapter-utils@^1.12.0: prop-types "^15.7.2" semver "^5.6.0" -enzyme@^3.3.0, enzyme@^3.5.0: +enzyme-context-react-router-4@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/enzyme-context-react-router-4/-/enzyme-context-react-router-4-2.0.0.tgz#d23ab6a4e3a6c6d34519def1bdacea4fd19daecd" + integrity sha512-q/0Fugcvipzo6qxghQ9NQjMrj0PW1wZh02dQ67AVg/j35naD4MeXihI2la3s4fUKGhrK6IUCQ4QGEw15slTNqQ== + dependencies: + "@types/history" "^4.7.3" + enzyme-context-utils "^1.1.0" + history "^4.9.0" + +enzyme-context-utils@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/enzyme-context-utils/-/enzyme-context-utils-1.1.0.tgz#2afdc446aef31417c908fd4be3179974451957e0" + integrity sha512-Nom/w7wAYfTd3evDPWDmnrDWYL/4NH30fBkrIaAAq+0vkxP2x2obCLpaJg6tptAEMAPnGEvOoGfKGgYUfFqe4g== + +enzyme-context@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/enzyme-context/-/enzyme-context-1.1.2.tgz#30aec6cd68a3c31b71ae5b7b38d6c53c971baaaf" + integrity sha512-KevDIkfztlgnUrPaOykBHMEZZ9zVILsFu2kYOmGnao1EPYXlns6GdnOyBTcjgy+igPovgKGO77KewjQmjexTDQ== + dependencies: + "@types/lodash.merge" "^4.6.4" + enzyme-context-utils "^1.1.0" + lodash.merge "^4.6.2" + once "^1.4.0" + +enzyme@^3.10.0, enzyme@^3.3.0, enzyme@^3.5.0: version "3.10.0" resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-3.10.0.tgz#7218e347c4a7746e133f8e964aada4a3523452f6" integrity sha512-p2yy9Y7t/PFbPoTvrWde7JIYB2ZyGC+NgTNbVEGvZ5/EyoYSr9aG/2rSbVvyNvMHEhw9/dmGUJHWtfQIEiX9pg== @@ -5818,7 +5849,7 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -gitdiff-parser@^0.1.2, "gitdiff-parser@https://github.com/cloudogu/gitdiff-parser#3a72da4a8e3d9bfb4b9e01a43e85628c19f26cc4": +gitdiff-parser@^0.1.2: version "0.1.2" resolved "https://github.com/cloudogu/gitdiff-parser#3a72da4a8e3d9bfb4b9e01a43e85628c19f26cc4" @@ -7878,6 +7909,11 @@ lodash.merge@4.6.1: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ== +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" @@ -9840,7 +9876,7 @@ querystringify@^2.1.1: resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e" integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA== -raf@^3.4.0: +raf@^3.4.0, raf@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==