@mysetup/test-helpers 1.0.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,30 @@
1
+ # @mysetup/test-helpers
2
+
3
+ A collection of helpful testing functions based on [React Testing Library](https://testing-library.com/docs/react-testing-library/intro/).
4
+
5
+ ## Usage
6
+
7
+ ### `setupRender`
8
+
9
+ `setupRender` accepts a component and default props, and returns a `render` function that will merge additional props to the component.
10
+
11
+ ```tsx
12
+ import { screen, setupRender } from "../../test-helpers";
13
+
14
+ const render = setupRender(<Component />, { text: "default props" });
15
+
16
+ describe("setupRender", () => {
17
+ test("default props", () => {
18
+ render();
19
+
20
+ expect(screen.getByText("default prop")).toBeInTheDocument();
21
+ });
22
+
23
+ test("default props", () => {
24
+ render({ moreText: "more props" });
25
+
26
+ expect(screen.getByText("default props")).toBeInTheDocument();
27
+ expect(screen.getByText("more props")).toBeInTheDocument();
28
+ });
29
+ });
30
+ ```
@@ -0,0 +1,32 @@
1
+ import { render, type RenderOptions, type RenderHookOptions } from "@testing-library/react";
2
+ import { userEvent } from "@testing-library/user-event";
3
+ import { type ReactNode, type ComponentType } from "react";
4
+ import { type ProviderProps, type AppState } from "@mysetup/types";
5
+ type MockOptions = MockNavigation & MockBreakpoint;
6
+ interface MockNavigation {
7
+ navigation?: {
8
+ pathname?: string;
9
+ params?: {
10
+ searchTerm?: string;
11
+ };
12
+ };
13
+ }
14
+ interface MockBreakpoint {
15
+ breakpoint?: number;
16
+ }
17
+ interface ContextProvierProps extends ProviderProps {
18
+ children: ReactNode;
19
+ }
20
+ export declare const setupRender: <Props extends Record<string, any>>(Component: ComponentType<Props>, defaultProps?: Partial<Props & {
21
+ "data-testid": string;
22
+ }>, defaultOptions?: RenderOptions & MockOptions) => ((passedProps?: Partial<Props>, passedOptions?: RenderOptions & MockOptions) => ReturnType<typeof render>);
23
+ export declare const setupRenderWithProvider: <Props extends Record<string, any>>(Component: ComponentType<Props>, Provider: ComponentType<ContextProvierProps>, defaultProps?: Partial<Props & {
24
+ "data-testid": string;
25
+ }>, defaultAppState?: Partial<AppState>, defaultOptions?: RenderOptions & MockOptions) => ((passedProps?: Partial<Props>, passedAppState?: Partial<AppState>, passedOptions?: RenderOptions & MockOptions) => ReturnType<typeof render>);
26
+ export declare const setupRenderHook: <Result, Props>(hook: (initialProps: Props) => Result, defaultProps?: Props, defaultOptions?: RenderHookOptions<Props> & MockOptions) => (passedProps?: Partial<Props>, passedOptions?: RenderHookOptions<Props> & MockOptions) => import("@testing-library/react").RenderHookResult<Result, Props>;
27
+ export declare const setupRenderHookWithProvider: <Result, Props>(hook: (initialProps: Props) => Result, Provider: ComponentType<ContextProvierProps>, defaultProps?: Props, defaultAppState?: Partial<AppState>, defaultOptions?: RenderHookOptions<Props> & MockOptions) => (passedProps?: Partial<Props>, passedAppState?: Partial<AppState> | null, passedOptions?: RenderHookOptions<Props> & MockOptions) => import("@testing-library/react").RenderHookResult<Result, Props>;
28
+ export declare const getById: (container: HTMLElement, id: import("@testing-library/react").Matcher, options?: import("@testing-library/react").MatcherOptions | undefined) => HTMLElement | null;
29
+ export { userEvent };
30
+ export * from "jest-axe";
31
+ export * from "@testing-library/react";
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../helpers/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEH,MAAM,EAEN,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACzB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAc,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAElE,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAEnE,KAAK,WAAW,GAAG,cAAc,GAAG,cAAc,CAAC;AAEnD,UAAU,cAAc;IACpB,UAAU,CAAC,EAAE;QACT,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE;YACL,UAAU,CAAC,EAAE,MAAM,CAAC;SACvB,CAAC;KACL,CAAC;CACL;AAED,UAAU,cAAc;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAeD,UAAU,mBAAoB,SAAQ,aAAa;IAC/C,QAAQ,EAAE,SAAS,CAAC;CACvB;AAED,eAAO,MAAM,WAAW,GAEpB,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,aAEtB,aAAa,CAAC,KAAK,CAAC,iBACjB,OAAO,CAAC,KAAK,GAAG;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC,mBACxC,aAAa,GAAG,WAAW,KAC5C,CAAC,CACA,WAAW,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,EAC5B,aAAa,CAAC,EAAE,aAAa,GAAG,WAAW,KAC1C,UAAU,CAAC,OAAO,MAAM,CAAC,CAiD7B,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAEhC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,aAEtB,aAAa,CAAC,KAAK,CAAC,YACrB,aAAa,CAAC,mBAAmB,CAAC,iBAC9B,OAAO,CAAC,KAAK,GAAG;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC,oBACvC,OAAO,CAAC,QAAQ,CAAC,mBAClB,aAAa,GAAG,WAAW,KAC5C,CAAC,CACA,WAAW,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,EAC5B,cAAc,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,EAClC,aAAa,CAAC,EAAE,aAAa,GAAG,WAAW,KAC1C,UAAU,CAAC,OAAO,MAAM,CAAC,CAuD7B,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,MAAM,EAAE,KAAK,QACnC,CAAC,YAAY,EAAE,KAAK,KAAK,MAAM,iBACtB,KAAK,mBACH,iBAAiB,CAAC,KAAK,CAAC,GAAG,WAAW,oBAGrC,OAAO,CAAC,KAAK,CAAC,kBACb,iBAAiB,CAAC,KAAK,CAAC,GAAG,WAAW,qEAwB5D,CAAC;AAEF,eAAO,MAAM,2BAA2B,GAAI,MAAM,EAAE,KAAK,QAC/C,CAAC,YAAY,EAAE,KAAK,KAAK,MAAM,YAC3B,aAAa,CAAC,mBAAmB,CAAC,iBAC7B,KAAK,oBACF,OAAO,CAAC,QAAQ,CAAC,mBAClB,iBAAiB,CAAC,KAAK,CAAC,GAAG,WAAW,oBAGrC,OAAO,CAAC,KAAK,CAAC,mBACX,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,kBAC1B,iBAAiB,CAAC,KAAK,CAAC,GAAG,WAAW,qEA+B5D,CAAC;AAEF,eAAO,MAAM,OAAO,qKAAoC,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,CAAC;AACrB,cAAc,UAAU,CAAC;AACzB,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
25
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
26
+ };
27
+ var __rest = (this && this.__rest) || function (s, e) {
28
+ var t = {};
29
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
30
+ t[p] = s[p];
31
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
32
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
33
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
34
+ t[p[i]] = s[p[i]];
35
+ }
36
+ return t;
37
+ };
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.userEvent = exports.getById = exports.setupRenderHookWithProvider = exports.setupRenderHook = exports.setupRenderWithProvider = exports.setupRender = void 0;
43
+ var react_1 = require("@testing-library/react");
44
+ var globals_1 = require("@jest/globals");
45
+ var user_event_1 = require("@testing-library/user-event");
46
+ Object.defineProperty(exports, "userEvent", { enumerable: true, get: function () { return user_event_1.userEvent; } });
47
+ var react_2 = __importDefault(require("react"));
48
+ var navigation_1 = require("next/navigation");
49
+ globals_1.jest.doMock("next/navigation", function () { return ({
50
+ usePathname: globals_1.jest.fn(),
51
+ useSearchParams: globals_1.jest.fn(),
52
+ useRouter: function () { return ({
53
+ push: globals_1.jest.fn(),
54
+ replace: globals_1.jest.fn(),
55
+ forward: globals_1.jest.fn(),
56
+ back: globals_1.jest.fn(),
57
+ prefetch: globals_1.jest.fn(),
58
+ refresh: globals_1.jest.fn(),
59
+ }); },
60
+ }); });
61
+ var setupRender = function (Component, defaultProps, defaultOptions) {
62
+ if (defaultProps === void 0) { defaultProps = {}; }
63
+ if (defaultOptions === void 0) { defaultOptions = {}; }
64
+ return function (passedProps, passedOptions) {
65
+ var _a;
66
+ if (passedProps === void 0) { passedProps = {}; }
67
+ if (passedOptions === void 0) { passedOptions = {}; }
68
+ var props = __assign(__assign({}, defaultProps), passedProps);
69
+ var _b = __assign(__assign({}, defaultOptions), passedOptions), _c = _b.navigation, navigation = _c === void 0 ? {} : _c, Wrapper = _b.wrapper, breakpoint = _b.breakpoint, options = __rest(_b, ["navigation", "wrapper", "breakpoint"]);
70
+ if (navigation.pathname) {
71
+ navigation_1.usePathname.mockReturnValue(navigation.pathname);
72
+ }
73
+ if ((_a = navigation.params) === null || _a === void 0 ? void 0 : _a.searchTerm) {
74
+ navigation_1.useSearchParams.mockReturnValue(new URLSearchParams("searchTerm=".concat(navigation.params.searchTerm)));
75
+ }
76
+ if (breakpoint) {
77
+ Object.defineProperty(window, "innerWidth", {
78
+ value: breakpoint,
79
+ });
80
+ }
81
+ return (0, react_1.render)(react_2.default.createElement(react_2.default.Fragment, null, Wrapper ? (react_2.default.createElement(Wrapper, null,
82
+ react_2.default.createElement(Component, __assign({}, props)))) : (react_2.default.createElement(Component, __assign({}, props)))), options);
83
+ };
84
+ };
85
+ exports.setupRender = setupRender;
86
+ var setupRenderWithProvider = function (Component, Provider, defaultProps, defaultAppState, defaultOptions) {
87
+ if (defaultProps === void 0) { defaultProps = {}; }
88
+ if (defaultAppState === void 0) { defaultAppState = {}; }
89
+ if (defaultOptions === void 0) { defaultOptions = {}; }
90
+ return function (passedProps, passedAppState, passedOptions) {
91
+ var _a;
92
+ if (passedProps === void 0) { passedProps = {}; }
93
+ if (passedAppState === void 0) { passedAppState = {}; }
94
+ if (passedOptions === void 0) { passedOptions = {}; }
95
+ var props = __assign(__assign({}, defaultProps), passedProps);
96
+ var _b = __assign(__assign({}, defaultOptions), passedOptions), _c = _b.navigation, navigation = _c === void 0 ? {} : _c, Wrapper = _b.wrapper, breakpoint = _b.breakpoint, options = __rest(_b, ["navigation", "wrapper", "breakpoint"]);
97
+ var appState = __assign(__assign({}, defaultAppState), passedAppState);
98
+ if (navigation.pathname) {
99
+ navigation_1.usePathname.mockReturnValue(navigation.pathname);
100
+ }
101
+ if ((_a = navigation.params) === null || _a === void 0 ? void 0 : _a.searchTerm) {
102
+ navigation_1.useSearchParams.mockReturnValue(new URLSearchParams("searchTerm=".concat(navigation.params.searchTerm)));
103
+ }
104
+ if (breakpoint) {
105
+ Object.defineProperty(window, "innerWidth", {
106
+ value: breakpoint,
107
+ });
108
+ }
109
+ return (0, react_1.render)(react_2.default.createElement(Provider, { appState: appState, version: "test" }, Wrapper ? (react_2.default.createElement(Wrapper, null,
110
+ react_2.default.createElement(Component, __assign({}, props)))) : (react_2.default.createElement(Component, __assign({}, props)))), options);
111
+ };
112
+ };
113
+ exports.setupRenderWithProvider = setupRenderWithProvider;
114
+ var setupRenderHook = function (hook, defaultProps, defaultOptions) {
115
+ return function (passedProps, passedOptions) {
116
+ if (passedOptions === void 0) { passedOptions = {}; }
117
+ var props = (passedProps !== null && passedProps !== void 0 ? passedProps : defaultProps);
118
+ var _a = __assign(__assign({}, defaultOptions), passedOptions), _b = _a.navigation, navigation = _b === void 0 ? {} : _b, Wrapper = _a.wrapper, options = __rest(_a, ["navigation", "wrapper"]);
119
+ if (navigation.pathname) {
120
+ navigation_1.usePathname.mockReturnValue(navigation.pathname);
121
+ }
122
+ return (0, react_1.renderHook)(function () { return hook(props); }, __assign(__assign({}, options), { wrapper: function (_a) {
123
+ var children = _a.children;
124
+ return (react_2.default.createElement(react_2.default.Fragment, null, Wrapper ? react_2.default.createElement(Wrapper, null, children) : children));
125
+ } }));
126
+ };
127
+ };
128
+ exports.setupRenderHook = setupRenderHook;
129
+ var setupRenderHookWithProvider = function (hook, Provider, defaultProps, defaultAppState, defaultOptions) {
130
+ return function (passedProps, passedAppState, passedOptions) {
131
+ if (passedOptions === void 0) { passedOptions = {}; }
132
+ var props = (passedProps !== null && passedProps !== void 0 ? passedProps : defaultProps);
133
+ var _a = __assign(__assign({}, defaultOptions), passedOptions), _b = _a.navigation, navigation = _b === void 0 ? {} : _b, Wrapper = _a.wrapper, options = __rest(_a, ["navigation", "wrapper"]);
134
+ var appState = __assign(__assign({}, defaultAppState), passedAppState);
135
+ if (navigation.pathname) {
136
+ navigation_1.usePathname.mockReturnValue(navigation.pathname);
137
+ }
138
+ return (0, react_1.renderHook)(function () { return hook(props); }, __assign(__assign({}, options), { wrapper: function (_a) {
139
+ var children = _a.children;
140
+ return (react_2.default.createElement(Provider, { appState: appState, version: "test" }, Wrapper ? react_2.default.createElement(Wrapper, null, children) : children));
141
+ } }));
142
+ };
143
+ };
144
+ exports.setupRenderHookWithProvider = setupRenderHookWithProvider;
145
+ exports.getById = react_1.queryByAttribute.bind(null, "id");
146
+ __exportStar(require("jest-axe"), exports);
147
+ __exportStar(require("@testing-library/react"), exports);
@@ -0,0 +1,2 @@
1
+ export * from "./helpers";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.tsx"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
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("./helpers"), exports);
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "@mysetup/test-helpers",
3
+ "version": "1.0.0",
4
+ "license": "MIT",
5
+ "main": "dist/index.js",
6
+ "files": [
7
+ "dist"
8
+ ],
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.js"
14
+ },
15
+ "./package.json": "./package.json"
16
+ },
17
+ "scripts": {
18
+ "build": "rm -rf ./dist && tsc -p tsconfig.build.json",
19
+ "lint": "eslint .",
20
+ "test": "jest",
21
+ "test:update": "pnpm test -- -u",
22
+ "test:coverage": "jest --coverage",
23
+ "typecheck": "tsc --noEmit",
24
+ "format": "prettier --write \"**/*.{ts,tsx,md,js,mjs,json}\"",
25
+ "checks": "pnpm typecheck && pnpm lint && pnpm test",
26
+ "clean": "rm -rf node_modules .swc dist pnpm-lock.yaml && echo \"✅ Successfully removed \""
27
+ },
28
+ "dependencies": {
29
+ "@testing-library/dom": "^10.4.0",
30
+ "@testing-library/jest-dom": "^6.6.3",
31
+ "@testing-library/react": "^16.0.1",
32
+ "@testing-library/user-event": "^14.5.2",
33
+ "@jest/globals": "^29.7.0",
34
+ "react": "^18.3.1",
35
+ "next": "^15.0.2",
36
+ "react-aria": "^3.35.1",
37
+ "react-dom": "^18.3.1"
38
+ },
39
+ "devDependencies": {
40
+ "@mysetup/eslint-config": "latest",
41
+ "@mysetup/jest-config": "latest",
42
+ "@mysetup/prettier-config": "latest",
43
+ "@mysetup/tsconfig": "latest",
44
+ "@mysetup/types": "latest",
45
+ "@types/jest": "^29.5.14",
46
+ "@types/jest-axe": "^3.5.9",
47
+ "@types/node": "^22.8.6",
48
+ "@types/react": "^18.3.12",
49
+ "@types/react-dom": "^18.3.1",
50
+ "eslint": "8.57.0",
51
+ "jest": "^29.7.0",
52
+ "jest-axe": "^9.0.0",
53
+ "typescript": "^5.6.3"
54
+ },
55
+ "prettier": "@mysetup/prettier-config",
56
+ "engines": {
57
+ "node": ">=18.0.0"
58
+ },
59
+ "packageManager": "pnpm@9.9.0"
60
+ }