async def test_command(aresponses): """Test to make sure setting lights works.""" aresponses.add("fan.local", "/mf", "POST", response=basic_info) aresponses.add("fan.local", "/mf", "POST", response=basic_response) async def evaluate_request(request): data = await request.json() assert aiomodernforms.COMMAND_LIGHT_POWER in data modified_response = basic_response.copy() modified_response[STATE_LIGHT_POWER] = data[ aiomodernforms.COMMAND_LIGHT_POWER] return aresponses.Response( status=200, content_type="application/json", text=json.dumps(modified_response), ) aresponses.add("fan.local", "/mf", "POST", response=evaluate_request) async with aiomodernforms.ModernFormsDevice("fan.local") as device: await device.update() response = await device.request(commands={ aiomodernforms.COMMAND_LIGHT_POWER: aiomodernforms.LIGHT_POWER_ON }) assert response.light_on == aiomodernforms.LIGHT_POWER_ON
async def main(): """Turn on the fan light.""" async with aiomodernforms.ModernFormsDevice("192.168.3.197") as fan: await fan.update() print(fan.status) await fan.light( on=LIGHT_POWER_ON, brightness=50, sleep=datetime.now() + timedelta(minutes=2), ) print(fan.status)
async def test_reboot(aresponses): """Test how reboot is handled.""" aresponses.add("fan.local", "/mf", "POST", response=basic_info) aresponses.add("fan.local", "/mf", "POST", response=basic_response) async with aiomodernforms.ModernFormsDevice("fan.local") as device: await device.update() with patch( "aiomodernforms.ModernFormsDevice.request", side_effect=ModernFormsConnectionTimeoutError, ): await device.reboot()
async def test_server_error(aresponses): """Test to make validate proper server error handling.""" aresponses.add("fan.local", "/mf", "POST", response=basic_info) aresponses.add( "fan.local", "/mf", "POST", response=aresponses.Response(text="error", status=500), ) with pytest.raises(aiomodernforms.ModernFormsError): async with aiomodernforms.ModernFormsDevice("fan.local") as device: await device.update()
async def test_empty_response(aresponses): """Test for an Empty Response.""" aresponses.add("fan.local", "/mf", "POST", response=basic_info) async def send_empty_state(request): await request.json() return aresponses.Response( status=200, content_type="application/json", text="{}", ) aresponses.add("fan.local", "/mf", "POST", response=send_empty_state) with pytest.raises(ModernFormsConnectionError): async with aiomodernforms.ModernFormsDevice("fan.local") as device: await device.update()
async def test_basic_status(aresponses): """Test JSON response is handled correctly.""" aresponses.add("fan.local", "/mf", "POST", response=basic_info) aresponses.add( "fan.local", "/mf", "POST", response=basic_response, repeat=2, ) async with aiomodernforms.ModernFormsDevice("fan.local") as device: await device.update() response = await device.request( commands={aiomodernforms.COMMAND_LIGHT_POWER: False}) assert response.fan_on == basic_response["fanOn"] assert device.status.fan_direction == "forward" assert device.info.fan_type == "1818-56"
async def test_fan(aresponses): """Test to make sure setting fan works.""" aresponses.add("fan.local", "/mf", "POST", response=basic_info) aresponses.add("fan.local", "/mf", "POST", response=basic_response) async def evaluate_request(request): data = await request.json() assert aiomodernforms.COMMAND_FAN_POWER in data assert aiomodernforms.COMMAND_FAN_SPEED in data assert aiomodernforms.COMMAND_FAN_DIRECTION in data assert aiomodernforms.COMMAND_FAN_SLEEP_TIMER in data modified_response = basic_response.copy() modified_response[STATE_FAN_POWER] = data[ aiomodernforms.COMMAND_FAN_POWER] modified_response[STATE_FAN_SPEED] = data[ aiomodernforms.COMMAND_FAN_SPEED] modified_response[STATE_FAN_DIRECTION] = data[ aiomodernforms.COMMAND_FAN_DIRECTION] modified_response[STATE_FAN_SLEEP_TIMER] = data[ aiomodernforms.COMMAND_FAN_SLEEP_TIMER] return aresponses.Response( status=200, content_type="application/json", text=json.dumps(modified_response), ) aresponses.add("fan.local", "/mf", "POST", response=evaluate_request) async with aiomodernforms.ModernFormsDevice("fan.local") as device: await device.update() sleep_time = datetime.now() + timedelta(minutes=2) await device.fan( on=aiomodernforms.FAN_POWER_ON, speed=aiomodernforms.FAN_SPEED_HIGH_VALUE, direction=aiomodernforms.FAN_DIRECTION_FORWARD, sleep=sleep_time, ) assert device.status.fan_on == aiomodernforms.FAN_POWER_ON assert device.status.fan_speed == aiomodernforms.FAN_SPEED_HIGH_VALUE assert device.status.fan_direction == aiomodernforms.FAN_DIRECTION_FORWARD assert device.status.fan_sleep_timer == int(sleep_time.timestamp())
async def test_adaptive_learning(aresponses): """Test to make sure setting adaptive learning mode works.""" aresponses.add("fan.local", "/mf", "POST", response=basic_info) aresponses.add("fan.local", "/mf", "POST", response=basic_response) async def evaluate_request(request): data = await request.json() assert aiomodernforms.COMMAND_ADAPTIVE_LEARNING in data modified_response = basic_response.copy() modified_response[STATE_ADAPTIVE_LEARNING] = data[ aiomodernforms.COMMAND_ADAPTIVE_LEARNING] return aresponses.Response( status=200, content_type="application/json", text=json.dumps(modified_response), ) aresponses.add("fan.local", "/mf", "POST", response=evaluate_request) async with aiomodernforms.ModernFormsDevice("fan.local") as device: await device.update() await device.adaptive_learning(ADAPTIVE_LEARNING_ON) assert device.status.adaptive_learning_enabled
async def test_fan_sleep_clear(aresponses): """Test to make sure setting light sleep works.""" aresponses.add("fan.local", "/mf", "POST", response=basic_info) aresponses.add("fan.local", "/mf", "POST", response=basic_response) async def evaluate_request(request): data = await request.json() assert aiomodernforms.COMMAND_FAN_SLEEP_TIMER in data modified_response = basic_response.copy() modified_response[STATE_FAN_SLEEP_TIMER] = data[ aiomodernforms.COMMAND_FAN_SLEEP_TIMER] return aresponses.Response( status=200, content_type="application/json", text=json.dumps(modified_response), ) aresponses.add("fan.local", "/mf", "POST", response=evaluate_request) # check to clear timer async with aiomodernforms.ModernFormsDevice("fan.local") as device: await device.fan(sleep=0, ) assert device.status.fan_sleep_timer == 0
async def test_light_sleep_int(aresponses): """Test to make sure setting light sleep works.""" aresponses.add("fan.local", "/mf", "POST", response=basic_info) aresponses.add("fan.local", "/mf", "POST", response=basic_response) async def evaluate_request(request): data = await request.json() assert aiomodernforms.COMMAND_LIGHT_SLEEP_TIMER in data modified_response = basic_response.copy() modified_response[STATE_LIGHT_SLEEP_TIMER] = data[ aiomodernforms.COMMAND_LIGHT_SLEEP_TIMER] return aresponses.Response( status=200, content_type="application/json", text=json.dumps(modified_response), ) aresponses.add("fan.local", "/mf", "POST", response=evaluate_request) async with aiomodernforms.ModernFormsDevice("fan.local") as device: sleep_time = datetime.now() + timedelta(seconds=120) await device.light(sleep=120, ) assert device.status.light_sleep_timer == int(sleep_time.timestamp())
async def test_light(aresponses): """Test to make sure setting lights works.""" aresponses.add("fan.local", "/mf", "POST", response=basic_info) aresponses.add("fan.local", "/mf", "POST", response=basic_response) async def evaluate_request(request): data = await request.json() assert aiomodernforms.COMMAND_LIGHT_POWER in data assert aiomodernforms.COMMAND_LIGHT_BRIGHTNESS in data assert aiomodernforms.COMMAND_LIGHT_SLEEP_TIMER in data modified_response = basic_response.copy() modified_response[STATE_LIGHT_POWER] = data[ aiomodernforms.COMMAND_LIGHT_POWER] modified_response[STATE_LIGHT_BRIGHTNESS] = data[ aiomodernforms.COMMAND_LIGHT_BRIGHTNESS] modified_response[STATE_LIGHT_SLEEP_TIMER] = data[ aiomodernforms.COMMAND_LIGHT_SLEEP_TIMER] return aresponses.Response( status=200, content_type="application/json", text=json.dumps(modified_response), ) aresponses.add("fan.local", "/mf", "POST", response=evaluate_request) async with aiomodernforms.ModernFormsDevice("fan.local") as device: await device.update() sleep_time = datetime.now() + timedelta(minutes=2) await device.light( on=aiomodernforms.LIGHT_POWER_ON, brightness=aiomodernforms.LIGHT_BRIGHTNESS_HIGH_VALUE, sleep=sleep_time, ) assert device.status.light_on == aiomodernforms.LIGHT_POWER_ON assert (device.status.light_brightness == aiomodernforms.LIGHT_BRIGHTNESS_HIGH_VALUE) assert device.status.light_sleep_timer == int(sleep_time.timestamp())
async def test_info_not_initialized_response(): """Test info when not initialized.""" with pytest.raises(ModernFormsNotInitializedError): async with aiomodernforms.ModernFormsDevice("fan.local") as device: device.info()
async def test_connection_error(aresponses): """Test to make validate proper connection error handling.""" aresponses.add("fan.local", "/mf", "POST", response=basic_info) with pytest.raises(aiomodernforms.ModernFormsConnectionError): async with aiomodernforms.ModernFormsDevice("fan.local") as device: await device.update()
async def test_invalid_setting(aresponses): """Test to make sure setting invalid settings are rejected.""" aresponses.add("fan.local", "/mf", "POST", response=basic_info) aresponses.add("fan.local", "/mf", "POST", response=basic_response) async with aiomodernforms.ModernFormsDevice("fan.local") as device: await device.update() # light on non boolean with pytest.raises(aiomodernforms.ModernFormsInvalidSettingsError): await device.light(on="foo") # light brightness not integer with pytest.raises(aiomodernforms.ModernFormsInvalidSettingsError): await device.light(brightness="foo") # light brightess out of range with pytest.raises(aiomodernforms.ModernFormsInvalidSettingsError): await device.light(brightness=LIGHT_BRIGHTNESS_HIGH_VALUE + 1) with pytest.raises(aiomodernforms.ModernFormsInvalidSettingsError): await device.light(brightness=LIGHT_BRIGHTNESS_LOW_VALUE - 1) # light sleep non boolean with pytest.raises(aiomodernforms.ModernFormsInvalidSettingsError): await device.light(sleep="foo") # light sleep out of range with pytest.raises(aiomodernforms.ModernFormsInvalidSettingsError): await device.light(sleep=datetime.now() + timedelta(hours=25)) with pytest.raises(aiomodernforms.ModernFormsInvalidSettingsError): await device.light(sleep=datetime.now() - timedelta(minutes=1)) # fan on non boolean with pytest.raises(aiomodernforms.ModernFormsInvalidSettingsError): await device.fan(on="foo") # fan speed not integer with pytest.raises(aiomodernforms.ModernFormsInvalidSettingsError): await device.fan(speed="foo") # fan speed out of range with pytest.raises(aiomodernforms.ModernFormsInvalidSettingsError): await device.fan(speed=FAN_SPEED_HIGH_VALUE + 1) with pytest.raises(aiomodernforms.ModernFormsInvalidSettingsError): await device.fan(speed=FAN_SPEED_LOW_VALUE - 1) # fan sleep non boolean with pytest.raises(aiomodernforms.ModernFormsInvalidSettingsError): await device.fan(sleep="foo") # fan sleep out of range with pytest.raises(aiomodernforms.ModernFormsInvalidSettingsError): await device.fan(sleep=datetime.now() + timedelta(hours=25)) with pytest.raises(aiomodernforms.ModernFormsInvalidSettingsError): await device.fan(sleep=datetime.now() - timedelta(minutes=1)) # fan direction non string with pytest.raises(aiomodernforms.ModernFormsInvalidSettingsError): await device.fan(direction=1) # fan direction invlaid value with pytest.raises(aiomodernforms.ModernFormsInvalidSettingsError): await device.fan(direction="upwards")