Skip to content

Commit 9e636a6

Browse files
committed
test(shrinkwrap-extractor): Add test for dependencies hoisted to the workspace root for packages other than the target
1 parent 64079c7 commit 9e636a6

File tree

3 files changed

+158
-3
lines changed

3 files changed

+158
-3
lines changed

internal/shrinkwrap-extractor/test/expected/package.c/npm-shrinkwrap.json

Lines changed: 57 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
{
2+
"name": "@ui5/cli-monorepo",
3+
"version": "0.0.1",
4+
"lockfileVersion": 3,
5+
"requires": true,
6+
"packages": {
7+
"": {
8+
"name": "monorepo-root",
9+
"version": "0.0.1",
10+
"license": "Apache-2.0",
11+
"workspaces": [
12+
"packages/target",
13+
"packages/module-a",
14+
"packages/module-b"
15+
],
16+
"dependencies": {},
17+
"devDependencies": {}
18+
},
19+
"node_modules/@ui5/target": {
20+
"resolved": "packages/target",
21+
"link": true
22+
},
23+
"node_modules/@ui5/module-a": {
24+
"resolved": "packages/module-a",
25+
"link": true
26+
},
27+
"node_modules/@ui5/module-b": {
28+
"resolved": "packages/module-b",
29+
"link": true
30+
},
31+
"packages/target": {
32+
"name": "@ui5/target",
33+
"version": "1.0.0",
34+
"license": "Apache-2.0",
35+
"dependencies": {
36+
"@sapui5/some-thirdparty": "^1.0.0",
37+
"@ui5/module-a": "^1.0.0",
38+
"@ui5/module-b": "^1.0.0"
39+
},
40+
"devDependencies": {}
41+
},
42+
"packages/module-a": {
43+
"name": "@ui5/module-a",
44+
"version": "1.0.0",
45+
"license": "Apache-2.0",
46+
"dependencies": {
47+
"@ui5/module-b": "^1.0.0",
48+
"@sapui5/some-thirdparty": "^2.0.0"
49+
},
50+
"devDependencies": {}
51+
},
52+
"packages/module-b": {
53+
"name": "@ui5/module-b",
54+
"version": "1.0.0",
55+
"license": "Apache-2.0",
56+
"dependencies": {
57+
"@sapui5/some-thirdparty": "^2.0.0"
58+
},
59+
"devDependencies": {}
60+
},
61+
"node_modules/@sapui5/some-thirdparty": {
62+
"version": "2.0.0"
63+
},
64+
"node_modules/@ui5/target/node_modules/@sapui5/some-thirdparty": {
65+
"version": "1.0.0"
66+
}
67+
}
68+
}

internal/shrinkwrap-extractor/test/lib/convertToShrinkwrap.js

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ test("Workspace paths should be normalized to node_modules format", async (t) =>
119119
console.log(`✓ All ${packagePaths.length - 1} package paths correctly normalized`);
120120
});
121121

122-
test("Compare generated shrinkwrap with expected result", async (t) => {
122+
test("Compare generated shrinkwrap with expected result: package.a", async (t) => {
123123
// Setup mock to prevent actual npm registry requests
124124
const mockRestore = setupPacoteMock();
125125
t.after(() => mockRestore());
@@ -172,8 +172,7 @@ test("Compare generated shrinkwrap with expected result", async (t) => {
172172
"Generated shrinkwrap packages should match expected");
173173
});
174174

175-
176-
test("Compare generated shrinkwrap with expected result", async (t) => {
175+
test("Compare generated shrinkwrap with expected result: package.b", async (t) => {
177176
// Setup mock to prevent actual npm registry requests
178177
const mockRestore = setupPacoteMock();
179178
t.after(() => mockRestore());
@@ -204,6 +203,37 @@ test("Compare generated shrinkwrap with expected result", async (t) => {
204203
"Generated shrinkwrap packages should match expected");
205204
});
206205

206+
test("Compare generated shrinkwrap with expected result: package.c", async (t) => {
207+
// Setup mock to prevent actual npm registry requests
208+
const mockRestore = setupPacoteMock();
209+
t.after(() => mockRestore());
210+
211+
const __dirname = import.meta.dirname;
212+
const generatedShrinkwrapPath = path.join(__dirname, "..", "tmp", "package.c", "npm-shrinkwrap.generated.json");
213+
// Clean any existing generated file
214+
await mkdir(path.dirname(generatedShrinkwrapPath), {recursive: true});
215+
await unlink(generatedShrinkwrapPath).catch(() => {});
216+
217+
// Generate shrinkwrap from fixture
218+
const cwd = path.join(__dirname, "..", "fixture", "project.c");
219+
const symlinkPath = await setupFixtureSymlink(cwd);
220+
t.after(async () => await unlink(symlinkPath).catch(() => {}));
221+
222+
const targetPackageName = "@ui5/target";
223+
224+
const generatedShrinkwrap = await convertPackageLockToShrinkwrap(cwd, targetPackageName);
225+
226+
// Load expected shrinkwrap
227+
const expectedShrinkwrapPath = path.join(__dirname, "..", "expected", "package.c", "npm-shrinkwrap.json");
228+
const expectedShrinkwrap = await readJson(expectedShrinkwrapPath);
229+
230+
// Write generated shrinkwrap to tmp dir for debugging purposes
231+
await writeFile(generatedShrinkwrapPath, JSON.stringify(generatedShrinkwrap, null, "\t"), "utf-8");
232+
233+
assert.deepEqual(generatedShrinkwrap.packages, expectedShrinkwrap.packages,
234+
"Generated shrinkwrap packages should match expected");
235+
});
236+
207237
// Error handling tests
208238
test("Error handling - invalid target package name", async (t) => {
209239
const __dirname = import.meta.dirname;

0 commit comments

Comments
 (0)