Skip to content

Commit

Permalink
Add dataDir to the Config object + tests
Browse files Browse the repository at this point in the history
  • Loading branch information
d3xter666 committed Jul 27, 2023
1 parent c6f070f commit 36b81ab
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 36 deletions.
36 changes: 25 additions & 11 deletions lib/config/Configuration.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

/**
Expand All @@ -31,24 +34,28 @@ 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
*/
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
*
Expand All @@ -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");
Expand All @@ -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);
}

Expand All @@ -95,7 +109,7 @@ class Configuration {
* @returns {Promise<void>}
*/
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");
Expand Down
55 changes: 30 additions & 25 deletions test/lib/config/Configuration.js
Original file line number Diff line number Diff line change
Expand Up @@ -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,
});
});

Expand All @@ -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);
Expand All @@ -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);
});


Expand All @@ -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);
Expand All @@ -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");
});


Expand All @@ -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) => {
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 36b81ab

Please sign in to comment.