Skip to content

Commit

Permalink
chore(core-logger-pino): implements service provider schema (#4283)
Browse files Browse the repository at this point in the history
  • Loading branch information
sebastijankuzner authored Jan 26, 2021
1 parent df2c5ad commit 6d86afc
Show file tree
Hide file tree
Showing 3 changed files with 140 additions and 0 deletions.
126 changes: 126 additions & 0 deletions __tests__/unit/core-logger-pino/service-provider.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { Application, Container, Services } from "@packages/core-kernel/src";
import { ServiceProvider } from "@packages/core-logger-pino/src";
import { defaults } from "@packages/core-logger-pino/src/defaults";
import { dirSync } from "tmp";
import { AnySchema } from "@hapi/joi";

let app: Application;

Expand Down Expand Up @@ -37,4 +38,129 @@ describe("ServiceProvider", () => {
it("should be disposable", async () => {
await expect(serviceProvider.dispose()).toResolve();
});

describe("ServiceProvider.configSchema", () => {
let serviceProvider: ServiceProvider;

beforeEach(() => {
serviceProvider = app.resolve<ServiceProvider>(ServiceProvider);

for (const key of Object.keys(process.env)) {
if (key.includes("CORE_LOG_LEVEL")) {
delete process.env[key];
}
}
});

it("should validate schema using defaults", async () => {
jest.resetModules();
const result = (serviceProvider.configSchema() as AnySchema).validate(
(await import("@packages/core-logger-pino/src/defaults")).defaults,
);

expect(result.error).toBeUndefined();

expect(result.value.levels.console).toBeString();
expect(result.value.levels.file).toBeString();

expect(result.value.fileRotator.interval).toBeString();
});

describe("process.env.CORE_LOG_LEVEL", () => {
it("should return value of process.env.CORE_LOG_LEVEL if defined", async () => {
process.env.CORE_LOG_LEVEL = "dummy";

jest.resetModules();
const result = (serviceProvider.configSchema() as AnySchema).validate(
(await import("@packages/core-logger-pino/src/defaults")).defaults,
);

expect(result.error).toBeUndefined();
expect(result.value.levels.console).toEqual("dummy");
});
});

describe("process.env.CORE_LOG_LEVEL_FILE", () => {
it("should return value of process.env.CORE_LOG_LEVEL_FILE if defined", async () => {
process.env.CORE_LOG_LEVEL_FILE = "dummy";

jest.resetModules();
const result = (serviceProvider.configSchema() as AnySchema).validate(
(await import("@packages/core-logger-pino/src/defaults")).defaults,
);

expect(result.error).toBeUndefined();
expect(result.value.levels.file).toEqual("dummy");
});
});

describe("schema restrictions", () => {
let defaults;

beforeEach(async () => {
jest.resetModules();
defaults = (await import("@packages/core-logger-pino/src/defaults")).defaults;
});

it("levels is required && is object", async () => {
defaults.levels = false;
let result = (serviceProvider.configSchema() as AnySchema).validate(defaults);

expect(result.error!.message).toEqual('"levels" must be of type object');

delete defaults.levels;
result = (serviceProvider.configSchema() as AnySchema).validate(defaults);

expect(result.error!.message).toEqual('"levels" is required');
});

it("levels.console is required && is string", async () => {
defaults.levels.console = false;
let result = (serviceProvider.configSchema() as AnySchema).validate(defaults);

expect(result.error!.message).toEqual('"levels.console" must be a string');

delete defaults.levels.console;
result = (serviceProvider.configSchema() as AnySchema).validate(defaults);

expect(result.error!.message).toEqual('"levels.console" is required');
});

it("levels.file is required && is string", async () => {
defaults.levels.file = false;
let result = (serviceProvider.configSchema() as AnySchema).validate(defaults);

expect(result.error!.message).toEqual('"levels.file" must be a string');

delete defaults.levels.file;
result = (serviceProvider.configSchema() as AnySchema).validate(defaults);

expect(result.error!.message).toEqual('"levels.file" is required');
});

it("fileRotator is required && is object", async () => {
defaults.fileRotator = false;
let result = (serviceProvider.configSchema() as AnySchema).validate(defaults);

expect(result.error!.message).toEqual('"fileRotator" must be of type object');

delete defaults.fileRotator;
result = (serviceProvider.configSchema() as AnySchema).validate(defaults);

expect(result.error!.message).toEqual('"fileRotator" is required');
});

it("fileRotator.interval is required && is string", async () => {
defaults.fileRotator.interval = false;
let result = (serviceProvider.configSchema() as AnySchema).validate(defaults);

expect(result.error!.message).toEqual('"fileRotator.interval" must be a string');

delete defaults.fileRotator.interval;
result = (serviceProvider.configSchema() as AnySchema).validate(defaults);

expect(result.error!.message).toEqual('"fileRotator.interval" is required');
});
});
});
});
1 change: 1 addition & 0 deletions packages/core-logger-pino/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
"dependencies": {
"@arkecosystem/core-kernel": "^3.0.0-next.20",
"chalk": "^4.0.0",
"joi": "^17.3.0",
"pino": "^6.0.0",
"pino-pretty": "^4.0.0",
"pump": "^3.0.0",
Expand Down
13 changes: 13 additions & 0 deletions packages/core-logger-pino/src/service-provider.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { Container, Contracts, Providers, Services } from "@arkecosystem/core-kernel";
import Joi from "joi";

import { PinoLogger } from "./driver";

Expand All @@ -19,4 +20,16 @@ export class ServiceProvider extends Providers.ServiceProvider {
// todo: destroy console stream
// todo: destroy file stream
}

public configSchema(): object {
return Joi.object({
levels: Joi.object({
console: Joi.string().required(),
file: Joi.string().required(),
}).required(),
fileRotator: Joi.object({
interval: Joi.string().required(),
}).required(),
});
}
}

0 comments on commit 6d86afc

Please sign in to comment.