Skip to content

Commit 9b414a7

Browse files
authored
[FIX] Resolve properly absolute path for ui5HomeDir (#588)
1 parent f081502 commit 9b414a7

File tree

2 files changed

+71
-6
lines changed

2 files changed

+71
-6
lines changed

lib/ui5Framework/AbstractResolver.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,11 @@ class AbstractResolver {
4343
throw new Error(`AbstractResolver: Missing parameter "version"`);
4444
}
4545

46-
this._ui5HomeDir = ui5HomeDir ? path.resolve(ui5HomeDir) : path.join(os.homedir(), ".ui5");
46+
// In some CI environments, the homedir might be set explicitly to a relative
47+
// path (e.g. "./"), but tooling requires an absolute path
48+
this._ui5HomeDir = path.resolve(
49+
ui5HomeDir || path.join(os.homedir(), ".ui5")
50+
);
4751
this._cwd = cwd ? path.resolve(cwd) : process.cwd();
4852
this._version = version;
4953
}

test/lib/ui5framework/AbstractResolver.js

Lines changed: 66 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,30 @@ import path from "node:path";
44
import os from "node:os";
55
import {fileURLToPath} from "node:url";
66
import {readFile} from "node:fs/promises";
7-
import AbstractResolver from "../../../lib/ui5Framework/AbstractResolver.js";
7+
import esmock from "esmock";
88

9-
class MyResolver extends AbstractResolver {
10-
static async fetchAllVersions() {}
11-
}
9+
test.beforeEach(async (t) => {
10+
t.context.osHomeDirStub = sinon.stub().callsFake(() => os.homedir());
11+
t.context.AbstractResolver = await esmock.p("../../../lib/ui5Framework/AbstractResolver.js", {
12+
"node:os": {
13+
homedir: t.context.osHomeDirStub
14+
}
15+
});
1216

13-
test.afterEach.always(() => {
17+
class MyResolver extends t.context.AbstractResolver {
18+
static async fetchAllVersions() {}
19+
}
20+
21+
t.context.MyResolver = MyResolver;
22+
});
23+
24+
test.afterEach.always((t) => {
25+
esmock.purge(t.context.AbstractResolver);
1426
sinon.restore();
1527
});
1628

1729
test("AbstractResolver: abstract constructor should throw", async (t) => {
30+
const {AbstractResolver} = t.context;
1831
await t.throwsAsync(async () => {
1932
new AbstractResolver({
2033
cwd: "/test-project/",
@@ -24,6 +37,7 @@ test("AbstractResolver: abstract constructor should throw", async (t) => {
2437
});
2538

2639
test("AbstractResolver: constructor", (t) => {
40+
const {MyResolver, AbstractResolver} = t.context;
2741
const resolver = new MyResolver({
2842
cwd: "/test-project/",
2943
version: "1.75.0"
@@ -33,12 +47,14 @@ test("AbstractResolver: constructor", (t) => {
3347
});
3448

3549
test("AbstractResolver: constructor requires 'version'", (t) => {
50+
const {MyResolver} = t.context;
3651
t.throws(() => {
3752
new MyResolver({});
3853
}, {message: `AbstractResolver: Missing parameter "version"`});
3954
});
4055

4156
test("AbstractResolver: Set absolute 'cwd'", (t) => {
57+
const {MyResolver} = t.context;
4258
const resolver = new MyResolver({
4359
version: "1.75.0",
4460
cwd: "/my-cwd"
@@ -47,6 +63,7 @@ test("AbstractResolver: Set absolute 'cwd'", (t) => {
4763
});
4864

4965
test("AbstractResolver: Set relative 'cwd'", (t) => {
66+
const {MyResolver} = t.context;
5067
const resolver = new MyResolver({
5168
version: "1.75.0",
5269
cwd: "./my-cwd"
@@ -55,6 +72,7 @@ test("AbstractResolver: Set relative 'cwd'", (t) => {
5572
});
5673

5774
test("AbstractResolver: Defaults 'cwd' to process.cwd()", (t) => {
75+
const {MyResolver} = t.context;
5876
const resolver = new MyResolver({
5977
version: "1.75.0",
6078
ui5HomeDir: "/ui5home"
@@ -63,6 +81,7 @@ test("AbstractResolver: Defaults 'cwd' to process.cwd()", (t) => {
6381
});
6482

6583
test("AbstractResolver: Set absolute 'ui5HomeDir'", (t) => {
84+
const {MyResolver} = t.context;
6685
const resolver = new MyResolver({
6786
version: "1.75.0",
6887
ui5HomeDir: "/my-ui5HomeDir"
@@ -71,14 +90,27 @@ test("AbstractResolver: Set absolute 'ui5HomeDir'", (t) => {
7190
});
7291

7392
test("AbstractResolver: Set relative 'ui5HomeDir'", (t) => {
93+
const {MyResolver} = t.context;
7494
const resolver = new MyResolver({
7595
version: "1.75.0",
7696
ui5HomeDir: "./my-ui5HomeDir"
7797
});
7898
t.is(resolver._ui5HomeDir, path.resolve("./my-ui5HomeDir"), "Should be resolved 'ui5HomeDir'");
7999
});
80100

101+
test("AbstractResolver: 'ui5HomeDir' overriden os.homedir()", (t) => {
102+
const {MyResolver, osHomeDirStub} = t.context;
103+
104+
osHomeDirStub.returns("./");
105+
106+
const resolver = new MyResolver({
107+
version: "1.75.0"
108+
});
109+
t.is(resolver._ui5HomeDir, path.resolve("./.ui5"), "Should be resolved 'ui5HomeDir'");
110+
});
111+
81112
test("AbstractResolver: Defaults 'ui5HomeDir' to ~/.ui5", (t) => {
113+
const {MyResolver} = t.context;
82114
const resolver = new MyResolver({
83115
version: "1.75.0",
84116
cwd: "/test-project/"
@@ -87,6 +119,7 @@ test("AbstractResolver: Defaults 'ui5HomeDir' to ~/.ui5", (t) => {
87119
});
88120

89121
test("AbstractResolver: getLibraryMetadata should throw an Error when not implemented", async (t) => {
122+
const {MyResolver} = t.context;
90123
await t.throwsAsync(async () => {
91124
const resolver = new MyResolver({
92125
cwd: "/test-project/",
@@ -97,6 +130,7 @@ test("AbstractResolver: getLibraryMetadata should throw an Error when not implem
97130
});
98131

99132
test("AbstractResolver: handleLibrary should throw an Error when not implemented", async (t) => {
133+
const {MyResolver} = t.context;
100134
await t.throwsAsync(async () => {
101135
const resolver = new MyResolver({
102136
cwd: "/test-project/",
@@ -107,6 +141,7 @@ test("AbstractResolver: handleLibrary should throw an Error when not implemented
107141
});
108142

109143
test("AbstractResolver: install", async (t) => {
144+
const {MyResolver} = t.context;
110145
const resolver = new MyResolver({
111146
cwd: "/test-project/",
112147
version: "1.75.0"
@@ -175,6 +210,7 @@ test("AbstractResolver: install", async (t) => {
175210
});
176211

177212
test("AbstractResolver: install error handling (rejection of metadata/install)", async (t) => {
213+
const {MyResolver} = t.context;
178214
const resolver = new MyResolver({
179215
cwd: "/test-project/",
180216
version: "1.75.0"
@@ -204,6 +240,7 @@ Failed to resolve library sap.ui.lib2: Error installing sap.ui.lib2`});
204240
});
205241

206242
test("AbstractResolver: install error handling (rejection of dependency metadata/install)", async (t) => {
243+
const {MyResolver} = t.context;
207244
const resolver = new MyResolver({
208245
cwd: "/test-project/",
209246
version: "1.75.0"
@@ -234,6 +271,7 @@ Failed to resolve library sap.ui.lib2: Error installing sap.ui.lib2`});
234271
});
235272

236273
test("AbstractResolver: install error handling (rejection of dependency install)", async (t) => {
274+
const {MyResolver} = t.context;
237275
const resolver = new MyResolver({
238276
cwd: "/test-project/",
239277
version: "1.75.0"
@@ -276,6 +314,7 @@ Failed to resolve library sap.ui.lib3: Error installing sap.ui.lib3`});
276314
});
277315

278316
test("AbstractResolver: install error handling (handleLibrary throws error)", async (t) => {
317+
const {MyResolver} = t.context;
279318
const resolver = new MyResolver({
280319
cwd: "/test-project/",
281320
version: "1.75.0"
@@ -297,12 +336,14 @@ Failed to resolve library sap.ui.lib2: Error within handleLibrary: sap.ui.lib2`}
297336
});
298337

299338
test("AbstractResolver: static fetchAllVersions should throw an Error when not implemented", async (t) => {
339+
const {AbstractResolver} = t.context;
300340
await t.throwsAsync(async () => {
301341
await AbstractResolver.fetchAllVersions();
302342
}, {message: `AbstractResolver: static fetchAllVersions must be implemented!`});
303343
});
304344

305345
test.serial("AbstractResolver: Static resolveVersion resolves 'latest'", async (t) => {
346+
const {MyResolver} = t.context;
306347
const fetchAllVersionsStub = sinon.stub(MyResolver, "fetchAllVersions")
307348
.returns(["1.75.0", "1.75.1", "1.76.0"]);
308349

@@ -321,6 +362,7 @@ test.serial("AbstractResolver: Static resolveVersion resolves 'latest'", async (
321362
});
322363

323364
test.serial("AbstractResolver: Static resolveVersion resolves 'MAJOR.MINOR'", async (t) => {
365+
const {MyResolver} = t.context;
324366
const fetchAllVersionsStub = sinon.stub(MyResolver, "fetchAllVersions")
325367
.returns(["1.75.0", "1.75.1", "1.76.0"]);
326368

@@ -339,6 +381,7 @@ test.serial("AbstractResolver: Static resolveVersion resolves 'MAJOR.MINOR'", as
339381
});
340382

341383
test.serial("AbstractResolver: Static resolveVersion resolves 'MAJOR.MINOR.PATCH'", async (t) => {
384+
const {MyResolver} = t.context;
342385
const fetchAllVersionsStub = sinon.stub(MyResolver, "fetchAllVersions")
343386
.returns(["1.75.0", "1.75.1", "1.76.0"]);
344387

@@ -357,6 +400,7 @@ test.serial("AbstractResolver: Static resolveVersion resolves 'MAJOR.MINOR.PATCH
357400
});
358401

359402
test.serial("AbstractResolver: Static resolveVersion resolves 'MAJOR.MINOR.PATCH-prerelease'", async (t) => {
403+
const {MyResolver} = t.context;
360404
const fetchAllVersionsStub = sinon.stub(MyResolver, "fetchAllVersions")
361405
.returns(["1.76.0", "1.77.0", "1.78.0", "1.79.0-SNAPSHOT"]);
362406

@@ -375,6 +419,7 @@ test.serial("AbstractResolver: Static resolveVersion resolves 'MAJOR.MINOR.PATCH
375419
});
376420

377421
test.serial("AbstractResolver: Static resolveVersion does not include prereleases for 'latest' version", async (t) => {
422+
const {MyResolver} = t.context;
378423
const fetchAllVersionsStub = sinon.stub(MyResolver, "fetchAllVersions")
379424
.returns(["1.76.0", "1.77.0", "1.78.0", "1.79.0-SNAPSHOT"]);
380425

@@ -393,6 +438,7 @@ test.serial("AbstractResolver: Static resolveVersion does not include prerelease
393438
});
394439

395440
test.serial("AbstractResolver: Static resolveVersion without options", async (t) => {
441+
const {MyResolver} = t.context;
396442
const fetchAllVersionsStub = sinon.stub(MyResolver, "fetchAllVersions")
397443
.returns(["1.75.0"]);
398444

@@ -406,6 +452,7 @@ test.serial("AbstractResolver: Static resolveVersion without options", async (t)
406452
});
407453

408454
test.serial("AbstractResolver: Static resolveVersion throws error for 'lts'", async (t) => {
455+
const {MyResolver} = t.context;
409456
const fetchAllVersionsStub = sinon.stub(MyResolver, "fetchAllVersions");
410457

411458
const error = await t.throwsAsync(MyResolver.resolveVersion("lts", {
@@ -419,6 +466,7 @@ test.serial("AbstractResolver: Static resolveVersion throws error for 'lts'", as
419466
});
420467

421468
test.serial("AbstractResolver: Static resolveVersion throws error for '1'", async (t) => {
469+
const {MyResolver} = t.context;
422470
const fetchAllVersionsStub = sinon.stub(MyResolver, "fetchAllVersions");
423471

424472
const error = await t.throwsAsync(MyResolver.resolveVersion("1", {
@@ -432,6 +480,7 @@ test.serial("AbstractResolver: Static resolveVersion throws error for '1'", asyn
432480
});
433481

434482
test.serial("AbstractResolver: Static resolveVersion throws error for '1.x'", async (t) => {
483+
const {MyResolver} = t.context;
435484
const fetchAllVersionsStub = sinon.stub(MyResolver, "fetchAllVersions");
436485

437486
const error = await t.throwsAsync(MyResolver.resolveVersion("1.x", {
@@ -445,6 +494,7 @@ test.serial("AbstractResolver: Static resolveVersion throws error for '1.x'", as
445494
});
446495

447496
test.serial("AbstractResolver: Static resolveVersion throws error for '1.75.x'", async (t) => {
497+
const {MyResolver} = t.context;
448498
const fetchAllVersionsStub = sinon.stub(MyResolver, "fetchAllVersions");
449499

450500
const error = await t.throwsAsync(MyResolver.resolveVersion("1.75.x", {
@@ -458,6 +508,7 @@ test.serial("AbstractResolver: Static resolveVersion throws error for '1.75.x'",
458508
});
459509

460510
test.serial("AbstractResolver: Static resolveVersion throws error for '^1.75.0'", async (t) => {
511+
const {MyResolver} = t.context;
461512
const fetchAllVersionsStub = sinon.stub(MyResolver, "fetchAllVersions");
462513

463514
const error = await t.throwsAsync(MyResolver.resolveVersion("^1.75.0", {
@@ -471,6 +522,7 @@ test.serial("AbstractResolver: Static resolveVersion throws error for '^1.75.0'"
471522
});
472523

473524
test.serial("AbstractResolver: Static resolveVersion throws error for '~1.75.0'", async (t) => {
525+
const {MyResolver} = t.context;
474526
const fetchAllVersionsStub = sinon.stub(MyResolver, "fetchAllVersions");
475527

476528
const error = await t.throwsAsync(MyResolver.resolveVersion("~1.75.0", {
@@ -484,6 +536,7 @@ test.serial("AbstractResolver: Static resolveVersion throws error for '~1.75.0'"
484536
});
485537

486538
test.serial("AbstractResolver: Static resolveVersion throws error for version not found", async (t) => {
539+
const {MyResolver} = t.context;
487540
sinon.stub(MyResolver, "fetchAllVersions")
488541
.returns(["1.75.0", "1.75.1", "1.76.0"]);
489542

@@ -498,6 +551,7 @@ test.serial("AbstractResolver: Static resolveVersion throws error for version no
498551

499552
test.serial(
500553
"AbstractResolver: Static resolveVersion throws error for version lower than lowest OpenUI5 version", async (t) => {
554+
const {AbstractResolver} = t.context;
501555
class Openui5Resolver extends AbstractResolver {
502556
static async fetchAllVersions() {}
503557
}
@@ -517,6 +571,7 @@ test.serial(
517571

518572
test.serial(
519573
"AbstractResolver: Static resolveVersion throws error for version lower than lowest SAPUI5 version", async (t) => {
574+
const {AbstractResolver} = t.context;
520575
class Sapui5Resolver extends AbstractResolver {
521576
static async fetchAllVersions() {}
522577
}
@@ -536,6 +591,7 @@ test.serial(
536591

537592
test.serial(
538593
"AbstractResolver: Static resolveVersion throws error when latest OpenUI5 version cannot be found", async (t) => {
594+
const {AbstractResolver} = t.context;
539595
class Openui5Resolver extends AbstractResolver {
540596
static async fetchAllVersions() {}
541597
}
@@ -554,6 +610,7 @@ test.serial(
554610

555611
test.serial(
556612
"AbstractResolver: Static resolveVersion throws error when latest SAPUI5 version cannot be found", async (t) => {
613+
const {AbstractResolver} = t.context;
557614
class Sapui5Resolver extends AbstractResolver {
558615
static async fetchAllVersions() {}
559616
}
@@ -572,6 +629,7 @@ test.serial(
572629

573630
test.serial(
574631
"AbstractResolver: Static resolveVersion throws error when OpenUI5 version range cannot be resolved", async (t) => {
632+
const {AbstractResolver} = t.context;
575633
class Openui5Resolver extends AbstractResolver {
576634
static async fetchAllVersions() {}
577635
}
@@ -590,6 +648,7 @@ test.serial(
590648

591649
test.serial(
592650
"AbstractResolver: Static resolveVersion throws error when SAPUI5 version range cannot be resolved", async (t) => {
651+
const {AbstractResolver} = t.context;
593652
class Sapui5Resolver extends AbstractResolver {
594653
static async fetchAllVersions() {}
595654
}
@@ -607,6 +666,8 @@ test.serial(
607666
});
608667

609668
test.serial("AbstractResolver: SEMVER_VERSION_REGEXP should be aligned with JSON schema", async (t) => {
669+
const {AbstractResolver} = t.context;
670+
610671
const projectSchema = JSON.parse(
611672
await readFile(fileURLToPath(
612673
new URL("../../../lib/validation/schema/specVersion/kind/project.json", import.meta.url)

0 commit comments

Comments
 (0)