From 0554c512d9821429c5ccbd029ae49bb36b9cd4c4 Mon Sep 17 00:00:00 2001 From: raythurnvoid <53383860+raythurnvoid@users.noreply.github.com> Date: Sun, 15 Jun 2025 20:01:47 +0100 Subject: [PATCH] Add tests --- .../error-boundary-reset-onerror/_config.js | 20 +++++++ .../error-boundary-reset-onerror/main.svelte | 17 ++++++ .../error-boundary-reset-premature/_config.js | 58 +++++++++++++++++++ .../main.svelte | 26 +++++++++ 4 files changed, 121 insertions(+) create mode 100644 packages/svelte/tests/runtime-runes/samples/error-boundary-reset-onerror/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/error-boundary-reset-onerror/main.svelte create mode 100644 packages/svelte/tests/runtime-runes/samples/error-boundary-reset-premature/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/error-boundary-reset-premature/main.svelte diff --git a/packages/svelte/tests/runtime-runes/samples/error-boundary-reset-onerror/_config.js b/packages/svelte/tests/runtime-runes/samples/error-boundary-reset-onerror/_config.js new file mode 100644 index 0000000000..2a18790c61 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/error-boundary-reset-onerror/_config.js @@ -0,0 +1,20 @@ +import { flushSync } from 'svelte'; +import { test } from '../../test'; + +export default test({ + test({ assert, target, warnings }) { + const btn = target.querySelector('button'); + + btn?.click(); + + assert.throws(() => { + flushSync(); + }, 'error on template render'); + + // Check that the warning is being showed to the user + assert.include(warnings[0], 'reset() was invoked'); + + // boundary content empty; only button remains + assert.htmlEqual(target.innerHTML, ``); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/error-boundary-reset-onerror/main.svelte b/packages/svelte/tests/runtime-runes/samples/error-boundary-reset-onerror/main.svelte new file mode 100644 index 0000000000..f91048a9e7 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/error-boundary-reset-onerror/main.svelte @@ -0,0 +1,17 @@ + + + reset()}> + {must_throw ? throw_error() : 'normal content'} + + {#snippet failed()} +
err
+ {/snippet} +
+ + diff --git a/packages/svelte/tests/runtime-runes/samples/error-boundary-reset-premature/_config.js b/packages/svelte/tests/runtime-runes/samples/error-boundary-reset-premature/_config.js new file mode 100644 index 0000000000..048413ad7b --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/error-boundary-reset-premature/_config.js @@ -0,0 +1,58 @@ +import { flushSync } from 'svelte'; +import { test } from '../../test'; + +export default test({ + html: ` + normal content + + `, + + expect_unhandled_rejections: true, + + async test({ assert, target, warnings, window }) { + // @ts-expect-error + const __expected_error = (window.__expected_error = { v: false }); + + window.addEventListener('error', (e) => { + // @ts-expect-error when in hydrate mode we can't access variables in the scope + const __expected_error = window.__expected_error; + + if (__expected_error.v) { + assert.include(e.error.message, 'error on template render'); + } else { + assert.fail('Error was not expected: ' + e.error.message); + } + e.preventDefault(); + }); + + const btn = target.querySelector('button'); + + // 1st click — error caught, fallback visible + btn?.click(); + flushSync(); + assert.htmlEqual(target.innerHTML, `
err
`); + + // 2nd click — reset succeeds, normal render + btn?.click(); + flushSync(); + assert.htmlEqual( + target.innerHTML, + ` + normal content + + ` + ); + + // 3rd click — mount-time crash escapes, boundary empty + __expected_error.v = true; + btn?.click(); + flushSync(); + __expected_error.v = false; + + // Check that the warning is being showed to the user + assert.include(warnings[0], 'reset() was invoked'); + + // boundary content empty; only button remains + assert.htmlEqual(target.innerHTML, ``); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/error-boundary-reset-premature/main.svelte b/packages/svelte/tests/runtime-runes/samples/error-boundary-reset-premature/main.svelte new file mode 100644 index 0000000000..c1462eaf09 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/error-boundary-reset-premature/main.svelte @@ -0,0 +1,26 @@ + + + + (reset = fn)}> + {must_throw ? throw_error() : 'normal content'} + + {#snippet failed()} +
err
+ {/snippet} +
+
+ +