Skip to content

Commit d982040

Browse files
authored
Merge pull request #1 from salzhrani/add-testing-library
Add react testing library with a basic test
2 parents 3078dcf + 32035bc commit d982040

5 files changed

+182
-9
lines changed

package.json

+4-2
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959
"transform": {
6060
".(ts|tsx)": "ts-jest"
6161
},
62-
"testEnvironment": "node",
62+
"testEnvironment": "jsdom",
6363
"testRegex": "(/__tests__/.*|\\.(test|spec))\\.(ts|tsx|js)$",
6464
"moduleFileExtensions": [
6565
"ts",
@@ -79,7 +79,7 @@
7979
}
8080
},
8181
"collectCoverageFrom": [
82-
"src/*.{js,ts}"
82+
"src/*.{js,ts,tsx}"
8383
]
8484
},
8585
"prettier": {
@@ -94,6 +94,7 @@
9494
"devDependencies": {
9595
"@commitlint/cli": "^11.0.0",
9696
"@commitlint/config-conventional": "^11.0.0",
97+
"@testing-library/react": "^11.0.4",
9798
"@types/jest": "^26.0.13",
9899
"@types/node": "^14.10.2",
99100
"@types/react": "^16.9.49",
@@ -109,6 +110,7 @@
109110
"lodash.camelcase": "^4.3.0",
110111
"prettier": "^2.1.1",
111112
"prompt": "^1.0.0",
113+
"react-dom": "^16.13.1",
112114
"replace-in-file": "^6.1.0",
113115
"rimraf": "^3.0.2",
114116
"rollup": "^2.26.11",

test/react-headless-nested-menu.test.ts

-5
This file was deleted.
+105
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import * as React from 'react'
2+
import { render, fireEvent, waitFor, screen } from '@testing-library/react'
3+
import { Items, useNestedMenu } from '../src/react-headless-nested-menu'
4+
5+
const simpleList = [
6+
{
7+
id: 'ckeri9fsh00003g657lmpwrly',
8+
label: 'Name',
9+
},
10+
{
11+
id: 'ckeri9fsh00013g65k5aosl1l',
12+
label: 'Photo',
13+
},
14+
{
15+
id: 'ckeri9fsh00023g65zjdr0wdx',
16+
label: 'Email',
17+
},
18+
];
19+
20+
const Basic: React.FC = () => {
21+
const {
22+
getToggleButtonProps,
23+
getMenuProps,
24+
getMenuOffsetStyles,
25+
getCloseTriggerProps,
26+
getItemProps,
27+
getOpenTriggerProps,
28+
toggleMenu,
29+
isSubMenuOpen,
30+
isOpen
31+
} = useNestedMenu({
32+
items: simpleList,
33+
})
34+
const renderItem = (item: Items[0]) => (
35+
<div
36+
{...getItemProps(item)}
37+
className="relative my-1 first:mt-0 last:mb-0"
38+
{...getOpenTriggerProps('onPointerEnter', item)}
39+
onClick={(event) => {
40+
event.stopPropagation()
41+
toggleMenu()
42+
}}
43+
>
44+
<div
45+
className={isSubMenuOpen(item) ? 'sub-open': 'sub-closed'}
46+
>
47+
{item.label}
48+
{item.subMenu && <span className="chevron" />}
49+
</div>
50+
51+
{/* Only show submenu when there's a submenu & it's open */}
52+
{item.subMenu && isSubMenuOpen(item) && renderMenu(item.subMenu, item)}
53+
</div>
54+
)
55+
const renderMenu = (items: Items, parentItem?: Items[0]) => (
56+
<div
57+
{...getMenuProps(parentItem)}
58+
style={{
59+
position: 'absolute',
60+
...getMenuOffsetStyles(parentItem),
61+
}}
62+
className={typeof parentItem === 'undefined' ? 'root' : 'sub'}
63+
{...getCloseTriggerProps('onPointerLeave', parentItem)}
64+
>
65+
<div>{items.map((item) => renderItem(item))}</div>
66+
67+
{/* Hit Area */}
68+
{parentItem && (
69+
<div
70+
style={{
71+
position: 'absolute',
72+
top: -8,
73+
bottom: -8,
74+
left: -8,
75+
right: -8,
76+
zIndex: -1,
77+
}}
78+
></div>
79+
)}
80+
</div>
81+
)
82+
return (
83+
<div>
84+
<button className="toggle-btn" {...getToggleButtonProps()}>
85+
Toggle
86+
</button>
87+
{isOpen && renderMenu(simpleList)}
88+
</div>
89+
)
90+
}
91+
92+
describe('Hook', () => {
93+
it('renders basic menu', () => {
94+
const { container, queryByText } = render(<Basic />);
95+
const btn = queryByText('Toggle');
96+
expect(btn).toBeDefined();
97+
expect(queryByText('Name')).toBe(null);
98+
expect(queryByText('Photo')).toBe(null);
99+
expect(queryByText('Email')).toBe(null);
100+
fireEvent.click(btn!);
101+
expect(queryByText('Name')).toBeDefined();
102+
expect(queryByText('Photo')).toBeDefined();
103+
expect(queryByText('Email')).toBeDefined();
104+
})
105+
})

tsconfig.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
"emitDecoratorMetadata": true,
1414
"declarationDir": "dist/types",
1515
"outDir": "dist/lib",
16-
"typeRoots": ["node_modules/@types"]
16+
"typeRoots": ["node_modules/@types"],
17+
"esModuleInterop": true
1718
},
1819
"include": ["src"]
1920
}

yarn.lock

+71-1
Original file line numberDiff line numberDiff line change
@@ -821,7 +821,15 @@
821821
pirates "^4.0.0"
822822
source-map-support "^0.5.16"
823823

824-
"@babel/runtime@^7.11.2", "@babel/runtime@^7.8.4":
824+
"@babel/runtime-corejs3@^7.10.2":
825+
version "7.11.2"
826+
resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.11.2.tgz#02c3029743150188edeb66541195f54600278419"
827+
integrity sha512-qh5IR+8VgFz83VBa6OkaET6uN/mJOhHONuy3m1sgF0CV6mXdPSEBdA7e1eUbVvyNtANjMbg22JUv71BaDXLY6A==
828+
dependencies:
829+
core-js-pure "^3.0.0"
830+
regenerator-runtime "^0.13.4"
831+
832+
"@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.11.2", "@babel/runtime@^7.8.4":
825833
version "7.11.2"
826834
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736"
827835
integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==
@@ -1451,11 +1459,37 @@
14511459
dependencies:
14521460
defer-to-connect "^1.0.1"
14531461

1462+
"@testing-library/dom@^7.24.2":
1463+
version "7.24.2"
1464+
resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.24.2.tgz#6d2b7dd21efbd5358b98c2777fc47c252f3ae55e"
1465+
integrity sha512-ERxcZSoHx0EcN4HfshySEWmEf5Kkmgi+J7O79yCJ3xggzVlBJ2w/QjJUC+EBkJJ2OeSw48i3IoePN4w8JlVUIA==
1466+
dependencies:
1467+
"@babel/code-frame" "^7.10.4"
1468+
"@babel/runtime" "^7.10.3"
1469+
"@types/aria-query" "^4.2.0"
1470+
aria-query "^4.2.2"
1471+
chalk "^4.1.0"
1472+
dom-accessibility-api "^0.5.1"
1473+
pretty-format "^26.4.2"
1474+
1475+
"@testing-library/react@^11.0.4":
1476+
version "11.0.4"
1477+
resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-11.0.4.tgz#c84082bfe1593d8fcd475d46baee024452f31dee"
1478+
integrity sha512-U0fZO2zxm7M0CB5h1+lh31lbAwMSmDMEMGpMT3BUPJwIjDEKYWOV4dx7lb3x2Ue0Pyt77gmz/VropuJnSz/Iew==
1479+
dependencies:
1480+
"@babel/runtime" "^7.11.2"
1481+
"@testing-library/dom" "^7.24.2"
1482+
14541483
"@tootallnate/once@1":
14551484
version "1.1.2"
14561485
resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
14571486
integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==
14581487

1488+
"@types/aria-query@^4.2.0":
1489+
version "4.2.0"
1490+
resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.0.tgz#14264692a9d6e2fa4db3df5e56e94b5e25647ac0"
1491+
integrity sha512-iIgQNzCm0v7QMhhe4Jjn9uRh+I6GoPmt03CbEtwx3ao8/EfoQcmgtqH4vQ5Db/lxiIGaWDv6nwvunuh0RyX0+A==
1492+
14591493
"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7":
14601494
version "7.1.9"
14611495
resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.9.tgz#77e59d438522a6fb898fa43dc3455c6e72f3963d"
@@ -1820,6 +1854,14 @@ argv-formatter@~1.0.0:
18201854
resolved "https://registry.yarnpkg.com/argv-formatter/-/argv-formatter-1.0.0.tgz#a0ca0cbc29a5b73e836eebe1cbf6c5e0e4eb82f9"
18211855
integrity sha1-oMoMvCmltz6Dbuvhy/bF4OTrgvk=
18221856

1857+
aria-query@^4.2.2:
1858+
version "4.2.2"
1859+
resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b"
1860+
integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==
1861+
dependencies:
1862+
"@babel/runtime" "^7.10.2"
1863+
"@babel/runtime-corejs3" "^7.10.2"
1864+
18231865
arr-diff@^4.0.0:
18241866
version "4.0.0"
18251867
resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
@@ -2698,6 +2740,11 @@ core-js-compat@^3.6.2:
26982740
browserslist "^4.8.5"
26992741
semver "7.0.0"
27002742

2743+
core-js-pure@^3.0.0:
2744+
version "3.6.5"
2745+
resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.5.tgz#c79e75f5e38dbc85a662d91eea52b8256d53b813"
2746+
integrity sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==
2747+
27012748
core-js@^2.6.5:
27022749
version "2.6.11"
27032750
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c"
@@ -3092,6 +3139,11 @@ doctrine@0.7.2:
30923139
esutils "^1.1.6"
30933140
isarray "0.0.1"
30943141

3142+
dom-accessibility-api@^0.5.1:
3143+
version "0.5.2"
3144+
resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.2.tgz#ef3cdb5d3f0d599d8f9c8b18df2fb63c9793739d"
3145+
integrity sha512-k7hRNKAiPJXD2aBqfahSo4/01cTsKWXf+LqJgglnkN2Nz8TsxXKQBXHhKe0Ye9fEfHEZY49uSA5Sr3AqP/sWKA==
3146+
30953147
domexception@^2.0.1:
30963148
version "2.0.1"
30973149
resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304"
@@ -7227,6 +7279,16 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.2.8:
72277279
minimist "^1.2.0"
72287280
strip-json-comments "~2.0.1"
72297281

7282+
react-dom@^16.13.1:
7283+
version "16.13.1"
7284+
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.1.tgz#c1bd37331a0486c078ee54c4740720993b2e0e7f"
7285+
integrity sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==
7286+
dependencies:
7287+
loose-envify "^1.1.0"
7288+
object-assign "^4.1.1"
7289+
prop-types "^15.6.2"
7290+
scheduler "^0.19.1"
7291+
72307292
react-is@^16.12.0, react-is@^16.8.1:
72317293
version "16.13.1"
72327294
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
@@ -7788,6 +7850,14 @@ saxes@^5.0.0:
77887850
dependencies:
77897851
xmlchars "^2.2.0"
77907852

7853+
scheduler@^0.19.1:
7854+
version "0.19.1"
7855+
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196"
7856+
integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==
7857+
dependencies:
7858+
loose-envify "^1.1.0"
7859+
object-assign "^4.1.1"
7860+
77917861
semantic-release@^17.1.1:
77927862
version "17.1.1"
77937863
resolved "https://registry.yarnpkg.com/semantic-release/-/semantic-release-17.1.1.tgz#d9775968e841b2b7c5020559e4481aea8520ca75"

0 commit comments

Comments
 (0)