From: daiwei Date: Tue, 20 May 2025 03:47:31 +0000 (+0800) Subject: test: add tests X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=05844e4bb257205b886e7e0bd11793fc41a33952;p=thirdparty%2Fvuejs%2Fcore.git test: add tests --- diff --git a/packages/runtime-vapor/__tests__/_utils.ts b/packages/runtime-vapor/__tests__/_utils.ts index 0ed6455447..729d42de78 100644 --- a/packages/runtime-vapor/__tests__/_utils.ts +++ b/packages/runtime-vapor/__tests__/_utils.ts @@ -2,6 +2,10 @@ import { createVaporApp } from '../src' import type { App } from '@vue/runtime-dom' import type { VaporComponent, VaporComponentInstance } from '../src/component' import type { RawProps } from '../src/componentProps' +import { compileScript, parse } from '@vue/compiler-sfc' +import * as runtimeVapor from '../src' +import * as runtimeDom from '@vue/runtime-dom' +import * as VueServerRenderer from '@vue/server-renderer' export interface RenderContext { component: VaporComponent @@ -82,3 +86,50 @@ export function makeRender( return define } + +export { runtimeDom, runtimeVapor, VueServerRenderer } +export function compile( + sfc: string, + data: runtimeDom.Ref, + components: Record = {}, + { + vapor = true, + ssr = false, + }: { + vapor?: boolean | undefined + ssr?: boolean | undefined + } = {}, +): any { + if (!sfc.includes(`const data = _data; const components = _components;` + + sfc + } + const descriptor = parse(sfc).descriptor + + const script = compileScript(descriptor, { + id: 'x', + isProd: true, + inlineTemplate: true, + genDefaultAs: '__sfc__', + vapor, + templateOptions: { + ssr, + }, + }) + + const code = + script.content + .replace(/\bimport {/g, 'const {') + .replace(/ as _/g, ': _') + .replace(/} from ['"]vue['"]/g, `} = Vue`) + .replace(/} from "vue\/server-renderer"/g, '} = VueServerRenderer') + + '\nreturn __sfc__' + + return new Function('Vue', 'VueServerRenderer', '_data', '_components', code)( + { ...runtimeDom, ...runtimeVapor }, + VueServerRenderer, + data, + components, + ) +} diff --git a/packages/runtime-vapor/__tests__/components/Suspense.spec.ts b/packages/runtime-vapor/__tests__/components/Suspense.spec.ts new file mode 100644 index 0000000000..6bec5b8a38 --- /dev/null +++ b/packages/runtime-vapor/__tests__/components/Suspense.spec.ts @@ -0,0 +1,79 @@ +import { nextTick } from 'vue' +import { compile, runtimeDom, runtimeVapor } from '../_utils' + +describe.todo('VaporSuspense', () => {}) + +describe('vapor / vdom interop', () => { + async function testSuspense( + code: string, + components: Record = {}, + data: any = {}, + { vapor = false } = {}, + ) { + const clientComponents: any = {} + for (const key in components) { + const comp = components[key] + let code = comp.code + const isVaporComp = !!comp.vapor + clientComponents[key] = compile(code, data, clientComponents, { + vapor: isVaporComp, + }) + } + + const clientComp = compile(code, data, clientComponents, { + vapor, + }) + + const app = (vapor ? runtimeVapor.createVaporApp : runtimeDom.createApp)( + clientComp, + ) + app.use(runtimeVapor.vaporInteropPlugin) + + const container = document.createElement('div') + document.body.appendChild(container) + app.mount(container) + return { container } + } + + function asyncWrapper(code: string) { + return { + code: ` + + ${code} + `, + vapor: true, + } + } + + test('vdom suspense: render vapor components', async () => { + const data = { deps: [] } + const { container } = await testSuspense( + ` + `, + { + VaporChild: asyncWrapper(``), + }, + data, + ) + + expect(container.innerHTML).toBe(`loading`) + expect(data.deps.length).toBe(1) + await Promise.all(data.deps) + await nextTick() + expect(container.innerHTML).toBe(`
hi
`) + }) +})