"""Mock helpers for Z-Wave component.""" from unittest.mock import MagicMock from pydispatch import dispatcher def value_changed(value): """Fire a value changed.""" dispatcher.send( MockNetwork.SIGNAL_VALUE_CHANGED, value=value, node=value.node, network=value.node._network ) def node_changed(node): """Fire a node changed.""" dispatcher.send( MockNetwork.SIGNAL_NODE, node=node, network=node._network ) def notification(node_id, network=None): """Fire a notification.""" dispatcher.send( MockNetwork.SIGNAL_NOTIFICATION, args={'nodeId': node_id}, network=network ) class MockOption(MagicMock): """Mock Z-Wave options.""" def __init__(self, device=None, config_path=None, user_path=None, cmd_line=None): """Initialize a Z-Wave mock options.""" super().__init__() self.device = device self.config_path = config_path self.user_path = user_path self.cmd_line = cmd_line def _get_child_mock(self, **kw): """Create child mocks with right MagicMock class.""" return MagicMock(**kw) class MockNetwork(MagicMock): """Mock Z-Wave network.""" SIGNAL_NETWORK_FAILED = 'mock_NetworkFailed' SIGNAL_NETWORK_STARTED = 'mock_NetworkStarted' SIGNAL_NETWORK_READY = 'mock_NetworkReady' SIGNAL_NETWORK_STOPPED = 'mock_NetworkStopped' SIGNAL_NETWORK_RESETTED = 'mock_DriverResetted' SIGNAL_NETWORK_AWAKED = 'mock_DriverAwaked' SIGNAL_DRIVER_FAILED = 'mock_DriverFailed' SIGNAL_DRIVER_READY = 'mock_DriverReady' SIGNAL_DRIVER_RESET = 'mock_DriverReset' SIGNAL_DRIVER_REMOVED = 'mock_DriverRemoved' SIGNAL_GROUP = 'mock_Group' SIGNAL_NODE = 'mock_Node' SIGNAL_NODE_ADDED = 'mock_NodeAdded' SIGNAL_NODE_EVENT = 'mock_NodeEvent' SIGNAL_NODE_NAMING = 'mock_NodeNaming' SIGNAL_NODE_NEW = 'mock_NodeNew' SIGNAL_NODE_PROTOCOL_INFO = 'mock_NodeProtocolInfo' SIGNAL_NODE_READY = 'mock_NodeReady' SIGNAL_NODE_REMOVED = 'mock_NodeRemoved' SIGNAL_SCENE_EVENT = 'mock_SceneEvent' SIGNAL_VALUE = 'mock_Value' SIGNAL_VALUE_ADDED = 'mock_ValueAdded' SIGNAL_VALUE_CHANGED = 'mock_ValueChanged' SIGNAL_VALUE_REFRESHED = 'mock_ValueRefreshed' SIGNAL_VALUE_REMOVED = 'mock_ValueRemoved' SIGNAL_POLLING_ENABLED = 'mock_PollingEnabled' SIGNAL_POLLING_DISABLED = 'mock_PollingDisabled' SIGNAL_CREATE_BUTTON = 'mock_CreateButton' SIGNAL_DELETE_BUTTON = 'mock_DeleteButton' SIGNAL_BUTTON_ON = 'mock_ButtonOn' SIGNAL_BUTTON_OFF = 'mock_ButtonOff' SIGNAL_ESSENTIAL_NODE_QUERIES_COMPLETE = \ 'mock_EssentialNodeQueriesComplete' SIGNAL_NODE_QUERIES_COMPLETE = 'mock_NodeQueriesComplete' SIGNAL_AWAKE_NODES_QUERIED = 'mock_AwakeNodesQueried' SIGNAL_ALL_NODES_QUERIED = 'mock_AllNodesQueried' SIGNAL_ALL_NODES_QUERIED_SOME_DEAD = \ 'mock_AllNodesQueriedSomeDead' SIGNAL_MSG_COMPLETE = 'mock_MsgComplete' SIGNAL_NOTIFICATION = 'mock_Notification' SIGNAL_CONTROLLER_COMMAND = 'mock_ControllerCommand' SIGNAL_CONTROLLER_WAITING = 'mock_ControllerWaiting' STATE_STOPPED = 0 STATE_FAILED = 1 STATE_RESETTED = 3 STATE_STARTED = 5 STATE_AWAKED = 7 STATE_READY = 10 def __init__(self, options=None, *args, **kwargs): """Initialize a Z-Wave mock network.""" super().__init__() self.options = options self.state = MockNetwork.STATE_STOPPED class MockNode(MagicMock): """Mock Z-Wave node.""" def __init__(self, *, node_id='567', name='Mock Node', manufacturer_id='ABCD', product_id='123', product_type='678', command_classes=None, can_wake_up_value=True, manufacturer_name='Test Manufacturer', product_name='Test Product', network=None, **kwargs): """Initialize a Z-Wave mock node.""" super().__init__() self.node_id = node_id self.name = name self.manufacturer_id = manufacturer_id self.product_id = product_id self.product_type = product_type self.manufacturer_name = manufacturer_name self.product_name = product_name self.can_wake_up_value = can_wake_up_value self._command_classes = command_classes or [] if network is not None: self._network = network for attr_name in kwargs: setattr(self, attr_name, kwargs[attr_name]) def has_command_class(self, command_class): """Test if mock has a command class.""" return command_class in self._command_classes def get_battery_level(self): """Return mock battery level.""" return 42 def can_wake_up(self): """Return whether the node can wake up.""" return self.can_wake_up_value def _get_child_mock(self, **kw): """Create child mocks with right MagicMock class.""" return MagicMock(**kw) class MockValue(MagicMock): """Mock Z-Wave value.""" _mock_value_id = 1234 def __init__(self, *, label='Mock Value', node=None, instance=0, index=0, value_id=None, **kwargs): """Initialize a Z-Wave mock value.""" super().__init__() self.label = label self.node = node self.instance = instance self.index = index if value_id is None: MockValue._mock_value_id += 1 value_id = MockValue._mock_value_id self.value_id = value_id self.object_id = value_id for attr_name in kwargs: setattr(self, attr_name, kwargs[attr_name]) def _get_child_mock(self, **kw): """Create child mocks with right MagicMock class.""" return MagicMock(**kw) def refresh(self): """Mock refresh of node value.""" value_changed(self) class MockEntityValues(): """Mock Z-Wave entity values.""" def __init__(self, **kwargs): """Initialize the mock zwave values.""" self.primary = None self.wakeup = None self.battery = None self.power = None for name in kwargs: setattr(self, name, kwargs[name]) def __iter__(self): """Allow iteration over all values.""" return iter(self.__dict__.values())