def test_schedule_mode_setter(self, set_data, _): thermostat = NuHeatThermostat(None, None) thermostat.schedule_mode = 2 set_data.assert_called_with({"ScheduleMode": 2}) # Invalid mode with self.assertRaises(Exception) as _: thermostat.schedule_mode = 5
def test_get_data_401(self): # First request (when initializing the thermostat) is successful response_data = load_fixture("thermostat.json") responses.add(responses.GET, config.THERMOSTAT_URL, status=200, body=json.dumps(response_data), content_type="application/json") # A later, second request throws 401 Unauthorized responses.add(responses.GET, config.THERMOSTAT_URL, status=401) # Attempt to reauthenticate auth_data = load_fixture("auth_success.json") responses.add(responses.POST, config.AUTH_URL, status=200, body=json.dumps(auth_data), content_type="application/json") # Third request is successful responses.add(responses.GET, config.THERMOSTAT_URL, status=200, body=json.dumps(response_data), content_type="application/json") bad_session_id = "my-bad-session" good_session_id = auth_data.get("SessionId") api = NuHeat(None, None, session_id=bad_session_id) serial_number = response_data.get("SerialNumber") thermostat = NuHeatThermostat(api, serial_number) thermostat.get_data() self.assertTrue(isinstance(thermostat, NuHeatThermostat)) api_calls = responses.calls self.assertEqual(len(api_calls), 4) unauthorized_attempt = api_calls[1] params = {"sessionid": bad_session_id, "serialnumber": serial_number} request_url = "{}?{}".format(config.THERMOSTAT_URL, urlencode(params)) self.assertEqual(unauthorized_attempt.request.method, "GET") self.assertUrlsEqual(unauthorized_attempt.request.url, request_url) self.assertEqual(unauthorized_attempt.response.status_code, 401) auth_call = api_calls[2] self.assertEqual(auth_call.request.method, "POST") self.assertUrlsEqual(auth_call.request.url, config.AUTH_URL) second_attempt = api_calls[3] params["sessionid"] = good_session_id request_url = "{}?{}".format(config.THERMOSTAT_URL, urlencode(params)) self.assertEqual(second_attempt.request.method, "GET") self.assertUrlsEqual(second_attempt.request.url, request_url) self.assertEqual(second_attempt.response.status_code, 200)
def test_repr_with_data(self, _): api = NuHeat(None, None) serial_number = "serial-123" thermostat = NuHeatThermostat(api, serial_number) thermostat.temperature = 2000 thermostat.target_temperature = 5000 self.assertEqual( str(thermostat), "<NuHeatThermostat id='{}' temperature='{}F / {}C' target='{}F / {}C'>" .format(serial_number, 68, 20, 122, 50))
def test_set_target_fahrenheit(self, set_target_temperature, _): thermostat = NuHeatThermostat(None, None) thermostat.set_target_fahrenheit(80) set_target_temperature.assert_called_with(2665, config.SCHEDULE_HOLD) thermostat = NuHeatThermostat(None, None) thermostat.set_target_fahrenheit(80, config.SCHEDULE_TEMPORARY_HOLD) set_target_temperature.assert_called_with( 2665, config.SCHEDULE_TEMPORARY_HOLD)
def test_set_target_celsius(self, set_target_temperature, _): thermostat = NuHeatThermostat(None, None) thermostat.set_target_celsius(26) set_target_temperature.assert_called_with(2609, config.SCHEDULE_HOLD) thermostat = NuHeatThermostat(None, None) thermostat.set_target_celsius(26, config.SCHEDULE_TEMPORARY_HOLD) set_target_temperature.assert_called_with( 2609, config.SCHEDULE_TEMPORARY_HOLD)
def test_repr_without_data(self, _): api = NuHeat(None, None) serial_number = "serial-123" thermostat = NuHeatThermostat(api, serial_number) self.assertEqual( str(thermostat), "<NuHeatThermostat id='{}' temperature='{}F / {}C' target='{}F / {}C'>" .format(serial_number, None, None, None, None))
def test_set_data(self, _): responses.add(responses.POST, config.THERMOSTAT_URL, status=200, content_type="application/json") api = NuHeat(None, None, session_id="my-session") serial_number = "my-thermostat" params = {"sessionid": api._session_id, "serialnumber": serial_number} request_url = "{}?{}".format(config.THERMOSTAT_URL, urlencode(params)) post_data = {"test": "data"} thermostat = NuHeatThermostat(api, serial_number) thermostat.set_data(post_data) api_call = responses.calls[0] self.assertEqual(api_call.request.method, "POST") self.assertUrlsEqual(api_call.request.url, request_url) self.assertEqual(api_call.request.body, urlencode(post_data))
def test_get_data(self): response_data = load_fixture("thermostat.json") responses.add(responses.GET, config.THERMOSTAT_URL, status=200, body=json.dumps(response_data), content_type="application/json") api = NuHeat(None, None, session_id="my-session") serial_number = response_data.get("SerialNumber") params = {"sessionid": api._session_id, "serialnumber": serial_number} request_url = "{}?{}".format(config.THERMOSTAT_URL, urlencode(params)) thermostat = NuHeatThermostat(api, serial_number) thermostat.get_data() api_calls = responses.calls # Data is fetched once on instantiation and once on get_data() self.assertEqual(len(api_calls), 2) api_call = api_calls[0] self.assertEqual(api_call.request.method, "GET") self.assertUrlsEqual(api_call.request.url, request_url) self.assertEqual(thermostat._data, response_data) self.assertEqual(thermostat.heating, response_data["Heating"]) self.assertEqual(thermostat.online, response_data["Online"]) self.assertEqual(thermostat.room, response_data["Room"]) self.assertEqual(thermostat.serial_number, response_data["SerialNumber"]) self.assertEqual(thermostat.temperature, response_data["Temperature"]) self.assertEqual(thermostat.min_temperature, response_data["MinTemp"]) self.assertEqual(thermostat.max_temperature, response_data["MaxTemp"]) self.assertEqual(thermostat.target_temperature, response_data["SetPointTemp"]) self.assertEqual(thermostat.schedule_mode, response_data["ScheduleMode"])
def test_max_fahrenheit(self, _): thermostat = NuHeatThermostat(None, None) self.assertEqual(thermostat.max_fahrenheit, None) thermostat.max_temperature = 7000 self.assertEqual(thermostat.max_fahrenheit, 157)
def test_min_celsius(self, _): thermostat = NuHeatThermostat(None, None) self.assertEqual(thermostat.min_celsius, None) thermostat.min_temperature = 500 self.assertEqual(thermostat.min_celsius, 5)
def test_min_fahrenheit(self, _): thermostat = NuHeatThermostat(None, None) self.assertEqual(thermostat.min_fahrenheit, None) thermostat.min_temperature = 500 self.assertEqual(thermostat.min_fahrenheit, 41)
def test_target_celsius(self, _): thermostat = NuHeatThermostat(None, None) thermostat.target_temperature = 2222 self.assertEqual(thermostat.target_celsius, 22)
def test_resume_schedule(self, set_data, _): thermostat = NuHeatThermostat(None, None) thermostat.resume_schedule() set_data.assert_called_with({"ScheduleMode": config.SCHEDULE_RUN})
def test_schedule_mode(self, _): thermostat = NuHeatThermostat(None, None) thermostat._schedule_mode = 1 self.assertEqual(thermostat.schedule_mode, 1)
def test_init(self, _): api = NuHeat(None, None) serial_number = "serial-123" thermostat = NuHeatThermostat(api, serial_number) self.assertEqual(thermostat.serial_number, serial_number) self.assertEqual(thermostat._session, api)
def test_max_celsius(self, _): thermostat = NuHeatThermostat(None, None) self.assertEqual(thermostat.max_celsius, None) thermostat.max_temperature = 7000 self.assertEqual(thermostat.max_celsius, 69)
def test_target_fahrenheit(self, _): thermostat = NuHeatThermostat(None, None) thermostat.target_temperature = 2222 self.assertEqual(thermostat.target_fahrenheit, 72)
def test_set_target_temperature(self, set_data, _): thermostat = NuHeatThermostat(None, None) thermostat.min_temperature = 500 thermostat.max_temperature = 7000 # Permanent hold thermostat.set_target_temperature(2222) set_data.assert_called_with({ "SetPointTemp": 2222, "ScheduleMode": config.SCHEDULE_HOLD }) # Temporary hold thermostat.set_target_temperature(2222, mode=config.SCHEDULE_TEMPORARY_HOLD) set_data.assert_called_with({ "SetPointTemp": 2222, "ScheduleMode": config.SCHEDULE_TEMPORARY_HOLD }) # Below minimum thermostat.set_target_temperature(481) set_data.assert_called_with({ "SetPointTemp": 500, "ScheduleMode": config.SCHEDULE_HOLD }) # Above maximum thermostat.set_target_temperature(7020) set_data.assert_called_with({ "SetPointTemp": 7000, "ScheduleMode": config.SCHEDULE_HOLD }) # Invalid mode with self.assertRaises(Exception) as _: thermostat.set_target_temperature(2222, 5)
def test_target_fahrenheit_setter(self, set_target_fahrenheit, _): thermostat = NuHeatThermostat(None, None) thermostat.target_fahrenheit = 80 set_target_fahrenheit.assert_called_with(80)
def test_target_celsius_setter(self, set_target_celsius, _): thermostat = NuHeatThermostat(None, None) thermostat.target_celsius = 26 set_target_celsius.assert_called_with(26)