|
20 | 20 | import pytest |
21 | 21 |
|
22 | 22 | from diffsync import DiffSync, DiffSyncModel, DiffSyncFlags, DiffSyncModelFlags |
23 | | -from diffsync.exceptions import ObjectAlreadyExists, ObjectNotFound, ObjectCrudException |
| 23 | +from diffsync.exceptions import DiffClassMismatch, ObjectAlreadyExists, ObjectNotFound, ObjectCrudException |
24 | 24 |
|
25 | 25 | from .conftest import Site, Device, Interface, TrackedDiff, BackendA, PersonA |
26 | 26 |
|
@@ -468,6 +468,57 @@ def callback(stage, current, total): |
468 | 468 | assert last_value == {"current": expected, "total": expected} |
469 | 469 |
|
470 | 470 |
|
| 471 | +def test_diffsync_sync_to_w_different_diff_class_raises(backend_a, backend_b): |
| 472 | + diff = backend_b.diff_to(backend_a) |
| 473 | + with pytest.raises(DiffClassMismatch) as failure: |
| 474 | + backend_b.sync_to(backend_a, diff_class=TrackedDiff, diff=diff) |
| 475 | + assert failure.value.args[0] == "The provided diff's class (Diff) does not match the diff_class: TrackedDiff" |
| 476 | + |
| 477 | + |
| 478 | +def test_diffsync_sync_to_w_diff_no_mocks(backend_a, backend_b): |
| 479 | + diff = backend_b.diff_to(backend_a) |
| 480 | + assert diff.has_diffs() |
| 481 | + # Perform full sync |
| 482 | + backend_b.sync_to(backend_a, diff=diff) |
| 483 | + # Assert there are no diffs after synchronization |
| 484 | + post_diff = backend_b.diff_to(backend_a) |
| 485 | + assert not post_diff.has_diffs() |
| 486 | + |
| 487 | + |
| 488 | +def test_diffsync_sync_to_w_diff(backend_a, backend_b): |
| 489 | + diff = backend_b.diff_to(backend_a) |
| 490 | + assert diff.has_diffs() |
| 491 | + # Mock diff_from to make sure it's not called when passing in an existing diff |
| 492 | + backend_b.diff_from = mock.Mock() |
| 493 | + backend_b.diff_to = mock.Mock() |
| 494 | + backend_a.diff_from = mock.Mock() |
| 495 | + backend_a.diff_to = mock.Mock() |
| 496 | + # Perform full sync |
| 497 | + backend_b.sync_to(backend_a, diff=diff) |
| 498 | + # Assert none of the diff methods have been called |
| 499 | + assert not backend_b.diff_from.called |
| 500 | + assert not backend_b.diff_to.called |
| 501 | + assert not backend_a.diff_from.called |
| 502 | + assert not backend_a.diff_to.called |
| 503 | + |
| 504 | + |
| 505 | +def test_diffsync_sync_from_w_diff(backend_a, backend_b): |
| 506 | + diff = backend_a.diff_from(backend_b) |
| 507 | + assert diff.has_diffs() |
| 508 | + # Mock diff_from to make sure it's not called when passing in an existing diff |
| 509 | + backend_a.diff_from = mock.Mock() |
| 510 | + backend_a.diff_to = mock.Mock() |
| 511 | + backend_b.diff_from = mock.Mock() |
| 512 | + backend_b.diff_to = mock.Mock() |
| 513 | + # Perform full sync |
| 514 | + backend_a.sync_from(backend_b, diff=diff) |
| 515 | + # Assert none of the diff methods have been called |
| 516 | + assert not backend_a.diff_from.called |
| 517 | + assert not backend_a.diff_to.called |
| 518 | + assert not backend_b.diff_from.called |
| 519 | + assert not backend_b.diff_to.called |
| 520 | + |
| 521 | + |
471 | 522 | def test_diffsync_sync_from(backend_a, backend_b): |
472 | 523 | backend_a.sync_complete = mock.Mock() |
473 | 524 | backend_b.sync_complete = mock.Mock() |
@@ -542,7 +593,6 @@ def check_successful_sync_log_sanity(log, src, dst, flags): |
542 | 593 | def check_sync_logs_against_diff(diffsync, diff, log, errors_permitted=False): |
543 | 594 | """Given a Diff, make sure the captured structlogs correctly correspond to its contents/actions.""" |
544 | 595 | for element in diff.get_children(): |
545 | | - print(element) |
546 | 596 | # This is kinda gross, but needed since a DiffElement stores a shortname and keys, not a unique_id |
547 | 597 | uid = getattr(diffsync, element.type).create_unique_id(**element.keys) |
548 | 598 |
|
|
0 commit comments