diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8166e9769cd..04b76fe81ac 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -85,6 +85,9 @@ jobs: - name: Test run: pnpm run test:ci + - name: Test + run: pnpm run test:ci:no-threads + test-ui: runs-on: ubuntu-latest steps: diff --git a/examples/react-storybook/src/App.test.tsx b/examples/react-storybook/src/App.test.tsx index de00b372a21..64dc8b3a400 100644 --- a/examples/react-storybook/src/App.test.tsx +++ b/examples/react-storybook/src/App.test.tsx @@ -26,12 +26,12 @@ it('renders with data', async () => { }), ).toBeInTheDocument() - posts.forEach(async (post) => { + for (const post of posts) { expect( await screen.findByRole('heading', { name: post.title, level: 2 }), ).toBeDefined() expect(screen.getByText(post.body)).toBeDefined() - }) + } }) it('handles errors', async () => { diff --git a/examples/svelte/test/basic.test.ts b/examples/svelte/test/basic.test.ts index a434cd6b7e4..ea4cd110559 100644 --- a/examples/svelte/test/basic.test.ts +++ b/examples/svelte/test/basic.test.ts @@ -1,8 +1,14 @@ import { tick } from 'svelte' import Hello from '../components/Hello.svelte' +let host: HTMLElement + +afterEach(() => { + host.remove() +}) + test('mount component', async () => { - const host = document.createElement('div') + host = document.createElement('div') host.setAttribute('id', 'host') document.body.appendChild(host) const instance = new Hello({ target: host, props: { count: 4 } }) diff --git a/examples/vitesse/vite.config.ts b/examples/vitesse/vite.config.ts index f2de3888ec7..38f3e4a7205 100644 --- a/examples/vitesse/vite.config.ts +++ b/examples/vitesse/vite.config.ts @@ -21,6 +21,10 @@ export default defineConfig({ dts: 'src/components.d.ts', }), ], + resolve: { + // TODO actually, if @vue/test-utils provided "exports" field, this wouldn't be needed + mainFields: ['module'], + }, test: { globals: true, environment: 'happy-dom', diff --git a/package.json b/package.json index e0c078771f3..881f755506d 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,8 @@ "test": "vitest --api -r test/core", "test:run": "vitest run -r test/core", "test:all": "cross-env CI=true pnpm -r --stream run test --allowOnly", - "test:ci": "cross-env CI=true pnpm -r --stream --filter=!test-fails run test --allowOnly", + "test:ci": "cross-env CI=true pnpm -r --stream --filter !test-fails run test --allowOnly", + "test:ci:no-threads": "cross-env CI=true pnpm -r --stream --filter !test-fails run test --allowOnly --no-threads", "typecheck": "tsc --noEmit", "ui:build": "vite build packages/ui", "ui:dev": "vite packages/ui", diff --git a/test/core/test/dom.test.ts b/test/core/test/dom.test.ts index 94cb8fd6ff4..df55887ab91 100644 --- a/test/core/test/dom.test.ts +++ b/test/core/test/dom.test.ts @@ -1,8 +1,16 @@ /** * @vitest-environment jsdom */ + +/* eslint-disable vars-on-top */ + import { expect, it, vi } from 'vitest' +declare global { + // eslint-disable-next-line no-var + var __property_jsdom: unknown +} + it('jsdom', () => { expect(window).toBeDefined() @@ -29,84 +37,83 @@ it('defined on self/window are defined on global', () => { expect(self).toBeDefined() expect(window).toBeDefined() - expect(self.__property).not.toBeDefined() - expect(window.__property).not.toBeDefined() - expect(globalThis.__property).not.toBeDefined() + expect(self.__property_jsdom).not.toBeDefined() + expect(window.__property_jsdom).not.toBeDefined() + expect(globalThis.__property_jsdom).not.toBeDefined() - globalThis.__property = 'defined_value' + globalThis.__property_jsdom = 'defined_value' - expect(__property).toBe('defined_value') - expect(self.__property).toBe('defined_value') - expect(window.__property).toBe('defined_value') - expect(globalThis.__property).toBe('defined_value') + expect(__property_jsdom).toBe('defined_value') + expect(self.__property_jsdom).toBe('defined_value') + expect(window.__property_jsdom).toBe('defined_value') + expect(globalThis.__property_jsdom).toBe('defined_value') - self.__property = 'test_value' + self.__property_jsdom = 'test_value' - expect(__property).toBe('test_value') - expect(self.__property).toBe('test_value') - expect(window.__property).toBe('test_value') - expect(globalThis.__property).toBe('test_value') + expect(__property_jsdom).toBe('test_value') + expect(self.__property_jsdom).toBe('test_value') + expect(window.__property_jsdom).toBe('test_value') + expect(globalThis.__property_jsdom).toBe('test_value') - window.__property = 'new_value' + window.__property_jsdom = 'new_value' - expect(__property).toBe('new_value') - expect(self.__property).toBe('new_value') - expect(window.__property).toBe('new_value') - expect(globalThis.__property).toBe('new_value') + expect(__property_jsdom).toBe('new_value') + expect(self.__property_jsdom).toBe('new_value') + expect(window.__property_jsdom).toBe('new_value') + expect(globalThis.__property_jsdom).toBe('new_value') - globalThis.__property = 'global_value' + globalThis.__property_jsdom = 'global_value' - expect(__property).toBe('global_value') - expect(self.__property).toBe('global_value') - expect(window.__property).toBe('global_value') - expect(globalThis.__property).toBe('global_value') + expect(__property_jsdom).toBe('global_value') + expect(self.__property_jsdom).toBe('global_value') + expect(window.__property_jsdom).toBe('global_value') + expect(globalThis.__property_jsdom).toBe('global_value') const obj = {} - self.__property = obj + self.__property_jsdom = obj - expect(self.__property).toBe(obj) - expect(window.__property).toBe(obj) - expect(globalThis.__property).toBe(obj) + expect(self.__property_jsdom).toBe(obj) + expect(window.__property_jsdom).toBe(obj) + expect(globalThis.__property_jsdom).toBe(obj) }) it('usage with defineProperty', () => { - Object.defineProperty(self, '__property', { + Object.defineProperty(self, '__property_jsdom', { get: () => 'self_property', configurable: true, }) - expect(__property).toBe('self_property') - expect(self.__property).toBe('self_property') - expect(globalThis.__property).toBe('self_property') - expect(window.__property).toBe('self_property') + expect(__property_jsdom).toBe('self_property') + expect(self.__property_jsdom).toBe('self_property') + expect(globalThis.__property_jsdom).toBe('self_property') + expect(window.__property_jsdom).toBe('self_property') - Object.defineProperty(window, '__property', { + Object.defineProperty(window, '__property_jsdom', { get: () => 'window_property', configurable: true, }) - expect(__property).toBe('window_property') - expect(self.__property).toBe('window_property') - expect(globalThis.__property).toBe('window_property') - expect(window.__property).toBe('window_property') + expect(__property_jsdom).toBe('window_property') + expect(self.__property_jsdom).toBe('window_property') + expect(globalThis.__property_jsdom).toBe('window_property') + expect(window.__property_jsdom).toBe('window_property') - Object.defineProperty(globalThis, '__property', { + Object.defineProperty(globalThis, '__property_jsdom', { get: () => 'global_property', configurable: true, }) - expect(__property).toBe('global_property') - expect(self.__property).toBe('global_property') - expect(globalThis.__property).toBe('global_property') - expect(window.__property).toBe('global_property') + expect(__property_jsdom).toBe('global_property') + expect(self.__property_jsdom).toBe('global_property') + expect(globalThis.__property_jsdom).toBe('global_property') + expect(window.__property_jsdom).toBe('global_property') }) it('can call global functions without window works as expected', async () => { const noop = vi.fn() expect(() => addEventListener('abort', noop)).not.toThrow() - expect(() => scrollTo()).not.toThrow() expect(() => requestAnimationFrame(noop)).not.toThrow() expect(() => window.requestAnimationFrame(noop)).not.toThrow() expect(() => self.requestAnimationFrame(noop)).not.toThrow() diff --git a/test/core/test/happy-dom.test.ts b/test/core/test/happy-dom.test.ts index e370f314aac..d0cd804947d 100644 --- a/test/core/test/happy-dom.test.ts +++ b/test/core/test/happy-dom.test.ts @@ -8,84 +8,84 @@ import { expect, it, vi } from 'vitest' declare global { // eslint-disable-next-line no-var - var __property: unknown + var __property_dom: unknown } it('defined on self/window are defined on global', () => { expect(self).toBeDefined() expect(window).toBeDefined() - expect(self.__property).not.toBeDefined() - expect(window.__property).not.toBeDefined() - expect(globalThis.__property).not.toBeDefined() + expect(self.__property_dom).not.toBeDefined() + expect(window.__property_dom).not.toBeDefined() + expect(globalThis.__property_dom).not.toBeDefined() - globalThis.__property = 'defined_value' + globalThis.__property_dom = 'defined_value' - expect(__property).toBe('defined_value') - expect(self.__property).toBe('defined_value') - expect(window.__property).toBe('defined_value') - expect(globalThis.__property).toBe('defined_value') + expect(__property_dom).toBe('defined_value') + expect(self.__property_dom).toBe('defined_value') + expect(window.__property_dom).toBe('defined_value') + expect(globalThis.__property_dom).toBe('defined_value') - self.__property = 'test_value' + self.__property_dom = 'test_value' - expect(__property).toBe('test_value') - expect(self.__property).toBe('test_value') - expect(window.__property).toBe('test_value') - expect(globalThis.__property).toBe('test_value') + expect(__property_dom).toBe('test_value') + expect(self.__property_dom).toBe('test_value') + expect(window.__property_dom).toBe('test_value') + expect(globalThis.__property_dom).toBe('test_value') - window.__property = 'new_value' + window.__property_dom = 'new_value' - expect(__property).toBe('new_value') - expect(self.__property).toBe('new_value') - expect(window.__property).toBe('new_value') - expect(globalThis.__property).toBe('new_value') + expect(__property_dom).toBe('new_value') + expect(self.__property_dom).toBe('new_value') + expect(window.__property_dom).toBe('new_value') + expect(globalThis.__property_dom).toBe('new_value') - globalThis.__property = 'global_value' + globalThis.__property_dom = 'global_value' - expect(__property).toBe('global_value') - expect(self.__property).toBe('global_value') - expect(window.__property).toBe('global_value') - expect(globalThis.__property).toBe('global_value') + expect(__property_dom).toBe('global_value') + expect(self.__property_dom).toBe('global_value') + expect(window.__property_dom).toBe('global_value') + expect(globalThis.__property_dom).toBe('global_value') const obj = {} - self.__property = obj + self.__property_dom = obj - expect(self.__property).toBe(obj) - expect(window.__property).toBe(obj) - expect(globalThis.__property).toBe(obj) + expect(self.__property_dom).toBe(obj) + expect(window.__property_dom).toBe(obj) + expect(globalThis.__property_dom).toBe(obj) }) it('usage with defineProperty', () => { - Object.defineProperty(self, '__property', { + Object.defineProperty(self, '__property_dom', { get: () => 'self_property', configurable: true, }) - expect(__property).toBe('self_property') - expect(self.__property).toBe('self_property') - expect(globalThis.__property).toBe('self_property') - expect(window.__property).toBe('self_property') + expect(__property_dom).toBe('self_property') + expect(self.__property_dom).toBe('self_property') + expect(globalThis.__property_dom).toBe('self_property') + expect(window.__property_dom).toBe('self_property') - Object.defineProperty(window, '__property', { + Object.defineProperty(window, '__property_dom', { get: () => 'window_property', configurable: true, }) - expect(__property).toBe('window_property') - expect(self.__property).toBe('window_property') - expect(globalThis.__property).toBe('window_property') - expect(window.__property).toBe('window_property') + expect(__property_dom).toBe('window_property') + expect(self.__property_dom).toBe('window_property') + expect(globalThis.__property_dom).toBe('window_property') + expect(window.__property_dom).toBe('window_property') - Object.defineProperty(globalThis, '__property', { + Object.defineProperty(globalThis, '__property_dom', { get: () => 'global_property', configurable: true, }) - expect(__property).toBe('global_property') - expect(self.__property).toBe('global_property') - expect(globalThis.__property).toBe('global_property') - expect(window.__property).toBe('global_property') + expect(__property_dom).toBe('global_property') + expect(self.__property_dom).toBe('global_property') + expect(globalThis.__property_dom).toBe('global_property') + expect(window.__property_dom).toBe('global_property') }) it('can call global functions without window works as expected', async () => {