Skip to content

Commit 36daa7a

Browse files
authored
test(PageHeader): react tests clean up with composeStory (#8579)
* test(PageHeader): use composeStory to test from actual stories * chore: add license
1 parent 6b00db0 commit 36daa7a

File tree

4 files changed

+61
-55
lines changed

4 files changed

+61
-55
lines changed

config/jest-config-ibm-cloud-cognitive/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ module.exports = {
5151
// This mapping is added to resolve the alias that is set in our webpack config
5252
// otherwise the webpack alias does not work in the jest environment
5353
'\\.(css|scss)$': 'identity-obj-proxy',
54+
'\\.(css|less|scss|sass)\\?inline$': require.resolve(
55+
'./setup/styleMock.js'
56+
),
5457
},
5558
modulePathIgnorePatterns: ['/build/', '/es/', '/lib/', '/umd/', '/examples/'],
5659
reporters: ['default'],
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/**
2+
* Copyright IBM Corp. 2025, 2025
3+
*
4+
* This source code is licensed under the Apache-2.0 license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
module.exports = {};

packages/ibm-products/src/components/PageHeader/next/PageHeader.stories.jsx

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* This source code is licensed under the Apache-2.0 license found in the
55
* LICENSE file in the root directory of this source tree.
66
*/
7-
import React, { cloneElement } from 'react';
7+
import React from 'react';
88
import {
99
preview__PageHeader as PageHeader,
1010
preview__TruncatedText as TruncatedText,
@@ -124,14 +124,21 @@ const breadcrumbPageActions = (
124124
</>
125125
);
126126

127-
export const Default = (args) => (
127+
export const Default = ({
128+
border,
129+
pageActionsFlush,
130+
contentActionsFlush,
131+
renderBreadcrumbIcon,
132+
title,
133+
...args
134+
}) => (
128135
<Tabs>
129-
<PageHeader.Root>
136+
<PageHeader.Root {...args}>
130137
<PageHeader.BreadcrumbBar
131-
border={args.border}
132-
pageActionsFlush={args.pageActionsFlush}
133-
contentActionsFlush={args.contentActionsFlush}
134-
renderIcon={args.renderBreadcrumbIcon ? BreadcrumbBeeIcon : null}
138+
border={border}
139+
pageActionsFlush={pageActionsFlush}
140+
contentActionsFlush={contentActionsFlush}
141+
renderIcon={renderBreadcrumbIcon ? BreadcrumbBeeIcon : null}
135142
contentActions={
136143
<>
137144
<IconButton
@@ -179,7 +186,7 @@ export const Default = (args) => (
179186
</Breadcrumb>
180187
</PageHeader.BreadcrumbBar>
181188
<PageHeader.Content
182-
title={args.title}
189+
title={title}
183190
pageActions={
184191
<PageHeader.ContentPageActions
185192
menuButtonLabel="Actions"

packages/ibm-products/src/components/PageHeader/next/PageHeader.test.js

Lines changed: 35 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import React, { cloneElement } from 'react';
99
import { render, screen, act, waitFor } from '@testing-library/react';
1010
import userEvent from '@testing-library/user-event';
11+
import { composeStory } from '@storybook/react-vite';
12+
import meta, { Compact, Default } from './PageHeader.stories';
1113
import { preview__PageHeader as PageHeader, pkg } from '../../..';
1214
import {
1315
PageHeader as PageHeaderDirect,
@@ -75,13 +77,12 @@ describe('PageHeader', () => {
7577

7678
it('should update css variable for sticky positioning', () => {
7779
const testId = 'page-header-next-test-id';
78-
render(
79-
<PageHeader.Root data-testid={testId}>
80-
<PageHeader.BreadcrumbBar />
81-
<PageHeader.Content title="title" />
82-
<PageHeader.TabBar />
83-
</PageHeader.Root>
84-
);
80+
const DefaultStory = composeStory(Default, meta, {
81+
args: {
82+
'data-testid': testId,
83+
},
84+
});
85+
render(<DefaultStory />);
8586
triggerResize();
8687
const computedStyle = window.getComputedStyle(screen.getByTestId(testId));
8788
expect(
@@ -97,13 +98,8 @@ describe('PageHeader', () => {
9798
});
9899

99100
it('supports dot notation component namespacing from the main entrypoint', () => {
100-
const { container } = render(
101-
<PageHeader.Root>
102-
<PageHeader.BreadcrumbBar />
103-
<PageHeader.Content title="title" />
104-
<PageHeader.TabBar />
105-
</PageHeader.Root>
106-
);
101+
const DefaultStory = composeStory(Default, meta);
102+
const { container } = render(<DefaultStory />);
107103
expect(container.firstChild).toBeInTheDocument();
108104
});
109105

@@ -126,10 +122,15 @@ describe('PageHeader', () => {
126122
});
127123

128124
it('should place className on the outermost element', () => {
129-
const { container } = render(
130-
<PageHeader.Root className="custom-class" />
131-
);
132-
expect(container.firstChild).toHaveClass('custom-class');
125+
const DefaultStory = composeStory(Default, meta, {
126+
args: {
127+
className: 'custom-class',
128+
role: 'banner',
129+
},
130+
});
131+
render(<DefaultStory />);
132+
const pageHeaderOuter = screen.getByRole('banner');
133+
expect(pageHeaderOuter).toHaveClass('custom-class');
133134
});
134135
});
135136

@@ -170,18 +171,15 @@ describe('PageHeader', () => {
170171
});
171172

172173
it('should render breadcrumb items', () => {
173-
const { container } = render(
174-
<PageHeader.Root>
175-
<PageHeader.BreadcrumbBar>
176-
<Breadcrumb>
177-
<BreadcrumbItem href="/#">Breadcrumb 1</BreadcrumbItem>
178-
<BreadcrumbItem href="#">Breadcrumb 2</BreadcrumbItem>
179-
</Breadcrumb>
180-
</PageHeader.BreadcrumbBar>
181-
</PageHeader.Root>
182-
);
174+
const DefaultStory = composeStory(Default, meta, {
175+
args: {
176+
role: 'banner',
177+
},
178+
});
179+
render(<DefaultStory />);
183180

184-
const breadcrumbs = container.getElementsByClassName(
181+
const pageHeaderOuter = screen.getByRole('banner');
182+
const breadcrumbs = pageHeaderOuter.getElementsByClassName(
185183
`${carbonPrefix}--breadcrumb-item`
186184
);
187185

@@ -440,15 +438,9 @@ describe('PageHeader', () => {
440438
});
441439

442440
it('should use a custom menuButtonLabel if provided', () => {
443-
render(
444-
<PageHeader.Root>
445-
<PageHeader.ContentPageActions
446-
actions={mockPageActions}
447-
menuButtonLabel="Options"
448-
/>
449-
</PageHeader.Root>
450-
);
451-
expect(screen.getByText('Options')).toBeInTheDocument();
441+
const CompactStory = composeStory(Compact, meta);
442+
render(<CompactStory />);
443+
expect(screen.getByText('Actions')).toBeInTheDocument();
452444
});
453445

454446
it('should call onClick of hidden action when MenuItem is clicked', async () => {
@@ -508,13 +500,10 @@ describe('PageHeader', () => {
508500
});
509501

510502
it('should render a subtitle', () => {
511-
render(
512-
<PageHeader.Root>
513-
<PageHeader.ContentText subtitle="subtitle" />
514-
</PageHeader.Root>
515-
);
503+
const DefaultStory = composeStory(Default, meta);
504+
render(<DefaultStory />);
516505

517-
expect(screen.getByText('subtitle')).toBeInTheDocument();
506+
expect(screen.getByText('Subtitle')).toBeInTheDocument();
518507
});
519508
});
520509

@@ -1003,9 +992,8 @@ describe('PageHeader', () => {
1003992
);
1004993
const scrollerButton = screen.getByLabelText('Collapse');
1005994
expect(scrollerButton).toBeInTheDocument();
1006-
1007-
await act(() => {
1008-
userEvent.click(scrollerButton);
995+
await waitFor(async () => {
996+
await userEvent.click(scrollerButton);
1009997
});
1010998
expect(scrollerOnClick).toHaveBeenCalledTimes(1);
1011999
});

0 commit comments

Comments
 (0)