Skip to content

Commit 87011d3

Browse files
committed
Add tests
1 parent 1739c97 commit 87011d3

File tree

4 files changed

+121
-0
lines changed

4 files changed

+121
-0
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { flushSync } from 'svelte';
2+
import { test } from '../../test';
3+
4+
export default test({
5+
test({ assert, target, warnings }) {
6+
const btn = target.querySelector('button');
7+
8+
btn?.click();
9+
10+
assert.throws(() => {
11+
flushSync();
12+
}, 'error on template render');
13+
14+
// Check that the warning is being showed to the user
15+
assert.include(warnings[0], 'reset() was invoked');
16+
17+
// boundary content empty; only button remains
18+
assert.htmlEqual(target.innerHTML, `<button>trigger throw</button>`);
19+
}
20+
});
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<script>
2+
let must_throw = $state(false);
3+
4+
function throw_error() {
5+
throw new Error("error on template render");
6+
}
7+
</script>
8+
9+
<svelte:boundary onerror={(_, reset) => reset()}>
10+
{must_throw ? throw_error() : 'normal content'}
11+
12+
{#snippet failed()}
13+
<div>err</div>
14+
{/snippet}
15+
</svelte:boundary>
16+
17+
<button onclick={() => must_throw = true}>trigger throw</button>
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import { flushSync } from 'svelte';
2+
import { test } from '../../test';
3+
4+
export default test({
5+
html: `
6+
normal content
7+
<button>toggle</button>
8+
`,
9+
10+
expect_unhandled_rejections: true,
11+
12+
async test({ assert, target, warnings, window }) {
13+
// @ts-expect-error
14+
const __expected_error = (window.__expected_error = { v: false });
15+
16+
window.addEventListener('error', (e) => {
17+
// @ts-expect-error when in hydrate mode we can't access variables in the scope
18+
const __expected_error = window.__expected_error;
19+
20+
if (__expected_error.v) {
21+
assert.include(e.error.message, 'error on template render');
22+
} else {
23+
assert.fail('Error was not expected: ' + e.error.message);
24+
}
25+
e.preventDefault();
26+
});
27+
28+
const btn = target.querySelector('button');
29+
30+
// 1st click — error caught, fallback visible
31+
btn?.click();
32+
flushSync();
33+
assert.htmlEqual(target.innerHTML, `<div>err</div><button>toggle</button>`);
34+
35+
// 2nd click — reset succeeds, normal render
36+
btn?.click();
37+
flushSync();
38+
assert.htmlEqual(
39+
target.innerHTML,
40+
`
41+
normal content
42+
<button>toggle</button>
43+
`
44+
);
45+
46+
// 3rd click — mount-time crash escapes, boundary empty
47+
__expected_error.v = true;
48+
btn?.click();
49+
flushSync();
50+
__expected_error.v = false;
51+
52+
// Check that the warning is being showed to the user
53+
assert.include(warnings[0], 'reset() was invoked');
54+
55+
// boundary content empty; only button remains
56+
assert.htmlEqual(target.innerHTML, `<button>toggle</button>`);
57+
}
58+
});
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<script>
2+
let must_throw = $state(false);
3+
let reset = $state(null);
4+
5+
function throw_error() {
6+
throw new Error("error on template render");
7+
}
8+
</script>
9+
10+
<svelte:boundary onerror={console.error}>
11+
<svelte:boundary onerror={(_, fn) => (reset = fn)}>
12+
{must_throw ? throw_error() : 'normal content'}
13+
14+
{#snippet failed()}
15+
<div>err</div>
16+
{/snippet}
17+
</svelte:boundary>
18+
</svelte:boundary>
19+
20+
<button
21+
onclick={() => {
22+
must_throw = !must_throw;
23+
if (reset) reset();
24+
}}>
25+
toggle
26+
</button>

0 commit comments

Comments
 (0)