Skip to content

Commit 897374d

Browse files
Copilotjoshblack
andauthored
Migrate batch of components from Jest to Vitest (#6356)
Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: joshblack <[email protected]> Co-authored-by: Josh Black <[email protected]>
1 parent e8de4fc commit 897374d

File tree

9 files changed

+51
-121
lines changed

9 files changed

+51
-121
lines changed

packages/react/jest.config.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,17 +39,20 @@ module.exports = {
3939
'<rootDir>/src/FeatureFlags/',
4040
'<rootDir>/src/Flash/',
4141
'<rootDir>/src/FormControl/',
42+
'<rootDir>/src/Header/',
4243
'<rootDir>/src/InlineMessage/',
4344
'<rootDir>/src/Hidden/',
4445
'<rootDir>/src/KeybindingHint/',
4546
'<rootDir>/src/Label/',
4647
'<rootDir>/src/LabelGroup/',
48+
'<rootDir>/src/Link/',
4749
'<rootDir>/src/NavList/',
4850
'<rootDir>/src/Octicon/',
4951
'<rootDir>/src/Overlay/',
5052
'<rootDir>/src/PageLayout/',
5153
'<rootDir>/src/Pagehead/',
5254
'<rootDir>/src/Pagination/',
55+
'<rootDir>/src/Popover/',
5356
'<rootDir>/src/Portal/',
5457
'<rootDir>/src/ProgressBar/',
5558
'<rootDir>/src/Radio/',
Lines changed: 14 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,41 @@
1+
import {describe, expect, it} from 'vitest'
2+
import {render} from '@testing-library/react'
13
import {Header} from '..'
2-
import {render, behavesAsComponent, checkExports} from '../utils/testing'
3-
import {render as HTMLRender} from '@testing-library/react'
4-
import axe from 'axe-core'
54

65
describe('Header', () => {
7-
behavesAsComponent({Component: Header})
8-
9-
checkExports('Header', {
10-
default: Header,
11-
})
12-
136
describe('Header.Item', () => {
14-
behavesAsComponent({Component: Header.Item, options: {skipAs: true}})
15-
167
it('accepts and applies className', () => {
17-
expect(render(<Header.Item className="primer" />).props.className).toContain('primer')
8+
const {container} = render(<Header.Item className="primer" />)
9+
expect(container.firstChild).toHaveClass('primer')
1810
})
1911

2012
it('should support `className` on the outermost element', () => {
2113
const Element = () => <Header.Item className={'test-class-name'} />
22-
expect(HTMLRender(<Element />).container.firstChild).toHaveClass('test-class-name')
14+
expect(render(<Element />).container.firstChild).toHaveClass('test-class-name')
2315
})
2416
})
2517

2618
describe('Header.Link', () => {
27-
behavesAsComponent({Component: Header.Link})
28-
2919
it('should support `className` on the outermost element', () => {
3020
const Element = () => <Header.Link className={'test-class-name'} />
31-
expect(HTMLRender(<Element />).container.firstChild).toHaveClass('test-class-name')
21+
expect(render(<Element />).container.firstChild).toHaveClass('test-class-name')
3222
})
3323
})
3424

35-
it('should have no axe violations', async () => {
36-
const {container} = HTMLRender(
37-
<Header>
38-
<Header.Item full>
39-
<Header.Link href="#">One</Header.Link>
40-
</Header.Item>
41-
<Header.Item>
42-
<Header.Link href="#">Two</Header.Link>
43-
</Header.Item>
44-
<Header.Item>Three</Header.Item>
45-
</Header>,
46-
)
47-
const results = await axe.run(container)
48-
expect(results).toHaveNoViolations()
49-
})
50-
51-
it('renders a <div> and <a>', () => {
52-
expect(render(<Header />).type).toEqual('header')
53-
expect(render(<Header.Link />).type).toEqual('a')
25+
it('renders a <header> and <a>', () => {
26+
const {container: headerContainer} = render(<Header />)
27+
const {container: linkContainer} = render(<Header.Link />)
28+
expect((headerContainer.firstChild as Element).tagName).toEqual('HEADER')
29+
expect((linkContainer.firstChild as Element).tagName).toEqual('A')
5430
})
5531

5632
it('sets aria-label appropriately', () => {
57-
expect(render(<Header aria-label="Test label" />).props['aria-label']).toEqual('Test label')
33+
const {container} = render(<Header aria-label="Test label" />)
34+
expect(container.firstChild).toHaveAttribute('aria-label', 'Test label')
5835
})
5936

6037
it('should support `className` on the outermost element', () => {
6138
const Element = () => <Header className={'test-class-name'} />
62-
expect(HTMLRender(<Element />).container.firstChild).toHaveClass('test-class-name')
39+
expect(render(<Element />).container.firstChild).toHaveClass('test-class-name')
6340
})
6441
})

packages/react/src/Hidden/Hidden.test.tsx

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,6 @@ import {describe, it, expect} from 'vitest'
33
import {Hidden} from '../Hidden'
44

55
describe('Hidden', () => {
6-
it('renders `when` prop as expected', () => {
7-
const {container} = render(
8-
<Hidden when={'narrow'}>
9-
<div>Hidden when narrow</div>
10-
</Hidden>,
11-
)
12-
expect(container).toMatchSnapshot()
13-
})
14-
156
it('renders the styles as expected when a single viewport value is provided as a string via `when` prop', () => {
167
const hiddenElement = render(
178
<div data-testid="hidden-regular">

packages/react/src/Hidden/__snapshots__/Hidden.test.tsx.snap

Lines changed: 0 additions & 14 deletions
This file was deleted.

packages/react/src/Link/__tests__/Link.test.tsx

Lines changed: 20 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,48 @@
1-
import Link from '..'
2-
import {render, behavesAsComponent, checkExports} from '../../utils/testing'
3-
import {render as HTMLRender} from '@testing-library/react'
4-
import axe from 'axe-core'
1+
import {describe, expect, it, vi} from 'vitest'
2+
import {render} from '@testing-library/react'
3+
import Link from '../Link'
54

65
describe('Link', () => {
7-
behavesAsComponent({Component: Link})
8-
9-
checkExports('Link', {
10-
default: Link,
11-
})
12-
136
it('should support `className` on the outermost element', () => {
147
const Element = () => <Link href="#" className={'test-class-name'} />
15-
expect(HTMLRender(<Element />).container.firstChild).toHaveClass('test-class-name')
16-
})
17-
18-
it('should have no axe violations', async () => {
19-
const {container} = HTMLRender(<Link href="www.github.com">GitHub</Link>)
20-
const results = await axe.run(container)
21-
expect(results).toHaveNoViolations()
8+
expect(render(<Element />).container.firstChild).toHaveClass('test-class-name')
229
})
2310

2411
it('passes href down to link element', () => {
25-
expect(render(<Link href="https://github.com" />)).toMatchSnapshot()
12+
const {container} = render(<Link href="https://github.com" />)
13+
expect(container.firstChild).toHaveAttribute('href', 'https://github.com')
2614
})
2715

2816
it('respects hoverColor prop', () => {
29-
expect(render(<Link hoverColor="accent.fg" />)).toMatchSnapshot()
17+
const {container} = render(<Link hoverColor="accent.fg" />)
18+
expect(container.firstChild).toHaveStyle('--fgColor-accent: #0969da')
3019
})
3120

3221
it('respects the "sx" prop', () => {
33-
expect(render(<Link sx={{fontStyle: 'italic'}} />)).toHaveStyleRule('font-style', 'italic')
22+
const {container} = render(<Link sx={{fontStyle: 'italic'}} />)
23+
expect(container.firstChild).toHaveStyle('font-style: italic')
3424
})
3525

3626
it('applies button styles when rendering a button element', () => {
37-
expect(render(<Link as="button" />)).toMatchSnapshot()
27+
const {container} = render(<Link as="button" />)
28+
expect((container.firstChild as Element).tagName).toBe('BUTTON')
3829
})
3930

4031
it('respects the "muted" prop', () => {
41-
expect(render(<Link muted />)).toMatchSnapshot()
32+
const {container} = render(<Link muted />)
33+
expect(container.firstChild).toHaveAttribute('data-muted', 'true')
4234
})
4335

44-
it('respects the "sx" prop when "muted" prop is also passed', () => {
45-
expect(render(<Link muted sx={{color: 'fg.onEmphasis'}} />)).toMatchSnapshot()
36+
it('respects the "sx" prop when "muted" prop is also passed', () => {
37+
const {container} = render(<Link muted sx={{color: 'fg.onEmphasis'}} />)
38+
expect(container.firstChild).toHaveAttribute('data-muted', 'true')
39+
expect(container.firstChild).toHaveStyle('color: rgb(89, 99, 110)')
4640
})
4741

4842
it('logs a warning when trying to render invalid "as" prop', () => {
49-
const consoleSpy = jest.spyOn(global.console, 'error').mockImplementation()
43+
const consoleSpy = vi.spyOn(globalThis.console, 'error').mockImplementation(() => {})
5044

51-
HTMLRender(<Link as="i" />)
45+
render(<Link as="i" />)
5246
expect(consoleSpy).toHaveBeenCalled()
5347

5448
consoleSpy.mockRestore()

packages/react/src/Link/__tests__/__snapshots__/Link.test.tsx.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Jest Snapshot v1, https://goo.gl/fbAQLP
1+
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
22

33
exports[`Link applies button styles when rendering a button element 1`] = `
44
<button
Lines changed: 9 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,12 @@
1+
import {describe, expect, it} from 'vitest'
2+
import {render} from '@testing-library/react'
13
import type {PopoverProps} from '../Popover'
24
import Popover from '../Popover'
3-
import {render, behavesAsComponent, checkExports} from '../utils/testing'
4-
import {render as HTMLRender} from '@testing-library/react'
5-
import axe from 'axe-core'
6-
7-
const comp = (
8-
<Popover caret="top" open>
9-
<Popover.Content>Hello!</Popover.Content>
10-
</Popover>
11-
)
125

136
describe('Popover', () => {
14-
behavesAsComponent({Component: Popover, toRender: () => comp})
15-
16-
checkExports('Popover', {
17-
default: Popover,
18-
})
19-
20-
describe('Popover.Content', () => {
21-
behavesAsComponent({Component: Popover.Content, toRender: () => comp})
22-
})
23-
247
it('should support `className` on the outermost element', () => {
258
const Element = () => <Popover className={'test-class-name'}></Popover>
26-
expect(HTMLRender(<Element />).container.firstChild).toHaveClass('test-class-name')
27-
})
28-
29-
it('should have no axe violations', async () => {
30-
const {container} = HTMLRender(
31-
<Popover caret="top" open>
32-
<Popover.Content>Hello!</Popover.Content>
33-
</Popover>,
34-
)
35-
const results = await axe.run(container)
36-
expect(results).toHaveNoViolations()
9+
expect(render(<Element />).container.firstChild).toHaveClass('test-class-name')
3710
})
3811

3912
const CARET_POSITIONS: PopoverProps['caret'][] = [
@@ -59,12 +32,15 @@ describe('Popover', () => {
5932
</Popover>
6033
)
6134

62-
expect(render(element)).toMatchSnapshot()
35+
const {container} = render(element)
36+
expect(container.firstChild).toHaveAttribute('data-caret', pos)
6337
})
6438
}
6539

6640
it('renders both elements as a <div>', () => {
67-
expect(render(<Popover />).type).toEqual('div')
68-
expect(render(<Popover.Content />).type).toEqual('div')
41+
const {container: popoverContainer} = render(<Popover />)
42+
const {container: contentContainer} = render(<Popover.Content />)
43+
expect((popoverContainer.firstChild as Element).tagName).toEqual('DIV')
44+
expect((contentContainer.firstChild as Element).tagName).toEqual('DIV')
6945
})
7046
})

packages/react/src/Popover/__snapshots__/Popover.test.tsx.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Jest Snapshot v1, https://goo.gl/fbAQLP
1+
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
22

33
exports[`Popover renders correctly for a caret position of bottom 1`] = `
44
<div

packages/react/vitest.config.browser.mts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,19 @@ export default defineConfig({
5353
'src/Flash/**/*.test.?(c|m)[jt]s?(x)',
5454
'src/FormControl/**/*.test.?(c|m)[jt]s?(x)',
5555
'src/InlineMessage/**/*.test.?(c|m)[jt]s?(x)',
56+
'src/Header/**/*.test.?(c|m)[jt]s?(x)',
5657
'src/Hidden/**/*.test.?(c|m)[jt]s?(x)',
5758
'src/KeybindingHint/**/*.test.?(c|m)[jt]s?(x)',
5859
'src/Label/**/*.test.?(c|m)[jt]s?(x)',
5960
'src/LabelGroup/**/*.test.?(c|m)[jt]s?(x)',
61+
'src/Link/**/*.test.?(c|m)[jt]s?(x)',
6062
'src/NavList/**/*.test.?(c|m)[jt]s?(x)',
6163
'src/Octicon/**/*.test.?(c|m)[jt]s?(x)',
6264
'src/Overlay/**/*.test.?(c|m)[jt]s?(x)',
6365
'src/PageLayout/**/*.test.?(c|m)[jt]s?(x)',
6466
'src/Pagehead/**/*.test.?(c|m)[jt]s?(x)',
6567
'src/Pagination/**/*.test.?(c|m)[jt]s?(x)',
68+
'src/Popover/**/*.test.?(c|m)[jt]s?(x)',
6669
'src/Portal/**/*.test.?(c|m)[jt]s?(x)',
6770
'src/ProgressBar/**/*.test.?(c|m)[jt]s?(x)',
6871
'src/Radio/**/*.test.?(c|m)[jt]s?(x)',

0 commit comments

Comments
 (0)