From c8f20caefe497e26a5cec253808c44c486cf4ab4 Mon Sep 17 00:00:00 2001 From: Michael Cousins Date: Mon, 29 Apr 2024 23:36:14 -0400 Subject: [PATCH 1/6] fix: ensure `pure` module is exported --- package.json | 5 +- .../auto-cleanup-skip.test.js.snap | 3 - src/__tests__/auto-cleanup-skip.test.js | 23 -------- src/__tests__/auto-cleanup.test.js | 57 +++++++++++++------ src/__tests__/cleanup.test.js | 2 +- src/__tests__/mount.test.js | 4 +- src/__tests__/rerender.test.js | 2 +- 7 files changed, 47 insertions(+), 49 deletions(-) delete mode 100644 src/__tests__/__snapshots__/auto-cleanup-skip.test.js.snap delete mode 100644 src/__tests__/auto-cleanup-skip.test.js diff --git a/package.json b/package.json index 5e00bbe..0813aaf 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,10 @@ "types": "./types/index.d.ts", "default": "./src/index.js" }, + "./pure": { + "types": "./types/index.d.ts", + "default": "./src/pure.js" + }, "./svelte5": { "types": "./types/index.d.ts", "default": "./src/svelte5-index.js" @@ -65,7 +69,6 @@ "setup": "npm install && npm run validate", "test": "vitest run --coverage", "test:watch": "vitest", - "test:update": "vitest run --update", "test:vitest:jsdom": "vitest run --coverage --environment jsdom", "test:vitest:happy-dom": "vitest run --coverage --environment happy-dom", "types": "svelte-check", diff --git a/src/__tests__/__snapshots__/auto-cleanup-skip.test.js.snap b/src/__tests__/__snapshots__/auto-cleanup-skip.test.js.snap deleted file mode 100644 index 2631c86..0000000 --- a/src/__tests__/__snapshots__/auto-cleanup-skip.test.js.snap +++ /dev/null @@ -1,3 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`auto-cleanup-skip > second 1`] = `""`; diff --git a/src/__tests__/auto-cleanup-skip.test.js b/src/__tests__/auto-cleanup-skip.test.js deleted file mode 100644 index db65447..0000000 --- a/src/__tests__/auto-cleanup-skip.test.js +++ /dev/null @@ -1,23 +0,0 @@ -import { beforeAll, describe, expect, test } from 'vitest' - -import Comp from './fixtures/Comp.svelte' - -describe('auto-cleanup-skip', () => { - let render - - beforeAll(async () => { - process.env.STL_SKIP_AUTO_CLEANUP = 'true' - const stl = await import('@testing-library/svelte') - render = stl.render - }) - - // This one verifies that if STL_SKIP_AUTO_CLEANUP is set - // then we DON'T auto-wire up the afterEach for folks - test('first', () => { - render(Comp, { props: { name: 'world' } }) - }) - - test('second', () => { - expect(document.body.innerHTML).toMatchSnapshot() - }) -}) diff --git a/src/__tests__/auto-cleanup.test.js b/src/__tests__/auto-cleanup.test.js index 206d101..baf3536 100644 --- a/src/__tests__/auto-cleanup.test.js +++ b/src/__tests__/auto-cleanup.test.js @@ -1,31 +1,52 @@ -import { render } from '@testing-library/svelte' -import { describe, expect, test } from 'vitest' +import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' import Comp from './fixtures/Comp.svelte' +import { IS_SVELTE_5 } from './utils.js' + +const importSvelteTestingLibrary = async () => + IS_SVELTE_5 ? import('../svelte5-index.js') : import('../index.js') + +const importSvelteTestingLibraryPure = async () => + IS_SVELTE_5 ? import('../svelte5.js') : import('../pure.js') + +const globalAfterEach = vi.fn() describe('auto-cleanup', () => { - // This just verifies that by importing STL in an - // environment which supports afterEach (like jest) - // we'll get automatic cleanup between tests. - test('first', () => { - render(Comp, { props: { name: 'world' } }) + beforeEach(() => { + vi.resetModules() + globalThis.afterEach = globalAfterEach }) - test('second', () => { - expect(document.body.innerHTML).toEqual('') + afterEach(() => { + delete process.env.STL_SKIP_AUTO_CLEANUP + delete globalThis.afterEach }) -}) -describe('cleanup of two components', () => { - // This just verifies that by importing STL in an - // environment which supports afterEach (like jest) - // we'll get automatic cleanup between tests. - test('first', () => { + test('calls afterEach with cleanup if globally defined', async () => { + const { render } = await importSvelteTestingLibrary() render(Comp, { props: { name: 'world' } }) - render(Comp, { props: { name: 'universe' } }) + + expect(globalAfterEach).toHaveBeenCalledTimes(1) + expect(globalAfterEach).toHaveBeenLastCalledWith(expect.any(Function)) + + await afterEach.mock.lastCall[0]() + + expect(document.body).toBeEmptyDOMElement() }) - test('second', () => { - expect(document.body.innerHTML).toEqual('') + test('does not call afterEach if process STL_SKIP_AUTO_CLEANUP is set', async () => { + process.env.STL_SKIP_AUTO_CLEANUP = 'true' + + const { render } = await importSvelteTestingLibrary() + render(Comp, { props: { name: 'world' } }) + + expect(globalAfterEach).toHaveBeenCalledTimes(0) + }) + + test('does not call afterEach if you import from `pure`', async () => { + const { render } = await importSvelteTestingLibraryPure() + render(Comp, { props: { name: 'world' } }) + + expect(globalAfterEach).toHaveBeenCalledTimes(0) }) }) diff --git a/src/__tests__/cleanup.test.js b/src/__tests__/cleanup.test.js index 7131624..d0ae026 100644 --- a/src/__tests__/cleanup.test.js +++ b/src/__tests__/cleanup.test.js @@ -19,7 +19,7 @@ describe('cleanup', () => { renderSubject() cleanup() - expect(onDestroyed).toHaveBeenCalledOnce() + expect(onDestroyed).toHaveBeenCalledTimes(1) }) test('cleanup handles unexpected errors during mount', () => { diff --git a/src/__tests__/mount.test.js b/src/__tests__/mount.test.js index 48d985f..e25c429 100644 --- a/src/__tests__/mount.test.js +++ b/src/__tests__/mount.test.js @@ -15,7 +15,7 @@ describe('mount and destroy', () => { expect(content).toBeInTheDocument() await act() - expect(onMounted).toHaveBeenCalledOnce() + expect(onMounted).toHaveBeenCalledTimes(1) }) test('component is destroyed', async () => { @@ -28,6 +28,6 @@ describe('mount and destroy', () => { expect(content).not.toBeInTheDocument() await act() - expect(onDestroyed).toHaveBeenCalledOnce() + expect(onDestroyed).toHaveBeenCalledTimes(1) }) }) diff --git a/src/__tests__/rerender.test.js b/src/__tests__/rerender.test.js index ca4b8e8..21a782c 100644 --- a/src/__tests__/rerender.test.js +++ b/src/__tests__/rerender.test.js @@ -23,7 +23,7 @@ describe('rerender', () => { await rerender({ props: { name: 'Dolly' } }) expect(element).toHaveTextContent('Hello Dolly!') - expect(console.warn).toHaveBeenCalledOnce() + expect(console.warn).toHaveBeenCalledTimes(1) expect(console.warn).toHaveBeenCalledWith( expect.stringMatching(/deprecated/iu) ) From b9a61311ca0e62d29bda1b5162585fed9da4aef3 Mon Sep 17 00:00:00 2001 From: Michael Cousins Date: Tue, 30 Apr 2024 00:10:59 -0400 Subject: [PATCH 2/6] fixup: re-import component after module cache clear --- src/__tests__/auto-cleanup.test.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/__tests__/auto-cleanup.test.js b/src/__tests__/auto-cleanup.test.js index baf3536..b400863 100644 --- a/src/__tests__/auto-cleanup.test.js +++ b/src/__tests__/auto-cleanup.test.js @@ -1,6 +1,5 @@ import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' -import Comp from './fixtures/Comp.svelte' import { IS_SVELTE_5 } from './utils.js' const importSvelteTestingLibrary = async () => @@ -24,12 +23,14 @@ describe('auto-cleanup', () => { test('calls afterEach with cleanup if globally defined', async () => { const { render } = await importSvelteTestingLibrary() + const { default: Comp } = await import('./fixtures/Comp.svelte') + render(Comp, { props: { name: 'world' } }) expect(globalAfterEach).toHaveBeenCalledTimes(1) expect(globalAfterEach).toHaveBeenLastCalledWith(expect.any(Function)) - await afterEach.mock.lastCall[0]() + await globalAfterEach.mock.lastCall[0]() expect(document.body).toBeEmptyDOMElement() }) @@ -38,6 +39,8 @@ describe('auto-cleanup', () => { process.env.STL_SKIP_AUTO_CLEANUP = 'true' const { render } = await importSvelteTestingLibrary() + const { default: Comp } = await import('./fixtures/Comp.svelte') + render(Comp, { props: { name: 'world' } }) expect(globalAfterEach).toHaveBeenCalledTimes(0) @@ -45,6 +48,8 @@ describe('auto-cleanup', () => { test('does not call afterEach if you import from `pure`', async () => { const { render } = await importSvelteTestingLibraryPure() + const { default: Comp } = await import('./fixtures/Comp.svelte') + render(Comp, { props: { name: 'world' } }) expect(globalAfterEach).toHaveBeenCalledTimes(0) From 5ce0045715d0aa82490386218c423f06c9fd9e01 Mon Sep 17 00:00:00 2001 From: Michael Cousins Date: Tue, 30 Apr 2024 00:13:45 -0400 Subject: [PATCH 3/6] fixup: further test refinements --- src/__tests__/auto-cleanup.test.js | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/__tests__/auto-cleanup.test.js b/src/__tests__/auto-cleanup.test.js index b400863..6100928 100644 --- a/src/__tests__/auto-cleanup.test.js +++ b/src/__tests__/auto-cleanup.test.js @@ -23,14 +23,14 @@ describe('auto-cleanup', () => { test('calls afterEach with cleanup if globally defined', async () => { const { render } = await importSvelteTestingLibrary() - const { default: Comp } = await import('./fixtures/Comp.svelte') - - render(Comp, { props: { name: 'world' } }) expect(globalAfterEach).toHaveBeenCalledTimes(1) expect(globalAfterEach).toHaveBeenLastCalledWith(expect.any(Function)) + const globalCleanup = globalAfterEach.mock.lastCall[0] - await globalAfterEach.mock.lastCall[0]() + const { default: Comp } = await import('./fixtures/Comp.svelte') + render(Comp, { props: { name: 'world' } }) + await globalCleanup() expect(document.body).toBeEmptyDOMElement() }) @@ -38,19 +38,13 @@ describe('auto-cleanup', () => { test('does not call afterEach if process STL_SKIP_AUTO_CLEANUP is set', async () => { process.env.STL_SKIP_AUTO_CLEANUP = 'true' - const { render } = await importSvelteTestingLibrary() - const { default: Comp } = await import('./fixtures/Comp.svelte') - - render(Comp, { props: { name: 'world' } }) + await importSvelteTestingLibrary() expect(globalAfterEach).toHaveBeenCalledTimes(0) }) test('does not call afterEach if you import from `pure`', async () => { - const { render } = await importSvelteTestingLibraryPure() - const { default: Comp } = await import('./fixtures/Comp.svelte') - - render(Comp, { props: { name: 'world' } }) + await importSvelteTestingLibraryPure() expect(globalAfterEach).toHaveBeenCalledTimes(0) }) From 3fad5e9ea1b2d9d1d283229e54297b968f1913c1 Mon Sep 17 00:00:00 2001 From: Michael Cousins Date: Tue, 30 Apr 2024 00:15:40 -0400 Subject: [PATCH 4/6] fixup: revert unrelated Jest updates --- src/__tests__/cleanup.test.js | 2 +- src/__tests__/mount.test.js | 4 ++-- src/__tests__/rerender.test.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/__tests__/cleanup.test.js b/src/__tests__/cleanup.test.js index d0ae026..7131624 100644 --- a/src/__tests__/cleanup.test.js +++ b/src/__tests__/cleanup.test.js @@ -19,7 +19,7 @@ describe('cleanup', () => { renderSubject() cleanup() - expect(onDestroyed).toHaveBeenCalledTimes(1) + expect(onDestroyed).toHaveBeenCalledOnce() }) test('cleanup handles unexpected errors during mount', () => { diff --git a/src/__tests__/mount.test.js b/src/__tests__/mount.test.js index e25c429..48d985f 100644 --- a/src/__tests__/mount.test.js +++ b/src/__tests__/mount.test.js @@ -15,7 +15,7 @@ describe('mount and destroy', () => { expect(content).toBeInTheDocument() await act() - expect(onMounted).toHaveBeenCalledTimes(1) + expect(onMounted).toHaveBeenCalledOnce() }) test('component is destroyed', async () => { @@ -28,6 +28,6 @@ describe('mount and destroy', () => { expect(content).not.toBeInTheDocument() await act() - expect(onDestroyed).toHaveBeenCalledTimes(1) + expect(onDestroyed).toHaveBeenCalledOnce() }) }) diff --git a/src/__tests__/rerender.test.js b/src/__tests__/rerender.test.js index 21a782c..ca4b8e8 100644 --- a/src/__tests__/rerender.test.js +++ b/src/__tests__/rerender.test.js @@ -23,7 +23,7 @@ describe('rerender', () => { await rerender({ props: { name: 'Dolly' } }) expect(element).toHaveTextContent('Hello Dolly!') - expect(console.warn).toHaveBeenCalledTimes(1) + expect(console.warn).toHaveBeenCalledOnce() expect(console.warn).toHaveBeenCalledWith( expect.stringMatching(/deprecated/iu) ) From 06e3fafe8f02e64f80d0c2b692376dad7e62bcb5 Mon Sep 17 00:00:00 2001 From: Michael Cousins Date: Tue, 14 May 2024 16:11:29 -0400 Subject: [PATCH 5/6] fixup: remove pure export, concentrate on test fixes --- package.json | 4 ---- src/index.js | 3 +-- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/package.json b/package.json index 0813aaf..bad9554 100644 --- a/package.json +++ b/package.json @@ -8,10 +8,6 @@ "types": "./types/index.d.ts", "default": "./src/index.js" }, - "./pure": { - "types": "./types/index.d.ts", - "default": "./src/pure.js" - }, "./svelte5": { "types": "./types/index.d.ts", "default": "./src/svelte5-index.js" diff --git a/src/index.js b/src/index.js index 46fd662..2e3d772 100644 --- a/src/index.js +++ b/src/index.js @@ -4,8 +4,7 @@ import { act, cleanup } from './pure.js' // If we're running in a test runner that supports afterEach // then we'll automatically run cleanup afterEach test // this ensures that tests run in isolation from each other -// if you don't like this then either import the `pure` module -// or set the STL_SKIP_AUTO_CLEANUP env variable to 'true'. +// if you don't like this then set the STL_SKIP_AUTO_CLEANUP env variable. if (typeof afterEach === 'function' && !process.env.STL_SKIP_AUTO_CLEANUP) { afterEach(async () => { await act() From 83ced42f040d6162cf2c3b1415a1524609c44d16 Mon Sep 17 00:00:00 2001 From: Michael Cousins Date: Wed, 15 May 2024 10:43:13 -0400 Subject: [PATCH 6/6] fixup: remove pure tests --- src/__tests__/auto-cleanup.test.js | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/__tests__/auto-cleanup.test.js b/src/__tests__/auto-cleanup.test.js index 6100928..b06d120 100644 --- a/src/__tests__/auto-cleanup.test.js +++ b/src/__tests__/auto-cleanup.test.js @@ -5,9 +5,6 @@ import { IS_SVELTE_5 } from './utils.js' const importSvelteTestingLibrary = async () => IS_SVELTE_5 ? import('../svelte5-index.js') : import('../index.js') -const importSvelteTestingLibraryPure = async () => - IS_SVELTE_5 ? import('../svelte5.js') : import('../pure.js') - const globalAfterEach = vi.fn() describe('auto-cleanup', () => { @@ -42,10 +39,4 @@ describe('auto-cleanup', () => { expect(globalAfterEach).toHaveBeenCalledTimes(0) }) - - test('does not call afterEach if you import from `pure`', async () => { - await importSvelteTestingLibraryPure() - - expect(globalAfterEach).toHaveBeenCalledTimes(0) - }) })