From 36b81abe6f32a111a81d43220c9f942477bfd9bd Mon Sep 17 00:00:00 2001 From: Yavor Ivanov Date: Thu, 27 Jul 2023 14:40:15 +0300 Subject: [PATCH] Add dataDir to the Config object + tests --- lib/config/Configuration.js | 36 ++++++++++++++------- test/lib/config/Configuration.js | 55 +++++++++++++++++--------------- 2 files changed, 55 insertions(+), 36 deletions(-) diff --git a/lib/config/Configuration.js b/lib/config/Configuration.js index b413a8799..4fdf8b0c2 100644 --- a/lib/config/Configuration.js +++ b/lib/config/Configuration.js @@ -11,13 +11,16 @@ import os from "node:os"; */ class Configuration { #mavenSnapshotEndpointUrl; + #ui5DataDir; /** * @param {object} configuration * @param {string} [configuration.mavenSnapshotEndpointUrl] + * @param {string} [configuration.ui5DataDir] */ - constructor({mavenSnapshotEndpointUrl}) { + constructor({mavenSnapshotEndpointUrl, ui5DataDir}) { this.#mavenSnapshotEndpointUrl = mavenSnapshotEndpointUrl; + this.#ui5DataDir = ui5DataDir; } /** @@ -31,6 +34,17 @@ class Configuration { return this.#mavenSnapshotEndpointUrl; } + /** + * Maven Repository Snapshot URL. + * Used to download artifacts and packages from Maven's build-snapshots URL. + * + * @public + * @returns {string} + */ + getUi5DataDir() { + return this.#ui5DataDir; + } + /** * @public * @returns {object} The configuration in a JSON format @@ -38,17 +52,10 @@ class Configuration { toJson() { return { mavenSnapshotEndpointUrl: this.#mavenSnapshotEndpointUrl, + ui5DataDir: this.#ui5DataDir, }; } - static #resolvePath(filePath) { - const ui5DataDir = process.env.UI5_DATA_DIR; - - return filePath || - (ui5DataDir && path.resolve(path.join(ui5DataDir, ".ui5rc"))) || - path.resolve(path.join(os.homedir(), ".ui5rc")); - } - /** * Creates Configuration from a JSON file * @@ -58,7 +65,7 @@ class Configuration { * @returns {Promise<@ui5/project/config/Configuration>} Configuration instance */ static async fromFile(filePath) { - filePath = Configuration.#resolvePath(filePath); + filePath = filePath || path.resolve(path.join(os.homedir(), ".ui5rc")); const {default: fs} = await import("graceful-fs"); const {promisify} = await import("node:util"); @@ -82,6 +89,13 @@ class Configuration { }); } } + + // ENV var should take precedence over the dataDir from the configuration. + const ui5DataDir = process.env.UI5_DATA_DIR; + if (ui5DataDir) { + config.ui5DataDir = path.resolve(path.join(ui5DataDir, ".ui5")); + } + return new Configuration(config); } @@ -95,7 +109,7 @@ class Configuration { * @returns {Promise} */ static async toFile(config, filePath) { - filePath = Configuration.#resolvePath(filePath); + filePath = filePath || path.resolve(path.join(os.homedir(), ".ui5rc")); const {default: fs} = await import("graceful-fs"); const {promisify} = await import("node:util"); diff --git a/test/lib/config/Configuration.js b/test/lib/config/Configuration.js index d2aaffe2f..aea19e3b8 100644 --- a/test/lib/config/Configuration.js +++ b/test/lib/config/Configuration.js @@ -28,13 +28,14 @@ test.afterEach.always((t) => { esmock.purge(t.context.Configuration); }); -test.serial("Build configuration with defaults", (t) => { +test("Build configuration with defaults", (t) => { const {Configuration} = t.context; const config = new Configuration({}); t.deepEqual(config.toJson(), { - mavenSnapshotEndpointUrl: undefined + mavenSnapshotEndpointUrl: undefined, + ui5DataDir: undefined, }); }); @@ -43,7 +44,8 @@ test.serial("Overwrite defaults defaults", (t) => { const {Configuration} = t.context; const params = { - mavenSnapshotEndpointUrl: "https://snapshot.url" + mavenSnapshotEndpointUrl: "https://snapshot.url", + ui5DataDir: "/custom/data/dir" }; const config = new Configuration(params); @@ -55,12 +57,14 @@ test.serial("Check getters", (t) => { const {Configuration} = t.context; const params = { - mavenSnapshotEndpointUrl: "https://snapshot.url" + mavenSnapshotEndpointUrl: "https://snapshot.url", + ui5DataDir: "/custom/data/dir" }; const config = new Configuration(params); t.is(config.getMavenSnapshotEndpointUrl(), params.mavenSnapshotEndpointUrl); + t.is(config.getUi5DataDir(), params.ui5DataDir); }); @@ -69,7 +73,8 @@ test.serial("fromFile", async (t) => { const {promisifyStub, sinon} = t.context; const ui5rcContents = { - mavenSnapshotEndpointUrl: "https://snapshot.url" + mavenSnapshotEndpointUrl: "https://snapshot.url", + ui5DataDir: "/custom/data/dir" }; const responseStub = sinon.stub().resolves(JSON.stringify(ui5rcContents)); promisifyStub.callsFake(() => responseStub); @@ -90,6 +95,7 @@ test.serial("fromFile: configuration file not found - fallback to default config t.is(config instanceof Configuration, true, "Created a default configuration"); t.is(config.getMavenSnapshotEndpointUrl(), undefined, "Default settings"); + t.is(config.getUi5DataDir(), undefined, "Default settings"); }); @@ -104,6 +110,25 @@ test.serial("fromFile: empty configuration file - fallback to default config", a t.is(config instanceof Configuration, true, "Created a default configuration"); t.is(config.getMavenSnapshotEndpointUrl(), undefined, "Default settings"); + t.is(config.getUi5DataDir(), undefined, "Default settings"); +}); + +test.serial("fromFile: ui5DataDir set via ENV variable", async (t) => { + const {promisifyStub, sinon, Configuration} = t.context; + const fromFile = Configuration.fromFile; + + process.env.UI5_DATA_DIR = "/custom/ui5rc/destination"; + + const responseStub = sinon.stub().resolves(""); + promisifyStub.callsFake(() => responseStub); + + const config = await fromFile("/non-existing/path/.ui5rc"); + + t.is(config instanceof Configuration, true, "Created a default configuration"); + t.is(config.getMavenSnapshotEndpointUrl(), undefined, "Default settings"); + t.is(config.getUi5DataDir(), "/custom/ui5rc/destination/.ui5", "ui5DataDir is resolved via the ENV Variable"); + + delete process.env.UI5_DATA_DIR; }); test.serial("fromFile: throws", async (t) => { @@ -135,26 +160,6 @@ test.serial("toFile", async (t) => { ); }); -test.serial("toFile with custom .ui5rc destination via ENV var", async (t) => { - const {promisifyStub, sinon, Configuration} = t.context; - const toFile = Configuration.toFile; - - process.env.UI5_DATA_DIR = "/custom/ui5rc/destination"; - const writeStub = sinon.stub().resolves(); - promisifyStub.callsFake(() => writeStub); - - const config = new Configuration({mavenSnapshotEndpointUrl: "https://registry.corp/vendor/build-snapshots/"}); - await toFile(config); - - delete process.env.UI5_DATA_DIR; - - t.deepEqual( - writeStub.getCall(0).args, - ["/custom/ui5rc/destination/.ui5rc", JSON.stringify(config.toJson())], - "Write config to path" - ); -}); - test.serial("toFile: throws", async (t) => { const {promisifyStub, sinon, Configuration} = t.context; const toFile = Configuration.toFile;