def test_custom_event_url_without_port(self, MockServer) -> None: """Event URL should use custom port if none was provided.""" MockServer.return_value.url = "http://127.0.0.1:81" hub = Hub("1.2.3.4", "1234", "token", 420, event_url="http://foo.local") wait_for(hub.start()) url = unquote(requests[0]["url"]) self.assertRegex(url, r"http://foo\.local:420$")
def test_stop_server(self, MockServer) -> None: """Hub should stop a server when stopped.""" hub = Hub("1.2.3.4", "1234", "token", True) run(hub.start()) self.assertTrue(MockServer.return_value.start.called) hub.stop() self.assertTrue(MockServer.return_value.stop.called)
def test_custom_event_url(self, MockServer) -> None: """Event URL should be configurable.""" MockServer.return_value.url = "http://127.0.0.1:81" hub = Hub("1.2.3.4", "1234", "token", event_url="http://foo.local") wait_for(hub.start()) url = unquote(requests[0]["url"]) self.assertRegex(url, r"http://foo\.local$")
def test_default_event_url(self, MockServer) -> None: """Default event URL should be server URL.""" MockServer.return_value.url = "http://127.0.0.1:81" hub = Hub("1.2.3.4", "1234", "token") wait_for(hub.start()) url = unquote(requests[0]["url"]) self.assertRegex(url, r"http://127.0.0.1:81$")
def test_start_no_hsm(self, MockServer) -> None: hub = Hub("1.2.3.4", "1234", "token") wait_for(hub.start()) self.assertEqual(len(requests), 13) self.assertRegex(requests[1]["url"], "devices$") self.assertRegex(requests[2]["url"], r"devices/\d+$") self.assertRegex(requests[3]["url"], r"devices/\d+$") self.assertRegex(requests[-2]["url"], "modes$") self.assertRegex(requests[-1]["url"], "hsm$")
def test_start(self, MockServer) -> None: """start() should request data from the Hubitat hub.""" hub = Hub("1.2.3.4", "1234", "token") run(hub.start()) # 33 requests - 1 to get device list, 32 to update devices self.assertEqual(len(requests), 33) self.assertRegex(requests[1]["url"], "devices$") self.assertRegex(requests[2]["url"], "devices/\d+$") self.assertRegex(requests[-1]["url"], "devices/\d+$")
def test_process_set_hsm(self, MockServer) -> None: """Started hub should allow mode to be updated.""" hub = Hub("1.2.3.4", "1234", "token") wait_for(hub.start()) self.assertEqual(hub.hsm_status, "armedAway") wait_for(hub.set_hsm(HSM_DISARM)) self.assertRegex(requests[-1]["url"], f"hsm/{HSM_DISARM}$") hub._process_event(events["hsm"]) self.assertEqual(hub.hsm_status, "armedAway")
def test_process_set_mode(self, MockServer) -> None: """Started hub should allow mode to be updated.""" hub = Hub("1.2.3.4", "1234", "token") wait_for(hub.start()) self.assertEqual(hub.mode, "Day") wait_for(hub.set_mode("Evening")) self.assertRegex(requests[-1]["url"], "modes/2$") hub._process_event(events["mode"]) self.assertEqual(hub.mode, "Evening")
def test_process_event(self, MockServer) -> None: """Started hub should process a device event.""" hub = Hub("1.2.3.4", "1234", "token") run(hub.start()) device = hub.devices["176"] attr = device.attributes["switch"] self.assertEqual(attr.value, "off") hub.process_event(events[0]) attr = device.attributes["switch"] self.assertEqual(attr.value, "on")
def test_process_other_event(self, MockServer) -> None: """Started hub should ignore non-device, non-mode events.""" hub = Hub("1.2.3.4", "1234", "token") wait_for(hub.start()) device = hub.devices["176"] attr = device.attributes["switch"] self.assertEqual(attr.value, "off") hub._process_event(events["other"]) attr = device.attributes["switch"] self.assertEqual(attr.value, "off")
def test_set_event_url(self, MockServer) -> None: """Started hub should allow mode to be updated.""" server_url = "http://127.0.0.1:81" MockServer.return_value.url = server_url hub = Hub("1.2.3.4", "1234", "token") wait_for(hub.start()) wait_for(hub.set_event_url(None)) event_url = unquote(requests[-1]["url"]) self.assertRegex(event_url, f"postURL/{server_url}$") other_url = "http://10.0.1.1:4443" wait_for(hub.set_event_url(other_url)) event_url = unquote(requests[-1]["url"]) self.assertRegex(event_url, f"postURL/{other_url}$")
def test_start(self, MockServer) -> None: """start() should request data from the Hubitat hub.""" hub = Hub("1.2.3.4", "1234", "token") wait_for(hub.start()) # 13 requests: # 0: set event URL # 1: request devices # 2...: request device details # -2: request modes # -1: request hsm status self.assertEqual(len(requests), 13) self.assertRegex(requests[1]["url"], "devices$") self.assertRegex(requests[2]["url"], r"devices/\d+$") self.assertRegex(requests[3]["url"], r"devices/\d+$") self.assertRegex(requests[-2]["url"], "modes$") self.assertRegex(requests[-1]["url"], "hsm$")
def test_process_hsm_event(self, MockServer) -> None: """Started hub should emit HSM events.""" hub = Hub("1.2.3.4", "1234", "token") wait_for(hub.start()) handler_called = False def listener(_: Any): nonlocal handler_called handler_called = True hub._process_event(events["hsm"]) self.assertFalse(handler_called) hub.add_hsm_listener(listener) hub._process_event(events["hsm"]) self.assertTrue(handler_called)
def test_start_server(self, MockServer) -> None: """Hub should start a server when asked to.""" hub = Hub("1.2.3.4", "1234", "token", True) run(hub.start()) self.assertTrue(MockServer.called)
def test_custom_event_port(self, MockServer) -> None: """Event server port should be configurable.""" MockServer.return_value.url = "http://127.0.0.1:81" hub = Hub("1.2.3.4", "1234", "token", 420) wait_for(hub.start()) self.assertEqual(MockServer.call_args[0][2], 420)
def test_devices_loaded(self, MockServer) -> None: """Started hub should have parsed device info.""" hub = Hub("1.2.3.4", "1234", "token") run(hub.start()) self.assertEqual(len(hub.devices), 9)
def test_custom_event_port_from_url(self, MockServer) -> None: """Event server port should come from event URL if none was provided.""" MockServer.return_value.url = "http://127.0.0.1:81" hub = Hub("1.2.3.4", "1234", "token", event_url="http://foo.local:416") wait_for(hub.start()) self.assertEqual(MockServer.call_args[0][2], 416)
def test_custom_event_port_and_url(self, MockServer) -> None: """Explicit event server port should override port from URL.""" MockServer.return_value.url = "http://127.0.0.1:81" hub = Hub("1.2.3.4", "1234", "token", 420, "http://foo.local:416") wait_for(hub.start()) self.assertEqual(MockServer.call_args[0][2], 420)