@abstraks-dev/ui-library 1.0.1
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/LICENSE +21 -0
- package/README.md +708 -0
- package/dist/__tests__/Anchor.test.js +145 -0
- package/dist/__tests__/ArrowRight.test.js +91 -0
- package/dist/__tests__/Avatar.test.js +123 -0
- package/dist/__tests__/Button.test.js +82 -0
- package/dist/__tests__/Card.test.js +198 -0
- package/dist/__tests__/CheckCircle.test.js +98 -0
- package/dist/__tests__/Checkbox.test.js +161 -0
- package/dist/__tests__/ChevronDown.test.js +73 -0
- package/dist/__tests__/Close.test.js +98 -0
- package/dist/__tests__/EditSquare.test.js +99 -0
- package/dist/__tests__/Error.test.js +74 -0
- package/dist/__tests__/Footer.test.js +66 -0
- package/dist/__tests__/Heading.test.js +227 -0
- package/dist/__tests__/Hero.test.js +74 -0
- package/dist/__tests__/Label.test.js +123 -0
- package/dist/__tests__/Loader.test.js +115 -0
- package/dist/__tests__/MenuHover.test.js +137 -0
- package/dist/__tests__/Paragraph.test.js +93 -0
- package/dist/__tests__/PlusCircle.test.js +99 -0
- package/dist/__tests__/Radio.test.js +153 -0
- package/dist/__tests__/Select.test.js +187 -0
- package/dist/__tests__/Tabs.test.js +162 -0
- package/dist/__tests__/TextArea.test.js +127 -0
- package/dist/__tests__/TextInput.test.js +181 -0
- package/dist/__tests__/Toggle.test.js +120 -0
- package/dist/__tests__/TrashX.test.js +99 -0
- package/dist/__tests__/useHeadingAccessibility.test.js +144 -0
- package/dist/components/Anchor.js +131 -0
- package/dist/components/Animation.js +129 -0
- package/dist/components/AnimationGroup.js +207 -0
- package/dist/components/AnimationToggle.js +216 -0
- package/dist/components/Avatar.js +153 -0
- package/dist/components/Button.js +218 -0
- package/dist/components/Card.js +222 -0
- package/dist/components/Checkbox.js +305 -0
- package/dist/components/Crud.js +564 -0
- package/dist/components/DragAndDrop.js +337 -0
- package/dist/components/Error.js +206 -0
- package/dist/components/Footer.js +99 -0
- package/dist/components/Form.js +412 -0
- package/dist/components/Header.js +372 -0
- package/dist/components/Heading.js +134 -0
- package/dist/components/Hero.js +181 -0
- package/dist/components/Label.js +256 -0
- package/dist/components/Loader.js +302 -0
- package/dist/components/MenuHover.js +114 -0
- package/dist/components/Paragraph.js +128 -0
- package/dist/components/Prompt.js +61 -0
- package/dist/components/Radio.js +254 -0
- package/dist/components/Select.js +422 -0
- package/dist/components/SideMenu.js +313 -0
- package/dist/components/Tabs.js +297 -0
- package/dist/components/TextArea.js +370 -0
- package/dist/components/TextInput.js +286 -0
- package/dist/components/Toggle.js +186 -0
- package/dist/components/crudFiles/CrudEditBase.js +150 -0
- package/dist/components/crudFiles/CrudViewBase.js +39 -0
- package/dist/components/crudFiles/crudDevelopment.js +118 -0
- package/dist/components/crudFiles/crudEditHandlers.js +50 -0
- package/dist/constants/animation.js +30 -0
- package/dist/icons/ArrowIcon.js +32 -0
- package/dist/icons/ArrowRight.js +33 -0
- package/dist/icons/CheckCircle.js +33 -0
- package/dist/icons/ChevronDown.js +28 -0
- package/dist/icons/Close.js +33 -0
- package/dist/icons/EditSquare.js +33 -0
- package/dist/icons/Ellipses.js +34 -0
- package/dist/icons/Hamburger.js +39 -0
- package/dist/icons/LoadingSpinner.js +42 -0
- package/dist/icons/PlusCircle.js +33 -0
- package/dist/icons/SaveIcon.js +32 -0
- package/dist/icons/TrashX.js +33 -0
- package/dist/icons/__tests__/CheckCircle.test.js +9 -0
- package/dist/icons/__tests__/ChevronDown.test.js +9 -0
- package/dist/icons/__tests__/Close.test.js +9 -0
- package/dist/icons/__tests__/EditSquare.test.js +9 -0
- package/dist/icons/__tests__/PlusCircle.test.js +9 -0
- package/dist/icons/__tests__/TrashX.test.js +9 -0
- package/dist/icons/index.js +89 -0
- package/dist/index.js +332 -0
- package/dist/setupTests.js +3 -0
- package/dist/styles/_variables.scss +286 -0
- package/dist/styles/anchor.scss +40 -0
- package/dist/styles/animation-accessibility.scss +96 -0
- package/dist/styles/animation-toggle.scss +233 -0
- package/dist/styles/animation.scss +3781 -0
- package/dist/styles/avatar.scss +285 -0
- package/dist/styles/button.scss +430 -0
- package/dist/styles/card.scss +210 -0
- package/dist/styles/checkbox.scss +160 -0
- package/dist/styles/crud.scss +474 -0
- package/dist/styles/dragAndDrop.scss +312 -0
- package/dist/styles/error.scss +232 -0
- package/dist/styles/footer.scss +58 -0
- package/dist/styles/form.scss +420 -0
- package/dist/styles/grid.scss +29 -0
- package/dist/styles/header.scss +276 -0
- package/dist/styles/heading.scss +118 -0
- package/dist/styles/hero.scss +185 -0
- package/dist/styles/htmlElements.scss +20 -0
- package/dist/styles/image.scss +9 -0
- package/dist/styles/label.scss +340 -0
- package/dist/styles/list-item.scss +5 -0
- package/dist/styles/loader.scss +354 -0
- package/dist/styles/logo.scss +19 -0
- package/dist/styles/main.css +9056 -0
- package/dist/styles/main.css.map +1 -0
- package/dist/styles/main.scss +0 -0
- package/dist/styles/menu-hover.scss +30 -0
- package/dist/styles/paragraph.scss +88 -0
- package/dist/styles/prompt.scss +51 -0
- package/dist/styles/radio.scss +202 -0
- package/dist/styles/select.scss +363 -0
- package/dist/styles/side-menu.scss +334 -0
- package/dist/styles/tabs.scss +540 -0
- package/dist/styles/text-area.scss +388 -0
- package/dist/styles/text-input.scss +171 -0
- package/dist/styles/toggle.scss +0 -0
- package/dist/styles/unordered-list.scss +8 -0
- package/dist/utils/ScrollHandler.js +30 -0
- package/dist/utils/accessibility.js +128 -0
- package/dist/utils/heroUtils.js +316 -0
- package/dist/utils/index.js +104 -0
- package/dist/utils/inputValidation.js +29 -0
- package/dist/utils/keyboardNavigation.js +536 -0
- package/dist/utils/labelUtils.js +708 -0
- package/dist/utils/loaderUtils.js +387 -0
- package/dist/utils/menuUtils.js +575 -0
- package/dist/utils/useHeadingAccessibility.js +298 -0
- package/dist/utils/useRadioGroup.js +260 -0
- package/dist/utils/useSelectAccessibility.js +426 -0
- package/dist/utils/useTabsAccessibility.js +278 -0
- package/dist/utils/useTextAreaAccessibility.js +255 -0
- package/dist/utils/useTextInputAccessibility.js +295 -0
- package/dist/utils/useTypographyAccessibility.js +168 -0
- package/dist/utils/useWindowSize.js +32 -0
- package/dist/utils/utils/ScrollHandler.js +26 -0
- package/dist/utils/utils/accessibility.js +133 -0
- package/dist/utils/utils/heroUtils.js +348 -0
- package/dist/utils/utils/index.js +9 -0
- package/dist/utils/utils/inputValidation.js +22 -0
- package/dist/utils/utils/keyboardNavigation.js +664 -0
- package/dist/utils/utils/labelUtils.js +772 -0
- package/dist/utils/utils/loaderUtils.js +436 -0
- package/dist/utils/utils/menuUtils.js +651 -0
- package/dist/utils/utils/useHeadingAccessibility.js +334 -0
- package/dist/utils/utils/useRadioGroup.js +311 -0
- package/dist/utils/utils/useSelectAccessibility.js +498 -0
- package/dist/utils/utils/useTabsAccessibility.js +316 -0
- package/dist/utils/utils/useTextAreaAccessibility.js +303 -0
- package/dist/utils/utils/useTextInputAccessibility.js +338 -0
- package/dist/utils/utils/useTypographyAccessibility.js +180 -0
- package/dist/utils/utils/useWindowSize.js +26 -0
- package/dist/utils/utils/validation.js +131 -0
- package/dist/utils/validation.js +139 -0
- package/package.json +90 -0
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _react = _interopRequireDefault(require("react"));
|
|
4
|
+
var _react2 = require("@testing-library/react");
|
|
5
|
+
var _Heading = require("../components/Heading");
|
|
6
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
|
+
describe('Heading Component', () => {
|
|
8
|
+
test('renders h1 when level is 1', () => {
|
|
9
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
|
|
10
|
+
level: 1
|
|
11
|
+
}, "Main Title"));
|
|
12
|
+
const heading = _react2.screen.getByRole('heading', {
|
|
13
|
+
level: 1
|
|
14
|
+
});
|
|
15
|
+
expect(heading).toBeInTheDocument();
|
|
16
|
+
expect(heading).toHaveTextContent('Main Title');
|
|
17
|
+
expect(heading.tagName).toBe('H1');
|
|
18
|
+
});
|
|
19
|
+
test('renders h2 when level is 2', () => {
|
|
20
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
|
|
21
|
+
level: 2
|
|
22
|
+
}, "Subtitle"));
|
|
23
|
+
const heading = _react2.screen.getByRole('heading', {
|
|
24
|
+
level: 2
|
|
25
|
+
});
|
|
26
|
+
expect(heading).toBeInTheDocument();
|
|
27
|
+
expect(heading).toHaveTextContent('Subtitle');
|
|
28
|
+
expect(heading.tagName).toBe('H2');
|
|
29
|
+
});
|
|
30
|
+
test('renders all heading levels correctly', () => {
|
|
31
|
+
const {
|
|
32
|
+
rerender
|
|
33
|
+
} = (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
|
|
34
|
+
level: 1
|
|
35
|
+
}, "Test"));
|
|
36
|
+
for (let level = 1; level <= 6; level++) {
|
|
37
|
+
rerender(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
|
|
38
|
+
level: level
|
|
39
|
+
}, "Heading ", level));
|
|
40
|
+
const heading = _react2.screen.getByRole('heading', {
|
|
41
|
+
level
|
|
42
|
+
});
|
|
43
|
+
expect(heading.tagName).toBe(`H${level}`);
|
|
44
|
+
expect(heading).toHaveTextContent(`Heading ${level}`);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
test('applies correct CSS classes', () => {
|
|
48
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
|
|
49
|
+
level: 3
|
|
50
|
+
}, "Test Heading"));
|
|
51
|
+
const heading = _react2.screen.getByRole('heading', {
|
|
52
|
+
level: 3
|
|
53
|
+
});
|
|
54
|
+
expect(heading).toHaveClass('h3', 'heading');
|
|
55
|
+
expect(heading).toHaveAttribute('data-testid', 'heading');
|
|
56
|
+
});
|
|
57
|
+
test('applies additional className', () => {
|
|
58
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
|
|
59
|
+
level: 1,
|
|
60
|
+
className: "custom-heading"
|
|
61
|
+
}, "Custom"));
|
|
62
|
+
const heading = _react2.screen.getByRole('heading', {
|
|
63
|
+
level: 1
|
|
64
|
+
});
|
|
65
|
+
expect(heading).toHaveClass('h1', 'heading', 'custom-heading');
|
|
66
|
+
});
|
|
67
|
+
test('applies custom component name', () => {
|
|
68
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
|
|
69
|
+
level: 2,
|
|
70
|
+
componentName: "title"
|
|
71
|
+
}, "Title"));
|
|
72
|
+
const heading = _react2.screen.getByRole('heading', {
|
|
73
|
+
level: 2
|
|
74
|
+
});
|
|
75
|
+
expect(heading).toHaveClass('h2', 'title');
|
|
76
|
+
expect(heading).toHaveAttribute('data-testid', 'title');
|
|
77
|
+
});
|
|
78
|
+
test('passes through additional props', () => {
|
|
79
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
|
|
80
|
+
level: 1,
|
|
81
|
+
id: "main-title",
|
|
82
|
+
"aria-describedby": "description",
|
|
83
|
+
"data-custom": "value"
|
|
84
|
+
}, "Title"));
|
|
85
|
+
const heading = _react2.screen.getByRole('heading', {
|
|
86
|
+
level: 1
|
|
87
|
+
});
|
|
88
|
+
expect(heading).toHaveAttribute('id', 'main-title');
|
|
89
|
+
expect(heading).toHaveAttribute('aria-describedby', 'description');
|
|
90
|
+
expect(heading).toHaveAttribute('data-custom', 'value');
|
|
91
|
+
});
|
|
92
|
+
test('renders with complex children', () => {
|
|
93
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
|
|
94
|
+
level: 1
|
|
95
|
+
}, /*#__PURE__*/_react.default.createElement("span", null, "Complex"), " ", /*#__PURE__*/_react.default.createElement("strong", null, "Heading")));
|
|
96
|
+
const heading = _react2.screen.getByRole('heading', {
|
|
97
|
+
level: 1
|
|
98
|
+
});
|
|
99
|
+
expect(heading).toContainHTML('<span>Complex</span> <strong>Heading</strong>');
|
|
100
|
+
});
|
|
101
|
+
test('handles empty children', () => {
|
|
102
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
|
|
103
|
+
level: 1
|
|
104
|
+
}));
|
|
105
|
+
const heading = _react2.screen.getByRole('heading', {
|
|
106
|
+
level: 1
|
|
107
|
+
});
|
|
108
|
+
expect(heading).toBeInTheDocument();
|
|
109
|
+
expect(heading).toBeEmptyDOMElement();
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
// New accessibility tests
|
|
113
|
+
test('requires children prop', () => {
|
|
114
|
+
// This should show a PropTypes warning in development
|
|
115
|
+
const consoleSpy = jest.spyOn(console, 'error').mockImplementation(() => {});
|
|
116
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
|
|
117
|
+
level: 1
|
|
118
|
+
}));
|
|
119
|
+
|
|
120
|
+
// In development mode, PropTypes would warn about missing required children
|
|
121
|
+
// We can't easily test PropTypes warnings in Jest, but the component should still render
|
|
122
|
+
const heading = _react2.screen.getByRole('heading', {
|
|
123
|
+
level: 1
|
|
124
|
+
});
|
|
125
|
+
expect(heading).toBeInTheDocument();
|
|
126
|
+
consoleSpy.mockRestore();
|
|
127
|
+
});
|
|
128
|
+
test('has proper accessibility attributes', () => {
|
|
129
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
|
|
130
|
+
level: 2,
|
|
131
|
+
id: "accessible-heading"
|
|
132
|
+
}, "Accessible Title"));
|
|
133
|
+
const heading = _react2.screen.getByRole('heading', {
|
|
134
|
+
level: 2
|
|
135
|
+
});
|
|
136
|
+
expect(heading).toHaveAttribute('id', 'accessible-heading');
|
|
137
|
+
|
|
138
|
+
// Should be focusable for screen readers when needed
|
|
139
|
+
expect(heading).not.toHaveAttribute('tabindex');
|
|
140
|
+
});
|
|
141
|
+
test('supports keyboard navigation when tabIndex is provided', () => {
|
|
142
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
|
|
143
|
+
level: 1,
|
|
144
|
+
tabIndex: "0"
|
|
145
|
+
}, "Focusable Heading"));
|
|
146
|
+
const heading = _react2.screen.getByRole('heading', {
|
|
147
|
+
level: 1
|
|
148
|
+
});
|
|
149
|
+
expect(heading).toHaveAttribute('tabindex', '0');
|
|
150
|
+
|
|
151
|
+
// Focus the heading
|
|
152
|
+
heading.focus();
|
|
153
|
+
expect(heading).toHaveFocus();
|
|
154
|
+
});
|
|
155
|
+
test('maintains semantic structure', () => {
|
|
156
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_Heading.Heading, {
|
|
157
|
+
level: 1
|
|
158
|
+
}, "Main Title"), /*#__PURE__*/_react.default.createElement(_Heading.Heading, {
|
|
159
|
+
level: 2
|
|
160
|
+
}, "Section"), /*#__PURE__*/_react.default.createElement(_Heading.Heading, {
|
|
161
|
+
level: 3
|
|
162
|
+
}, "Subsection")));
|
|
163
|
+
const h1 = _react2.screen.getByRole('heading', {
|
|
164
|
+
level: 1
|
|
165
|
+
});
|
|
166
|
+
const h2 = _react2.screen.getByRole('heading', {
|
|
167
|
+
level: 2
|
|
168
|
+
});
|
|
169
|
+
const h3 = _react2.screen.getByRole('heading', {
|
|
170
|
+
level: 3
|
|
171
|
+
});
|
|
172
|
+
expect(h1).toBeInTheDocument();
|
|
173
|
+
expect(h2).toBeInTheDocument();
|
|
174
|
+
expect(h3).toBeInTheDocument();
|
|
175
|
+
|
|
176
|
+
// Verify proper heading hierarchy
|
|
177
|
+
expect(h1.tagName).toBe('H1');
|
|
178
|
+
expect(h2.tagName).toBe('H2');
|
|
179
|
+
expect(h3.tagName).toBe('H3');
|
|
180
|
+
});
|
|
181
|
+
test('trims className string properly', () => {
|
|
182
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
|
|
183
|
+
level: 1,
|
|
184
|
+
className: ""
|
|
185
|
+
}, "Clean Classes"));
|
|
186
|
+
const heading = _react2.screen.getByRole('heading', {
|
|
187
|
+
level: 1
|
|
188
|
+
});
|
|
189
|
+
expect(heading.className).toBe('h1 heading');
|
|
190
|
+
expect(heading.className).not.toContain(' '); // No double spaces
|
|
191
|
+
});
|
|
192
|
+
test('supports ARIA attributes for enhanced accessibility', () => {
|
|
193
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
|
|
194
|
+
level: 1,
|
|
195
|
+
"aria-describedby": "heading-description",
|
|
196
|
+
"aria-labelledby": "heading-label"
|
|
197
|
+
}, "ARIA Enhanced Heading"));
|
|
198
|
+
const heading = _react2.screen.getByRole('heading', {
|
|
199
|
+
level: 1
|
|
200
|
+
});
|
|
201
|
+
expect(heading).toHaveAttribute('aria-describedby', 'heading-description');
|
|
202
|
+
expect(heading).toHaveAttribute('aria-labelledby', 'heading-label');
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
// Legacy compatibility tests
|
|
206
|
+
test('maintains backward compatibility with variant prop', () => {
|
|
207
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
|
|
208
|
+
variant: 2
|
|
209
|
+
}, "Legacy Heading"));
|
|
210
|
+
const heading = _react2.screen.getByRole('heading', {
|
|
211
|
+
level: 2
|
|
212
|
+
});
|
|
213
|
+
expect(heading).toBeInTheDocument();
|
|
214
|
+
expect(heading).toHaveTextContent('Legacy Heading');
|
|
215
|
+
expect(heading.tagName).toBe('H2');
|
|
216
|
+
});
|
|
217
|
+
test('maintains backward compatibility with additionalClassName prop', () => {
|
|
218
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Heading.Heading, {
|
|
219
|
+
variant: 1,
|
|
220
|
+
additionalClassName: "legacy-class"
|
|
221
|
+
}, "Legacy Style"));
|
|
222
|
+
const heading = _react2.screen.getByRole('heading', {
|
|
223
|
+
level: 1
|
|
224
|
+
});
|
|
225
|
+
expect(heading).toHaveClass('h1', 'heading', 'legacy-class');
|
|
226
|
+
});
|
|
227
|
+
});
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _react = _interopRequireDefault(require("react"));
|
|
4
|
+
var _react2 = require("@testing-library/react");
|
|
5
|
+
var _Hero = require("../components/Hero");
|
|
6
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
|
+
describe('Hero Component', () => {
|
|
8
|
+
test('renders hero with default props', () => {
|
|
9
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Hero.Hero, null, "Hero Content"));
|
|
10
|
+
const animation = _react2.screen.getByTestId('animation');
|
|
11
|
+
const hero = (0, _react2.within)(animation).getByTestId('hero');
|
|
12
|
+
expect(hero).toBeInTheDocument();
|
|
13
|
+
expect(hero).toHaveClass('hero-wrapper');
|
|
14
|
+
expect(_react2.screen.getByText('Hero Content')).toBeInTheDocument();
|
|
15
|
+
});
|
|
16
|
+
test('renders with custom component name', () => {
|
|
17
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Hero.Hero, {
|
|
18
|
+
componentName: "custom-hero"
|
|
19
|
+
}, "Custom Hero"));
|
|
20
|
+
const animation = _react2.screen.getByTestId('animation');
|
|
21
|
+
const hero = (0, _react2.within)(animation).getByTestId('hero');
|
|
22
|
+
expect(hero).toHaveClass('custom-hero-wrapper');
|
|
23
|
+
});
|
|
24
|
+
test('renders with additional className', () => {
|
|
25
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Hero.Hero, {
|
|
26
|
+
additionalClassName: "extra-class"
|
|
27
|
+
}, "Styled Hero"));
|
|
28
|
+
const animation = _react2.screen.getByTestId('animation');
|
|
29
|
+
const hero = (0, _react2.within)(animation).getByTestId('hero');
|
|
30
|
+
expect(hero).toHaveClass('hero-wrapper', 'extra-class');
|
|
31
|
+
});
|
|
32
|
+
test('renders with background image', () => {
|
|
33
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Hero.Hero, {
|
|
34
|
+
background: "/path/to/image.jpg"
|
|
35
|
+
}, "Hero with Background"));
|
|
36
|
+
const animation = _react2.screen.getByTestId('animation');
|
|
37
|
+
const hero = (0, _react2.within)(animation).getByTestId('hero');
|
|
38
|
+
expect(hero).toHaveStyle('background-image: url(/path/to/image.jpg)');
|
|
39
|
+
});
|
|
40
|
+
test('renders inner hero container', () => {
|
|
41
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Hero.Hero, null, "Inner Content"));
|
|
42
|
+
const animation = _react2.screen.getByTestId('animation');
|
|
43
|
+
const hero = (0, _react2.within)(animation).getByTestId('hero');
|
|
44
|
+
const innerContainer = hero.querySelector('.hero');
|
|
45
|
+
expect(innerContainer).toBeInTheDocument();
|
|
46
|
+
expect(innerContainer).toHaveTextContent('Inner Content');
|
|
47
|
+
});
|
|
48
|
+
test('renders with complex children', () => {
|
|
49
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Hero.Hero, null, /*#__PURE__*/_react.default.createElement("h1", null, "Hero Title"), /*#__PURE__*/_react.default.createElement("p", null, "Hero description"), /*#__PURE__*/_react.default.createElement("button", null, "Call to Action")));
|
|
50
|
+
expect(_react2.screen.getByText('Hero Title')).toBeInTheDocument();
|
|
51
|
+
expect(_react2.screen.getByText('Hero description')).toBeInTheDocument();
|
|
52
|
+
expect(_react2.screen.getByText('Call to Action')).toBeInTheDocument();
|
|
53
|
+
});
|
|
54
|
+
test('renders without background image', () => {
|
|
55
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Hero.Hero, null, "No Background"));
|
|
56
|
+
const animation = _react2.screen.getByTestId('animation');
|
|
57
|
+
const hero = (0, _react2.within)(animation).getByTestId('hero');
|
|
58
|
+
// Should not have background-image style at all
|
|
59
|
+
expect(hero.style.backgroundImage).toBe('');
|
|
60
|
+
});
|
|
61
|
+
test('combines all props correctly', () => {
|
|
62
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Hero.Hero, {
|
|
63
|
+
componentName: "landing-hero",
|
|
64
|
+
testId: "landing-hero",
|
|
65
|
+
additionalClassName: "home-hero large",
|
|
66
|
+
background: "/hero-bg.png"
|
|
67
|
+
}, "Landing Page Hero"));
|
|
68
|
+
const animation = _react2.screen.getByTestId('animation');
|
|
69
|
+
const hero = (0, _react2.within)(animation).getByTestId('landing-hero');
|
|
70
|
+
expect(hero).toHaveClass('landing-hero-wrapper', 'home-hero', 'large');
|
|
71
|
+
expect(hero).toHaveStyle('background-image: url(/hero-bg.png)');
|
|
72
|
+
expect(_react2.screen.getByText('Landing Page Hero')).toBeInTheDocument();
|
|
73
|
+
});
|
|
74
|
+
});
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _react = _interopRequireDefault(require("react"));
|
|
4
|
+
var _react2 = require("@testing-library/react");
|
|
5
|
+
var _Label = require("../components/Label");
|
|
6
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
|
+
// Suppress console.error during tests
|
|
8
|
+
let consoleErrorSpy;
|
|
9
|
+
beforeAll(() => {
|
|
10
|
+
consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => {});
|
|
11
|
+
});
|
|
12
|
+
afterAll(() => {
|
|
13
|
+
consoleErrorSpy.mockRestore();
|
|
14
|
+
});
|
|
15
|
+
describe('Label Component', () => {
|
|
16
|
+
test('renders basic label with text', () => {
|
|
17
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Label.Label, {
|
|
18
|
+
labelText: "Username"
|
|
19
|
+
}));
|
|
20
|
+
const label = _react2.screen.getByText('Username');
|
|
21
|
+
expect(label).toBeInTheDocument();
|
|
22
|
+
expect(label.closest('label')).toHaveClass('label');
|
|
23
|
+
});
|
|
24
|
+
test('renders label with htmlFor attribute', () => {
|
|
25
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Label.Label, {
|
|
26
|
+
labelText: "Email",
|
|
27
|
+
labelFor: "email-input"
|
|
28
|
+
}));
|
|
29
|
+
const label = _react2.screen.getByText('Email').closest('label');
|
|
30
|
+
expect(label).toHaveAttribute('for', 'email-input');
|
|
31
|
+
});
|
|
32
|
+
test('shows required asterisk when required is true', () => {
|
|
33
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Label.Label, {
|
|
34
|
+
labelText: "Required Field",
|
|
35
|
+
required: true
|
|
36
|
+
}));
|
|
37
|
+
const asterisk = _react2.screen.getByText('*');
|
|
38
|
+
expect(asterisk).toBeInTheDocument();
|
|
39
|
+
expect(asterisk).toHaveClass('required');
|
|
40
|
+
});
|
|
41
|
+
test('does not show asterisk when required is false', () => {
|
|
42
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Label.Label, {
|
|
43
|
+
labelText: "Optional Field",
|
|
44
|
+
required: false
|
|
45
|
+
}));
|
|
46
|
+
expect(_react2.screen.queryByText('*')).not.toBeInTheDocument();
|
|
47
|
+
});
|
|
48
|
+
test('applies additional className', () => {
|
|
49
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Label.Label, {
|
|
50
|
+
labelText: "Test",
|
|
51
|
+
additionalClassName: "custom-label"
|
|
52
|
+
}));
|
|
53
|
+
const label = _react2.screen.getByText('Test').closest('label');
|
|
54
|
+
expect(label).toHaveClass('label', 'custom-label');
|
|
55
|
+
});
|
|
56
|
+
test('applies custom component name', () => {
|
|
57
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Label.Label, {
|
|
58
|
+
labelText: "Test",
|
|
59
|
+
componentName: "form-label"
|
|
60
|
+
}));
|
|
61
|
+
const label = _react2.screen.getByText('Test').closest('label');
|
|
62
|
+
expect(label).toHaveClass('form-label');
|
|
63
|
+
// data-test-id is on the wrapper, not the label
|
|
64
|
+
});
|
|
65
|
+
test('renders children elements', () => {
|
|
66
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Label.Label, {
|
|
67
|
+
labelText: "Input Label"
|
|
68
|
+
}, /*#__PURE__*/_react.default.createElement("input", {
|
|
69
|
+
type: "text"
|
|
70
|
+
})));
|
|
71
|
+
const input = _react2.screen.getByRole('textbox');
|
|
72
|
+
expect(input).toBeInTheDocument();
|
|
73
|
+
});
|
|
74
|
+
test('renders complex children with required asterisk', () => {
|
|
75
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Label.Label, {
|
|
76
|
+
labelText: "Complex Field",
|
|
77
|
+
required: true
|
|
78
|
+
}, /*#__PURE__*/_react.default.createElement("input", {
|
|
79
|
+
type: "email",
|
|
80
|
+
placeholder: "Enter email"
|
|
81
|
+
}), /*#__PURE__*/_react.default.createElement("span", null, "Helper text")));
|
|
82
|
+
expect(_react2.screen.getByText('Complex Field')).toBeInTheDocument();
|
|
83
|
+
expect(_react2.screen.getByText('*')).toBeInTheDocument();
|
|
84
|
+
expect(_react2.screen.getByRole('textbox')).toBeInTheDocument();
|
|
85
|
+
expect(_react2.screen.getByText('Helper text')).toBeInTheDocument();
|
|
86
|
+
});
|
|
87
|
+
test('passes through additional props', () => {
|
|
88
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Label.Label, {
|
|
89
|
+
labelText: "Test",
|
|
90
|
+
id: "custom-label",
|
|
91
|
+
"data-custom": "value"
|
|
92
|
+
}));
|
|
93
|
+
const label = _react2.screen.getByText('Test').closest('label');
|
|
94
|
+
expect(label).toHaveAttribute('id', 'custom-label');
|
|
95
|
+
expect(label).toHaveAttribute('data-custom', 'value');
|
|
96
|
+
});
|
|
97
|
+
test('has correct data-test-id attribute', () => {
|
|
98
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Label.Label, {
|
|
99
|
+
labelText: "Test"
|
|
100
|
+
}));
|
|
101
|
+
const label = _react2.screen.getByText('Test').closest('label');
|
|
102
|
+
// data-test-id is on the wrapper, not the label
|
|
103
|
+
});
|
|
104
|
+
test('label text is wrapped in span with correct class', () => {
|
|
105
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Label.Label, {
|
|
106
|
+
labelText: "Wrapped Text"
|
|
107
|
+
}));
|
|
108
|
+
const textSpan = _react2.screen.getByText('Wrapped Text');
|
|
109
|
+
expect(textSpan.tagName).toBe('SPAN');
|
|
110
|
+
expect(textSpan).toHaveClass('label-text');
|
|
111
|
+
});
|
|
112
|
+
test('renders without children', () => {
|
|
113
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Label.Label, {
|
|
114
|
+
labelText: "Standalone Label"
|
|
115
|
+
}));
|
|
116
|
+
const label = _react2.screen.getByText('Standalone Label').closest('label');
|
|
117
|
+
expect(label).toBeInTheDocument();
|
|
118
|
+
|
|
119
|
+
// Should only contain the label text span and possibly asterisk
|
|
120
|
+
const spans = label.querySelectorAll('span');
|
|
121
|
+
expect(spans).toHaveLength(1); // Only the label-text span
|
|
122
|
+
});
|
|
123
|
+
});
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _react = _interopRequireDefault(require("react"));
|
|
4
|
+
var _react2 = require("@testing-library/react");
|
|
5
|
+
var _Loader = _interopRequireDefault(require("../components/Loader"));
|
|
6
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
|
+
// Suppress console.error during tests
|
|
8
|
+
let consoleErrorSpy;
|
|
9
|
+
beforeAll(() => {
|
|
10
|
+
consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => {});
|
|
11
|
+
});
|
|
12
|
+
afterAll(() => {
|
|
13
|
+
consoleErrorSpy.mockRestore();
|
|
14
|
+
});
|
|
15
|
+
describe('Loader Component', () => {
|
|
16
|
+
test('renders loader with default props', () => {
|
|
17
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Loader.default, null));
|
|
18
|
+
const loader = _react2.screen.getByTestId('ui-loader');
|
|
19
|
+
expect(loader).toBeInTheDocument();
|
|
20
|
+
expect(loader).toHaveClass('ui-loader');
|
|
21
|
+
expect(_react2.screen.getByRole('heading', {
|
|
22
|
+
level: 3
|
|
23
|
+
})).toHaveTextContent('Loading...');
|
|
24
|
+
});
|
|
25
|
+
test('renders with custom component name', () => {
|
|
26
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Loader.default, {
|
|
27
|
+
componentName: "custom-loader"
|
|
28
|
+
}));
|
|
29
|
+
const loader = _react2.screen.getByTestId('custom-loader');
|
|
30
|
+
expect(loader).toHaveClass('custom-loader');
|
|
31
|
+
});
|
|
32
|
+
test('renders with additional className', () => {
|
|
33
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Loader.default, {
|
|
34
|
+
additionalClassName: "centered-loader"
|
|
35
|
+
}));
|
|
36
|
+
const loader = _react2.screen.getByTestId('ui-loader');
|
|
37
|
+
expect(loader).toHaveClass('ui-loader', 'centered-loader');
|
|
38
|
+
});
|
|
39
|
+
test('renders with custom header text', () => {
|
|
40
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Loader.default, {
|
|
41
|
+
headerText: "Please wait..."
|
|
42
|
+
}));
|
|
43
|
+
expect(_react2.screen.getByRole('heading', {
|
|
44
|
+
level: 3
|
|
45
|
+
})).toHaveTextContent('Please wait...');
|
|
46
|
+
expect(_react2.screen.queryByText('Loading...')).not.toBeInTheDocument();
|
|
47
|
+
});
|
|
48
|
+
test('renders with custom title size', () => {
|
|
49
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Loader.default, {
|
|
50
|
+
titleSize: 2
|
|
51
|
+
}));
|
|
52
|
+
const heading = _react2.screen.getByRole('heading', {
|
|
53
|
+
level: 2
|
|
54
|
+
});
|
|
55
|
+
expect(heading).toBeInTheDocument();
|
|
56
|
+
expect(heading).toHaveTextContent('Loading...');
|
|
57
|
+
});
|
|
58
|
+
test('renders SVG with correct attributes', () => {
|
|
59
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Loader.default, {
|
|
60
|
+
svgSize: "300px"
|
|
61
|
+
}));
|
|
62
|
+
const loader = _react2.screen.getByTestId('ui-loader');
|
|
63
|
+
const svg = loader.querySelector('svg');
|
|
64
|
+
expect(svg).toBeInTheDocument();
|
|
65
|
+
expect(svg).toHaveAttribute('width', '300px');
|
|
66
|
+
expect(svg).toHaveAttribute('viewBox', '0 0 100 100');
|
|
67
|
+
expect(svg.className.baseVal).toContain('svg');
|
|
68
|
+
});
|
|
69
|
+
test('renders with custom fill color', () => {
|
|
70
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Loader.default, {
|
|
71
|
+
fill: "#ff0000"
|
|
72
|
+
}));
|
|
73
|
+
const loader = _react2.screen.getByTestId('ui-loader');
|
|
74
|
+
const path = loader.querySelector('path');
|
|
75
|
+
expect(path).toHaveAttribute('fill', '#ff0000');
|
|
76
|
+
});
|
|
77
|
+
test('renders loader wrapper', () => {
|
|
78
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Loader.default, null));
|
|
79
|
+
const loader = _react2.screen.getByTestId('ui-loader');
|
|
80
|
+
const wrapper = loader.querySelector('.ui-loader__wrapper');
|
|
81
|
+
expect(wrapper).toBeInTheDocument();
|
|
82
|
+
});
|
|
83
|
+
test('combines all props correctly', () => {
|
|
84
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Loader.default, {
|
|
85
|
+
componentName: "page-loader",
|
|
86
|
+
additionalClassName: "fullscreen overlay",
|
|
87
|
+
headerText: "Initializing...",
|
|
88
|
+
titleSize: 1,
|
|
89
|
+
svgSize: "400px",
|
|
90
|
+
fill: "#0066cc"
|
|
91
|
+
}));
|
|
92
|
+
const loader = _react2.screen.getByTestId('page-loader');
|
|
93
|
+
expect(loader).toHaveClass('page-loader', 'fullscreen', 'overlay');
|
|
94
|
+
const heading = _react2.screen.getByRole('heading', {
|
|
95
|
+
level: 1
|
|
96
|
+
});
|
|
97
|
+
expect(heading).toHaveTextContent('Initializing...');
|
|
98
|
+
const svg = loader.querySelector('svg');
|
|
99
|
+
expect(svg).toHaveAttribute('width', '400px');
|
|
100
|
+
const path = loader.querySelector('path');
|
|
101
|
+
expect(path).toHaveAttribute('fill', '#0066cc');
|
|
102
|
+
});
|
|
103
|
+
test('has correct default values', () => {
|
|
104
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Loader.default, null));
|
|
105
|
+
const loader = _react2.screen.getByTestId('ui-loader');
|
|
106
|
+
const heading = _react2.screen.getByRole('heading', {
|
|
107
|
+
level: 3
|
|
108
|
+
});
|
|
109
|
+
const svg = loader.querySelector('svg');
|
|
110
|
+
const path = loader.querySelector('path');
|
|
111
|
+
expect(heading).toHaveTextContent('Loading...');
|
|
112
|
+
expect(svg).toHaveAttribute('width', '200px');
|
|
113
|
+
expect(path).toHaveAttribute('fill', '#333');
|
|
114
|
+
});
|
|
115
|
+
});
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _react = _interopRequireDefault(require("react"));
|
|
4
|
+
var _react2 = require("@testing-library/react");
|
|
5
|
+
var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
|
|
6
|
+
var _MenuHover = require("../components/MenuHover");
|
|
7
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
9
|
+
// Suppress console.error during tests
|
|
10
|
+
let consoleErrorSpy;
|
|
11
|
+
beforeAll(() => {
|
|
12
|
+
consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => {});
|
|
13
|
+
});
|
|
14
|
+
afterAll(() => {
|
|
15
|
+
consoleErrorSpy.mockRestore();
|
|
16
|
+
});
|
|
17
|
+
// Stateful test wrapper for MenuHover
|
|
18
|
+
function StatefulMenuHover(props) {
|
|
19
|
+
const [isOpen, setIsOpen] = _react.default.useState(false);
|
|
20
|
+
return /*#__PURE__*/_react.default.createElement(_MenuHover.MenuHover, _extends({}, props, {
|
|
21
|
+
isOpen: isOpen,
|
|
22
|
+
onToggle: setIsOpen
|
|
23
|
+
}));
|
|
24
|
+
}
|
|
25
|
+
describe('MenuHover Component', () => {
|
|
26
|
+
const mockOpenChildren = /*#__PURE__*/_react.default.createElement("div", {
|
|
27
|
+
"data-testid": "open-content"
|
|
28
|
+
}, "Menu is open");
|
|
29
|
+
const mockClosedChildren = /*#__PURE__*/_react.default.createElement("div", {
|
|
30
|
+
"data-testid": "closed-content"
|
|
31
|
+
}, "Menu is closed");
|
|
32
|
+
test('renders closed children by default', () => {
|
|
33
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(StatefulMenuHover, {
|
|
34
|
+
isOpenChildren: mockOpenChildren,
|
|
35
|
+
isClosedChildren: mockClosedChildren
|
|
36
|
+
}));
|
|
37
|
+
const menuContainer = _react2.screen.getByTestId('menu-hover');
|
|
38
|
+
expect(menuContainer).toBeInTheDocument();
|
|
39
|
+
expect(_react2.screen.getByTestId('closed-content')).toBeInTheDocument();
|
|
40
|
+
expect(_react2.screen.queryByTestId('open-content')).not.toBeInTheDocument();
|
|
41
|
+
});
|
|
42
|
+
test('toggles between open and closed states when clicked', async () => {
|
|
43
|
+
const user = _userEvent.default.setup();
|
|
44
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(StatefulMenuHover, {
|
|
45
|
+
isOpenChildren: mockOpenChildren,
|
|
46
|
+
isClosedChildren: mockClosedChildren
|
|
47
|
+
}));
|
|
48
|
+
const menuContainer = _react2.screen.getByTestId('menu-hover');
|
|
49
|
+
|
|
50
|
+
// Initially closed
|
|
51
|
+
expect(menuContainer).toBeInTheDocument();
|
|
52
|
+
expect(_react2.screen.getByTestId('closed-content')).toBeInTheDocument();
|
|
53
|
+
expect(_react2.screen.queryByTestId('open-content')).not.toBeInTheDocument();
|
|
54
|
+
|
|
55
|
+
// Click to open
|
|
56
|
+
await user.click(menuContainer);
|
|
57
|
+
expect(menuContainer).toBeInTheDocument();
|
|
58
|
+
expect(_react2.screen.getByTestId('open-content')).toBeInTheDocument();
|
|
59
|
+
expect(_react2.screen.queryByTestId('closed-content')).not.toBeInTheDocument();
|
|
60
|
+
|
|
61
|
+
// Click to close
|
|
62
|
+
await user.click(menuContainer);
|
|
63
|
+
expect(menuContainer).toBeInTheDocument();
|
|
64
|
+
expect(_react2.screen.getByTestId('closed-content')).toBeInTheDocument();
|
|
65
|
+
expect(_react2.screen.queryByTestId('open-content')).not.toBeInTheDocument();
|
|
66
|
+
});
|
|
67
|
+
test('applies correct CSS classes when closed', () => {
|
|
68
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(StatefulMenuHover, {
|
|
69
|
+
isOpenChildren: mockOpenChildren,
|
|
70
|
+
isClosedChildren: mockClosedChildren
|
|
71
|
+
}));
|
|
72
|
+
const menuContainer = _react2.screen.getByTestId('menu-hover');
|
|
73
|
+
expect(menuContainer).toHaveClass('menu-hover');
|
|
74
|
+
expect(menuContainer).not.toHaveClass('open');
|
|
75
|
+
});
|
|
76
|
+
test('applies correct CSS classes when open', async () => {
|
|
77
|
+
const user = _userEvent.default.setup();
|
|
78
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(StatefulMenuHover, {
|
|
79
|
+
isOpenChildren: mockOpenChildren,
|
|
80
|
+
isClosedChildren: mockClosedChildren
|
|
81
|
+
}));
|
|
82
|
+
const menuContainer = _react2.screen.getByTestId('menu-hover');
|
|
83
|
+
await user.click(menuContainer);
|
|
84
|
+
expect(menuContainer).toHaveClass('menu-hover', 'open');
|
|
85
|
+
});
|
|
86
|
+
test('applies additional className', () => {
|
|
87
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_MenuHover.MenuHover, {
|
|
88
|
+
isOpenChildren: mockOpenChildren,
|
|
89
|
+
isClosedChildren: mockClosedChildren,
|
|
90
|
+
additionalClassName: "custom-menu"
|
|
91
|
+
}));
|
|
92
|
+
const menuContainer = _react2.screen.getByTestId('menu-hover');
|
|
93
|
+
expect(menuContainer).toHaveClass('menu-hover', 'custom-menu');
|
|
94
|
+
});
|
|
95
|
+
test('applies custom component name', () => {
|
|
96
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(StatefulMenuHover, {
|
|
97
|
+
isOpenChildren: mockOpenChildren,
|
|
98
|
+
isClosedChildren: mockClosedChildren,
|
|
99
|
+
componentName: "dropdown-menu"
|
|
100
|
+
}));
|
|
101
|
+
const menuContainer = _react2.screen.getByTestId('dropdown-menu');
|
|
102
|
+
expect(menuContainer).toHaveClass('dropdown-menu');
|
|
103
|
+
expect(menuContainer).toHaveAttribute('data-testid', 'dropdown-menu');
|
|
104
|
+
});
|
|
105
|
+
test('applies both custom component name and additional className', () => {
|
|
106
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(StatefulMenuHover, {
|
|
107
|
+
isOpenChildren: mockOpenChildren,
|
|
108
|
+
isClosedChildren: mockClosedChildren,
|
|
109
|
+
componentName: "dropdown",
|
|
110
|
+
additionalClassName: "extra-styles"
|
|
111
|
+
}));
|
|
112
|
+
const menuContainer = _react2.screen.getByTestId('dropdown');
|
|
113
|
+
expect(menuContainer).toHaveClass('dropdown', 'extra-styles');
|
|
114
|
+
});
|
|
115
|
+
test('has correct data-test-id attribute', () => {
|
|
116
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(StatefulMenuHover, {
|
|
117
|
+
isOpenChildren: mockOpenChildren,
|
|
118
|
+
isClosedChildren: mockClosedChildren
|
|
119
|
+
}));
|
|
120
|
+
const menuContainer = _react2.screen.getByTestId('menu-hover');
|
|
121
|
+
expect(menuContainer).toHaveAttribute('data-testid', 'menu-hover');
|
|
122
|
+
});
|
|
123
|
+
test('renders complex children correctly', () => {
|
|
124
|
+
const complexOpenChildren = /*#__PURE__*/_react.default.createElement("div", {
|
|
125
|
+
"data-testid": "complex-open"
|
|
126
|
+
}, /*#__PURE__*/_react.default.createElement("h2", null, "Open Menu"), /*#__PURE__*/_react.default.createElement("ul", null, /*#__PURE__*/_react.default.createElement("li", null, "Item 1"), /*#__PURE__*/_react.default.createElement("li", null, "Item 2")));
|
|
127
|
+
const complexClosedChildren = /*#__PURE__*/_react.default.createElement("button", {
|
|
128
|
+
"data-testid": "complex-closed"
|
|
129
|
+
}, "Menu Button");
|
|
130
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_MenuHover.MenuHover, {
|
|
131
|
+
isOpenChildren: complexOpenChildren,
|
|
132
|
+
isClosedChildren: complexClosedChildren
|
|
133
|
+
}));
|
|
134
|
+
expect(_react2.screen.getByTestId('complex-closed')).toBeInTheDocument();
|
|
135
|
+
expect(_react2.screen.getByText('Menu Button')).toBeInTheDocument();
|
|
136
|
+
});
|
|
137
|
+
});
|