From 130aab9621ef4a2a6aa21cd0ffd033dd941a75fd Mon Sep 17 00:00:00 2001 From: tanhauhau Date: Fri, 14 Oct 2022 22:13:39 +0800 Subject: [PATCH] fix test and update server-side-rendering test --- test/hydration/index.ts | 86 ++++++++++++++------------ test/register.ts | 21 +++++-- test/runtime/index.ts | 6 +- test/server-side-rendering/index.ts | 93 +++++++++++++++-------------- 4 files changed, 114 insertions(+), 92 deletions(-) diff --git a/test/hydration/index.ts b/test/hydration/index.ts index 01edbc6bbb..ca9fb772cc 100644 --- a/test/hydration/index.ts +++ b/test/hydration/index.ts @@ -40,63 +40,71 @@ describe('hydration', () => { }); register.setCompile(svelte.compile); register.setOutputFolderName('hydratable'); + register.clearRequireCache(); + register.clearCompileOutputCache(); const window = env(); - global.window = window; + try { + global.window = window; - const SvelteComponent = require(`${cwd}/main.svelte`).default; + const SvelteComponent = require(`${cwd}/main.svelte`).default; - const target = window.document.body; - const head = window.document.head; + const target = window.document.body; + const head = window.document.head; - target.innerHTML = fs.readFileSync(`${cwd}/_before.html`, 'utf-8'); + target.innerHTML = fs.readFileSync(`${cwd}/_before.html`, 'utf-8'); - let before_head; - try { - before_head = fs.readFileSync(`${cwd}/_before_head.html`, 'utf-8'); - head.innerHTML = before_head; - } catch (err) { - // continue regardless of error - } + let before_head; + try { + before_head = fs.readFileSync(`${cwd}/_before_head.html`, 'utf-8'); + head.innerHTML = before_head; + } catch (err) { + // continue regardless of error + } - const snapshot = config.snapshot ? config.snapshot(target) : {}; + const snapshot = config.snapshot ? config.snapshot(target) : {}; - const component = new SvelteComponent({ - target, - hydrate: true, - props: config.props - }); + const component = new SvelteComponent({ + target, + hydrate: true, + props: config.props + }); - try { - assert.htmlEqual(target.innerHTML, fs.readFileSync(`${cwd}/_after.html`, 'utf-8')); - } catch (error) { - if (shouldUpdateExpected()) { - fs.writeFileSync(`${cwd}/_after.html`, target.innerHTML); - console.log(`Updated ${cwd}/_after.html.`); - } else { - throw error; - } - } - - if (before_head) { try { - assert.htmlEqual(head.innerHTML, fs.readFileSync(`${cwd}/_after_head.html`, 'utf-8')); + assert.htmlEqual(target.innerHTML, fs.readFileSync(`${cwd}/_after.html`, 'utf-8')); } catch (error) { if (shouldUpdateExpected()) { - fs.writeFileSync(`${cwd}/_after_head.html`, head.innerHTML); - console.log(`Updated ${cwd}/_after_head.html.`); + fs.writeFileSync(`${cwd}/_after.html`, target.innerHTML); + console.log(`Updated ${cwd}/_after.html.`); } else { throw error; } } - } - if (config.test) { - config.test(assert, target, snapshot, component, window); - } else { - component.$destroy(); - assert.equal(target.innerHTML, ''); + if (before_head) { + try { + assert.htmlEqual(head.innerHTML, fs.readFileSync(`${cwd}/_after_head.html`, 'utf-8')); + } catch (error) { + if (shouldUpdateExpected()) { + fs.writeFileSync(`${cwd}/_after_head.html`, head.innerHTML); + console.log(`Updated ${cwd}/_after_head.html.`); + } else { + throw error; + } + } + } + + if (config.test) { + config.test(assert, target, snapshot, component, window); + } else { + component.$destroy(); + assert.equal(target.innerHTML, ''); + } + } catch (err) { + // saves the compiled output into file system + register.writeCompileOutputCacheToFile(); + throw err; } }); } diff --git a/test/register.ts b/test/register.ts index 3aa165782a..c6252d6b67 100644 --- a/test/register.ts +++ b/test/register.ts @@ -38,7 +38,7 @@ export function clearRequireCache() { } function registerExtension(extension: string) { - require.extensions[extension] = function(module, filename) { + require.extensions[extension] = function (module, filename) { const name = path .parse(filename) .name.replace(/^\d/, '_$&') @@ -56,22 +56,33 @@ function registerExtension(extension: string) { } = compile(fs.readFileSync(filename, 'utf-8'), options); if (!process.env.CI) { - saveGeneratedOutput(code, filename); + saveGeneratedOutputToCache(code, filename); } return module._compile(code, filename); }; } -function saveGeneratedOutput(code: string, filename: string) { +const outputCache = new Map(); +function saveGeneratedOutputToCache(code: string, filename: string) { filename = filename.split('\\').join('/'); filename = filename.replace( /samples\/([^/]+)\/(.*)\.svelte$/, `samples/$1/_output/${folderName}/$2.js` ); + outputCache.set(filename, code); +} + +export function clearCompileOutputCache() { + outputCache.clear(); +} - mkdirp(path.dirname(filename)); - fs.writeFileSync(filename, code, 'utf8'); +export function writeCompileOutputCacheToFile() { + for (const [filename, code] of outputCache) { + mkdirp(path.dirname(filename)); + fs.writeFileSync(filename, code, 'utf8'); + } + clearCompileOutputCache(); } extensions.forEach(registerExtension); diff --git a/test/runtime/index.ts b/test/runtime/index.ts index 797e4ce37f..127f9b23d3 100644 --- a/test/runtime/index.ts +++ b/test/runtime/index.ts @@ -65,6 +65,7 @@ describe('runtime', () => { accessors: 'accessors' in config ? config.accessors : true }; + register.clearCompileOutputCache(); register.clearRequireCache(); register.setCompile((config.preserveIdentifiers ? svelte : svelte$).compile); register.setCompileOptions(compileOptions); @@ -191,11 +192,10 @@ describe('runtime', () => { } }).catch(err => { failed.add(dir); - throw err; - }) - .catch(err => { // print a clickable link to open the directory err.stack += `\n\ncmd-click: ${path.relative(process.cwd(), cwd)}/main.svelte`; + // saves the compiled output into file system + register.writeCompileOutputCacheToFile(); throw err; }) .then(() => { diff --git a/test/server-side-rendering/index.ts b/test/server-side-rendering/index.ts index 619d8af374..82bde6db82 100644 --- a/test/server-side-rendering/index.ts +++ b/test/server-side-rendering/index.ts @@ -8,7 +8,6 @@ import { loadSvelte, setupHtmlEqual, tryToLoadJson, - cleanRequireCache, shouldUpdateExpected } from '../helpers'; import { set_current_component } from '../../internal'; @@ -55,19 +54,18 @@ describe('ssr', () => { (solo ? it.only : it)(dir, (done) => { try { - dir = path.resolve(`${__dirname}/samples`, dir); - cleanRequireCache(); - + register.clearCompileOutputCache(); + register.clearRequireCache(); const compileOptions = { sveltePath, ...config.compileOptions, generate: 'ssr', format: 'cjs' }; - - require('../../register')(compileOptions); + register.setCompileOptions(compileOptions); + register.setOutputFolderName('ssr'); const Component = require(`${dir}/main.svelte`).default; @@ -134,6 +132,7 @@ describe('ssr', () => { done(); } catch (err) { err.stack += `\n\ncmd-click: ${path.relative(process.cwd(), dir)}/main.svelte`; + register.writeCompileOutputCacheToFile(); done(err); } finally { set_current_component(null); @@ -143,7 +142,7 @@ describe('ssr', () => { // duplicate client-side tests, as far as possible runRuntimeSamples('runtime'); - runRuntimeSamples('runtime-puppeteer'); + // runRuntimeSamples('runtime-puppeteer'); function runRuntimeSamples(suite) { fs.readdirSync(`test/${suite}/samples`).forEach(dir => { @@ -162,50 +161,54 @@ describe('ssr', () => { const cwd = path.resolve(`test/${suite}/samples`, dir); delete global.window; - register.clearRequireCache(); - register.setCompileOptions({ - sveltePath, - ...config.compileOptions, - generate: 'ssr', - format: 'cjs' - }); - register.setOutputFolderName('ssr'); - - try { - if (config.before_test) config.before_test(); - - const Component = require(`../${suite}/samples/${dir}/main.svelte`).default; - const { html } = Component.render(config.props, { - store: (config.store !== true) && config.store - }); - - if (config.ssrHtml) { - assert.htmlEqual(html, config.ssrHtml); - } else if (config.html) { - assert.htmlEqual(html, config.html); - } - - if (config.test_ssr) { - config.test_ssr({ assert }); - } + return Promise.resolve() + .then(() => { + register.clearCompileOutputCache(); + register.clearRequireCache(); + register.setCompileOptions({ + sveltePath, + ...config.compileOptions, + generate: 'ssr', + format: 'cjs' + }); + register.setOutputFolderName('ssr'); + + if (config.before_test) config.before_test(); + + const Component = require(`../${suite}/samples/${dir}/main.svelte`).default; + const { html } = Component.render(config.props, { + store: (config.store !== true) && config.store + }); + + if (config.ssrHtml) { + assert.htmlEqual(html, config.ssrHtml); + } else if (config.html) { + assert.htmlEqual(html, config.html); + } - if (config.after_test) config.after_test(); - } catch (err) { - err.stack += `\n\ncmd-click: ${path.relative(process.cwd(), cwd)}/main.svelte`; + if (config.test_ssr) { + config.test_ssr({ assert }); + } - if (config.error) { - if (typeof config.error === 'function') { - config.error(assert, err); + if (config.after_test) config.after_test(); + set_current_component(null); + }).catch(err => { + if (config.error) { + if (typeof config.error === 'function') { + config.error(assert, err); + } else { + assert.equal(err.message, config.error); + } } else { - assert.equal(err.message, config.error); + throw err; } - } else { + }).catch(err => { + err.stack += `\n\ncmd-click: ${path.relative(process.cwd(), cwd)}/main.svelte`; + register.writeCompileOutputCacheToFile(); + set_current_component(null); throw err; - } - } finally { - set_current_component(null); - } + }); }); }); }