Skip to content

Commit 6d86afc

Browse files
chore(core-logger-pino): implements service provider schema (#4283)
1 parent df2c5ad commit 6d86afc

File tree

3 files changed

+140
-0
lines changed

3 files changed

+140
-0
lines changed

__tests__/unit/core-logger-pino/service-provider.test.ts

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { Application, Container, Services } from "@packages/core-kernel/src";
55
import { ServiceProvider } from "@packages/core-logger-pino/src";
66
import { defaults } from "@packages/core-logger-pino/src/defaults";
77
import { dirSync } from "tmp";
8+
import { AnySchema } from "@hapi/joi";
89

910
let app: Application;
1011

@@ -37,4 +38,129 @@ describe("ServiceProvider", () => {
3738
it("should be disposable", async () => {
3839
await expect(serviceProvider.dispose()).toResolve();
3940
});
41+
42+
describe("ServiceProvider.configSchema", () => {
43+
let serviceProvider: ServiceProvider;
44+
45+
beforeEach(() => {
46+
serviceProvider = app.resolve<ServiceProvider>(ServiceProvider);
47+
48+
for (const key of Object.keys(process.env)) {
49+
if (key.includes("CORE_LOG_LEVEL")) {
50+
delete process.env[key];
51+
}
52+
}
53+
});
54+
55+
it("should validate schema using defaults", async () => {
56+
jest.resetModules();
57+
const result = (serviceProvider.configSchema() as AnySchema).validate(
58+
(await import("@packages/core-logger-pino/src/defaults")).defaults,
59+
);
60+
61+
expect(result.error).toBeUndefined();
62+
63+
expect(result.value.levels.console).toBeString();
64+
expect(result.value.levels.file).toBeString();
65+
66+
expect(result.value.fileRotator.interval).toBeString();
67+
});
68+
69+
describe("process.env.CORE_LOG_LEVEL", () => {
70+
it("should return value of process.env.CORE_LOG_LEVEL if defined", async () => {
71+
process.env.CORE_LOG_LEVEL = "dummy";
72+
73+
jest.resetModules();
74+
const result = (serviceProvider.configSchema() as AnySchema).validate(
75+
(await import("@packages/core-logger-pino/src/defaults")).defaults,
76+
);
77+
78+
expect(result.error).toBeUndefined();
79+
expect(result.value.levels.console).toEqual("dummy");
80+
});
81+
});
82+
83+
describe("process.env.CORE_LOG_LEVEL_FILE", () => {
84+
it("should return value of process.env.CORE_LOG_LEVEL_FILE if defined", async () => {
85+
process.env.CORE_LOG_LEVEL_FILE = "dummy";
86+
87+
jest.resetModules();
88+
const result = (serviceProvider.configSchema() as AnySchema).validate(
89+
(await import("@packages/core-logger-pino/src/defaults")).defaults,
90+
);
91+
92+
expect(result.error).toBeUndefined();
93+
expect(result.value.levels.file).toEqual("dummy");
94+
});
95+
});
96+
97+
describe("schema restrictions", () => {
98+
let defaults;
99+
100+
beforeEach(async () => {
101+
jest.resetModules();
102+
defaults = (await import("@packages/core-logger-pino/src/defaults")).defaults;
103+
});
104+
105+
it("levels is required && is object", async () => {
106+
defaults.levels = false;
107+
let result = (serviceProvider.configSchema() as AnySchema).validate(defaults);
108+
109+
expect(result.error!.message).toEqual('"levels" must be of type object');
110+
111+
delete defaults.levels;
112+
result = (serviceProvider.configSchema() as AnySchema).validate(defaults);
113+
114+
expect(result.error!.message).toEqual('"levels" is required');
115+
});
116+
117+
it("levels.console is required && is string", async () => {
118+
defaults.levels.console = false;
119+
let result = (serviceProvider.configSchema() as AnySchema).validate(defaults);
120+
121+
expect(result.error!.message).toEqual('"levels.console" must be a string');
122+
123+
delete defaults.levels.console;
124+
result = (serviceProvider.configSchema() as AnySchema).validate(defaults);
125+
126+
expect(result.error!.message).toEqual('"levels.console" is required');
127+
});
128+
129+
it("levels.file is required && is string", async () => {
130+
defaults.levels.file = false;
131+
let result = (serviceProvider.configSchema() as AnySchema).validate(defaults);
132+
133+
expect(result.error!.message).toEqual('"levels.file" must be a string');
134+
135+
delete defaults.levels.file;
136+
result = (serviceProvider.configSchema() as AnySchema).validate(defaults);
137+
138+
expect(result.error!.message).toEqual('"levels.file" is required');
139+
});
140+
141+
it("fileRotator is required && is object", async () => {
142+
defaults.fileRotator = false;
143+
let result = (serviceProvider.configSchema() as AnySchema).validate(defaults);
144+
145+
expect(result.error!.message).toEqual('"fileRotator" must be of type object');
146+
147+
delete defaults.fileRotator;
148+
result = (serviceProvider.configSchema() as AnySchema).validate(defaults);
149+
150+
expect(result.error!.message).toEqual('"fileRotator" is required');
151+
});
152+
153+
it("fileRotator.interval is required && is string", async () => {
154+
defaults.fileRotator.interval = false;
155+
let result = (serviceProvider.configSchema() as AnySchema).validate(defaults);
156+
157+
expect(result.error!.message).toEqual('"fileRotator.interval" must be a string');
158+
159+
delete defaults.fileRotator.interval;
160+
result = (serviceProvider.configSchema() as AnySchema).validate(defaults);
161+
162+
expect(result.error!.message).toEqual('"fileRotator.interval" is required');
163+
});
164+
});
165+
});
40166
});

packages/core-logger-pino/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
"dependencies": {
2323
"@arkecosystem/core-kernel": "^3.0.0-next.20",
2424
"chalk": "^4.0.0",
25+
"joi": "^17.3.0",
2526
"pino": "^6.0.0",
2627
"pino-pretty": "^4.0.0",
2728
"pump": "^3.0.0",

packages/core-logger-pino/src/service-provider.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Container, Contracts, Providers, Services } from "@arkecosystem/core-kernel";
2+
import Joi from "joi";
23

34
import { PinoLogger } from "./driver";
45

@@ -19,4 +20,16 @@ export class ServiceProvider extends Providers.ServiceProvider {
1920
// todo: destroy console stream
2021
// todo: destroy file stream
2122
}
23+
24+
public configSchema(): object {
25+
return Joi.object({
26+
levels: Joi.object({
27+
console: Joi.string().required(),
28+
file: Joi.string().required(),
29+
}).required(),
30+
fileRotator: Joi.object({
31+
interval: Joi.string().required(),
32+
}).required(),
33+
});
34+
}
2235
}

0 commit comments

Comments
 (0)