@@ -5,6 +5,7 @@ import { Application, Container, Services } from "@packages/core-kernel/src";
5
5
import { ServiceProvider } from "@packages/core-logger-pino/src" ;
6
6
import { defaults } from "@packages/core-logger-pino/src/defaults" ;
7
7
import { dirSync } from "tmp" ;
8
+ import { AnySchema } from "@hapi/joi" ;
8
9
9
10
let app : Application ;
10
11
@@ -37,4 +38,129 @@ describe("ServiceProvider", () => {
37
38
it ( "should be disposable" , async ( ) => {
38
39
await expect ( serviceProvider . dispose ( ) ) . toResolve ( ) ;
39
40
} ) ;
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
+ } ) ;
40
166
} ) ;
0 commit comments