@@ -325,32 +325,33 @@ def json_loader(obj):
325
325
326
326
327
327
class MakePatchTestCase (unittest .TestCase ):
328
+ generate_test_ops = False
328
329
329
330
def test_apply_patch_to_copy (self ):
330
331
src = {'foo' : 'bar' , 'boo' : 'qux' }
331
332
dst = {'baz' : 'qux' , 'foo' : 'boo' }
332
- patch = jsonpatch .make_patch (src , dst )
333
+ patch = jsonpatch .make_patch (src , dst , generate_test_ops = self . generate_test_ops )
333
334
res = patch .apply (src )
334
335
self .assertTrue (src is not res )
335
336
336
337
def test_apply_patch_to_same_instance (self ):
337
338
src = {'foo' : 'bar' , 'boo' : 'qux' }
338
339
dst = {'baz' : 'qux' , 'foo' : 'boo' }
339
- patch = jsonpatch .make_patch (src , dst )
340
+ patch = jsonpatch .make_patch (src , dst , generate_test_ops = self . generate_test_ops )
340
341
res = patch .apply (src , in_place = True )
341
342
self .assertTrue (src is res )
342
343
343
344
def test_objects (self ):
344
345
src = {'foo' : 'bar' , 'boo' : 'qux' }
345
346
dst = {'baz' : 'qux' , 'foo' : 'boo' }
346
- patch = jsonpatch .make_patch (src , dst )
347
+ patch = jsonpatch .make_patch (src , dst , generate_test_ops = self . generate_test_ops )
347
348
res = patch .apply (src )
348
349
self .assertEqual (res , dst )
349
350
350
351
def test_arrays (self ):
351
352
src = {'numbers' : [1 , 2 , 3 ], 'other' : [1 , 3 , 4 , 5 ]}
352
353
dst = {'numbers' : [1 , 3 , 4 , 5 ], 'other' : [1 , 3 , 4 ]}
353
- patch = jsonpatch .make_patch (src , dst )
354
+ patch = jsonpatch .make_patch (src , dst , generate_test_ops = self . generate_test_ops )
354
355
res = patch .apply (src )
355
356
self .assertEqual (res , dst )
356
357
@@ -361,15 +362,15 @@ def test_complex_object(self):
361
362
dst = {'data' : [
362
363
{'foo' : [42 ]}, {'bar' : []}, {'baz' : {'boo' : 'oom!' }}
363
364
]}
364
- patch = jsonpatch .make_patch (src , dst )
365
+ patch = jsonpatch .make_patch (src , dst , generate_test_ops = self . generate_test_ops )
365
366
res = patch .apply (src )
366
367
self .assertEqual (res , dst )
367
368
368
369
def test_array_add_remove (self ):
369
370
# see https://github.com/stefankoegl/python-json-patch/issues/4
370
371
src = {'numbers' : [], 'other' : [1 , 5 , 3 , 4 ]}
371
372
dst = {'numbers' : [1 , 3 , 4 , 5 ], 'other' : []}
372
- patch = jsonpatch .make_patch (src , dst )
373
+ patch = jsonpatch .make_patch (src , dst , generate_test_ops = self . generate_test_ops )
373
374
res = patch .apply (src )
374
375
self .assertEqual (res , dst )
375
376
@@ -388,7 +389,7 @@ def test_add_nested(self):
388
389
def _test_should_just_add_new_item_not_rebuild_all_list (self ):
389
390
src = {'foo' : [1 , 2 , 3 ]}
390
391
dst = {'foo' : [3 , 1 , 2 , 3 ]}
391
- patch = list (jsonpatch .make_patch (src , dst ))
392
+ patch = list (jsonpatch .make_patch (src , dst , generate_test_ops = self . generate_test_ops ))
392
393
self .assertEqual (len (patch ), 1 )
393
394
self .assertEqual (patch [0 ]['op' ], 'add' )
394
395
res = jsonpatch .apply_patch (src , patch )
@@ -397,24 +398,30 @@ def _test_should_just_add_new_item_not_rebuild_all_list(self):
397
398
def test_escape (self ):
398
399
src = {"x/y" : 1 }
399
400
dst = {"x/y" : 2 }
400
- patch = jsonpatch .make_patch (src , dst )
401
- self .assertEqual ([{"path" : "/x~1y" , "value" : 2 , "op" : "replace" }], patch .patch )
401
+ patch = jsonpatch .make_patch (src , dst , generate_test_ops = self .generate_test_ops )
402
+
403
+ if self .generate_test_ops :
404
+ self .assertEqual ([{"path" : "/x~1y" , "value" : 1 , "op" : "test" },
405
+ {"path" : "/x~1y" , "value" : 2 , "op" : "replace" }], patch .patch )
406
+ else :
407
+ self .assertEqual ([{"path" : "/x~1y" , "value" : 2 , "op" : "replace" }], patch .patch )
408
+
402
409
res = patch .apply (src )
403
410
self .assertEqual (res , dst )
404
411
405
412
def test_root_list (self ):
406
413
""" Test making and applying a patch of the root is a list """
407
414
src = [{'foo' : 'bar' , 'boo' : 'qux' }]
408
415
dst = [{'baz' : 'qux' , 'foo' : 'boo' }]
409
- patch = jsonpatch .make_patch (src , dst )
416
+ patch = jsonpatch .make_patch (src , dst , generate_test_ops = self . generate_test_ops )
410
417
res = patch .apply (src )
411
418
self .assertEqual (res , dst )
412
419
413
420
def test_make_patch_unicode (self ):
414
421
""" Test if unicode keys and values are handled correctly """
415
422
src = {}
416
423
dst = {'\xee ' : '\xee ' }
417
- patch = jsonpatch .make_patch (src , dst )
424
+ patch = jsonpatch .make_patch (src , dst , generate_test_ops = self . generate_test_ops )
418
425
res = patch .apply (src )
419
426
self .assertEqual (res , dst )
420
427
@@ -423,15 +430,21 @@ def test_issue40(self):
423
430
424
431
src = [8 , 7 , 2 , 1 , 0 , 9 , 4 , 3 , 5 , 6 ]
425
432
dest = [7 , 2 , 1 , 0 , 9 , 4 , 3 , 6 , 5 , 8 ]
426
- jsonpatch .make_patch (src , dest )
433
+ jsonpatch .make_patch (src , dest , generate_test_ops = self . generate_test_ops )
427
434
428
435
def test_issue76 (self ):
429
436
""" Make sure op:remove does not include a 'value' field """
430
437
431
438
src = { "name" : "fred" , "friend" : "barney" , "spouse" : "wilma" }
432
439
dst = { "name" : "fred" , "spouse" : "wilma" }
433
- expected = [{"path" : "/friend" , "op" : "remove" }]
434
- patch = jsonpatch .make_patch (src , dst )
440
+
441
+ if self .generate_test_ops :
442
+ expected = [{"path" : "/friend" , "op" : "test" , "value" : "barney" },
443
+ {"path" : "/friend" , "op" : "remove" }]
444
+ else :
445
+ expected = [{"path" : "/friend" , "op" : "remove" }]
446
+
447
+ patch = jsonpatch .make_patch (src , dst , generate_test_ops = self .generate_test_ops )
435
448
self .assertEqual (patch .patch , expected )
436
449
res = jsonpatch .apply_patch (src , patch )
437
450
self .assertEqual (res , dst )
@@ -443,7 +456,7 @@ def test_json_patch(self):
443
456
new = {
444
457
'queue' : {'teams_out' : [{'id' : 5 , 'reason' : 'If lose' }]}
445
458
}
446
- patch = jsonpatch .make_patch (old , new )
459
+ patch = jsonpatch .make_patch (old , new , generate_test_ops = self . generate_test_ops )
447
460
new_from_patch = jsonpatch .apply_patch (old , patch )
448
461
self .assertEqual (new , new_from_patch )
449
462
@@ -452,7 +465,7 @@ def test_arrays_one_element_sequences(self):
452
465
# see https://github.com/stefankoegl/python-json-patch/issues/30#issuecomment-155070128
453
466
src = [1 ,2 ,3 ]
454
467
dst = [3 ,1 ,4 ,2 ]
455
- patch = jsonpatch .make_patch (src , dst )
468
+ patch = jsonpatch .make_patch (src , dst , generate_test_ops = self . generate_test_ops )
456
469
res = jsonpatch .apply_patch (src , patch )
457
470
self .assertEqual (res , dst )
458
471
@@ -462,7 +475,7 @@ def test_list_in_dict(self):
462
475
https://github.com/stefankoegl/python-json-patch/issues/74 """
463
476
old = {'key' : [{'someNumber' : 0 , 'someArray' : [1 , 2 , 3 ]}]}
464
477
new = {'key' : [{'someNumber' : 0 , 'someArray' : [1 , 2 , 3 , 4 ]}]}
465
- patch = jsonpatch .make_patch (old , new )
478
+ patch = jsonpatch .make_patch (old , new , generate_test_ops = self . generate_test_ops )
466
479
new_from_patch = jsonpatch .apply_patch (old , patch )
467
480
self .assertEqual (new , new_from_patch )
468
481
@@ -472,23 +485,23 @@ def test_nested(self):
472
485
https://github.com/stefankoegl/python-json-patch/issues/41 """
473
486
old = {'school' :{'names' :['Kevin' ,'Carl' ]}}
474
487
new = {'school' :{'names' :['Carl' ,'Kate' ,'Kevin' ,'Jake' ]}}
475
- patch = jsonpatch .JsonPatch .from_diff (old , new )
488
+ patch = jsonpatch .JsonPatch .from_diff (old , new , generate_test_ops = self . generate_test_ops )
476
489
new_from_patch = jsonpatch .apply_patch (old , patch )
477
490
self .assertEqual (new , new_from_patch )
478
491
479
492
def test_move_from_numeric_to_alpha_dict_key (self ):
480
493
#https://github.com/stefankoegl/python-json-patch/issues/97
481
494
src = {'13' : 'x' }
482
495
dst = {'A' : 'a' , 'b' : 'x' }
483
- patch = jsonpatch .make_patch (src , dst )
496
+ patch = jsonpatch .make_patch (src , dst , generate_test_ops = self . generate_test_ops )
484
497
res = jsonpatch .apply_patch (src , patch )
485
498
self .assertEqual (res , dst )
486
499
487
500
def test_issue90 (self ):
488
501
"""In JSON 1 is different from True even though in python 1 == True"""
489
502
src = {'A' : 1 }
490
503
dst = {'A' : True }
491
- patch = jsonpatch .make_patch (src , dst )
504
+ patch = jsonpatch .make_patch (src , dst , generate_test_ops = self . generate_test_ops )
492
505
res = jsonpatch .apply_patch (src , patch )
493
506
self .assertEqual (res , dst )
494
507
self .assertIsInstance (res ['A' ], bool )
@@ -497,7 +510,7 @@ def test_issue129(self):
497
510
"""In JSON 1 is different from True even though in python 1 == True Take Two"""
498
511
src = {'A' : {'D' : 1.0 }, 'B' : {'E' : 'a' }}
499
512
dst = {'A' : {'C' : 'a' }, 'B' : {'C' : True }}
500
- patch = jsonpatch .make_patch (src , dst )
513
+ patch = jsonpatch .make_patch (src , dst , generate_test_ops = self . generate_test_ops )
501
514
res = jsonpatch .apply_patch (src , patch )
502
515
self .assertEqual (res , dst )
503
516
self .assertIsInstance (res ['B' ]['C' ], bool )
@@ -506,7 +519,7 @@ def test_issue103(self):
506
519
"""In JSON 1 is different from 1.0 even though in python 1 == 1.0"""
507
520
src = {'A' : 1 }
508
521
dst = {'A' : 1.0 }
509
- patch = jsonpatch .make_patch (src , dst )
522
+ patch = jsonpatch .make_patch (src , dst , generate_test_ops = self . generate_test_ops )
510
523
res = jsonpatch .apply_patch (src , patch )
511
524
self .assertEqual (res , dst )
512
525
self .assertIsInstance (res ['A' ], float )
@@ -522,7 +535,7 @@ def test_issue119(self):
522
535
{'foobar' : {u'1' : [u'lettuce' , u'cabbage' , u'bok choy' , u'broccoli' ], u'3' : [u'ibex' ], u'2' : [u'apple' ], u'5' : [], u'4' : [u'gerenuk' , u'duiker' ], u'10_1576156603109' : [], u'6' : [], u'8_1572034252560' : [u'thompson' , u'gravie' , u'mango' , u'coconut' ], u'7_1572034204585' : []}},
523
536
{'foobar' : {u'description' : u'' , u'title' : u'' }}
524
537
]
525
- patch = jsonpatch .make_patch (src , dst )
538
+ patch = jsonpatch .make_patch (src , dst , generate_test_ops = self . generate_test_ops )
526
539
res = jsonpatch .apply_patch (src , patch )
527
540
self .assertEqual (res , dst )
528
541
@@ -562,7 +575,7 @@ def test_issue120(self):
562
575
'16' : 'service' ,
563
576
'2' : ['zero' , 'enable' ]}}
564
577
]
565
- patch = jsonpatch .make_patch (src , dst )
578
+ patch = jsonpatch .make_patch (src , dst , generate_test_ops = self . generate_test_ops )
566
579
res = jsonpatch .apply_patch (src , patch )
567
580
self .assertEqual (res , dst )
568
581
@@ -597,6 +610,10 @@ def test_custom_types_subclass_load(self):
597
610
self .assertEqual (new , new_from_patch )
598
611
599
612
613
+ class MakePatchWithTestOpsTestCase (MakePatchTestCase ):
614
+ generate_test_ops = True
615
+
616
+
600
617
class OptimizationTests (unittest .TestCase ):
601
618
def test_use_replace_instead_of_remove_add (self ):
602
619
src = {'foo' : [1 , 2 , 3 ]}
@@ -1051,6 +1068,7 @@ def get_suite():
1051
1068
suite .addTest (unittest .makeSuite (ApplyPatchTestCase ))
1052
1069
suite .addTest (unittest .makeSuite (EqualityTestCase ))
1053
1070
suite .addTest (unittest .makeSuite (MakePatchTestCase ))
1071
+ suite .addTest (unittest .makeSuite (MakePatchWithTestOpsTestCase ))
1054
1072
suite .addTest (unittest .makeSuite (ListTests ))
1055
1073
suite .addTest (unittest .makeSuite (InvalidInputTests ))
1056
1074
suite .addTest (unittest .makeSuite (ConflictTests ))
0 commit comments