@@ -473,4 +473,57 @@ describe('mongoose-lean-getters', function() {
473473 await BaseModel . findById ( entry . _id ) . lean ( { getters : true } ) ;
474474 } ) ;
475475 } ) ;
476+
477+ it ( 'handles getters on primitive arrays' , async function ( ) {
478+ const schema = new mongoose . Schema ( {
479+ integers : {
480+ type : [ Number ] ,
481+ get : v => Array . isArray ( v ) ? v . map ( i => Math . round ( i ) ) : v
482+ }
483+ } ) ;
484+ schema . plugin ( mongooseLeanGetters ) ;
485+
486+ const Model = mongoose . model ( 'primitiveArrayGetters' , schema ) ;
487+
488+ await Model . deleteMany ( { } ) ;
489+ await Model . create ( { integers : [ 1.1 , 2.2 , 3.3 ] } ) ;
490+
491+ const doc = await Model . findOne ( ) . lean ( { getters : true } ) ;
492+
493+ assert . deepStrictEqual ( doc . integers , [ 1 , 2 , 3 ] ) ;
494+ } ) ;
495+
496+ it ( 'should should allow array getters to return non-arrays' , async function ( ) {
497+ const userSchema = new mongoose . Schema ( {
498+ emails : {
499+ type : [ String ] ,
500+ // returns undefined, string, or array
501+ get : ( val ) => ! val || ! val . length ? undefined : ( val . length === 1 ? val [ 0 ] : val ) ,
502+ set : ( val ) => typeof val === 'string' ? [ val ] : val ,
503+ }
504+ } ) ;
505+ userSchema . plugin ( mongooseLeanGetters ) ;
506+ const User = mongoose . model ( 'gh-37-transform-arrays' , userSchema ) ;
507+
508+ const variants = [
509+ { sourceVal : 'foo' , expectedVal : 'foo' } ,
510+ { sourceVal : [ 'foo' ] , expectedVal : 'foo' } ,
511+ { sourceVal : [ 'foo' , 'bar' ] , expectedVal : [ 'foo' , 'bar' ] } ,
512+ { sourceVal : [ ] , expectedVal : undefined } ,
513+ { sourceVal : null , expectedVal : undefined } ,
514+ { sourceVal : undefined , expectedVal : undefined } ,
515+ ] ;
516+
517+ await Promise . all (
518+ variants . map ( async ( { sourceVal, expectedVal } ) => {
519+ const user = new User ( { emails : sourceVal } ) ;
520+ await user . save ( ) ;
521+
522+ const foundUser = await User . findById ( user . _id ) . lean ( { getters : true } ) ;
523+ const stringified = JSON . stringify ( { sourceVal, expectedVal } ) ;
524+ assert . deepStrictEqual ( user . emails , expectedVal , `user did not have expected value ${ stringified } ` ) ;
525+ assert . deepStrictEqual ( foundUser . emails , expectedVal , `foundUser did not have expected value ${ stringified } ` ) ;
526+ } )
527+ ) ;
528+ } ) ;
476529} ) ;
0 commit comments