@@ -5,6 +5,7 @@ import { Application, Container, Services } from "@packages/core-kernel/src";
55import { ServiceProvider } from "@packages/core-logger-pino/src" ;
66import { defaults } from "@packages/core-logger-pino/src/defaults" ;
77import { dirSync } from "tmp" ;
8+ import { AnySchema } from "@hapi/joi" ;
89
910let 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} ) ;
0 commit comments