forked from salesforce/lwc
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfixtures.spec.ts
More file actions
145 lines (128 loc) · 4.57 KB
/
fixtures.spec.ts
File metadata and controls
145 lines (128 loc) · 4.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/*
* Copyright (c) 2024, salesforce.com, inc.
* All rights reserved.
* SPDX-License-Identifier: MIT
* For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
*/
import path from 'node:path';
import { vi, describe } from 'vitest';
import { rollup } from 'rollup';
import lwcRollupPlugin from '@lwc/rollup-plugin';
import { testFixtureDir, formatHTML, pluginVirtual } from '@lwc/test-utils-lwc-internals';
import { serverSideRenderComponent } from '@lwc/ssr-runtime';
import { DEFAULT_SSR_MODE, type CompilationMode } from '@lwc/shared';
import { expectedFailures } from './utils/expected-failures';
import type { LightningElementConstructor } from '@lwc/ssr-runtime';
interface FixtureConfig {
/**
* Component name that serves as the entrypoint / root component of the fixture.
* @example x/test
*/
entry: string;
/** Props to provide to the top-level component. */
props?: Record<string, string | string[]>;
/** Output files used by ssr-compiler, when the output needs to differ fron engine-server */
ssrFiles?: {
error?: string;
expected?: string;
};
/** The string used to uniquely identify one set of dedupe IDs with multiple SSR islands */
styleDedupe?: string;
}
vi.mock('@lwc/ssr-runtime', async () => {
const runtime = await import('@lwc/ssr-runtime');
try {
runtime.setHooks({
sanitizeHtmlContent(content: unknown) {
return String(content);
},
});
} catch (_err) {
// Ignore error if the hook is already overridden
}
return runtime;
});
const SSR_MODE: CompilationMode = DEFAULT_SSR_MODE;
async function compileFixture({ entry, dirname }: { entry: string; dirname: string }) {
const modulesDir = path.resolve(dirname, './modules');
const outputFile = path.resolve(dirname, './dist/compiled-experimental-ssr.js');
const input = 'virtual/fixture/test.js';
const bundle = await rollup({
input,
external: ['lwc', '@lwc/ssr-runtime', 'vitest'],
plugins: [
pluginVirtual(`export { default } from "${entry}";`, input),
lwcRollupPlugin({
targetSSR: true,
ssrMode: SSR_MODE,
enableDynamicComponents: true,
enableLwcOn: true,
// TODO [#3331]: remove usage of lwc:dynamic in 246
experimentalDynamicDirective: true,
modules: [{ dir: modulesDir }],
experimentalDynamicComponent: {
loader: path.join(__dirname, './utils/custom-loader.js'),
strictSpecifier: false,
},
}),
],
onwarn({ message, code }) {
if (code !== 'CIRCULAR_DEPENDENCY') {
throw new Error(message);
}
},
});
await bundle.write({
file: outputFile,
format: 'esm',
exports: 'named',
});
return outputFile;
}
describe.concurrent('fixtures', () => {
testFixtureDir<FixtureConfig>(
{
root: path.resolve(__dirname, '../../../engine-server/src/__tests__/fixtures'),
pattern: '**/config.json',
ssrVersion: 2,
// TODO [#4815]: enable all SSR v2 tests
expectedFailures,
},
async ({ dirname, config }) => {
const errorFile = config?.ssrFiles?.error ?? 'error.txt';
const expectedFile = config?.ssrFiles?.expected ?? 'expected.html';
let compiledFixturePath;
try {
compiledFixturePath = await compileFixture({
entry: config!.entry,
dirname,
});
} catch (err: any) {
return {
[errorFile]: err.message,
[expectedFile]: '',
};
}
const module: LightningElementConstructor = (await import(compiledFixturePath)).default;
let result;
let error;
try {
result = formatHTML(
await serverSideRenderComponent(
'fixture-test',
module,
config?.props ?? {},
config?.styleDedupe ?? true,
SSR_MODE
)
);
} catch (err: any) {
error = err.message;
}
return {
[errorFile]: error,
[expectedFile]: result,
};
}
);
});