From a186f7b96261c31cc601ab4b5f39fb4e67a7586f Mon Sep 17 00:00:00 2001 From: Michael Cousins Date: Mon, 12 Feb 2024 11:09:40 +1000 Subject: [PATCH 1/3] fix: remove DOM elements even if component creation fails Fixes #190 --- .../__snapshots__/render.test.js.snap | 1 - src/__tests__/cleanup.test.js | 30 ++++++++ src/__tests__/fixtures/Mounter.svelte | 2 +- src/pure.js | 68 +++++++++---------- vite.config.js | 2 +- 5 files changed, 65 insertions(+), 38 deletions(-) create mode 100644 src/__tests__/cleanup.test.js diff --git a/src/__tests__/__snapshots__/render.test.js.snap b/src/__tests__/__snapshots__/render.test.js.snap index a31cf2e..e6c67fa 100644 --- a/src/__tests__/__snapshots__/render.test.js.snap +++ b/src/__tests__/__snapshots__/render.test.js.snap @@ -18,7 +18,6 @@ exports[`render > should accept svelte component options 1`] = ` -
diff --git a/src/__tests__/cleanup.test.js b/src/__tests__/cleanup.test.js new file mode 100644 index 0000000..7abd1dd --- /dev/null +++ b/src/__tests__/cleanup.test.js @@ -0,0 +1,30 @@ +import { describe, expect, test, vi } from 'vitest' + +import { cleanup, render } from '..' +import Mounter from './fixtures/Mounter.svelte' + +const onMounted = vi.fn() +const onDestroyed = vi.fn() +const renderSubject = () => render(Mounter, { onMounted, onDestroyed }) + +describe('cleanup', () => { + test('cleanup unmounts component and deletes element', () => { + renderSubject() + + cleanup() + + expect(onDestroyed).toHaveBeenCalledOnce() + expect(document.body).toBeEmptyDOMElement() + }) + + test('cleanup handles unexpected errors during mount', () => { + onMounted.mockImplementation(() => { + throw new Error('oh no!') + }) + + expect(renderSubject).toThrowError() + cleanup() + + expect(document.body).toBeEmptyDOMElement() + }) +}) diff --git a/src/__tests__/fixtures/Mounter.svelte b/src/__tests__/fixtures/Mounter.svelte index 477bb34..ba7cf7a 100644 --- a/src/__tests__/fixtures/Mounter.svelte +++ b/src/__tests__/fixtures/Mounter.svelte @@ -1,5 +1,5 @@