diff --git a/owrx/property/__init__.py b/owrx/property/__init__.py index 2e3b573..f04b115 100644 --- a/owrx/property/__init__.py +++ b/owrx/property/__init__.py @@ -322,11 +322,13 @@ class PropertyStack(PropertyManager): def receiveEvent(self, layer, changes): changesToForward = {name: value for name, value in changes.items() if layer == self._getTopLayer(name)} - # deletions need to be handled separately: only send them if deleted in all layers + # deletions need to be handled separately: + # * send a deletion if the key was deleted in all layers + # * send lower value if the key is still present in a lower layer deletionsToForward = { - name: value + name: PropertyDeleted if self._getTopLayer(name, False) is None else self[name] for name, value in changes.items() - if value is PropertyDeleted and self._getTopLayer(name, False) is None + if value is PropertyDeleted } self._fireCallbacks({**changesToForward, **deletionsToForward}) diff --git a/test/property/test_property_stack.py b/test/property/test_property_stack.py index 0efeac4..f3c3a12 100644 --- a/test/property/test_property_stack.py +++ b/test/property/test_property_stack.py @@ -215,3 +215,14 @@ class PropertyStackTest(TestCase): ps.wire(mock.method) del low_pm["testkey"] mock.method.assert_called_once_with({"testkey": PropertyDeleted}) + + def testChangeEventWhenKeyDeleted(self): + ps = PropertyStack() + low_pm = PropertyLayer(testkey="lowvalue") + high_pm = PropertyLayer(testkey="highvalue") + ps.addLayer(0, high_pm) + ps.addLayer(1, low_pm) + mock = Mock() + ps.wire(mock.method) + del high_pm["testkey"] + mock.method.assert_called_once_with({"testkey": "lowvalue"})