@@ -56,9 +56,11 @@ def test_diffsync_sync_self_with_no_data_is_noop(generic_diffsync):
5656 assert not generic_diffsync .sync_complete .called
5757
5858
59- def test_diffsync_get_with_no_data_is_none (generic_diffsync ):
60- assert generic_diffsync .get ("anything" , "myname" ) is None
61- assert generic_diffsync .get (DiffSyncModel , "" ) is None
59+ def test_diffsync_get_with_no_data_fails (generic_diffsync ):
60+ with pytest .raises (ObjectNotFound ):
61+ generic_diffsync .get ("anything" , "myname" )
62+ with pytest .raises (ObjectNotFound ):
63+ generic_diffsync .get (DiffSyncModel , "" )
6264
6365
6466def test_diffsync_get_all_with_no_data_is_empty_list (generic_diffsync ):
@@ -90,9 +92,11 @@ def test_diffsync_get_with_generic_model(generic_diffsync, generic_diffsync_mode
9092 # DiffSync doesn't know how to construct a uid str for a "diffsyncmodel"
9193 assert generic_diffsync .get (DiffSyncModel .get_type (), {}) is None
9294 # Wrong object-type - no match
93- assert generic_diffsync .get ("" , "" ) is None
95+ with pytest .raises (ObjectNotFound ):
96+ generic_diffsync .get ("" , "" )
9497 # Wrong unique-id - no match
95- assert generic_diffsync .get (DiffSyncModel , "myname" ) is None
98+ with pytest .raises (ObjectNotFound ):
99+ generic_diffsync .get (DiffSyncModel , "myname" )
96100
97101
98102def test_diffsync_get_all_with_generic_model (generic_diffsync , generic_diffsync_model ):
@@ -121,7 +125,8 @@ def test_diffsync_remove_with_generic_model(generic_diffsync, generic_diffsync_m
121125 with pytest .raises (ObjectNotFound ):
122126 generic_diffsync .remove (generic_diffsync_model )
123127
124- assert generic_diffsync .get (DiffSyncModel , "" ) is None
128+ with pytest .raises (ObjectNotFound ):
129+ generic_diffsync .get (DiffSyncModel , "" )
125130 assert list (generic_diffsync .get_all (DiffSyncModel )) == []
126131 with pytest .raises (ObjectNotFound ):
127132 generic_diffsync .get_by_uids (["" ], DiffSyncModel )
@@ -315,8 +320,10 @@ def test_diffsync_sync_from(backend_a, backend_b):
315320 site_atl_a = backend_a .get ("site" , "atl" )
316321 assert isinstance (site_atl_a , Site )
317322 assert site_atl_a .name == "atl"
318- assert backend_a .get (Site , "rdu" ) is None
319- assert backend_a .get ("nothing" , "" ) is None
323+ with pytest .raises (ObjectNotFound ):
324+ backend_a .get (Site , "rdu" )
325+ with pytest .raises (ObjectNotFound ):
326+ backend_a .get ("nothing" , "" )
320327
321328 assert list (backend_a .get_all (Site )) == [site_nyc_a , site_sfo_a , site_atl_a ]
322329 assert list (backend_a .get_all ("site" )) == [site_nyc_a , site_sfo_a , site_atl_a ]
@@ -363,6 +370,18 @@ def test_diffsync_add_get_remove_with_subclass_and_data(backend_a):
363370 backend_a .remove (site_atl_a )
364371
365372
373+ def test_diffsync_remove_missing_child (log , backend_a ):
374+ rdu_spine1 = backend_a .get (Device , "rdu-spine1" )
375+ rdu_spine1_eth0 = backend_a .get (Interface , "rdu-spine1__eth0" )
376+ # Usage error - remove rdu_spine1_eth0 from backend_a, but rdu_spine1 still has a reference to it
377+ backend_a .remove (rdu_spine1_eth0 )
378+ # Should log an error but continue removing other child objects
379+ backend_a .remove (rdu_spine1 , remove_children = True )
380+ assert log .has ("Unable to remove child rdu-spine1__eth0 of device rdu-spine1 - not found!" , diffsync = backend_a )
381+ with pytest .raises (ObjectNotFound ):
382+ backend_a .get (Interface , "rdu-spine1__eth1" )
383+
384+
366385def test_diffsync_sync_from_exceptions_are_not_caught_by_default (error_prone_backend_a , backend_b ):
367386 with pytest .raises (ObjectCrudException ):
368387 error_prone_backend_a .sync_from (backend_b )
@@ -439,8 +458,10 @@ def test_diffsync_diff_with_skip_unmatched_both_flag(
439458def test_diffsync_sync_with_skip_unmatched_src_flag (backend_a , backend_a_with_extra_models ):
440459 backend_a .sync_from (backend_a_with_extra_models , flags = DiffSyncFlags .SKIP_UNMATCHED_SRC )
441460 # New objects should not have been created
442- assert backend_a .get (backend_a .site , "lax" ) is None
443- assert backend_a .get (backend_a .device , "nyc-spine3" ) is None
461+ with pytest .raises (ObjectNotFound ):
462+ backend_a .get (backend_a .site , "lax" )
463+ with pytest .raises (ObjectNotFound ):
464+ backend_a .get (backend_a .device , "nyc-spine3" )
444465 assert "nyc-spine3" not in backend_a .get (backend_a .site , "nyc" ).devices
445466
446467
@@ -500,7 +521,8 @@ class NoDeleteInterfaceDiffSync(BackendA):
500521 # NoDeleteInterface.delete() should not be called since we're deleting its parent only
501522 extra_models .sync_from (backend_a )
502523 # The extra interface should have been removed from the DiffSync without calling its delete() method
503- assert extra_models .get (extra_models .interface , extra_interface .get_unique_id ()) is None
524+ with pytest .raises (ObjectNotFound ):
525+ extra_models .get (extra_models .interface , extra_interface .get_unique_id ())
504526 # The sync should be complete, regardless
505527 diff = extra_models .diff_from (backend_a )
506528 print (diff .str ()) # for debugging of any failure
0 commit comments