Skip to content

Commit 42a4ce9

Browse files
authored
Merge pull request #352 from testing-library/next
chore(release): promote v5 as an main consumption release
2 parents e13a6b1 + 496c455 commit 42a4ce9

35 files changed

+457
-360
lines changed

.eslintrc.cjs

+4
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ module.exports = {
1414
plugins: ['svelte', 'simple-import-sort', 'json-files'],
1515
rules: {
1616
'simple-import-sort/imports': 'error',
17+
'simple-import-sort/exports': 'error',
1718
},
1819
overrides: [
1920
{
@@ -22,6 +23,9 @@ module.exports = {
2223
parserOptions: {
2324
parser: '@typescript-eslint/parser',
2425
},
26+
rules: {
27+
'no-undef-init': 'off',
28+
},
2529
},
2630
{
2731
files: ['*.ts'],

.github/workflows/release.yml

+15
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ on:
55
branches: [main, next]
66
pull_request:
77
branches: [main, next]
8+
schedule:
9+
# Tuesdays at 14:45 UTC (10:45 EST)
10+
- cron: 45 14 * * 1
811

912
concurrency:
1013
group: ${{ github.workflow }}-${{ github.ref }}
@@ -16,11 +19,23 @@ jobs:
1619
if: ${{ !contains(github.head_ref, 'all-contributors') }}
1720
name: Node ${{ matrix.node }}, Svelte ${{ matrix.svelte }}, ${{ matrix.test-runner }}
1821
runs-on: ubuntu-latest
22+
continue-on-error: ${{ matrix.experimental }}
1923
strategy:
24+
fail-fast: false
2025
matrix:
2126
node: ['16', '18', '20']
2227
svelte: ['3', '4']
2328
test-runner: ['vitest:jsdom', 'vitest:happy-dom']
29+
experimental: [false]
30+
include:
31+
- node: '20'
32+
svelte: 'next'
33+
test-runner: 'vitest:jsdom'
34+
experimental: true
35+
- node: '20'
36+
svelte: 'next'
37+
test-runner: 'vitest:happy-dom'
38+
experimental: true
2439

2540
steps:
2641
- name: ⬇️ Checkout repo

.prettierignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
scripts/*
22
.eslintignore
33
.prettierignore
4+
.all-contributorsrc

.prettierrc.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ trailingComma: es5
44
plugins:
55
- prettier-plugin-svelte
66
overrides:
7-
- files: "*.svelte"
7+
- files: '*.svelte'
88
options:
99
parser: svelte

README.md

+15
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,21 @@ This library has `peerDependencies` listings for `svelte >= 3`.
8080
You may also be interested in installing `@testing-library/jest-dom` so you can use
8181
[the custom jest matchers](https://github.com/testing-library/jest-dom).
8282

83+
### Svelte 5 support
84+
85+
If you are riding the bleeding edge of Svelte 5, you'll need to either
86+
import from `@testing-library/svelte/svelte5` instead of `@testing-library/svelte`, or have your `vite.config.js` contains the following alias:
87+
88+
```
89+
export default defineConfig(({ }) => ({
90+
test: {
91+
alias: {
92+
'@testing-library/svelte': '@testing-library/svelte/svelte5'
93+
}
94+
},
95+
}))
96+
```
97+
8398
## Docs
8499

85100
See the [**docs**](https://testing-library.com/docs/svelte-testing-library/intro) over at the Testing Library website.

package.json

+9-5
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88
"types": "./types/index.d.ts",
99
"default": "./src/index.js"
1010
},
11+
"./svelte5": {
12+
"types": "./types/index.d.ts",
13+
"default": "./src/svelte5-index.js"
14+
},
1115
"./vitest": {
1216
"default": "./src/vitest.js"
1317
}
@@ -64,13 +68,13 @@
6468
"contributors:generate": "all-contributors generate"
6569
},
6670
"peerDependencies": {
67-
"svelte": "^3 || ^4"
71+
"svelte": "^3 || ^4 || ^5"
6872
},
6973
"dependencies": {
7074
"@testing-library/dom": "^9.3.1"
7175
},
7276
"devDependencies": {
73-
"@sveltejs/vite-plugin-svelte": "^2.4.2",
77+
"@sveltejs/vite-plugin-svelte": "^3.0.2",
7478
"@testing-library/jest-dom": "^6.3.0",
7579
"@testing-library/user-event": "^14.5.2",
7680
"@typescript-eslint/eslint-plugin": "6.19.1",
@@ -89,16 +93,16 @@
8993
"eslint-plugin-svelte": "2.35.1",
9094
"eslint-plugin-vitest-globals": "1.4.0",
9195
"expect-type": "^0.17.3",
92-
"happy-dom": "^13.3.1",
96+
"happy-dom": "^14.7.1",
9397
"jsdom": "^22.1.0",
9498
"npm-run-all": "^4.1.5",
9599
"prettier": "3.2.4",
96100
"prettier-plugin-svelte": "3.1.2",
97-
"svelte": "^3 || ^4",
101+
"svelte": "^3 || ^4 || ^5",
98102
"svelte-check": "^3.6.3",
99103
"svelte-jester": "^3.0.0",
100104
"typescript": "^5.3.3",
101-
"vite": "^4.3.9",
105+
"vite": "^5.1.1",
102106
"vitest": "^0.33.0"
103107
}
104108
}

src/__tests__/__snapshots__/render.test.js.snap

-25
This file was deleted.

src/__tests__/act.test.js

+8-31
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,13 @@
1-
import { beforeEach, describe, expect, test } from 'vitest'
1+
import { setTimeout } from 'node:timers/promises'
2+
3+
import { act, render } from '@testing-library/svelte'
4+
import { describe, expect, test } from 'vitest'
25

3-
import { act, fireEvent, render as stlRender } from '..'
46
import Comp from './fixtures/Comp.svelte'
57

68
describe('act', () => {
7-
let props
8-
9-
const render = () => {
10-
return stlRender(Comp, {
11-
props
12-
})
13-
}
14-
15-
beforeEach(() => {
16-
props = {
17-
name: 'World'
18-
}
19-
})
20-
219
test('state updates are flushed', async () => {
22-
const { getByText } = render()
10+
const { getByText } = render(Comp)
2311
const button = getByText('Button')
2412

2513
expect(button).toHaveTextContent('Button')
@@ -31,24 +19,13 @@ describe('act', () => {
3119
expect(button).toHaveTextContent('Button Clicked')
3220
})
3321

34-
test('findByTestId returns the element', async () => {
35-
const { findByTestId } = render()
36-
37-
expect(await findByTestId('test')).toHaveTextContent(`Hello ${props.name}!`)
38-
})
39-
4022
test('accepts async functions', async () => {
41-
const sleep = (ms) =>
42-
new Promise((resolve) => {
43-
setTimeout(() => resolve(), ms)
44-
})
45-
46-
const { getByText } = render()
23+
const { getByText } = render(Comp)
4724
const button = getByText('Button')
4825

4926
await act(async () => {
50-
await sleep(100)
51-
await fireEvent.click(button)
27+
await setTimeout(100)
28+
button.click()
5229
})
5330

5431
expect(button).toHaveTextContent('Button Clicked')

src/__tests__/auto-cleanup-skip.test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ describe('auto-cleanup-skip', () => {
77

88
beforeAll(async () => {
99
process.env.STL_SKIP_AUTO_CLEANUP = 'true'
10-
const stl = await import('..')
10+
const stl = await import('@testing-library/svelte')
1111
render = stl.render
1212
})
1313

src/__tests__/auto-cleanup.test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
import { render } from '@testing-library/svelte'
12
import { describe, expect, test } from 'vitest'
23

3-
import { render } from '..'
44
import Comp from './fixtures/Comp.svelte'
55

66
describe('auto-cleanup', () => {

src/__tests__/cleanup.test.js

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { cleanup, render } from '@testing-library/svelte'
2+
import { describe, expect, test, vi } from 'vitest'
3+
4+
import Mounter from './fixtures/Mounter.svelte'
5+
6+
const onExecuted = vi.fn()
7+
const onDestroyed = vi.fn()
8+
const renderSubject = () => render(Mounter, { onExecuted, onDestroyed })
9+
10+
describe('cleanup', () => {
11+
test('cleanup deletes element', async () => {
12+
renderSubject()
13+
cleanup()
14+
15+
expect(document.body).toBeEmptyDOMElement()
16+
})
17+
18+
test('cleanup unmounts component', () => {
19+
renderSubject()
20+
cleanup()
21+
22+
expect(onDestroyed).toHaveBeenCalledOnce()
23+
})
24+
25+
test('cleanup handles unexpected errors during mount', () => {
26+
onExecuted.mockImplementation(() => {
27+
throw new Error('oh no!')
28+
})
29+
30+
expect(renderSubject).toThrowError()
31+
cleanup()
32+
33+
expect(document.body).toBeEmptyDOMElement()
34+
})
35+
})

src/__tests__/context.test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
import { render } from '@testing-library/svelte'
12
import { expect, test } from 'vitest'
23

3-
import { render } from '..'
44
import Comp from './fixtures/Context.svelte'
55

66
test('can set a context', () => {

src/__tests__/debug.test.js

+6-12
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,18 @@
11
import { prettyDOM } from '@testing-library/dom'
2-
import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'
2+
import { render } from '@testing-library/svelte'
3+
import { describe, expect, test, vi } from 'vitest'
34

4-
import { render } from '..'
55
import Comp from './fixtures/Comp.svelte'
66

77
describe('debug', () => {
8-
beforeEach(() => {
9-
vi.spyOn(console, 'log').mockImplementation(() => { })
10-
})
11-
12-
afterEach(() => {
13-
console.log.mockRestore()
14-
})
8+
test('pretty prints the base element', () => {
9+
vi.stubGlobal('console', { log: vi.fn(), warn: vi.fn(), error: vi.fn() })
1510

16-
test('pretty prints the container', () => {
17-
const { container, debug } = render(Comp, { props: { name: 'world' } })
11+
const { baseElement, debug } = render(Comp, { props: { name: 'world' } })
1812

1913
debug()
2014

2115
expect(console.log).toHaveBeenCalledTimes(1)
22-
expect(console.log).toHaveBeenCalledWith(prettyDOM(container))
16+
expect(console.log).toHaveBeenCalledWith(prettyDOM(baseElement))
2317
})
2418
})

src/__tests__/events.test.js

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,32 @@
1+
import { fireEvent, render } from '@testing-library/svelte'
12
import { describe, expect, test } from 'vitest'
23

3-
import { fireEvent, render } from '..'
44
import Comp from './fixtures/Comp.svelte'
55

66
describe('events', () => {
77
test('state changes are flushed after firing an event', async () => {
88
const { getByText } = render(Comp, { props: { name: 'World' } })
99
const button = getByText('Button')
1010

11-
await fireEvent.click(button)
11+
const result = fireEvent.click(button)
1212

13+
await expect(result).resolves.toBe(true)
1314
expect(button).toHaveTextContent('Button Clicked')
1415
})
1516

1617
test('calling `fireEvent` directly works too', async () => {
1718
const { getByText } = render(Comp, { props: { name: 'World' } })
1819
const button = getByText('Button')
1920

20-
await fireEvent(
21+
const result = fireEvent(
2122
button,
2223
new MouseEvent('click', {
2324
bubbles: true,
24-
cancelable: true
25+
cancelable: true,
2526
})
2627
)
2728

29+
await expect(result).resolves.toBe(true)
2830
expect(button).toHaveTextContent('Button Clicked')
2931
})
3032
})

src/__tests__/fixtures/Comp.svelte

+2-8
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,17 @@
11
<svelte:options accessors />
22

33
<script>
4-
import { getContext } from 'svelte'
5-
6-
export let name
4+
export let name = 'World'
75
86
let buttonText = 'Button'
97
10-
const contextName = getContext('name')
11-
12-
function handleClick () {
8+
function handleClick() {
139
buttonText = 'Button Clicked'
1410
}
1511
</script>
1612

1713
<h1 data-testid="test">Hello {name}!</h1>
1814

19-
<div>we have {contextName}</div>
20-
2115
<button on:click={handleClick}>{buttonText}</button>
2216

2317
<style></style>

src/__tests__/fixtures/Comp2.svelte

-15
This file was deleted.

src/__tests__/fixtures/Context.svelte

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<script>
2-
import { getContext } from 'svelte';
2+
import { getContext } from 'svelte'
33
4-
const ctx = getContext('foo');
4+
const ctx = getContext('foo')
55
</script>
66

77
<div>{ctx.message}</div>

0 commit comments

Comments
 (0)