run ssr on sync and async

pull/16781/head
S. Elliott Johnson 4 weeks ago
parent b63a56a67e
commit 5a42efb99b

@ -0,0 +1,6 @@
import { test } from '../../test';
export default test({
mode: ['async'],
error: 'lifecycle_outside_component'
});

@ -0,0 +1,10 @@
<script>
import { setContext } from 'svelte';
await Promise.resolve('hi');
setContext('key', 'value');
</script>

@ -0,0 +1,11 @@
<script>
import { setContext, getContext } from 'svelte';
setContext('key', 'child value');
await Promise.resolve();
</script>
<div>{getContext('key')}</div>

@ -0,0 +1,5 @@
import { test } from '../../test';
export default test({
mode: ['async']
});

@ -0,0 +1,3 @@
<div>value</div>
<div>value</div>
<div>child value</div>

@ -0,0 +1,15 @@
<script>
import { getContext, setContext } from 'svelte';
import Child from './Child.svelte';
setContext('key', 'value');
await Promise.resolve();
</script>
<div>{getContext('key')}</div>
<div>{(await Promise.resolve(true)) && getContext('key')}</div>
<Child />

@ -4,8 +4,6 @@ export default test({
compileOptions: {
dev: true
},
errors: [
error:
'node_invalid_placement_ssr: `<p>` (packages/svelte/tests/server-side-rendering/samples/invalid-nested-svelte-element/main.svelte:2:1) cannot be a child of `<p>` (packages/svelte/tests/server-side-rendering/samples/invalid-nested-svelte-element/main.svelte:1:0)\n\nThis can cause content to shift around as the browser repairs the HTML, and will likely result in a `hydration_mismatch` warning.'
]
});

@ -7,23 +7,19 @@
import * as fs from 'node:fs';
import { assert } from 'vitest';
import { render, renderAsync } from 'svelte/server';
import {
async_mode,
compile_directory,
should_update_expected,
try_read_file
} from '../helpers.js';
import { compile_directory, should_update_expected, try_read_file } from '../helpers.js';
import { assert_html_equal_with_options } from '../html_equal.js';
import { suite, type BaseTest } from '../suite.js';
import { suite_with_variants, type BaseTest } from '../suite.js';
import type { CompileOptions } from '#compiler';
interface SSRTest extends BaseTest {
mode?: ('sync' | 'async')[];
compileOptions?: Partial<CompileOptions>;
load_compiled?: boolean;
props?: Record<string, any>;
id_prefix?: string;
withoutNormalizeHtml?: boolean;
errors?: string[];
error?: string;
}
// TODO remove this shim when we can
@ -40,13 +36,23 @@ Promise.withResolvers = () => {
return { promise, resolve, reject };
};
// eslint-disable-next-line no-console
let console_error = console.error;
const { test, run } = suite_with_variants<SSRTest, 'sync' | 'async', CompileOptions>(
['sync', 'async'],
(variant, config, test_name) => {
if (config.mode && !config.mode.includes(variant)) {
return 'no-test';
}
if (test_name.startsWith('async') && variant === 'sync') {
return 'no-test';
}
const { test, run } = suite<SSRTest>(async (config, test_dir) => {
return false;
},
async (config, test_dir) => {
const compile_options = {
experimental: {
async: async_mode,
async: true,
...config.compileOptions?.experimental
},
...config.compileOptions
@ -56,15 +62,15 @@ const { test, run } = suite<SSRTest>(async (config, test_dir) => {
await compile_directory(test_dir, 'server', compile_options);
}
const errors: string[] = [];
console.error = (...args) => {
errors.push(...args);
};
return compile_options;
},
async (config, test_dir, variant, compile_options) => {
const Component = (await import(`${test_dir}/_output/server/main.svelte.js`)).default;
const expected_html = try_read_file(`${test_dir}/_expected.html`);
const rendered = async_mode
let rendered;
try {
rendered =
variant === 'async'
? await renderAsync(Component, {
props: config.props || {},
idPrefix: config.id_prefix
@ -73,12 +79,22 @@ const { test, run } = suite<SSRTest>(async (config, test_dir) => {
props: config.props || {},
idPrefix: config.id_prefix
});
} catch (error) {
if (config.error) {
assert.deepEqual((error as Error).message, config.error);
return;
} else {
throw error;
}
}
const { body, head } = rendered;
fs.writeFileSync(`${test_dir}/_output/rendered.html`, body);
const prefix = variant === 'async' ? 'async_' : '';
fs.writeFileSync(`${test_dir}/_output/${prefix}rendered.html`, body);
if (head) {
fs.writeFileSync(`${test_dir}/_output/rendered_head.html`, head);
fs.writeFileSync(`${test_dir}/_output/${prefix}rendered_head.html`, head);
}
try {
@ -113,13 +129,8 @@ const { test, run } = suite<SSRTest>(async (config, test_dir) => {
}
}
}
if (errors.length > 0) {
assert.deepEqual(config.errors, errors);
}
console.error = console_error;
});
);
export { test };

Loading…
Cancel
Save