@uxf/e2e 11.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,23 @@
1
+ # @uxf/e2e
2
+
3
+ ```bash
4
+ yarn add @uxf/e2e
5
+ ```
6
+
7
+ ## TestCafe test example
8
+
9
+ ```ts
10
+ import { fixture, test } from "testcafe";
11
+ import { components, waitForReact } from "@uxf/e2e";
12
+
13
+ fixture("E2E test")
14
+ .page("https://fe.uxf.dev/examples/ui/button/Default")
15
+ .beforeEach(async (t) => {
16
+ await waitForReact(10000, t);
17
+ });
18
+
19
+ test("First E2E test", async () => {
20
+ await components.button({ text: "Default" }).click();
21
+ await components.button({ text: "Default" }).shouldBeDisabled();
22
+ });
23
+ ```
@@ -0,0 +1,8 @@
1
+ import { button } from "./ui/button";
2
+ import { buttonGroup } from "./ui/button-group";
3
+ import { buttonList } from "./ui/button-list";
4
+ export declare const components: {
5
+ button: typeof button;
6
+ buttonGroup: typeof buttonGroup;
7
+ buttonList: typeof buttonList;
8
+ };
package/components.js ADDED
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.components = void 0;
4
+ const button_1 = require("./ui/button");
5
+ const button_group_1 = require("./ui/button-group");
6
+ const button_list_1 = require("./ui/button-list");
7
+ exports.components = {
8
+ button: button_1.button,
9
+ buttonGroup: button_group_1.buttonGroup,
10
+ buttonList: button_list_1.buttonList,
11
+ };
package/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from "./components";
2
+ export * from "./utils/wait-for-react";
package/index.js ADDED
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./components"), exports);
18
+ __exportStar(require("./utils/wait-for-react"), exports);
package/package.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "@uxf/e2e",
3
+ "version": "11.10.0",
4
+ "description": "UXF TestCafe helpers",
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "scripts": {
9
+ "build": "npm run compile",
10
+ "compile": "tsc -P tsconfig.json",
11
+ "test": "../../node_modules/.bin/testcafe chrome ./tests/button.e2e.ts",
12
+ "dev": "../../node_modules/.bin/testcafe chrome ./tests/button.e2e.ts --live",
13
+ "typecheck": "../../node_modules/.bin/tsc --noEmit --skipLibCheck"
14
+ },
15
+ "author": "UX Fans s.r.o",
16
+ "license": "MIT",
17
+ "devDependencies": {
18
+ "testcafe": "^3.5.0"
19
+ },
20
+ "peerDependencies": {
21
+ "testcafe": "^3.5.0"
22
+ }
23
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const testcafe_1 = require("testcafe");
4
+ const components_1 = require("../components");
5
+ const wait_for_react_1 = require("../utils/wait-for-react");
6
+ (0, testcafe_1.fixture)("Home page")
7
+ .page("https://fe.uxf.dev/examples/ui/button/Default")
8
+ .httpAuth({ username: "uxf", password: "uxf" })
9
+ .beforeEach(async (t) => {
10
+ await (0, wait_for_react_1.waitForReact)(10000, t);
11
+ });
12
+ (0, testcafe_1.test)("UI Button", async () => {
13
+ await components_1.components.button({ text: "Default" }).shouldExists();
14
+ await components_1.components.button({ text: "Not found" }).shouldNotExists();
15
+ });
@@ -0,0 +1,10 @@
1
+ import { BaseSelector } from "../utils/base-selector";
2
+ interface ButtonGroupSelector extends BaseSelector {
3
+ dataTestId: string;
4
+ }
5
+ export declare function buttonGroup(buttonGroupSelector: ButtonGroupSelector): {
6
+ clickOnButtonByText(buttonText: string): TestControllerPromise<any>;
7
+ shouldExists(): TestControllerPromise<any>;
8
+ shouldExistsButtonByText(text: string): TestControllerPromise<any>;
9
+ };
10
+ export {};
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buttonGroup = void 0;
4
+ const testcafe_1 = require("testcafe");
5
+ const create_selector_1 = require("../utils/create-selector");
6
+ const button_1 = require("./button");
7
+ function buttonGroup(buttonGroupSelector) {
8
+ const selector = (0, create_selector_1.createSelector)(buttonGroupSelector)
9
+ .find(".uxf-button-group")
10
+ .find(`[data-test-id="${buttonGroupSelector.dataTestId}"]`);
11
+ return {
12
+ clickOnButtonByText(buttonText) {
13
+ return (0, button_1.button)({ parent: selector, text: buttonText }).click();
14
+ },
15
+ shouldExists() {
16
+ return testcafe_1.t.expect(selector.exists).ok();
17
+ },
18
+ shouldExistsButtonByText(text) {
19
+ return (0, button_1.button)({ parent: selector, text }).shouldExists();
20
+ },
21
+ };
22
+ }
23
+ exports.buttonGroup = buttonGroup;
@@ -0,0 +1,8 @@
1
+ import { BaseSelector } from "../utils/base-selector";
2
+ interface ButtonListSelector extends BaseSelector {
3
+ nth?: number;
4
+ }
5
+ export declare function buttonList(buttonListSelector: ButtonListSelector): {
6
+ clickOnButton(text: string): TestControllerPromise<any>;
7
+ };
8
+ export {};
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buttonList = void 0;
4
+ const create_selector_1 = require("../utils/create-selector");
5
+ const button_1 = require("./button");
6
+ function buttonList(buttonListSelector) {
7
+ var _a;
8
+ const selector = (0, create_selector_1.createSelector)(buttonListSelector)
9
+ .find(".uxf-button-list")
10
+ .nth((_a = buttonListSelector.nth) !== null && _a !== void 0 ? _a : 0);
11
+ return {
12
+ clickOnButton(text) {
13
+ return (0, button_1.button)({ parent: selector, text }).click();
14
+ },
15
+ };
16
+ }
17
+ exports.buttonList = buttonList;
package/ui/button.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ import { BaseSelector } from "../utils/base-selector";
2
+ interface ButtonSelector extends BaseSelector {
3
+ text: string;
4
+ nth?: number;
5
+ }
6
+ export declare function button(buttonSelector: ButtonSelector): {
7
+ click(): TestControllerPromise<any>;
8
+ shouldExists(): TestControllerPromise<any>;
9
+ shouldNotExists(): TestControllerPromise<any>;
10
+ shouldBeDisabled(): void;
11
+ };
12
+ export {};
package/ui/button.js ADDED
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.button = void 0;
4
+ const testcafe_1 = require("testcafe");
5
+ const create_selector_1 = require("../utils/create-selector");
6
+ function button(buttonSelector) {
7
+ var _a;
8
+ const selector = (0, create_selector_1.createSelector)(buttonSelector)
9
+ .find(".uxf-button")
10
+ .withExactText(buttonSelector.text)
11
+ .nth((_a = buttonSelector.nth) !== null && _a !== void 0 ? _a : 0);
12
+ return {
13
+ click() {
14
+ return testcafe_1.t.click(selector);
15
+ },
16
+ shouldExists() {
17
+ return testcafe_1.t.expect(selector.exists).ok();
18
+ },
19
+ shouldNotExists() {
20
+ return testcafe_1.t.expect(selector.exists).notOk();
21
+ },
22
+ shouldBeDisabled() {
23
+ // TODO
24
+ },
25
+ };
26
+ }
27
+ exports.button = button;
@@ -0,0 +1,3 @@
1
+ export type BaseSelector = {
2
+ parent?: Selector;
3
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ import { BaseSelector } from "./base-selector";
2
+ export declare function createSelector(selector: BaseSelector): Selector;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSelector = void 0;
4
+ const root_selector_1 = require("./root-selector");
5
+ function createSelector(selector) {
6
+ var _a;
7
+ return (_a = selector.parent) !== null && _a !== void 0 ? _a : root_selector_1.RootSelector;
8
+ }
9
+ exports.createSelector = createSelector;
@@ -0,0 +1 @@
1
+ export declare const RootSelector: Selector;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RootSelector = void 0;
4
+ const testcafe_1 = require("testcafe");
5
+ exports.RootSelector = (0, testcafe_1.Selector)("body");
@@ -0,0 +1 @@
1
+ export declare function waitForReact(timeout: any, testController: any): Promise<Promise<unknown>>;
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.waitForReact = void 0;
4
+ const testcafe_1 = require("testcafe");
5
+ // TODO - klasická funkce waitForReact nefunguje s AppDirectory v nextu :-)
6
+ function waitForReact(timeout, testController) {
7
+ const DEFAULT_TIMEOUT = 1e4;
8
+ const checkTimeout = typeof timeout === "number" ? timeout : DEFAULT_TIMEOUT;
9
+ return (0, testcafe_1.ClientFunction)(() => {
10
+ const CHECK_INTERVAL = 200;
11
+ let stopChecking = false;
12
+ function findReact16to18Root() {
13
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
14
+ // @ts-ignore
15
+ const treeWalker = document.createTreeWalker(document, NodeFilter.SHOW_ELEMENT, null, false);
16
+ while (treeWalker.nextNode()) {
17
+ //NOTE: react 18
18
+ for (const prop of Object.keys(treeWalker.currentNode)) {
19
+ if (/^__reactContainer|^__reactProps/.test(prop)) {
20
+ return true;
21
+ }
22
+ }
23
+ }
24
+ return false;
25
+ }
26
+ function findReactApp() {
27
+ return findReact16to18Root();
28
+ }
29
+ return new Promise((resolve, reject) => {
30
+ function tryFindReactApp() {
31
+ const startTime = new Date();
32
+ const reactTreeIsFound = findReactApp();
33
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
34
+ // @ts-ignore
35
+ const checkTime = new Date() - startTime;
36
+ if (reactTreeIsFound) {
37
+ resolve();
38
+ return;
39
+ }
40
+ if (stopChecking) {
41
+ return;
42
+ }
43
+ setTimeout(tryFindReactApp, checkTime > CHECK_INTERVAL ? checkTime : CHECK_INTERVAL);
44
+ }
45
+ tryFindReactApp();
46
+ setTimeout(() => {
47
+ stopChecking = true;
48
+ reject("waitForReact: The waiting timeout is exceeded");
49
+ }, checkTimeout);
50
+ });
51
+ }, { dependencies: { checkTimeout }, boundTestRun: testController })();
52
+ }
53
+ exports.waitForReact = waitForReact;