94 lines
5.2 KiB
Python
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
|
|
|
|
|