import pytest from jaydiff.merge import merge_add, merge_delete, merge_update, merge_full # ── merge_* ─────────────────────────────────────────────────────────────── class TestJayMerge: def test_merge_add_to_empty(self): assert merge_add({}, {'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke', 'f': 'coffee'}}) \ == {'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke', 'f': 'coffee'}} def test_merge_add_new_key(self): assert merge_add({'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'d': 'icecream'}) \ == {'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke', 'f': 'coffee'}, 'd': 'icecream'} def test_merge_add_existing_unchanged(self): assert merge_add({'a': 'hamburger', 'b': 'fries', 'c': {'f': 'coffee'}, 'd': 'icecream'}, {'d': 'icecream'}) \ == {'a': 'hamburger', 'b': 'fries', 'c': {'f': 'coffee'}, 'd': 'icecream'} def test_merge_delete_top_key(self): assert merge_delete({'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke', 'f': 'coffee'}, 'd': 'icecream'}, {'d': 'icecream'}) \ == {'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke', 'f': 'coffee'}} def test_merge_delete_nested_key(self): assert merge_delete({'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'c': {'f': 'coffee'}}) \ == {'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke'}} def test_merge_delete_nested_leaves_sibling(self): assert merge_delete({'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'c': {'e': 'coke'}}) \ == {'a': 'hamburger', 'b': 'fries', 'c': {'f': 'coffee'}} class TestJayMergeFull: def test_passthrough_when_old_empty(self): assert merge_full({}, {'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke', 'f': 'coffee'}}) \ == {'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke', 'f': 'coffee'}} def test_empty_diff_unchanged(self): assert merge_full({'a': 'hamburger', 'b': 'fries', 'c': 'coke'}, {}) \ == {'a': 'hamburger', 'b': 'fries', 'c': 'coke'} def test_update(self): assert merge_full({'a': 'hamburger', 'b': 'fries', 'c': 'coke'}, {'update': {'c': 'pepsi'}}) \ == {'a': 'hamburger', 'b': 'fries', 'c': 'pepsi'} def test_update_add(self): assert merge_full({'a': 'hamburger', 'b': 'fries', 'c': 'pepsi'}, {'update_add': {'c': 'coke'}}) \ == {'a': 'hamburger', 'b': 'fries', 'c': 'coke'} def test_delete(self): assert merge_full({'a': 'hamburger', 'b': 'fries', 'c': 'pepsi', 'd': 'icecream'}, {'delete': {'d': 'icecream'}}) \ == {'a': 'hamburger', 'b': 'fries', 'c': 'pepsi'} def test_add_delete_update_combined(self): assert merge_full({'a': 'hamburger', 'b': 'fries', 'c': 'pepsi'}, {'add': {'d': 'icecream'}, 'delete': {'b': 'fries'}, 'update': {'c': 'coke'}}) \ == {'a': 'hamburger', 'd': 'icecream', 'c': 'coke'} def test_nested_update_and_delete(self): assert merge_full({'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'delete': {'a': 'hamburger', 'b': 'fries', 'c': {'f': 'coffee'}}, 'update': {'c': {'e': 'pepsi'}}}) \ == {'c': {'e': 'pepsi'}} def test_update_add_new_subkey(self): assert merge_full({'a': 'hamburger', 'b': 'fries', 'c': {'e': 'coke', 'f': 'coffee'}}, {'update_add': {'c': {'e': 'pepsi', 'h': 'cake'}}}) \ == {'a': 'hamburger', 'b': 'fries', 'c': {'e': 'pepsi', 'f': 'coffee', 'h': 'cake'}} def test_real_world_snapshot_update(self): old = {'charging': { 'batteryStatus': {'value': {'carCapturedTimestamp': '2024-10-19T05:34:34Z', 'cruisingRangeElectric_km': 192}}, 'chargingStatus': {'value': {'carCapturedTimestamp': '2024-10-19T05:34:34Z'}}, 'chargingSettings': {'value': {'carCapturedTimestamp': '2024-10-19T05:34:30Z'}}, 'plugStatus': {'value': {'carCapturedTimestamp': '2024-10-19T05:34:29Z'}}}} update = {'charging': { 'batteryStatus': {'value': {'carCapturedTimestamp': '2024-10-19T05:35:46Z', 'cruisingRangeElectric_km': 191}}, 'chargingStatus': {'value': {'carCapturedTimestamp': '2024-10-19T05:35:46Z'}}}} add = {'charging': {'batteryStatus': {'value': {'currentSOC_pct': 55}}}, 'fuelStatus': {'rangeStatus': {'value': {'primaryEngine': {'currentSOC_pct': 55}}}}, 'measurements': {'fuelLevelStatus': {'value': {'currentSOC_pct': 55}}}} delete = {'charging': { 'chargingSettings': {'value': {'carCapturedTimestamp': '2024-10-19T05:34:30Z'}}, 'plugStatus': {'value': {'carCapturedTimestamp': '2024-10-19T05:34:29Z'}}}} result = merge_full(old, {'update': update, 'add': add, 'delete': delete}) assert result == old