Skip to content

Commit 1f8349f

Browse files
test: add comprehensive tests for ConsumeSharedPlugin with layer handling
1 parent 8093171 commit 1f8349f

File tree

2 files changed

+802
-0
lines changed

2 files changed

+802
-0
lines changed
Lines changed: 284 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,284 @@
1+
import { ConsumeSharedPlugin } from '../../../src';
2+
import path from 'path';
3+
import { normalizeWebpackPath } from '@module-federation/sdk/normalize-webpack-path';
4+
const webpack = require(normalizeWebpackPath('webpack'));
5+
6+
const compile = (compiler: any): Promise<any> => {
7+
return new Promise((resolve, reject) => {
8+
compiler.run((err: Error | null | undefined, stats: any) => {
9+
if (err) return reject(err);
10+
resolve(stats);
11+
});
12+
});
13+
};
14+
15+
describe('ConsumeSharedPlugin - Layers Consume Loader Scenario', () => {
16+
let compiler: any;
17+
18+
it('should resolve "lib-two" via fallback "lib2" when imported from a specific layer', async () => {
19+
const webpackConfig = {
20+
context: path.resolve(
21+
__dirname,
22+
'../../configCases/sharing/layers-consume-loader',
23+
),
24+
entry: {
25+
main: {
26+
import: './src/index.js',
27+
},
28+
},
29+
mode: 'development',
30+
devtool: false,
31+
experiments: {
32+
layers: true,
33+
},
34+
module: {
35+
rules: [
36+
{
37+
test: /tests\/different-layers\.test\.js$/,
38+
layer: 'differing-layer',
39+
},
40+
{
41+
test: /tests\/prefixed-share\.test\.js$/,
42+
layer: 'prefixed-layer',
43+
},
44+
{
45+
layer: 'multi-pkg-layer',
46+
issuerLayer: 'prefixed-layer',
47+
use: [
48+
{
49+
loader: path.resolve(
50+
__dirname,
51+
'../../configCases/sharing/layers-consume-loader/loaders/multi-pkg-layer-loader.js',
52+
),
53+
},
54+
],
55+
},
56+
{
57+
layer: 'required-layer',
58+
issuerLayer: 'differing-layer',
59+
exclude: /react\/index2\.js$/,
60+
use: [
61+
{
62+
loader: path.resolve(
63+
__dirname,
64+
'../../configCases/sharing/layers-consume-loader/loaders/different-layer-loader.js',
65+
),
66+
},
67+
],
68+
},
69+
{
70+
test: /react\/index2\.js$/,
71+
layer: 'explicit-layer',
72+
use: [
73+
{
74+
loader: path.resolve(
75+
__dirname,
76+
'../../configCases/sharing/layers-consume-loader/loaders/explicit-layer-loader.js',
77+
),
78+
},
79+
],
80+
},
81+
{
82+
test: /tests\/lib-two\.test\.js$/,
83+
layer: 'lib-two-layer',
84+
},
85+
{
86+
test: /lib2\/index\.js$/,
87+
layer: 'lib-two-required-layer',
88+
issuerLayer: 'lib-two-layer',
89+
use: [
90+
{
91+
loader: path.resolve(
92+
__dirname,
93+
'../../configCases/sharing/layers-consume-loader/loaders/different-layer-loader.js',
94+
),
95+
},
96+
],
97+
},
98+
],
99+
},
100+
plugins: [
101+
new ConsumeSharedPlugin({
102+
consumes: {
103+
react: {
104+
singleton: true,
105+
},
106+
'explicit-layer-react': {
107+
request: 'react/index2',
108+
import: 'react/index2',
109+
shareKey: 'react',
110+
singleton: true,
111+
issuerLayer: 'differing-layer',
112+
layer: 'explicit-layer',
113+
},
114+
'differing-layer-react': {
115+
request: 'react',
116+
import: 'react',
117+
shareKey: 'react',
118+
singleton: true,
119+
issuerLayer: 'differing-layer',
120+
layer: 'differing-layer',
121+
},
122+
'lib-two': {
123+
request: 'lib-two',
124+
import: 'lib2',
125+
requiredVersion: '^1.0.0',
126+
strictVersion: true,
127+
eager: false,
128+
},
129+
nonsense: {
130+
request: 'lib-two',
131+
import: 'lib2',
132+
shareKey: 'lib-two',
133+
requiredVersion: '^1.0.0',
134+
strictVersion: true,
135+
eager: true,
136+
issuerLayer: 'lib-two-layer',
137+
layer: 'differing-layer',
138+
},
139+
'lib-two-layered': {
140+
import: 'lib2',
141+
shareKey: 'lib-two',
142+
requiredVersion: '^1.0.0',
143+
strictVersion: true,
144+
eager: true,
145+
issuerLayer: 'lib-two-layer',
146+
layer: 'differing-layer',
147+
},
148+
multi: {
149+
request: 'multi-pkg/',
150+
requiredVersion: '^2.0.0',
151+
strictVersion: true,
152+
eager: true,
153+
},
154+
},
155+
}),
156+
],
157+
resolve: {
158+
modules: [
159+
path.resolve(
160+
__dirname,
161+
'../../configCases/sharing/layers-consume-loader/node_modules',
162+
),
163+
'node_modules',
164+
],
165+
},
166+
};
167+
168+
compiler = webpack(webpackConfig);
169+
170+
const stats = await compile(compiler);
171+
172+
if (stats.hasErrors()) {
173+
throw new Error(stats.toJson({ errors: true }).errors);
174+
}
175+
176+
const output = stats.toJson({
177+
modules: true,
178+
errors: true,
179+
warnings: true,
180+
assets: true,
181+
});
182+
183+
expect(stats.hasErrors()).toBe(false);
184+
expect(stats.hasWarnings()).toBe(false);
185+
186+
const entryModule = output.modules.find((m) =>
187+
m.name?.endsWith('src/index.js'),
188+
);
189+
expect(entryModule).toBeDefined();
190+
const importsLibTwoTest = entryModule?.reasons?.some((r) =>
191+
r.moduleName?.endsWith('tests/lib-two.test.js'),
192+
);
193+
194+
const libTwoTestModule = output.modules.find((m) =>
195+
m.name?.endsWith('tests/lib-two.test.js'),
196+
);
197+
expect(libTwoTestModule).toBeDefined();
198+
expect(libTwoTestModule?.layer).toBe('lib-two-layer');
199+
200+
const consumedLibTwoModule = output.modules.find(
201+
(m) =>
202+
m.moduleType === 'consume-shared-module' &&
203+
m.name?.startsWith('consume shared module (default) lib-two@') &&
204+
m.issuerId === libTwoTestModule?.id &&
205+
m.layer === 'differing-layer' &&
206+
m.reasons?.some(
207+
(r) =>
208+
r.moduleId === libTwoTestModule?.id &&
209+
(r.userRequest === 'lib-two' ||
210+
r.userRequest === 'lib-two-layered'),
211+
),
212+
);
213+
expect(consumedLibTwoModule).toBeDefined();
214+
215+
const lib2ModuleAsFallback = output.modules.find(
216+
(m) =>
217+
m.name?.includes('node_modules/lib2/index.js') &&
218+
m.issuerId === consumedLibTwoModule?.id,
219+
);
220+
expect(lib2ModuleAsFallback).toBeDefined();
221+
222+
const loadedLib2Instance = output.modules.find(
223+
(m) =>
224+
m.nameForCondition?.endsWith('node_modules/lib2/index.js') &&
225+
m.identifier?.includes('different-layer-loader.js') &&
226+
m.layer === 'required-layer',
227+
);
228+
expect(loadedLib2Instance).toBeDefined();
229+
expect(loadedLib2Instance?.issuerId).toBe(consumedLibTwoModule?.id);
230+
231+
const differentLayersTestModule = output.modules.find((m) =>
232+
m.name?.endsWith('tests/different-layers.test.js'),
233+
);
234+
expect(differentLayersTestModule).toBeDefined();
235+
expect(differentLayersTestModule?.layer).toBe('differing-layer');
236+
237+
const consumedReactModuleFromDiffLayer = output.modules.find(
238+
(m) =>
239+
m.moduleType === 'consume-shared-module' &&
240+
m.name?.startsWith('consume shared module (default) react@') &&
241+
m.issuerId === differentLayersTestModule?.id &&
242+
m.layer === 'differing-layer' &&
243+
m.reasons?.some(
244+
(r) =>
245+
r.moduleId === differentLayersTestModule?.id &&
246+
r.userRequest === 'react',
247+
),
248+
);
249+
expect(consumedReactModuleFromDiffLayer).toBeDefined();
250+
251+
const loadedReactInRequiredLayer = output.modules.find(
252+
(m) =>
253+
m.nameForCondition?.endsWith('node_modules/react/index.js') &&
254+
m.identifier?.includes('different-layer-loader.js') &&
255+
m.layer === 'required-layer' &&
256+
m.issuerId === consumedReactModuleFromDiffLayer?.id,
257+
);
258+
expect(loadedReactInRequiredLayer).toBeDefined();
259+
260+
const consumedReactIndex2ModuleInExplicitLayer = output.modules.find(
261+
(m) =>
262+
m.moduleType === 'consume-shared-module' &&
263+
m.name?.includes('fallback: ./node_modules/react/index2.js') &&
264+
m.name?.startsWith('consume shared module (default) react@') &&
265+
m.issuerId === differentLayersTestModule?.id &&
266+
m.layer === 'explicit-layer' &&
267+
m.reasons?.some(
268+
(r) =>
269+
r.moduleId === differentLayersTestModule?.id &&
270+
r.userRequest === 'react/index2',
271+
),
272+
);
273+
expect(consumedReactIndex2ModuleInExplicitLayer).toBeDefined();
274+
275+
const loadedReactIndex2InExplicitLayer = output.modules.find(
276+
(m) =>
277+
m.nameForCondition?.endsWith('node_modules/react/index2.js') &&
278+
m.identifier?.includes('explicit-layer-loader.js') &&
279+
m.layer === 'explicit-layer' &&
280+
m.issuerId === consumedReactIndex2ModuleInExplicitLayer?.id,
281+
);
282+
expect(loadedReactIndex2InExplicitLayer).toBeDefined();
283+
});
284+
});

0 commit comments

Comments
 (0)