11import Interface from 'forest-express' ;
2+ import mongoose from 'mongoose' ;
23import Flattener from '../../../src/services/flattener' ;
4+ import mongooseConnect from '../../utils/mongoose-connect' ;
35
46const FLATTEN_SEPARATOR = '@@@' ;
57
68describe ( 'service > Flattener' , ( ) => {
79 let errorLoggerSpy ;
810 let warnLoggerSpy ;
911
12+ const companiesSchema = mongoose . Schema ( {
13+ name : String ,
14+ } ) ;
15+ const carsSchema = mongoose . Schema ( {
16+ name : String ,
17+ engine : {
18+ horsePower : { type : String , default : '110cv' , enum : [ '110cv' , '115cv' , '130cv' ] } ,
19+ identification : {
20+ manufacturer : { type : mongoose . Schema . Types . ObjectId , ref : 'companies' } ,
21+ } ,
22+ owner : { type : mongoose . Schema . Types . ObjectId , ref : 'companies' } ,
23+ partners : [ { type : mongoose . Schema . Types . ObjectId , ref : 'companies' } ] ,
24+ } ,
25+ } ) ;
26+ let carsModel ;
1027 const generateFlattenedEngineSchema = ( ) => ( {
1128 name : 'cars' ,
1229 fields : [ {
@@ -110,15 +127,30 @@ describe('service > Flattener', () => {
110127 type : 'String' ,
111128 } ] ,
112129 } ) ;
130+ const lianaOptions = {
131+ connections : { } ,
132+ mongoose,
133+ } ;
113134
114- beforeAll ( ( ) => {
135+ beforeAll ( async ( ) => {
115136 Interface . Schemas . schemas . cars = {
116137 fields : [ ] ,
117138 } ;
118139 errorLoggerSpy = jest
119140 . spyOn ( Interface . logger , 'error' ) ;
120141 warnLoggerSpy = jest
121142 . spyOn ( Interface . logger , 'warn' ) ;
143+
144+ await mongooseConnect ( ) ;
145+
146+ lianaOptions . connections . default = mongoose . connection ;
147+ mongoose . model ( 'cars' , carsSchema ) ;
148+ mongoose . model ( 'companies' , companiesSchema ) ;
149+ carsModel = lianaOptions . connections . default . models . cars ;
150+ } ) ;
151+
152+ afterAll ( async ( ) => {
153+ await mongoose . connection . close ( ) ;
122154 } ) ;
123155
124156 describe ( 'unflattenParams' , ( ) => {
@@ -163,7 +195,7 @@ describe('service > Flattener', () => {
163195 expect . assertions ( 2 ) ;
164196
165197 jest . resetAllMocks ( ) ;
166- const fieldsFlattener = new Flattener ( { name : 'cars' } , { } ) ;
198+ const fieldsFlattener = new Flattener ( { name : 'cars' } , { } , carsModel , lianaOptions ) ;
167199 fieldsFlattener . validateOptions ( ) ;
168200
169201 expect ( errorLoggerSpy ) . toHaveBeenCalledTimes ( 1 ) ;
@@ -174,7 +206,7 @@ describe('service > Flattener', () => {
174206 expect . assertions ( 1 ) ;
175207
176208 jest . resetAllMocks ( ) ;
177- const fieldsFlattener = new Flattener ( { name : 'cars' } , { } ) ;
209+ const fieldsFlattener = new Flattener ( { name : 'cars' } , { } , carsModel , lianaOptions ) ;
178210
179211 expect ( ( ) => { fieldsFlattener . validateOptions ( ) ; } ) . not . toThrow ( ) ;
180212 } ) ;
@@ -187,7 +219,7 @@ describe('service > Flattener', () => {
187219
188220 beforeAll ( ( ) => {
189221 jest . resetAllMocks ( ) ;
190- fieldsFlattener = new Flattener ( { fields : [ ] } , [ 'test' ] ) ;
222+ fieldsFlattener = new Flattener ( { fields : [ ] } , [ 'test' ] , carsModel , lianaOptions ) ;
191223 fieldsFlattener . validateOptions ( ) ;
192224 } ) ;
193225
@@ -210,7 +242,7 @@ describe('service > Flattener', () => {
210242
211243 beforeAll ( ( ) => {
212244 jest . resetAllMocks ( ) ;
213- fieldsFlattener = new Flattener ( { fields : [ ] } , [ { field : 'test' } ] ) ;
245+ fieldsFlattener = new Flattener ( { fields : [ ] } , [ { field : 'test' } ] , carsModel , lianaOptions ) ;
214246 fieldsFlattener . validateOptions ( ) ;
215247 } ) ;
216248
@@ -234,7 +266,7 @@ describe('service > Flattener', () => {
234266
235267 beforeAll ( ( ) => {
236268 jest . resetAllMocks ( ) ;
237- fieldsFlattener = new Flattener ( { fields : [ ] } , [ { } ] ) ;
269+ fieldsFlattener = new Flattener ( { fields : [ ] } , [ { } ] , carsModel , lianaOptions ) ;
238270 fieldsFlattener . validateOptions ( ) ;
239271 } ) ;
240272
@@ -258,7 +290,12 @@ describe('service > Flattener', () => {
258290 expect . assertions ( 2 ) ;
259291
260292 jest . resetAllMocks ( ) ;
261- const fieldsFlattener = new Flattener ( generateDefaultEngineSchema ( ) , [ { field : 'engine' , level : null } ] ) ;
293+ const fieldsFlattener = new Flattener (
294+ generateDefaultEngineSchema ( ) ,
295+ [ { field : 'engine' , level : null } ] ,
296+ carsModel ,
297+ lianaOptions ,
298+ ) ;
262299 fieldsFlattener . validateOptions ( ) ;
263300
264301 expect ( warnLoggerSpy ) . toHaveBeenCalledTimes ( 1 ) ;
@@ -270,7 +307,12 @@ describe('service > Flattener', () => {
270307
271308 jest . resetAllMocks ( ) ;
272309 const flatten = [ { field : 'engine' , level : null } ] ;
273- const fieldsFlattener = new Flattener ( generateDefaultEngineSchema ( ) , flatten ) ;
310+ const fieldsFlattener = new Flattener (
311+ generateDefaultEngineSchema ( ) ,
312+ flatten ,
313+ carsModel ,
314+ lianaOptions ,
315+ ) ;
274316 fieldsFlattener . validateOptions ( ) ;
275317
276318 expect ( flatten [ 0 ] . level ) . not . toBeDefined ( ) ;
@@ -279,12 +321,27 @@ describe('service > Flattener', () => {
279321 } ) ;
280322
281323 describe ( 'flattening a field' , ( ) => {
324+ it ( 'should deeply introspect mongoose schema for native fields' , ( ) => {
325+ expect . assertions ( 2 ) ;
326+
327+ const schema = generateDefaultEngineSchema ( ) ;
328+
329+ const fieldsFlattener = new Flattener ( schema , [ 'engine' ] , carsModel , lianaOptions ) ;
330+ fieldsFlattener . flattenFields ( ) ;
331+
332+ const horsePowerField = schema . fields
333+ . find ( ( field ) => field . field === 'engine@@@horsePower' ) ;
334+
335+ expect ( horsePowerField . defaultValue ) . toStrictEqual ( '110cv' ) ;
336+ expect ( horsePowerField . enums ) . toStrictEqual ( [ '110cv' , '115cv' , '130cv' ] ) ;
337+ } ) ;
338+
282339 it ( `should merge fields name with ${ FLATTEN_SEPARATOR } as separator` , ( ) => {
283340 expect . assertions ( 1 ) ;
284341
285342 const schema = generateDefaultEngineSchema ( ) ;
286343
287- const fieldsFlattener = new Flattener ( schema , [ 'engine' ] ) ;
344+ const fieldsFlattener = new Flattener ( schema , [ 'engine' ] , carsModel , lianaOptions ) ;
288345 fieldsFlattener . flattenFields ( ) ;
289346
290347 expect ( schema . fields ) . toContainEqual ( {
@@ -301,7 +358,7 @@ describe('service > Flattener', () => {
301358
302359 const schema = generateDefaultEngineSchema ( ) ;
303360
304- const fieldsFlattener = new Flattener ( schema , [ 'engine' ] ) ;
361+ const fieldsFlattener = new Flattener ( schema , [ 'engine' ] , carsModel , lianaOptions ) ;
305362 fieldsFlattener . flattenFields ( ) ;
306363
307364 expect ( schema . fields ) . toHaveLength ( 5 ) ;
@@ -315,7 +372,7 @@ describe('service > Flattener', () => {
315372 expect . assertions ( 1 ) ;
316373
317374 const schema = generateDefaultEngineSchema ( ) ;
318- const fieldsFlattener = new Flattener ( schema , [ { field : 'engine' , level : 100 } ] ) ;
375+ const fieldsFlattener = new Flattener ( schema , [ { field : 'engine' , level : 100 } ] , carsModel , lianaOptions ) ;
319376
320377 fieldsFlattener . flattenFields ( ) ;
321378
@@ -327,7 +384,7 @@ describe('service > Flattener', () => {
327384 expect . assertions ( 1 ) ;
328385
329386 const schema = generateDefaultEngineSchema ( ) ;
330- const fieldsFlattener = new Flattener ( schema , [ { field : 'engine' , level : 0 } ] ) ;
387+ const fieldsFlattener = new Flattener ( schema , [ { field : 'engine' , level : 0 } ] , carsModel , lianaOptions ) ;
331388
332389 fieldsFlattener . flattenFields ( ) ;
333390
@@ -340,7 +397,7 @@ describe('service > Flattener', () => {
340397 expect . assertions ( 1 ) ;
341398
342399 const schema = generateDefaultEngineSchema ( ) ;
343- const fieldsFlattener = new Flattener ( schema , [ { field : 'engine' , level : 0 } ] ) ;
400+ const fieldsFlattener = new Flattener ( schema , [ { field : 'engine' , level : 0 } ] , carsModel , lianaOptions ) ;
344401
345402 fieldsFlattener . flattenFields ( ) ;
346403
@@ -352,7 +409,7 @@ describe('service > Flattener', () => {
352409 expect . assertions ( 1 ) ;
353410
354411 const schema = generateDefaultEngineSchema ( ) ;
355- const fieldsFlattener = new Flattener ( schema , [ { field : 'engine' , level : - 2 } ] ) ;
412+ const fieldsFlattener = new Flattener ( schema , [ { field : 'engine' , level : - 2 } ] , carsModel , lianaOptions ) ;
356413
357414 fieldsFlattener . flattenFields ( ) ;
358415
0 commit comments