From 611e3efe61e072dfe010ec04fc8957e07f9d3dd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Exbrayat?= Date: Thu, 31 Mar 2022 13:36:46 +0200 Subject: [PATCH 1/2] chore: repro --no-threads issues --- .github/workflows/ci.yml | 3 +++ package.json | 1 + 2 files changed, 4 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3e7da129303..c87929660a2 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/package.json b/package.json index 46759bd29f1..d9db345699d 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "test:run": "vitest run -r test/core", "test:all": "cross-env CI=true pnpm -r --stream --filter !@vitest/monorepo run test -- --allowOnly", "test:ci": "cross-env CI=true pnpm -r --stream --filter !@vitest/monorepo --filter !test-fails run test -- --allowOnly", + "test:ci:no-threads": "cross-env CI=true pnpm -r --stream --filter !@vitest/monorepo --filter !test-fails run test -- --allowOnly --no-threads", "typecheck": "tsc --noEmit", "ui:build": "vite build packages/ui", "ui:dev": "vite packages/ui", From 8e29fd3469a4d7653736319232b3662f6a15c2d1 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Sun, 8 May 2022 09:21:05 +0300 Subject: [PATCH 2/2] test: fix --no-threads issues in examples --- examples/react-storybook/src/App.test.tsx | 4 +- examples/svelte/test/basic.test.ts | 8 +- examples/vitesse/vite.config.ts | 4 + test/core/test/dom.test.ts | 93 ++++++++++++----------- test/core/test/happy-dom.test.ts | 86 ++++++++++----------- 5 files changed, 106 insertions(+), 89 deletions(-) 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/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 () => {