Skip to content

Commit

Permalink
chore: repro --no-threads issues (#1060)
Browse files Browse the repository at this point in the history
Co-authored-by: Anthony Fu <anthonyfu117@hotmail.com>
Co-authored-by: Vladimir Sheremet <sheremet.va@icloud.com>
  • Loading branch information
3 people committed May 8, 2022
1 parent dd3c5a1 commit 07eeb28
Show file tree
Hide file tree
Showing 7 changed files with 111 additions and 90 deletions.
3 changes: 3 additions & 0 deletions .github/workflows/ci.yml
Expand Up @@ -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:
Expand Down
4 changes: 2 additions & 2 deletions examples/react-storybook/src/App.test.tsx
Expand Up @@ -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 () => {
Expand Down
8 changes: 7 additions & 1 deletion 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 } })
Expand Down
4 changes: 4 additions & 0 deletions examples/vitesse/vite.config.ts
Expand Up @@ -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',
Expand Down
3 changes: 2 additions & 1 deletion package.json
Expand Up @@ -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",
Expand Down
93 changes: 50 additions & 43 deletions 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()

Expand All @@ -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()
Expand Down
86 changes: 43 additions & 43 deletions test/core/test/happy-dom.test.ts
Expand Up @@ -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 () => {
Expand Down

0 comments on commit 07eeb28

Please sign in to comment.