Files
2026-05-27 13:33:52 +02:00

94 lines
5.2 KiB
Python

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