@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,145 @@
|
|
|
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 _Anchor = require("../components/Anchor");
|
|
7
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
// Suppress only JSDOM navigation error in tests
|
|
9
|
+
let originalConsoleError;
|
|
10
|
+
beforeAll(() => {
|
|
11
|
+
originalConsoleError = console.error;
|
|
12
|
+
console.error = (...args) => {
|
|
13
|
+
if (typeof args[0] === 'string' && args[0].includes('Not implemented: navigation (except hash changes)')) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
originalConsoleError(...args);
|
|
17
|
+
};
|
|
18
|
+
});
|
|
19
|
+
afterAll(() => {
|
|
20
|
+
console.error = originalConsoleError;
|
|
21
|
+
});
|
|
22
|
+
describe('Anchor Component', () => {
|
|
23
|
+
test('renders anchor with required props', () => {
|
|
24
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Anchor.Anchor, {
|
|
25
|
+
href: "/test"
|
|
26
|
+
}, "Test Link"));
|
|
27
|
+
const anchor = _react2.screen.getByRole('link');
|
|
28
|
+
expect(anchor).toBeInTheDocument();
|
|
29
|
+
expect(anchor).toHaveTextContent('Test Link');
|
|
30
|
+
expect(anchor).toHaveAttribute('href', '/test');
|
|
31
|
+
expect(anchor).toHaveClass('anchor');
|
|
32
|
+
expect(anchor).toHaveAttribute('data-testid', 'anchor');
|
|
33
|
+
});
|
|
34
|
+
test('renders anchor with custom component name', () => {
|
|
35
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Anchor.Anchor, {
|
|
36
|
+
href: "/test",
|
|
37
|
+
componentName: "custom-anchor"
|
|
38
|
+
}, "Custom Link"));
|
|
39
|
+
const anchor = _react2.screen.getByRole('link');
|
|
40
|
+
expect(anchor).toHaveClass('custom-anchor');
|
|
41
|
+
expect(anchor).toHaveAttribute('data-testid', 'custom-anchor');
|
|
42
|
+
});
|
|
43
|
+
test('renders anchor with additional className', () => {
|
|
44
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Anchor.Anchor, {
|
|
45
|
+
href: "/test",
|
|
46
|
+
className: "extra-class"
|
|
47
|
+
}, "Styled Link"));
|
|
48
|
+
const anchor = _react2.screen.getByRole('link');
|
|
49
|
+
expect(anchor).toHaveClass('anchor', 'extra-class');
|
|
50
|
+
});
|
|
51
|
+
test('maintains backward compatibility with additionalClassName', () => {
|
|
52
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Anchor.Anchor, {
|
|
53
|
+
href: "/test",
|
|
54
|
+
additionalClassName: "legacy-class"
|
|
55
|
+
}, "Legacy Styled Link"));
|
|
56
|
+
const anchor = _react2.screen.getByRole('link');
|
|
57
|
+
expect(anchor).toHaveClass('anchor', 'legacy-class');
|
|
58
|
+
});
|
|
59
|
+
test('forwards ref to the anchor element', () => {
|
|
60
|
+
const ref = /*#__PURE__*/_react.default.createRef();
|
|
61
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Anchor.Anchor, {
|
|
62
|
+
href: "/test",
|
|
63
|
+
ref: ref
|
|
64
|
+
}, "Ref Link"));
|
|
65
|
+
expect(ref.current).toBeInstanceOf(HTMLAnchorElement);
|
|
66
|
+
expect(ref.current).toHaveAttribute('href', '/test');
|
|
67
|
+
});
|
|
68
|
+
test('renders anchor with variant', () => {
|
|
69
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Anchor.Anchor, {
|
|
70
|
+
href: "/test",
|
|
71
|
+
variant: "primary"
|
|
72
|
+
}, "Primary Link"));
|
|
73
|
+
const anchor = _react2.screen.getByRole('link');
|
|
74
|
+
expect(anchor).toHaveClass('anchor', 'primary');
|
|
75
|
+
});
|
|
76
|
+
test('renders anchor with target attribute', () => {
|
|
77
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Anchor.Anchor, {
|
|
78
|
+
href: "/test",
|
|
79
|
+
target: "_blank"
|
|
80
|
+
}, "External Link"));
|
|
81
|
+
const anchor = _react2.screen.getByRole('link');
|
|
82
|
+
expect(anchor).toHaveAttribute('target', '_blank');
|
|
83
|
+
});
|
|
84
|
+
test('renders disabled anchor', () => {
|
|
85
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Anchor.Anchor, {
|
|
86
|
+
href: "/test",
|
|
87
|
+
disabled: true
|
|
88
|
+
}, "Disabled Link"));
|
|
89
|
+
|
|
90
|
+
// Disabled anchors without href don't have link role, so query by test-id
|
|
91
|
+
const anchor = _react2.screen.getByTestId('anchor');
|
|
92
|
+
expect(anchor).toHaveAttribute('aria-disabled', 'true');
|
|
93
|
+
expect(anchor).toHaveAttribute('tabindex', '-1');
|
|
94
|
+
expect(anchor).not.toHaveAttribute('href');
|
|
95
|
+
});
|
|
96
|
+
test('passes through additional props', () => {
|
|
97
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Anchor.Anchor, {
|
|
98
|
+
href: "/test",
|
|
99
|
+
"data-custom": "test-value",
|
|
100
|
+
"aria-label": "Custom link"
|
|
101
|
+
}, "Test Link"));
|
|
102
|
+
const anchor = _react2.screen.getByRole('link');
|
|
103
|
+
expect(anchor).toHaveAttribute('data-custom', 'test-value');
|
|
104
|
+
expect(anchor).toHaveAttribute('aria-label', 'Custom link');
|
|
105
|
+
});
|
|
106
|
+
test('renders with complex children', () => {
|
|
107
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Anchor.Anchor, {
|
|
108
|
+
href: "/test"
|
|
109
|
+
}, /*#__PURE__*/_react.default.createElement("span", null, "Icon"), /*#__PURE__*/_react.default.createElement("span", null, "Text")));
|
|
110
|
+
const anchor = _react2.screen.getByRole('link');
|
|
111
|
+
expect(anchor).toContainHTML('<span>Icon</span><span>Text</span>');
|
|
112
|
+
});
|
|
113
|
+
test('handles click events', async () => {
|
|
114
|
+
const handleClick = jest.fn();
|
|
115
|
+
const user = _userEvent.default.setup();
|
|
116
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Anchor.Anchor, {
|
|
117
|
+
href: "/test",
|
|
118
|
+
onClick: handleClick
|
|
119
|
+
}, "Clickable Link"));
|
|
120
|
+
const anchor = _react2.screen.getByRole('link');
|
|
121
|
+
await user.click(anchor);
|
|
122
|
+
expect(handleClick).toHaveBeenCalledTimes(1);
|
|
123
|
+
});
|
|
124
|
+
test('adds security attributes for external links', () => {
|
|
125
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Anchor.Anchor, {
|
|
126
|
+
href: "https://example.com",
|
|
127
|
+
target: "_blank"
|
|
128
|
+
}, "External Link"));
|
|
129
|
+
const anchor = _react2.screen.getByRole('link');
|
|
130
|
+
expect(anchor).toHaveAttribute('target', '_blank');
|
|
131
|
+
expect(anchor).toHaveAttribute('rel', 'noopener noreferrer');
|
|
132
|
+
});
|
|
133
|
+
test('handles disabled state properly', () => {
|
|
134
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Anchor.Anchor, {
|
|
135
|
+
href: "/test",
|
|
136
|
+
disabled: true
|
|
137
|
+
}, "Disabled Link"));
|
|
138
|
+
|
|
139
|
+
// Disabled anchors without href don't have link role, so query by test-id
|
|
140
|
+
const anchor = _react2.screen.getByTestId('anchor');
|
|
141
|
+
expect(anchor).toHaveAttribute('aria-disabled', 'true');
|
|
142
|
+
expect(anchor).toHaveAttribute('tabindex', '-1');
|
|
143
|
+
expect(anchor).not.toHaveAttribute('href');
|
|
144
|
+
});
|
|
145
|
+
});
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _react = _interopRequireDefault(require("react"));
|
|
4
|
+
var _react2 = require("@testing-library/react");
|
|
5
|
+
var _ArrowRight = require("../icons/ArrowRight");
|
|
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('ArrowRight Icon', () => {
|
|
16
|
+
test('renders SVG element', () => {
|
|
17
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_ArrowRight.ArrowRight, null));
|
|
18
|
+
const svg = document.querySelector('svg');
|
|
19
|
+
expect(svg).toBeInTheDocument();
|
|
20
|
+
expect(svg.tagName).toBe('svg');
|
|
21
|
+
});
|
|
22
|
+
test('has correct default props', () => {
|
|
23
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_ArrowRight.ArrowRight, null));
|
|
24
|
+
const svg = document.querySelector('svg');
|
|
25
|
+
expect(svg).toHaveAttribute('width', '24');
|
|
26
|
+
expect(svg).toHaveAttribute('height', '24');
|
|
27
|
+
expect(svg).toHaveAttribute('viewBox', '0 0 24 24');
|
|
28
|
+
expect(svg).toHaveAttribute('fill', 'none');
|
|
29
|
+
});
|
|
30
|
+
test('applies custom size', () => {
|
|
31
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_ArrowRight.ArrowRight, {
|
|
32
|
+
size: 48
|
|
33
|
+
}));
|
|
34
|
+
const svg = document.querySelector('svg');
|
|
35
|
+
expect(svg).toHaveAttribute('width', '48');
|
|
36
|
+
expect(svg).toHaveAttribute('height', '48');
|
|
37
|
+
});
|
|
38
|
+
test('applies custom className', () => {
|
|
39
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_ArrowRight.ArrowRight, {
|
|
40
|
+
className: "arrow-icon"
|
|
41
|
+
}));
|
|
42
|
+
const svg = document.querySelector('svg');
|
|
43
|
+
expect(svg).toHaveClass('arrow-icon');
|
|
44
|
+
});
|
|
45
|
+
test('applies custom color to stroke', () => {
|
|
46
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_ArrowRight.ArrowRight, {
|
|
47
|
+
color: "blue"
|
|
48
|
+
}));
|
|
49
|
+
const svg = document.querySelector('svg');
|
|
50
|
+
const paths = svg.querySelectorAll('path');
|
|
51
|
+
paths.forEach(path => {
|
|
52
|
+
expect(path).toHaveAttribute('stroke', 'blue');
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
test('uses currentColor as default stroke', () => {
|
|
56
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_ArrowRight.ArrowRight, null));
|
|
57
|
+
const svg = document.querySelector('svg');
|
|
58
|
+
const paths = svg.querySelectorAll('path');
|
|
59
|
+
paths.forEach(path => {
|
|
60
|
+
expect(path).toHaveAttribute('stroke', 'currentColor');
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
test('has correct stroke properties', () => {
|
|
64
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_ArrowRight.ArrowRight, null));
|
|
65
|
+
const svg = document.querySelector('svg');
|
|
66
|
+
const paths = svg.querySelectorAll('path');
|
|
67
|
+
paths.forEach(path => {
|
|
68
|
+
expect(path).toHaveAttribute('stroke-width', '2');
|
|
69
|
+
expect(path).toHaveAttribute('stroke-linecap', 'round');
|
|
70
|
+
expect(path).toHaveAttribute('stroke-linejoin', 'round');
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
test('has correct path data for arrow line', () => {
|
|
74
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_ArrowRight.ArrowRight, null));
|
|
75
|
+
const svg = document.querySelector('svg');
|
|
76
|
+
const paths = svg.querySelectorAll('path');
|
|
77
|
+
expect(paths[0]).toHaveAttribute('d', 'M5 12H19');
|
|
78
|
+
});
|
|
79
|
+
test('has correct path data for arrow head', () => {
|
|
80
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_ArrowRight.ArrowRight, null));
|
|
81
|
+
const svg = document.querySelector('svg');
|
|
82
|
+
const paths = svg.querySelectorAll('path');
|
|
83
|
+
expect(paths[1]).toHaveAttribute('d', 'M12 5L19 12L12 19');
|
|
84
|
+
});
|
|
85
|
+
test('contains exactly two path elements', () => {
|
|
86
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_ArrowRight.ArrowRight, null));
|
|
87
|
+
const svg = document.querySelector('svg');
|
|
88
|
+
const paths = svg.querySelectorAll('path');
|
|
89
|
+
expect(paths).toHaveLength(2);
|
|
90
|
+
});
|
|
91
|
+
});
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _react = _interopRequireDefault(require("react"));
|
|
4
|
+
var _react2 = require("@testing-library/react");
|
|
5
|
+
var _Avatar = _interopRequireDefault(require("../components/Avatar"));
|
|
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('Avatar Component', () => {
|
|
16
|
+
test('renders avatar with default props', () => {
|
|
17
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Avatar.default, null));
|
|
18
|
+
const avatar = _react2.screen.getByTestId('avatar');
|
|
19
|
+
expect(avatar).toBeInTheDocument();
|
|
20
|
+
expect(avatar).toHaveClass('avatar');
|
|
21
|
+
});
|
|
22
|
+
test('renders with custom component name', () => {
|
|
23
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Avatar.default, {
|
|
24
|
+
componentName: "user-avatar"
|
|
25
|
+
}));
|
|
26
|
+
const avatar = _react2.screen.getByTestId('user-avatar');
|
|
27
|
+
expect(avatar).toHaveClass('user-avatar');
|
|
28
|
+
});
|
|
29
|
+
test('renders with additional className', () => {
|
|
30
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Avatar.default, {
|
|
31
|
+
additionalClassName: "large-avatar"
|
|
32
|
+
}));
|
|
33
|
+
const avatar = _react2.screen.getByTestId('avatar');
|
|
34
|
+
expect(avatar).toHaveClass('avatar', 'large-avatar');
|
|
35
|
+
});
|
|
36
|
+
test('renders with image source', () => {
|
|
37
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Avatar.default, {
|
|
38
|
+
source: "/path/to/avatar.jpg"
|
|
39
|
+
}));
|
|
40
|
+
const avatar = _react2.screen.getByTestId('avatar');
|
|
41
|
+
const imageDiv = avatar.querySelector('.image');
|
|
42
|
+
expect(imageDiv).toHaveStyle('background-image: url(/path/to/avatar.jpg)');
|
|
43
|
+
});
|
|
44
|
+
test('renders with custom dimensions', () => {
|
|
45
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Avatar.default, {
|
|
46
|
+
dimensions: "100px"
|
|
47
|
+
}));
|
|
48
|
+
const avatar = _react2.screen.getByTestId('avatar');
|
|
49
|
+
const imageDiv = avatar.querySelector('.image');
|
|
50
|
+
expect(imageDiv).toHaveStyle({
|
|
51
|
+
width: '100px',
|
|
52
|
+
height: '100px'
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
test('renders with hover element when hasHoverEffect is true', () => {
|
|
56
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Avatar.default, {
|
|
57
|
+
hasHoverEffect: true,
|
|
58
|
+
dimensions: "50px"
|
|
59
|
+
}));
|
|
60
|
+
const avatar = _react2.screen.getByTestId('avatar');
|
|
61
|
+
const hoverDiv = avatar.querySelector('.hover');
|
|
62
|
+
expect(hoverDiv).toBeInTheDocument();
|
|
63
|
+
expect(hoverDiv).toHaveStyle({
|
|
64
|
+
width: '50px',
|
|
65
|
+
height: '50px'
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
test('does not render hover element when hasHoverEffect is false', () => {
|
|
69
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Avatar.default, {
|
|
70
|
+
hasHoverEffect: false
|
|
71
|
+
}));
|
|
72
|
+
const avatar = _react2.screen.getByTestId('avatar');
|
|
73
|
+
const hoverDiv = avatar.querySelector('.hover');
|
|
74
|
+
expect(hoverDiv).not.toBeInTheDocument();
|
|
75
|
+
});
|
|
76
|
+
test('image has correct styling properties', () => {
|
|
77
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Avatar.default, {
|
|
78
|
+
source: "/test.jpg",
|
|
79
|
+
dimensions: "75px"
|
|
80
|
+
}));
|
|
81
|
+
const avatar = _react2.screen.getByTestId('avatar');
|
|
82
|
+
const imageDiv = avatar.querySelector('.image');
|
|
83
|
+
expect(imageDiv).toHaveStyle({
|
|
84
|
+
borderRadius: '50%',
|
|
85
|
+
backgroundRepeat: 'no-repeat',
|
|
86
|
+
backgroundPosition: 'center center',
|
|
87
|
+
backgroundSize: 'cover',
|
|
88
|
+
width: '75px',
|
|
89
|
+
height: '75px'
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
test('renders without image source', () => {
|
|
93
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Avatar.default, {
|
|
94
|
+
dimensions: "40px"
|
|
95
|
+
}));
|
|
96
|
+
const avatar = _react2.screen.getByTestId('avatar');
|
|
97
|
+
const imageDiv = avatar.querySelector('.image');
|
|
98
|
+
expect(imageDiv).toHaveStyle('background-image: url()');
|
|
99
|
+
});
|
|
100
|
+
test('combines all props correctly', () => {
|
|
101
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Avatar.default, {
|
|
102
|
+
componentName: "profile-pic",
|
|
103
|
+
additionalClassName: "rounded-border",
|
|
104
|
+
source: "/profile.png",
|
|
105
|
+
dimensions: "120px",
|
|
106
|
+
hasHoverEffect: true
|
|
107
|
+
}));
|
|
108
|
+
const avatar = _react2.screen.getByTestId('profile-pic');
|
|
109
|
+
expect(avatar).toHaveClass('profile-pic', 'rounded-border');
|
|
110
|
+
const imageDiv = avatar.querySelector('.image');
|
|
111
|
+
expect(imageDiv).toHaveStyle({
|
|
112
|
+
backgroundImage: 'url(/profile.png)',
|
|
113
|
+
width: '120px',
|
|
114
|
+
height: '120px'
|
|
115
|
+
});
|
|
116
|
+
const hoverDiv = avatar.querySelector('.hover');
|
|
117
|
+
expect(hoverDiv).toBeInTheDocument();
|
|
118
|
+
expect(hoverDiv).toHaveStyle({
|
|
119
|
+
width: '120px',
|
|
120
|
+
height: '120px'
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
});
|
|
@@ -0,0 +1,82 @@
|
|
|
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 _Button = require("../components/Button");
|
|
7
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
describe('Button Component', () => {
|
|
9
|
+
test('renders button with default props', () => {
|
|
10
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Button.Button, null, "Click me"));
|
|
11
|
+
const button = _react2.screen.getByRole('button');
|
|
12
|
+
expect(button).toBeInTheDocument();
|
|
13
|
+
expect(button).toHaveTextContent('Click me');
|
|
14
|
+
expect(button).toHaveClass('button', 'button--primary', 'button--md');
|
|
15
|
+
expect(button).toHaveAttribute('data-testid', 'button');
|
|
16
|
+
});
|
|
17
|
+
test('renders button with custom className', () => {
|
|
18
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Button.Button, {
|
|
19
|
+
additionalClassName: "custom-class"
|
|
20
|
+
}, "Test"));
|
|
21
|
+
const button = _react2.screen.getByRole('button');
|
|
22
|
+
expect(button).toHaveClass('button', 'button--primary', 'button--md', 'custom-class');
|
|
23
|
+
});
|
|
24
|
+
test('renders button with different variants', () => {
|
|
25
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Button.Button, {
|
|
26
|
+
variant: "secondary"
|
|
27
|
+
}, "Secondary Button"));
|
|
28
|
+
const button = _react2.screen.getByRole('button');
|
|
29
|
+
expect(button).toHaveClass('button', 'button--secondary', 'button--md');
|
|
30
|
+
});
|
|
31
|
+
test('renders button with custom component name', () => {
|
|
32
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Button.Button, {
|
|
33
|
+
componentName: "custom-button"
|
|
34
|
+
}, "Custom"));
|
|
35
|
+
const button = _react2.screen.getByRole('button');
|
|
36
|
+
expect(button).toHaveClass('custom-button');
|
|
37
|
+
expect(button).toHaveAttribute('data-testid', 'custom-button');
|
|
38
|
+
});
|
|
39
|
+
test('renders disabled button', () => {
|
|
40
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Button.Button, {
|
|
41
|
+
disabled: true
|
|
42
|
+
}, "Disabled Button"));
|
|
43
|
+
const button = _react2.screen.getByRole('button');
|
|
44
|
+
expect(button).toBeDisabled();
|
|
45
|
+
expect(button).toHaveAttribute('disabled');
|
|
46
|
+
});
|
|
47
|
+
test('handles click events', async () => {
|
|
48
|
+
const handleClick = jest.fn();
|
|
49
|
+
const user = _userEvent.default.setup();
|
|
50
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Button.Button, {
|
|
51
|
+
onClick: handleClick
|
|
52
|
+
}, "Clickable"));
|
|
53
|
+
const button = _react2.screen.getByRole('button');
|
|
54
|
+
await user.click(button);
|
|
55
|
+
expect(handleClick).toHaveBeenCalledTimes(1);
|
|
56
|
+
});
|
|
57
|
+
test('does not trigger click when disabled', async () => {
|
|
58
|
+
const handleClick = jest.fn();
|
|
59
|
+
const user = _userEvent.default.setup();
|
|
60
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Button.Button, {
|
|
61
|
+
onClick: handleClick,
|
|
62
|
+
disabled: true
|
|
63
|
+
}, "Disabled"));
|
|
64
|
+
const button = _react2.screen.getByRole('button');
|
|
65
|
+
await user.click(button);
|
|
66
|
+
expect(handleClick).not.toHaveBeenCalled();
|
|
67
|
+
});
|
|
68
|
+
test('passes through additional props', () => {
|
|
69
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Button.Button, {
|
|
70
|
+
"data-custom": "test-value",
|
|
71
|
+
"aria-label": "Custom button"
|
|
72
|
+
}, "Test"));
|
|
73
|
+
const button = _react2.screen.getByRole('button');
|
|
74
|
+
expect(button).toHaveAttribute('data-custom', 'test-value');
|
|
75
|
+
expect(button).toHaveAttribute('aria-label', 'Custom button');
|
|
76
|
+
});
|
|
77
|
+
test('renders with complex children', () => {
|
|
78
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Button.Button, null, /*#__PURE__*/_react.default.createElement("span", null, "Icon"), /*#__PURE__*/_react.default.createElement("span", null, "Text")));
|
|
79
|
+
const button = _react2.screen.getByRole('button');
|
|
80
|
+
expect(button).toContainHTML('<span>Icon</span><span>Text</span>');
|
|
81
|
+
});
|
|
82
|
+
});
|
|
@@ -0,0 +1,198 @@
|
|
|
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 _Card = _interopRequireDefault(require("../components/Card"));
|
|
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
|
+
describe('Card', () => {
|
|
18
|
+
const defaultProps = {
|
|
19
|
+
bodyCopy: 'This is the card body content.',
|
|
20
|
+
title: 'Card Title'
|
|
21
|
+
};
|
|
22
|
+
test('renders card with required props', () => {
|
|
23
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Card.default, defaultProps));
|
|
24
|
+
const card = _react2.screen.getByTestId('card');
|
|
25
|
+
expect(card).toBeInTheDocument();
|
|
26
|
+
expect(card).toHaveClass('card');
|
|
27
|
+
expect(_react2.screen.getByText('This is the card body content.')).toBeInTheDocument();
|
|
28
|
+
expect(_react2.screen.getByText('Card Title')).toBeInTheDocument();
|
|
29
|
+
});
|
|
30
|
+
test('renders with custom component name', () => {
|
|
31
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Card.default, _extends({}, defaultProps, {
|
|
32
|
+
componentName: "custom-card"
|
|
33
|
+
})));
|
|
34
|
+
const card = _react2.screen.getByTestId('custom-card');
|
|
35
|
+
expect(card).toHaveClass('custom-card');
|
|
36
|
+
});
|
|
37
|
+
test('renders with additional className', () => {
|
|
38
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Card.default, _extends({}, defaultProps, {
|
|
39
|
+
className: "featured-card"
|
|
40
|
+
})));
|
|
41
|
+
const card = _react2.screen.getByTestId('card');
|
|
42
|
+
expect(card).toHaveClass('card', 'featured-card');
|
|
43
|
+
});
|
|
44
|
+
test('maintains backward compatibility with additionalClassName', () => {
|
|
45
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Card.default, _extends({}, defaultProps, {
|
|
46
|
+
additionalClassName: "legacy-card"
|
|
47
|
+
})));
|
|
48
|
+
const card = _react2.screen.getByTestId('card');
|
|
49
|
+
expect(card).toHaveClass('card', 'legacy-card');
|
|
50
|
+
});
|
|
51
|
+
test('forwards ref to the card element', () => {
|
|
52
|
+
const ref = /*#__PURE__*/_react.default.createRef();
|
|
53
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Card.default, _extends({}, defaultProps, {
|
|
54
|
+
ref: ref
|
|
55
|
+
})));
|
|
56
|
+
expect(ref.current).toBeInstanceOf(HTMLDivElement);
|
|
57
|
+
expect(ref.current).toHaveClass('card');
|
|
58
|
+
});
|
|
59
|
+
test('renders with avatar when avatarSrc provided', () => {
|
|
60
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Card.default, _extends({}, defaultProps, {
|
|
61
|
+
avatarSrc: "/path/to/avatar.jpg"
|
|
62
|
+
})));
|
|
63
|
+
const avatar = _react2.screen.getByTestId('avatar');
|
|
64
|
+
expect(avatar).toBeInTheDocument();
|
|
65
|
+
// Avatar component now uses img element rather than background-image
|
|
66
|
+
const avatarImages = avatar.querySelectorAll('[role="img"]');
|
|
67
|
+
expect(avatarImages.length).toBeGreaterThan(0);
|
|
68
|
+
// Find the image with the correct style or src
|
|
69
|
+
const found = Array.from(avatarImages).find(img => img.style.backgroundImage.includes('/path/to/avatar.jpg') || img.getAttribute('src') === '/path/to/avatar.jpg');
|
|
70
|
+
expect(found).toBeDefined();
|
|
71
|
+
});
|
|
72
|
+
test('toggles ellipses menu when clicked', async () => {
|
|
73
|
+
const user = _userEvent.default.setup();
|
|
74
|
+
const onEllipsesToggle = jest.fn();
|
|
75
|
+
const ellipsesList = [/*#__PURE__*/_react.default.createElement("li", {
|
|
76
|
+
key: "1"
|
|
77
|
+
}, "Menu Item")];
|
|
78
|
+
const {
|
|
79
|
+
rerender
|
|
80
|
+
} = (0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Card.default, _extends({}, defaultProps, {
|
|
81
|
+
avatarSrc: "/path/to/avatar.jpg",
|
|
82
|
+
ellipsesList: ellipsesList,
|
|
83
|
+
isEllipsesOpen: false,
|
|
84
|
+
onEllipsesToggle: onEllipsesToggle
|
|
85
|
+
})));
|
|
86
|
+
const card = _react2.screen.getByTestId('card');
|
|
87
|
+
const ellipsesButton = card.querySelector('.ellipses-trigger');
|
|
88
|
+
|
|
89
|
+
// Initially closed
|
|
90
|
+
expect(card).not.toHaveClass('open');
|
|
91
|
+
expect(_react2.screen.queryByText('Menu Item')).not.toBeInTheDocument();
|
|
92
|
+
|
|
93
|
+
// Click to open
|
|
94
|
+
await user.click(ellipsesButton);
|
|
95
|
+
expect(onEllipsesToggle).toHaveBeenCalledTimes(1);
|
|
96
|
+
|
|
97
|
+
// Re-render with open state to test display
|
|
98
|
+
rerender(/*#__PURE__*/_react.default.createElement(_Card.default, _extends({}, defaultProps, {
|
|
99
|
+
avatarSrc: "/path/to/avatar.jpg",
|
|
100
|
+
ellipsesList: ellipsesList,
|
|
101
|
+
isEllipsesOpen: true,
|
|
102
|
+
onEllipsesToggle: onEllipsesToggle
|
|
103
|
+
})));
|
|
104
|
+
expect(card).toHaveClass('open');
|
|
105
|
+
expect(_react2.screen.getByText('Menu Item')).toBeInTheDocument();
|
|
106
|
+
});
|
|
107
|
+
test('renders with subtitle when provided', () => {
|
|
108
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Card.default, _extends({}, defaultProps, {
|
|
109
|
+
subTitle: "Card subtitle"
|
|
110
|
+
})));
|
|
111
|
+
expect(_react2.screen.getByText('Card subtitle')).toBeInTheDocument();
|
|
112
|
+
});
|
|
113
|
+
test('renders with full image when provided', () => {
|
|
114
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Card.default, _extends({}, defaultProps, {
|
|
115
|
+
fullImage: "/path/to/image.jpg"
|
|
116
|
+
})));
|
|
117
|
+
const image = _react2.screen.getByRole('img');
|
|
118
|
+
expect(image).toHaveAttribute('src', '/path/to/image.jpg');
|
|
119
|
+
expect(image).toHaveAttribute('alt', 'Card Title image');
|
|
120
|
+
});
|
|
121
|
+
test('renders custom image component over fullImage when both provided', () => {
|
|
122
|
+
const customImage = /*#__PURE__*/_react.default.createElement("img", {
|
|
123
|
+
src: "/custom.jpg",
|
|
124
|
+
alt: "Custom",
|
|
125
|
+
"data-testid": "custom-image"
|
|
126
|
+
});
|
|
127
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Card.default, _extends({}, defaultProps, {
|
|
128
|
+
fullImage: "/path/to/image.jpg",
|
|
129
|
+
imgComponent: customImage
|
|
130
|
+
})));
|
|
131
|
+
expect(_react2.screen.getByRole('img', {
|
|
132
|
+
name: 'Custom'
|
|
133
|
+
})).toBeInTheDocument();
|
|
134
|
+
expect(_react2.screen.queryByRole('img', {
|
|
135
|
+
name: 'Card Title'
|
|
136
|
+
})).not.toBeInTheDocument();
|
|
137
|
+
});
|
|
138
|
+
test('renders with custom title size', () => {
|
|
139
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Card.default, _extends({}, defaultProps, {
|
|
140
|
+
titleSize: 1
|
|
141
|
+
})));
|
|
142
|
+
const heading = _react2.screen.getByRole('heading', {
|
|
143
|
+
level: 1
|
|
144
|
+
});
|
|
145
|
+
expect(heading).toHaveTextContent('Card Title');
|
|
146
|
+
});
|
|
147
|
+
test('applies margin-top style to heading when avatar is present', () => {
|
|
148
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Card.default, _extends({}, defaultProps, {
|
|
149
|
+
avatarSrc: "/avatar.jpg"
|
|
150
|
+
})));
|
|
151
|
+
const heading = _react2.screen.getByTestId('card-title');
|
|
152
|
+
expect(heading).toHaveStyle('margin-top: 0px');
|
|
153
|
+
});
|
|
154
|
+
test('renders without avatar section when no avatarSrc', () => {
|
|
155
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Card.default, defaultProps));
|
|
156
|
+
const card = _react2.screen.getByTestId('card');
|
|
157
|
+
const head = card.querySelector('.head');
|
|
158
|
+
expect(head).not.toBeInTheDocument();
|
|
159
|
+
});
|
|
160
|
+
test('combines all props correctly', () => {
|
|
161
|
+
const ellipsesList = [/*#__PURE__*/_react.default.createElement("li", {
|
|
162
|
+
key: "1"
|
|
163
|
+
}, "Settings")];
|
|
164
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Card.default, {
|
|
165
|
+
componentName: "feature-card",
|
|
166
|
+
className: "highlighted premium",
|
|
167
|
+
bodyCopy: "Premium card content with advanced features.",
|
|
168
|
+
title: "Premium Feature",
|
|
169
|
+
subTitle: "Exclusive benefits",
|
|
170
|
+
titleSize: 2,
|
|
171
|
+
avatarSrc: "/premium-avatar.jpg",
|
|
172
|
+
ellipsesList: ellipsesList,
|
|
173
|
+
fullImage: "/premium-bg.jpg"
|
|
174
|
+
}));
|
|
175
|
+
const card = _react2.screen.getByTestId('feature-card');
|
|
176
|
+
expect(card).toHaveClass('feature-card', 'highlighted', 'premium');
|
|
177
|
+
expect(_react2.screen.getByText('Premium Feature')).toBeInTheDocument();
|
|
178
|
+
expect(_react2.screen.getByText('Exclusive benefits')).toBeInTheDocument();
|
|
179
|
+
expect(_react2.screen.getByText('Premium card content with advanced features.')).toBeInTheDocument();
|
|
180
|
+
expect(_react2.screen.getByTestId('avatar')).toBeInTheDocument();
|
|
181
|
+
// Use more specific selector for the card image to avoid multiple matches
|
|
182
|
+
const cardImage = _react2.screen.getByAltText('Premium Feature image');
|
|
183
|
+
expect(cardImage).toHaveAttribute('src', '/premium-bg.jpg');
|
|
184
|
+
});
|
|
185
|
+
test('handles accessibility props correctly', () => {
|
|
186
|
+
(0, _react2.render)(/*#__PURE__*/_react.default.createElement(_Card.default, _extends({}, defaultProps, {
|
|
187
|
+
"aria-label": "User profile card",
|
|
188
|
+
"aria-describedby": "card-description",
|
|
189
|
+
role: "article",
|
|
190
|
+
tabIndex: 0
|
|
191
|
+
})));
|
|
192
|
+
const card = _react2.screen.getByTestId('card');
|
|
193
|
+
expect(card).toHaveAttribute('aria-label', 'User profile card');
|
|
194
|
+
expect(card).toHaveAttribute('aria-describedby', 'card-description');
|
|
195
|
+
expect(card).toHaveAttribute('role', 'article');
|
|
196
|
+
expect(card).toHaveAttribute('tabIndex', '0');
|
|
197
|
+
});
|
|
198
|
+
});
|