openwebrx-clone/test/owrx/property/test_property_carousel.py

126 lines
4.0 KiB
Python

from unittest import TestCase
from unittest.mock import Mock
from owrx.property import PropertyCarousel, PropertyLayer, PropertyDeleted, PropertyWriteError
class PropertyCarouselTest(TestCase):
def testInitiallyEmpty(self):
pc = PropertyCarousel()
with self.assertRaises(KeyError):
x = pc["testkey"]
def testPropertyAccess(self):
pc = PropertyCarousel()
pl = PropertyLayer(testkey="testvalue")
pc.addLayer("test", pl)
pc.switch("test")
self.assertEqual(pc["testkey"], "testvalue")
def testWriteAccess(self):
pc = PropertyCarousel()
pl = PropertyLayer(testkey="old_value")
pc.addLayer("test", pl)
pc.switch("test")
pc["testkey"] = "new_value"
self.assertEqual(pc["testkey"], "new_value")
self.assertEqual(pl["testkey"], "new_value")
def testForwardsEvents(self):
pc = PropertyCarousel()
pl = PropertyLayer(testkey="old_value")
pc.addLayer("test", pl)
pc.switch("test")
mock = Mock()
pc.wire(mock.method)
pc["testkey"] = "new_value"
mock.method.assert_called_once_with({"testkey": "new_value"})
def testStopsForwardingAfterSwitch(self):
pc = PropertyCarousel()
pl_x = PropertyLayer(testkey="old_value")
pc.addLayer("x", pl_x)
pl_y = PropertyLayer(testkey="new_value")
pc.addLayer("y", pl_y)
pc.switch("x")
pc.switch("y")
mock = Mock()
pc.wire(mock.method)
pl_x["testkey"] = "new_value"
mock.method.assert_not_called()
def testEventsOnSwitch(self):
pc = PropertyCarousel()
pl_x = PropertyLayer(old_key="old_value")
pc.addLayer("x", pl_x)
pl_y = PropertyLayer(new_key="new_value")
pc.addLayer("y", pl_y)
pc.switch("x")
mock = Mock()
pc.wire(mock.method)
pc.switch("y")
mock.method.assert_called_once_with({"old_key": PropertyDeleted, "new_key": "new_value"})
def testNoEventsIfKeysDontChange(self):
pc = PropertyCarousel()
pl_x = PropertyLayer(testkey="same_value")
pc.addLayer("x", pl_x)
pl_y = PropertyLayer(testkey="same_value")
pc.addLayer("y", pl_y)
pc.switch("x")
mock = Mock()
pc.wire(mock.method)
pc.switch("y")
mock.method.assert_not_called()
def testKeyErrorOnInvalidSwitch(self):
pc = PropertyCarousel()
with self.assertRaises(KeyError):
pc.switch("doesntmatter")
def testRemoveLayer(self):
pc = PropertyCarousel()
pl = PropertyLayer(testkey="testvalue")
pc.addLayer("x", pl)
pc.switch("x")
self.assertEqual(pc["testkey"], "testvalue")
pc.removeLayer("x")
with self.assertRaises(KeyError):
pc.switch("x")
def testPropertyResetAfterRemoval(self):
pc = PropertyCarousel()
pl = PropertyLayer(testkey="testvalue")
pc.addLayer("x", pl)
pc.switch("x")
self.assertEqual(pc["testkey"], "testvalue")
pc.removeLayer("x")
with self.assertRaises(KeyError):
x = pc["testkey"]
def testEmptySwitch(self):
pc = PropertyCarousel()
pl = PropertyLayer(testkey="testvalue")
pc.addLayer("x", pl)
pc.switch("x")
self.assertEqual(pc["testkey"], "testvalue")
pc.switch()
with self.assertRaises(KeyError):
x = pc["testkey"]
def testErrorOnWriteOnDefaultLayer(self):
pc = PropertyCarousel()
with self.assertRaises(PropertyWriteError):
pc["testkey"] = "testvalue"
def testSendsChangesIfActiveLayerIsReplaced(self):
pc = PropertyCarousel()
pl = PropertyLayer(testkey="testvalue")
pc.addLayer("x", pl)
pc.switch("x")
self.assertEqual(pc["testkey"], "testvalue")
mock = Mock()
pc.wire(mock.method)
pl = PropertyLayer(testkey="othervalue")
pc.addLayer("x", pl)
mock.method.assert_called_once_with({"testkey": "othervalue"})