@@ -200,7 +200,7 @@ describe('dropUndefinedKeys()', () => {
200200 } ) ;
201201 } ) ;
202202
203- test ( 'objects with circular reference' , ( ) => {
203+ test ( 'should not throw on objects with circular reference' , ( ) => {
204204 const dog : any = {
205205 food : undefined ,
206206 } ;
@@ -217,11 +217,25 @@ describe('dropUndefinedKeys()', () => {
217217
218218 dog . chases = rat ;
219219
220- expect ( dropUndefinedKeys ( human ) ) . toStrictEqual ( {
221- pets : {
222- chases : rat ,
223- } ,
224- } ) ;
220+ const result = dropUndefinedKeys ( human ) ;
221+
222+ // Removes undefined keys
223+ expect ( Object . keys ( result ) ) . toEqual ( [ 'pets' ] ) ;
224+ expect ( Object . keys ( result . pets ) ) . toEqual ( [ 'chases' ] ) ;
225+ expect ( Object . keys ( result . pets . chases ) ) . toEqual ( [ 'scares' , 'weight' ] ) ;
226+
227+ // Returns new object
228+ expect ( human === result ) . toBe ( false ) ;
229+ expect ( dog === result . pets ) . toBe ( false ) ;
230+ expect ( rat === result . pets . chases ) . toBe ( false ) ;
231+
232+ // Returns new references within objects
233+ expect ( human === result . pets . chases . scares ) . toBe ( false ) ;
234+ expect ( dog === result . pets . chases . scares . pets ) . toBe ( false ) ;
235+ expect ( rat === result . pets . chases . scares . pets . chases ) . toBe ( false ) ;
236+
237+ // Keeps circular reference
238+ expect ( result . pets . chases . scares === result ) . toBe ( true ) ;
225239 } ) ;
226240
227241 test ( 'arrays with circular reference' , ( ) => {
@@ -235,10 +249,22 @@ describe('dropUndefinedKeys()', () => {
235249
236250 egg [ 0 ] = chicken ;
237251
238- expect ( dropUndefinedKeys ( chicken ) ) . toStrictEqual ( {
239- lays : egg ,
240- weight : '1kg' ,
241- } ) ;
252+ const result = dropUndefinedKeys ( chicken ) ;
253+
254+ // Removes undefined keys
255+ expect ( Object . keys ( result ) ) . toEqual ( [ 'weight' , 'lays' ] ) ;
256+ expect ( Object . keys ( result . lays ) ) . toEqual ( [ '0' ] ) ;
257+
258+ // Returns new objects
259+ expect ( chicken === result ) . toBe ( false ) ;
260+ expect ( egg === result . lays ) . toBe ( false ) ;
261+
262+ // Returns new references within objects
263+ expect ( chicken === result . lays [ 0 ] ) . toBe ( false ) ;
264+ expect ( egg === result . lays [ 0 ] . lays ) . toBe ( false ) ;
265+
266+ // Keeps circular reference
267+ expect ( result . lays [ 0 ] === result ) . toBe ( true ) ;
242268 } ) ;
243269} ) ;
244270
0 commit comments