@windstream/react-shared-components 0.1.94 → 0.1.95
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +635 -635
- package/dist/contentful/index.esm.js +3 -3
- package/dist/contentful/index.esm.js.map +1 -1
- package/dist/contentful/index.js +3 -3
- package/dist/contentful/index.js.map +1 -1
- package/dist/core.d.ts +4 -4
- package/dist/index.esm.js +5 -13
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +5 -13
- package/dist/index.js.map +1 -1
- package/dist/next/index.esm.js +2 -2
- package/dist/next/index.esm.js.map +1 -1
- package/dist/next/index.js +2 -2
- package/dist/next/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/utils/index.esm.js +1 -1
- package/dist/utils/index.esm.js.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/package.json +191 -191
- package/src/components/accordion/Accordion.stories.tsx +230 -230
- package/src/components/accordion/index.test.tsx +270 -270
- package/src/components/accordion/index.tsx +70 -70
- package/src/components/accordion/types.ts +12 -12
- package/src/components/alert-card/AlertCard.stories.tsx +171 -171
- package/src/components/alert-card/index.test.tsx +152 -152
- package/src/components/alert-card/index.tsx +41 -41
- package/src/components/alert-card/types.ts +13 -13
- package/src/components/animation-wrapper/index.test.tsx +424 -424
- package/src/components/animation-wrapper/index.tsx +129 -129
- package/src/components/animation-wrapper/types.ts +11 -11
- package/src/components/brand-button/BrandButton.stories.tsx +223 -223
- package/src/components/brand-button/helpers.ts +35 -35
- package/src/components/brand-button/index.test.tsx +292 -292
- package/src/components/brand-button/index.tsx +120 -120
- package/src/components/brand-button/types.ts +38 -38
- package/src/components/button/Button.stories.tsx +108 -108
- package/src/components/button/index.test.tsx +91 -91
- package/src/components/button/index.tsx +27 -27
- package/src/components/button/types.ts +14 -14
- package/src/components/call-button/CallButton.stories.tsx +324 -324
- package/src/components/call-button/index.test.tsx +260 -260
- package/src/components/call-button/index.tsx +106 -106
- package/src/components/call-button/types.ts +16 -16
- package/src/components/checkbox/Checkbox.stories.tsx +247 -247
- package/src/components/checkbox/index.test.tsx +252 -252
- package/src/components/checkbox/index.tsx +197 -197
- package/src/components/checkbox/types.ts +27 -27
- package/src/components/checklist/Checklist.stories.tsx +150 -150
- package/src/components/checklist/index.test.tsx +231 -231
- package/src/components/checklist/index.tsx +96 -96
- package/src/components/checklist/types.ts +23 -23
- package/src/components/collapse/Collapse.stories.tsx +255 -255
- package/src/components/collapse/index.test.tsx +277 -277
- package/src/components/collapse/index.tsx +47 -47
- package/src/components/collapse/types.ts +6 -6
- package/src/components/divider/Divider.stories.tsx +205 -205
- package/src/components/divider/index.test.tsx +53 -53
- package/src/components/divider/index.tsx +22 -22
- package/src/components/divider/type.ts +3 -3
- package/src/components/image/Image.stories.tsx +113 -113
- package/src/components/image/index.test.tsx +174 -174
- package/src/components/image/index.tsx +25 -25
- package/src/components/image/types.ts +40 -40
- package/src/components/input/Input.stories.tsx +325 -325
- package/src/components/input/index.test.tsx +348 -348
- package/src/components/input/index.tsx +177 -177
- package/src/components/input/types.ts +37 -37
- package/src/components/link/Link.stories.tsx +163 -163
- package/src/components/link/index.test.tsx +199 -199
- package/src/components/link/index.tsx +116 -116
- package/src/components/link/types.ts +25 -25
- package/src/components/list/List.stories.tsx +272 -272
- package/src/components/list/index.test.tsx +166 -166
- package/src/components/list/index.tsx +88 -88
- package/src/components/list/list-item/index.tsx +38 -38
- package/src/components/list/list-item/types.ts +13 -13
- package/src/components/list/types.ts +29 -29
- package/src/components/material-icon/MaterialIcon.stories.tsx +322 -322
- package/src/components/material-icon/constants.ts +99 -99
- package/src/components/material-icon/index.test.tsx +130 -130
- package/src/components/material-icon/index.tsx +47 -47
- package/src/components/material-icon/types.ts +31 -31
- package/src/components/modal/Modal.stories.tsx +171 -171
- package/src/components/modal/index.test.tsx +310 -310
- package/src/components/modal/index.tsx +164 -164
- package/src/components/modal/types.ts +24 -24
- package/src/components/next-image/index.test.tsx +406 -406
- package/src/components/next-image/index.tsx +74 -74
- package/src/components/next-image/types.ts +1 -1
- package/src/components/pagination/index.test.tsx +521 -521
- package/src/components/pagination/index.tsx +91 -91
- package/src/components/pagination/types.ts +6 -6
- package/src/components/radio-button/RadioButton.stories.tsx +307 -307
- package/src/components/radio-button/index.test.tsx +151 -151
- package/src/components/radio-button/index.tsx +75 -75
- package/src/components/radio-button/types.ts +21 -21
- package/src/components/see-more/SeeMore.stories.tsx +181 -181
- package/src/components/see-more/index.test.tsx +96 -96
- package/src/components/see-more/index.tsx +44 -44
- package/src/components/see-more/types.ts +4 -4
- package/src/components/select/Select.stories.tsx +411 -411
- package/src/components/select/index.test.tsx +256 -256
- package/src/components/select/index.tsx +155 -155
- package/src/components/select/types.ts +36 -36
- package/src/components/select-plan-button/SelectPlanButton.stories.tsx +184 -184
- package/src/components/select-plan-button/index.test.tsx +173 -173
- package/src/components/select-plan-button/index.tsx +63 -63
- package/src/components/select-plan-button/types.ts +17 -17
- package/src/components/skeleton/Skeleton.stories.tsx +179 -179
- package/src/components/skeleton/index.test.tsx +74 -74
- package/src/components/skeleton/index.tsx +61 -61
- package/src/components/skeleton/types.ts +4 -4
- package/src/components/spinner/Spinner.stories.tsx +335 -335
- package/src/components/spinner/index.test.tsx +76 -76
- package/src/components/spinner/index.tsx +44 -44
- package/src/components/spinner/types.ts +5 -5
- package/src/components/text/Text.stories.tsx +321 -321
- package/src/components/text/index.test.tsx +65 -65
- package/src/components/text/index.tsx +25 -25
- package/src/components/text/types.ts +45 -45
- package/src/components/tooltip/Tooltip.stories.tsx +219 -219
- package/src/components/tooltip/index.test.tsx +50 -50
- package/src/components/tooltip/index.tsx +74 -74
- package/src/components/tooltip/types.ts +7 -7
- package/src/components/view-cart-button/ViewCartButton.stories.tsx +252 -252
- package/src/components/view-cart-button/index.test.tsx +57 -57
- package/src/components/view-cart-button/index.tsx +42 -42
- package/src/components/view-cart-button/types.ts +5 -5
- package/src/contentful/blocks/accordion/Accordion.stories.mocks.tsx +128 -128
- package/src/contentful/blocks/accordion/Accordion.stories.tsx +98 -98
- package/src/contentful/blocks/accordion/index.test.tsx +218 -218
- package/src/contentful/blocks/accordion/index.tsx +114 -114
- package/src/contentful/blocks/accordion/types.ts +34 -34
- package/src/contentful/blocks/address-input-banner/index.test.tsx +132 -132
- package/src/contentful/blocks/address-input-banner/index.tsx +52 -52
- package/src/contentful/blocks/address-input-banner/types.ts +14 -14
- package/src/contentful/blocks/anchored-bottom-banner/index.test.tsx +287 -287
- package/src/contentful/blocks/anchored-bottom-banner/index.tsx +181 -181
- package/src/contentful/blocks/anchored-bottom-banner/types.ts +13 -13
- package/src/contentful/blocks/blogs-grid/BlogGrid.stories.mocks.tsx +144 -144
- package/src/contentful/blocks/blogs-grid/BlogGrid.stories.tsx +157 -157
- package/src/contentful/blocks/blogs-grid/index.test.tsx +355 -355
- package/src/contentful/blocks/blogs-grid/index.tsx +134 -134
- package/src/contentful/blocks/blogs-grid/types.ts +26 -26
- package/src/contentful/blocks/blogs-grid-base/index.test.tsx +274 -274
- package/src/contentful/blocks/blogs-grid-base/index.tsx +119 -119
- package/src/contentful/blocks/blogs-grid-base/types.ts +36 -36
- package/src/contentful/blocks/breadcrumbs/BreadcrumbNavigation.stories.tsx +147 -147
- package/src/contentful/blocks/breadcrumbs/index.test.tsx +281 -281
- package/src/contentful/blocks/breadcrumbs/index.tsx +95 -95
- package/src/contentful/blocks/breadcrumbs/types.ts +8 -8
- package/src/contentful/blocks/button/Button.stories.tsx +40 -40
- package/src/contentful/blocks/button/index.test.tsx +339 -339
- package/src/contentful/blocks/button/index.tsx +131 -131
- package/src/contentful/blocks/button/types.ts +39 -39
- package/src/contentful/blocks/callout/Callout.stories.tsx +23 -23
- package/src/contentful/blocks/callout/index.test.tsx +539 -539
- package/src/contentful/blocks/callout/index.tsx +277 -277
- package/src/contentful/blocks/callout/types.ts +78 -78
- package/src/contentful/blocks/cards/Cards.stories.tsx +23 -23
- package/src/contentful/blocks/cards/blog-card/index.test.tsx +218 -218
- package/src/contentful/blocks/cards/blog-card/index.tsx +129 -129
- package/src/contentful/blocks/cards/blog-card/types.ts +34 -34
- package/src/contentful/blocks/cards/floating-image-card/index.test.tsx +201 -201
- package/src/contentful/blocks/cards/floating-image-card/index.tsx +119 -119
- package/src/contentful/blocks/cards/floating-image-card/types.ts +30 -30
- package/src/contentful/blocks/cards/full-image-card/index.test.tsx +216 -216
- package/src/contentful/blocks/cards/full-image-card/index.tsx +130 -130
- package/src/contentful/blocks/cards/full-image-card/types.ts +29 -29
- package/src/contentful/blocks/cards/index.test.tsx +39 -39
- package/src/contentful/blocks/cards/index.tsx +13 -13
- package/src/contentful/blocks/cards/product-card/index.test.tsx +263 -263
- package/src/contentful/blocks/cards/product-card/index.tsx +251 -251
- package/src/contentful/blocks/cards/product-card/types.ts +28 -28
- package/src/contentful/blocks/cards/simple-card/index.test.tsx +364 -364
- package/src/contentful/blocks/cards/simple-card/index.tsx +325 -325
- package/src/contentful/blocks/cards/simple-card/types.ts +71 -71
- package/src/contentful/blocks/cards/testimonial-card/index.test.tsx +180 -180
- package/src/contentful/blocks/cards/testimonial-card/index.tsx +90 -90
- package/src/contentful/blocks/cards/testimonial-card/types.tsx +12 -12
- package/src/contentful/blocks/cards/types.ts +1 -1
- package/src/contentful/blocks/carousel/Carousel.stories.tsx +23 -23
- package/src/contentful/blocks/carousel/helper.test.tsx +539 -539
- package/src/contentful/blocks/carousel/helper.tsx +494 -494
- package/src/contentful/blocks/carousel/index.test.tsx +308 -308
- package/src/contentful/blocks/carousel/index.tsx +87 -87
- package/src/contentful/blocks/carousel/types.test.ts +16 -16
- package/src/contentful/blocks/carousel/types.ts +145 -145
- package/src/contentful/blocks/cart-retention-banner/index.test.tsx +409 -409
- package/src/contentful/blocks/cart-retention-banner/index.tsx +109 -109
- package/src/contentful/blocks/cart-retention-banner/types.ts +11 -11
- package/src/contentful/blocks/comparison-table/index.test.tsx +114 -114
- package/src/contentful/blocks/comparison-table/index.tsx +29 -29
- package/src/contentful/blocks/comparison-table/types.ts +6 -6
- package/src/contentful/blocks/cookiebanner/index.test.tsx +277 -277
- package/src/contentful/blocks/cookiebanner/index.tsx +146 -146
- package/src/contentful/blocks/cookiebanner/type.ts +7 -7
- package/src/contentful/blocks/cta-callout/CtaCallout.stories.tsx +46 -46
- package/src/contentful/blocks/cta-callout/index.test.tsx +244 -244
- package/src/contentful/blocks/cta-callout/index.tsx +73 -73
- package/src/contentful/blocks/cta-callout/types.ts +26 -26
- package/src/contentful/blocks/dynamic-tabs/index.test.tsx +240 -240
- package/src/contentful/blocks/dynamic-tabs/index.tsx +204 -204
- package/src/contentful/blocks/dynamic-tabs/types.ts +21 -21
- package/src/contentful/blocks/email-input-block/index.test.tsx +213 -213
- package/src/contentful/blocks/email-input-block/index.tsx +121 -121
- package/src/contentful/blocks/email-input-block/types.ts +16 -16
- package/src/contentful/blocks/find-kinetic/FindKinetic.stories.tsx +23 -23
- package/src/contentful/blocks/find-kinetic/index.test.tsx +269 -269
- package/src/contentful/blocks/find-kinetic/index.tsx +138 -138
- package/src/contentful/blocks/find-kinetic/types.ts +20 -20
- package/src/contentful/blocks/floating-banner/FloatingBanner.stories.tsx +34 -34
- package/src/contentful/blocks/floating-banner/index.test.tsx +246 -246
- package/src/contentful/blocks/floating-banner/index.tsx +97 -97
- package/src/contentful/blocks/floating-banner/types.ts +22 -22
- package/src/contentful/blocks/footer/Footer.stories.tsx +317 -317
- package/src/contentful/blocks/footer/index.test.tsx +302 -302
- package/src/contentful/blocks/footer/index.tsx +91 -91
- package/src/contentful/blocks/footer/types.ts +13 -13
- package/src/contentful/blocks/image-promo-bar/ImagePromoBar.stories.tsx +23 -23
- package/src/contentful/blocks/image-promo-bar/helper.test.tsx +61 -61
- package/src/contentful/blocks/image-promo-bar/helper.tsx +28 -28
- package/src/contentful/blocks/image-promo-bar/index.test.tsx +467 -467
- package/src/contentful/blocks/image-promo-bar/index.tsx +8 -6
- package/src/contentful/blocks/image-promo-bar/types.ts +44 -44
- package/src/contentful/blocks/image-promo-bar/vimeo-embed.test.tsx +142 -142
- package/src/contentful/blocks/image-promo-bar/vimeo-embed.tsx +93 -93
- package/src/contentful/blocks/image-promo-bar/youtube-embed.test.tsx +104 -104
- package/src/contentful/blocks/image-promo-bar/youtube-embed.tsx +46 -46
- package/src/contentful/blocks/modal/constants.ts +53 -53
- package/src/contentful/blocks/modal/index.test.tsx +209 -209
- package/src/contentful/blocks/modal/index.tsx +108 -108
- package/src/contentful/blocks/modal/types.ts +12 -12
- package/src/contentful/blocks/navigation/Navigation.stories.mocks.tsx +78 -78
- package/src/contentful/blocks/navigation/Navigation.stories.tsx +138 -138
- package/src/contentful/blocks/navigation/desktop-link-groups.tsx/index.test.tsx +208 -208
- package/src/contentful/blocks/navigation/desktop-link-groups.tsx/index.tsx +141 -141
- package/src/contentful/blocks/navigation/index.test.tsx +924 -924
- package/src/contentful/blocks/navigation/index.tsx +569 -569
- package/src/contentful/blocks/navigation/mobile-link-groups.tsx/index.test.tsx +131 -131
- package/src/contentful/blocks/navigation/mobile-link-groups.tsx/index.tsx +82 -82
- package/src/contentful/blocks/navigation/types.ts +71 -71
- package/src/contentful/blocks/primary-hero/PrimaryHero.stories.tsx +23 -23
- package/src/contentful/blocks/primary-hero/index.test.tsx +286 -286
- package/src/contentful/blocks/primary-hero/index.tsx +239 -239
- package/src/contentful/blocks/primary-hero/types.ts +37 -37
- package/src/contentful/blocks/search-block/index.test.tsx +268 -268
- package/src/contentful/blocks/search-block/index.tsx +90 -90
- package/src/contentful/blocks/search-block/types.ts +15 -15
- package/src/contentful/blocks/shape-background-wrapper/ShapeBackgroundWrapper.stories.tsx +26 -26
- package/src/contentful/blocks/shape-background-wrapper/index.test.tsx +284 -284
- package/src/contentful/blocks/shape-background-wrapper/index.tsx +124 -124
- package/src/contentful/blocks/shape-background-wrapper/types.ts +36 -36
- package/src/contentful/blocks/text/Text.stories.tsx +23 -23
- package/src/contentful/blocks/text/index.test.tsx +36 -36
- package/src/contentful/blocks/text/index.tsx +12 -12
- package/src/contentful/blocks/text/types.ts +1 -1
- package/src/contentful/index.test.ts +45 -45
- package/src/contentful/index.ts +105 -105
- package/src/global-mocks/contentful/to-document.ts +25 -25
- package/src/global-mocks/cookie.ts +48 -48
- package/src/global-mocks/cx.ts +37 -37
- package/src/global-mocks/index.ts +89 -89
- package/src/global-mocks/speed-card-bg.ts +27 -27
- package/src/global-mocks/utm.ts +49 -49
- package/src/hooks/contentful/use-contentful-rich-text.test.tsx +1758 -1758
- package/src/hooks/contentful/use-contentful-rich-text.tsx +309 -309
- package/src/hooks/contentful/use-processed-check-list.test.tsx +277 -277
- package/src/hooks/contentful/use-processed-check-list.ts +63 -63
- package/src/hooks/use-body-scroll-lock.test.ts +134 -134
- package/src/hooks/use-body-scroll-lock.ts +34 -34
- package/src/hooks/use-carousel-swipe.test.ts +393 -393
- package/src/hooks/use-carousel-swipe.ts +264 -264
- package/src/hooks/use-outside-click.test.ts +142 -142
- package/src/hooks/use-outside-click.ts +17 -17
- package/src/index.ts +107 -107
- package/src/next/index.test.ts +7 -7
- package/src/next/index.ts +5 -5
- package/src/setupTests.ts +52 -52
- package/src/stories/DocsTemplate.tsx +24 -24
- package/src/styles/globals.css +343 -343
- package/src/types/global.d.ts +9 -9
- package/src/types/micro-components.ts +99 -99
- package/src/types/utm.ts +49 -49
- package/src/utils/contentful/to-document.test.ts +85 -85
- package/src/utils/contentful/to-document.ts +24 -24
- package/src/utils/cookie.test.ts +180 -180
- package/src/utils/cookie.ts +84 -84
- package/src/utils/cx.test.ts +90 -90
- package/src/utils/cx.ts +49 -49
- package/src/utils/index.test.ts +115 -115
- package/src/utils/index.ts +41 -41
- package/src/utils/speed-card-bg.test.ts +46 -46
- package/src/utils/speed-card-bg.ts +24 -24
- package/src/utils/utm.test.ts +359 -359
- package/src/utils/utm.ts +221 -221
|
@@ -1,252 +1,252 @@
|
|
|
1
|
-
/// <reference types="@testing-library/jest-dom" />
|
|
2
|
-
import React from "react";
|
|
3
|
-
import { Checkbox } from "./index";
|
|
4
|
-
|
|
5
|
-
import { fireEvent, render, screen } from "@testing-library/react";
|
|
6
|
-
|
|
7
|
-
jest.mock("@shared/components/button", () => {
|
|
8
|
-
const MockButton = React.forwardRef<
|
|
9
|
-
HTMLButtonElement,
|
|
10
|
-
React.ButtonHTMLAttributes<HTMLButtonElement>
|
|
11
|
-
>(({ children, ...props }, ref) => (
|
|
12
|
-
<button ref={ref} {...props}>
|
|
13
|
-
{children}
|
|
14
|
-
</button>
|
|
15
|
-
));
|
|
16
|
-
MockButton.displayName = "MockButton";
|
|
17
|
-
return { Button: MockButton };
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
jest.mock("@shared/utils", () => ({
|
|
21
|
-
cx: (...args: unknown[]) => args.filter(Boolean).join(" "),
|
|
22
|
-
}));
|
|
23
|
-
|
|
24
|
-
describe("Checkbox", () => {
|
|
25
|
-
describe("rendering", () => {
|
|
26
|
-
it("renders an unchecked checkbox by default", () => {
|
|
27
|
-
render(<Checkbox name="test" />);
|
|
28
|
-
const input = screen.getByRole("checkbox");
|
|
29
|
-
expect(input).not.toBeChecked();
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
it("renders a checked checkbox when checked is true", () => {
|
|
33
|
-
render(<Checkbox name="test" checked={true} />);
|
|
34
|
-
const input = screen.getByRole("checkbox");
|
|
35
|
-
expect(input).toBeChecked();
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it("renders with the correct name attribute", () => {
|
|
39
|
-
render(<Checkbox name="agreement" />);
|
|
40
|
-
const input = screen.getByRole("checkbox");
|
|
41
|
-
expect(input).toHaveAttribute("name", "agreement");
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
it("renders with the correct value attribute", () => {
|
|
45
|
-
render(<Checkbox name="test" value="yes" />);
|
|
46
|
-
const input = screen.getByRole("checkbox");
|
|
47
|
-
expect(input).toHaveAttribute("value", "yes");
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
it("applies displayName correctly", () => {
|
|
51
|
-
expect(Checkbox.displayName).toBe("Checkbox");
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
describe("label", () => {
|
|
56
|
-
it("renders a string label", () => {
|
|
57
|
-
render(<Checkbox name="test" label="Accept terms" />);
|
|
58
|
-
expect(screen.getByText("Accept terms")).toBeInTheDocument();
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
it("renders a ReactNode label", () => {
|
|
62
|
-
render(
|
|
63
|
-
<Checkbox
|
|
64
|
-
name="test"
|
|
65
|
-
label={<span data-testid="custom-label">Custom</span>}
|
|
66
|
-
/>
|
|
67
|
-
);
|
|
68
|
-
expect(screen.getByTestId("custom-label")).toBeInTheDocument();
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
it("does not render label element when label is not provided", () => {
|
|
72
|
-
const { container } = render(<Checkbox name="test" />);
|
|
73
|
-
const labels = container.querySelectorAll("label");
|
|
74
|
-
// Only the icon label, no text label
|
|
75
|
-
expect(labels.length).toBe(1);
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
it("applies labelClassName to the label", () => {
|
|
79
|
-
render(
|
|
80
|
-
<Checkbox name="test" label="Label" labelClassName="custom-label" />
|
|
81
|
-
);
|
|
82
|
-
const label = screen.getByText("Label");
|
|
83
|
-
expect(label.className).toContain("custom-label");
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
it("applies error class to label when error is true", () => {
|
|
87
|
-
render(<Checkbox name="test" label="Label" error={true} />);
|
|
88
|
-
const label = screen.getByText("Label");
|
|
89
|
-
expect(label.className).toContain("text-text-critical");
|
|
90
|
-
});
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
describe("interactive behavior", () => {
|
|
94
|
-
it("calls onChange with boolean when handler expects a parameter", () => {
|
|
95
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
96
|
-
const handleChange = jest.fn((_isChecked: boolean) => undefined);
|
|
97
|
-
render(<Checkbox name="test" onChange={handleChange} />);
|
|
98
|
-
const input = screen.getByRole("checkbox");
|
|
99
|
-
fireEvent.click(input);
|
|
100
|
-
expect(handleChange).toHaveBeenCalledWith(true);
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
it("calls onChange without parameters for zero-arity handler", () => {
|
|
104
|
-
const handleChange = jest.fn();
|
|
105
|
-
// Override length to simulate zero-arity
|
|
106
|
-
Object.defineProperty(handleChange, "length", { value: 0 });
|
|
107
|
-
render(<Checkbox name="test" onChange={handleChange} />);
|
|
108
|
-
const input = screen.getByRole("checkbox");
|
|
109
|
-
fireEvent.click(input);
|
|
110
|
-
expect(handleChange).toHaveBeenCalled();
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
it("does not call onChange when disabled", () => {
|
|
114
|
-
const handleChange = jest.fn();
|
|
115
|
-
render(<Checkbox name="test" onChange={handleChange} disabled={true} />);
|
|
116
|
-
const input = screen.getByRole("checkbox");
|
|
117
|
-
fireEvent.click(input);
|
|
118
|
-
expect(handleChange).not.toHaveBeenCalled();
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
it("does not call onChange when state is disabled", () => {
|
|
122
|
-
const handleChange = jest.fn();
|
|
123
|
-
render(<Checkbox name="test" onChange={handleChange} state="disabled" />);
|
|
124
|
-
const input = screen.getByRole("checkbox");
|
|
125
|
-
fireEvent.click(input);
|
|
126
|
-
expect(handleChange).not.toHaveBeenCalled();
|
|
127
|
-
});
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
describe("disabled state", () => {
|
|
131
|
-
it("sets disabled attribute when disabled prop is true", () => {
|
|
132
|
-
render(<Checkbox name="test" disabled={true} />);
|
|
133
|
-
const input = screen.getByRole("checkbox");
|
|
134
|
-
expect(input).toBeDisabled();
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
it("sets disabled attribute when state is disabled", () => {
|
|
138
|
-
render(<Checkbox name="test" state="disabled" />);
|
|
139
|
-
const input = screen.getByRole("checkbox");
|
|
140
|
-
expect(input).toBeDisabled();
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
it("applies disabled styling to unchecked icon", () => {
|
|
144
|
-
const { container } = render(<Checkbox name="test" disabled={true} />);
|
|
145
|
-
const rect = container.querySelector("rect");
|
|
146
|
-
expect(rect).toHaveClass("fill-checkbox-bg-surface-disabled");
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
it("applies disabled styling to checked icon", () => {
|
|
150
|
-
const { container } = render(
|
|
151
|
-
<Checkbox name="test" disabled={true} checked={true} />
|
|
152
|
-
);
|
|
153
|
-
const rect = container.querySelector("rect");
|
|
154
|
-
expect(rect).toHaveClass("fill-checkbox-bg-surface-selected-disabled");
|
|
155
|
-
});
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
describe("focus state", () => {
|
|
159
|
-
it("applies focus outline class when state is focus", () => {
|
|
160
|
-
const { container } = render(<Checkbox name="test" state="focus" />);
|
|
161
|
-
const label = container.querySelector("label");
|
|
162
|
-
expect(label?.className).toContain("outline");
|
|
163
|
-
});
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
describe("required", () => {
|
|
167
|
-
it("sets required attribute when required is true", () => {
|
|
168
|
-
render(<Checkbox name="test" required={true} />);
|
|
169
|
-
const input = screen.getByRole("checkbox");
|
|
170
|
-
expect(input).toBeRequired();
|
|
171
|
-
});
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
describe("id handling", () => {
|
|
175
|
-
it("uses provided id for input and label", () => {
|
|
176
|
-
render(<Checkbox name="test" id="custom-id" label="Label" />);
|
|
177
|
-
const input = screen.getByRole("checkbox");
|
|
178
|
-
expect(input).toHaveAttribute("id", "custom-id");
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
it("falls back to name when id is not provided", () => {
|
|
182
|
-
render(<Checkbox name="fallback-name" label="Label" />);
|
|
183
|
-
const input = screen.getByRole("checkbox");
|
|
184
|
-
expect(input).toHaveAttribute("id", "fallback-name");
|
|
185
|
-
});
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
describe("data-cy attribute", () => {
|
|
189
|
-
it("passes data-cy to the input element", () => {
|
|
190
|
-
render(<Checkbox name="test" data-cy="checkbox-cy" />);
|
|
191
|
-
const input = screen.getByRole("checkbox");
|
|
192
|
-
expect(input).toHaveAttribute("data-cy", "checkbox-cy");
|
|
193
|
-
});
|
|
194
|
-
});
|
|
195
|
-
|
|
196
|
-
describe("renderInfoIcon", () => {
|
|
197
|
-
it("renders info icon button when renderInfoIcon is provided", () => {
|
|
198
|
-
const onClick = jest.fn();
|
|
199
|
-
render(
|
|
200
|
-
<Checkbox
|
|
201
|
-
name="test"
|
|
202
|
-
renderInfoIcon={{ onClick, dataTestId: "info-btn" }}
|
|
203
|
-
/>
|
|
204
|
-
);
|
|
205
|
-
expect(screen.getByTestId("info-btn")).toBeInTheDocument();
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
it("calls onClick when info icon is clicked", () => {
|
|
209
|
-
const onClick = jest.fn();
|
|
210
|
-
render(
|
|
211
|
-
<Checkbox
|
|
212
|
-
name="test"
|
|
213
|
-
renderInfoIcon={{ onClick, dataTestId: "info-btn" }}
|
|
214
|
-
/>
|
|
215
|
-
);
|
|
216
|
-
fireEvent.click(screen.getByTestId("info-btn"));
|
|
217
|
-
expect(onClick).toHaveBeenCalledTimes(1);
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
it("does not render info icon when renderInfoIcon is not provided", () => {
|
|
221
|
-
const { container } = render(<Checkbox name="test" />);
|
|
222
|
-
const buttons = container.querySelectorAll("button");
|
|
223
|
-
expect(buttons.length).toBe(0);
|
|
224
|
-
});
|
|
225
|
-
});
|
|
226
|
-
|
|
227
|
-
describe("containerClassName", () => {
|
|
228
|
-
it("applies containerClassName to the wrapper div", () => {
|
|
229
|
-
const { container } = render(
|
|
230
|
-
<Checkbox name="test" containerClassName="wrapper-class" />
|
|
231
|
-
);
|
|
232
|
-
const wrapper = container.firstChild as HTMLElement;
|
|
233
|
-
expect(wrapper.className).toContain("wrapper-class");
|
|
234
|
-
});
|
|
235
|
-
});
|
|
236
|
-
|
|
237
|
-
describe("checked icon rendering", () => {
|
|
238
|
-
it("renders checkmark SVG when checked", () => {
|
|
239
|
-
const { container } = render(<Checkbox name="test" checked={true} />);
|
|
240
|
-
const paths = container.querySelectorAll("path");
|
|
241
|
-
// Checked state has a checkmark path
|
|
242
|
-
expect(paths.length).toBeGreaterThan(0);
|
|
243
|
-
});
|
|
244
|
-
|
|
245
|
-
it("renders empty box SVG when unchecked", () => {
|
|
246
|
-
const { container } = render(<Checkbox name="test" checked={false} />);
|
|
247
|
-
const rects = container.querySelectorAll("rect");
|
|
248
|
-
// Unchecked state has border rects
|
|
249
|
-
expect(rects.length).toBeGreaterThan(0);
|
|
250
|
-
});
|
|
251
|
-
});
|
|
252
|
-
});
|
|
1
|
+
/// <reference types="@testing-library/jest-dom" />
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { Checkbox } from "./index";
|
|
4
|
+
|
|
5
|
+
import { fireEvent, render, screen } from "@testing-library/react";
|
|
6
|
+
|
|
7
|
+
jest.mock("@shared/components/button", () => {
|
|
8
|
+
const MockButton = React.forwardRef<
|
|
9
|
+
HTMLButtonElement,
|
|
10
|
+
React.ButtonHTMLAttributes<HTMLButtonElement>
|
|
11
|
+
>(({ children, ...props }, ref) => (
|
|
12
|
+
<button ref={ref} {...props}>
|
|
13
|
+
{children}
|
|
14
|
+
</button>
|
|
15
|
+
));
|
|
16
|
+
MockButton.displayName = "MockButton";
|
|
17
|
+
return { Button: MockButton };
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
jest.mock("@shared/utils", () => ({
|
|
21
|
+
cx: (...args: unknown[]) => args.filter(Boolean).join(" "),
|
|
22
|
+
}));
|
|
23
|
+
|
|
24
|
+
describe("Checkbox", () => {
|
|
25
|
+
describe("rendering", () => {
|
|
26
|
+
it("renders an unchecked checkbox by default", () => {
|
|
27
|
+
render(<Checkbox name="test" />);
|
|
28
|
+
const input = screen.getByRole("checkbox");
|
|
29
|
+
expect(input).not.toBeChecked();
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it("renders a checked checkbox when checked is true", () => {
|
|
33
|
+
render(<Checkbox name="test" checked={true} />);
|
|
34
|
+
const input = screen.getByRole("checkbox");
|
|
35
|
+
expect(input).toBeChecked();
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it("renders with the correct name attribute", () => {
|
|
39
|
+
render(<Checkbox name="agreement" />);
|
|
40
|
+
const input = screen.getByRole("checkbox");
|
|
41
|
+
expect(input).toHaveAttribute("name", "agreement");
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it("renders with the correct value attribute", () => {
|
|
45
|
+
render(<Checkbox name="test" value="yes" />);
|
|
46
|
+
const input = screen.getByRole("checkbox");
|
|
47
|
+
expect(input).toHaveAttribute("value", "yes");
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it("applies displayName correctly", () => {
|
|
51
|
+
expect(Checkbox.displayName).toBe("Checkbox");
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
describe("label", () => {
|
|
56
|
+
it("renders a string label", () => {
|
|
57
|
+
render(<Checkbox name="test" label="Accept terms" />);
|
|
58
|
+
expect(screen.getByText("Accept terms")).toBeInTheDocument();
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it("renders a ReactNode label", () => {
|
|
62
|
+
render(
|
|
63
|
+
<Checkbox
|
|
64
|
+
name="test"
|
|
65
|
+
label={<span data-testid="custom-label">Custom</span>}
|
|
66
|
+
/>
|
|
67
|
+
);
|
|
68
|
+
expect(screen.getByTestId("custom-label")).toBeInTheDocument();
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it("does not render label element when label is not provided", () => {
|
|
72
|
+
const { container } = render(<Checkbox name="test" />);
|
|
73
|
+
const labels = container.querySelectorAll("label");
|
|
74
|
+
// Only the icon label, no text label
|
|
75
|
+
expect(labels.length).toBe(1);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it("applies labelClassName to the label", () => {
|
|
79
|
+
render(
|
|
80
|
+
<Checkbox name="test" label="Label" labelClassName="custom-label" />
|
|
81
|
+
);
|
|
82
|
+
const label = screen.getByText("Label");
|
|
83
|
+
expect(label.className).toContain("custom-label");
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it("applies error class to label when error is true", () => {
|
|
87
|
+
render(<Checkbox name="test" label="Label" error={true} />);
|
|
88
|
+
const label = screen.getByText("Label");
|
|
89
|
+
expect(label.className).toContain("text-text-critical");
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
describe("interactive behavior", () => {
|
|
94
|
+
it("calls onChange with boolean when handler expects a parameter", () => {
|
|
95
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
96
|
+
const handleChange = jest.fn((_isChecked: boolean) => undefined);
|
|
97
|
+
render(<Checkbox name="test" onChange={handleChange} />);
|
|
98
|
+
const input = screen.getByRole("checkbox");
|
|
99
|
+
fireEvent.click(input);
|
|
100
|
+
expect(handleChange).toHaveBeenCalledWith(true);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it("calls onChange without parameters for zero-arity handler", () => {
|
|
104
|
+
const handleChange = jest.fn();
|
|
105
|
+
// Override length to simulate zero-arity
|
|
106
|
+
Object.defineProperty(handleChange, "length", { value: 0 });
|
|
107
|
+
render(<Checkbox name="test" onChange={handleChange} />);
|
|
108
|
+
const input = screen.getByRole("checkbox");
|
|
109
|
+
fireEvent.click(input);
|
|
110
|
+
expect(handleChange).toHaveBeenCalled();
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it("does not call onChange when disabled", () => {
|
|
114
|
+
const handleChange = jest.fn();
|
|
115
|
+
render(<Checkbox name="test" onChange={handleChange} disabled={true} />);
|
|
116
|
+
const input = screen.getByRole("checkbox");
|
|
117
|
+
fireEvent.click(input);
|
|
118
|
+
expect(handleChange).not.toHaveBeenCalled();
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it("does not call onChange when state is disabled", () => {
|
|
122
|
+
const handleChange = jest.fn();
|
|
123
|
+
render(<Checkbox name="test" onChange={handleChange} state="disabled" />);
|
|
124
|
+
const input = screen.getByRole("checkbox");
|
|
125
|
+
fireEvent.click(input);
|
|
126
|
+
expect(handleChange).not.toHaveBeenCalled();
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
describe("disabled state", () => {
|
|
131
|
+
it("sets disabled attribute when disabled prop is true", () => {
|
|
132
|
+
render(<Checkbox name="test" disabled={true} />);
|
|
133
|
+
const input = screen.getByRole("checkbox");
|
|
134
|
+
expect(input).toBeDisabled();
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it("sets disabled attribute when state is disabled", () => {
|
|
138
|
+
render(<Checkbox name="test" state="disabled" />);
|
|
139
|
+
const input = screen.getByRole("checkbox");
|
|
140
|
+
expect(input).toBeDisabled();
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it("applies disabled styling to unchecked icon", () => {
|
|
144
|
+
const { container } = render(<Checkbox name="test" disabled={true} />);
|
|
145
|
+
const rect = container.querySelector("rect");
|
|
146
|
+
expect(rect).toHaveClass("fill-checkbox-bg-surface-disabled");
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
it("applies disabled styling to checked icon", () => {
|
|
150
|
+
const { container } = render(
|
|
151
|
+
<Checkbox name="test" disabled={true} checked={true} />
|
|
152
|
+
);
|
|
153
|
+
const rect = container.querySelector("rect");
|
|
154
|
+
expect(rect).toHaveClass("fill-checkbox-bg-surface-selected-disabled");
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
describe("focus state", () => {
|
|
159
|
+
it("applies focus outline class when state is focus", () => {
|
|
160
|
+
const { container } = render(<Checkbox name="test" state="focus" />);
|
|
161
|
+
const label = container.querySelector("label");
|
|
162
|
+
expect(label?.className).toContain("outline");
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
describe("required", () => {
|
|
167
|
+
it("sets required attribute when required is true", () => {
|
|
168
|
+
render(<Checkbox name="test" required={true} />);
|
|
169
|
+
const input = screen.getByRole("checkbox");
|
|
170
|
+
expect(input).toBeRequired();
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
describe("id handling", () => {
|
|
175
|
+
it("uses provided id for input and label", () => {
|
|
176
|
+
render(<Checkbox name="test" id="custom-id" label="Label" />);
|
|
177
|
+
const input = screen.getByRole("checkbox");
|
|
178
|
+
expect(input).toHaveAttribute("id", "custom-id");
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
it("falls back to name when id is not provided", () => {
|
|
182
|
+
render(<Checkbox name="fallback-name" label="Label" />);
|
|
183
|
+
const input = screen.getByRole("checkbox");
|
|
184
|
+
expect(input).toHaveAttribute("id", "fallback-name");
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
describe("data-cy attribute", () => {
|
|
189
|
+
it("passes data-cy to the input element", () => {
|
|
190
|
+
render(<Checkbox name="test" data-cy="checkbox-cy" />);
|
|
191
|
+
const input = screen.getByRole("checkbox");
|
|
192
|
+
expect(input).toHaveAttribute("data-cy", "checkbox-cy");
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
describe("renderInfoIcon", () => {
|
|
197
|
+
it("renders info icon button when renderInfoIcon is provided", () => {
|
|
198
|
+
const onClick = jest.fn();
|
|
199
|
+
render(
|
|
200
|
+
<Checkbox
|
|
201
|
+
name="test"
|
|
202
|
+
renderInfoIcon={{ onClick, dataTestId: "info-btn" }}
|
|
203
|
+
/>
|
|
204
|
+
);
|
|
205
|
+
expect(screen.getByTestId("info-btn")).toBeInTheDocument();
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
it("calls onClick when info icon is clicked", () => {
|
|
209
|
+
const onClick = jest.fn();
|
|
210
|
+
render(
|
|
211
|
+
<Checkbox
|
|
212
|
+
name="test"
|
|
213
|
+
renderInfoIcon={{ onClick, dataTestId: "info-btn" }}
|
|
214
|
+
/>
|
|
215
|
+
);
|
|
216
|
+
fireEvent.click(screen.getByTestId("info-btn"));
|
|
217
|
+
expect(onClick).toHaveBeenCalledTimes(1);
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
it("does not render info icon when renderInfoIcon is not provided", () => {
|
|
221
|
+
const { container } = render(<Checkbox name="test" />);
|
|
222
|
+
const buttons = container.querySelectorAll("button");
|
|
223
|
+
expect(buttons.length).toBe(0);
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
describe("containerClassName", () => {
|
|
228
|
+
it("applies containerClassName to the wrapper div", () => {
|
|
229
|
+
const { container } = render(
|
|
230
|
+
<Checkbox name="test" containerClassName="wrapper-class" />
|
|
231
|
+
);
|
|
232
|
+
const wrapper = container.firstChild as HTMLElement;
|
|
233
|
+
expect(wrapper.className).toContain("wrapper-class");
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
describe("checked icon rendering", () => {
|
|
238
|
+
it("renders checkmark SVG when checked", () => {
|
|
239
|
+
const { container } = render(<Checkbox name="test" checked={true} />);
|
|
240
|
+
const paths = container.querySelectorAll("path");
|
|
241
|
+
// Checked state has a checkmark path
|
|
242
|
+
expect(paths.length).toBeGreaterThan(0);
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
it("renders empty box SVG when unchecked", () => {
|
|
246
|
+
const { container } = render(<Checkbox name="test" checked={false} />);
|
|
247
|
+
const rects = container.querySelectorAll("rect");
|
|
248
|
+
// Unchecked state has border rects
|
|
249
|
+
expect(rects.length).toBeGreaterThan(0);
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
});
|