@@ -200,7 +200,7 @@ describe('dropUndefinedKeys()', () => {
200
200
} ) ;
201
201
} ) ;
202
202
203
- test ( 'objects with circular reference' , ( ) => {
203
+ test ( 'should not throw on objects with circular reference' , ( ) => {
204
204
const dog : any = {
205
205
food : undefined ,
206
206
} ;
@@ -217,11 +217,25 @@ describe('dropUndefinedKeys()', () => {
217
217
218
218
dog . chases = rat ;
219
219
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 ) ;
225
239
} ) ;
226
240
227
241
test ( 'arrays with circular reference' , ( ) => {
@@ -235,10 +249,22 @@ describe('dropUndefinedKeys()', () => {
235
249
236
250
egg [ 0 ] = chicken ;
237
251
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 ) ;
242
268
} ) ;
243
269
} ) ;
244
270
0 commit comments