async def test_openclose_binary_sensor(hass, device_class): """Test OpenClose trait support for binary_sensor domain.""" assert helpers.get_google_type(binary_sensor.DOMAIN, device_class) is not None assert trait.OpenCloseTrait.supported(binary_sensor.DOMAIN, 0, device_class) trt = trait.OpenCloseTrait( hass, State('binary_sensor.test', STATE_ON, { ATTR_DEVICE_CLASS: device_class, }), BASIC_CONFIG) assert trt.sync_attributes() == { 'queryOnlyOpenClose': True, } assert trt.query_attributes() == {'openPercent': 100} trt = trait.OpenCloseTrait( hass, State('binary_sensor.test', STATE_OFF, { ATTR_DEVICE_CLASS: device_class, }), BASIC_CONFIG) assert trt.sync_attributes() == { 'queryOnlyOpenClose': True, } assert trt.query_attributes() == {'openPercent': 0}
async def test_openclose_cover(hass): """Test OpenClose trait support for cover domain.""" assert helpers.get_google_type(cover.DOMAIN, None) is not None assert trait.OpenCloseTrait.supported(cover.DOMAIN, cover.SUPPORT_SET_POSITION, None) # No position trt = trait.OpenCloseTrait(hass, State('cover.bla', cover.STATE_OPEN, { }), BASIC_CONFIG) assert trt.sync_attributes() == {} assert trt.query_attributes() == { 'openPercent': 100 } # No state trt = trait.OpenCloseTrait(hass, State('cover.bla', STATE_UNKNOWN, { }), BASIC_CONFIG) assert trt.sync_attributes() == {} with pytest.raises(helpers.SmartHomeError): trt.query_attributes() # Assumed state trt = trait.OpenCloseTrait(hass, State('cover.bla', cover.STATE_OPEN, { ATTR_ASSUMED_STATE: True, }), BASIC_CONFIG) assert trt.sync_attributes() == {} with pytest.raises(helpers.SmartHomeError): trt.query_attributes() trt = trait.OpenCloseTrait(hass, State('cover.bla', cover.STATE_OPEN, { cover.ATTR_CURRENT_POSITION: 75 }), BASIC_CONFIG) assert trt.sync_attributes() == {} assert trt.query_attributes() == { 'openPercent': 75 } calls = async_mock_service( hass, cover.DOMAIN, cover.SERVICE_SET_COVER_POSITION) await trt.execute( trait.COMMAND_OPENCLOSE, BASIC_DATA, {'openPercent': 50}, {}) assert len(calls) == 1 assert calls[0].data == { ATTR_ENTITY_ID: 'cover.bla', cover.ATTR_POSITION: 50 }
async def test_openclose_cover(hass): """Test OpenClose trait support for cover domain.""" assert helpers.get_google_type(cover.DOMAIN, None) is not None assert trait.OpenCloseTrait.supported(cover.DOMAIN, cover.SUPPORT_SET_POSITION, None) trt = trait.OpenCloseTrait( hass, State( 'cover.bla', cover.STATE_OPEN, { cover.ATTR_CURRENT_POSITION: 75, ATTR_SUPPORTED_FEATURES: cover.SUPPORT_SET_POSITION, }), BASIC_CONFIG) assert trt.sync_attributes() == {} assert trt.query_attributes() == {'openPercent': 75} calls = async_mock_service(hass, cover.DOMAIN, cover.SERVICE_SET_COVER_POSITION) await trt.execute(trait.COMMAND_OPENCLOSE, BASIC_DATA, {'openPercent': 50}, {}) assert len(calls) == 1 assert calls[0].data == { ATTR_ENTITY_ID: 'cover.bla', cover.ATTR_POSITION: 50 }
async def test_openclose_cover_secure(hass, device_class): """Test OpenClose trait support for cover domain.""" assert helpers.get_google_type(cover.DOMAIN, device_class) is not None assert trait.OpenCloseTrait.supported(cover.DOMAIN, cover.SUPPORT_SET_POSITION, device_class) assert trait.OpenCloseTrait.might_2fa(cover.DOMAIN, cover.SUPPORT_SET_POSITION, device_class) trt = trait.OpenCloseTrait( hass, State( "cover.bla", cover.STATE_OPEN, { ATTR_DEVICE_CLASS: device_class, ATTR_SUPPORTED_FEATURES: cover.SUPPORT_SET_POSITION, cover.ATTR_CURRENT_POSITION: 75, }, ), PIN_CONFIG, ) assert trt.sync_attributes() == {} assert trt.query_attributes() == {"openPercent": 75} calls = async_mock_service(hass, cover.DOMAIN, cover.SERVICE_SET_COVER_POSITION) # No challenge data with pytest.raises(error.ChallengeNeeded) as err: await trt.execute(trait.COMMAND_OPENCLOSE, PIN_DATA, {"openPercent": 50}, {}) assert len(calls) == 0 assert err.value.code == const.ERR_CHALLENGE_NEEDED assert err.value.challenge_type == const.CHALLENGE_PIN_NEEDED # invalid pin with pytest.raises(error.ChallengeNeeded) as err: await trt.execute(trait.COMMAND_OPENCLOSE, PIN_DATA, {"openPercent": 50}, {"pin": "9999"}) assert len(calls) == 0 assert err.value.code == const.ERR_CHALLENGE_NEEDED assert err.value.challenge_type == const.CHALLENGE_FAILED_PIN_NEEDED await trt.execute(trait.COMMAND_OPENCLOSE, PIN_DATA, {"openPercent": 50}, {"pin": "1234"}) assert len(calls) == 1 assert calls[0].data == { ATTR_ENTITY_ID: "cover.bla", cover.ATTR_POSITION: 50 } # no challenge on close calls = async_mock_service(hass, cover.DOMAIN, cover.SERVICE_CLOSE_COVER) await trt.execute(trait.COMMAND_OPENCLOSE, PIN_DATA, {"openPercent": 0}, {}) assert len(calls) == 1 assert calls[0].data == {ATTR_ENTITY_ID: "cover.bla"}
async def test_openclose_cover_assumed_state(hass): """Test OpenClose trait support for cover domain.""" assert helpers.get_google_type(cover.DOMAIN, None) is not None assert trait.OpenCloseTrait.supported(cover.DOMAIN, cover.SUPPORT_SET_POSITION, None) trt = trait.OpenCloseTrait( hass, State( "cover.bla", cover.STATE_OPEN, { ATTR_ASSUMED_STATE: True, ATTR_SUPPORTED_FEATURES: cover.SUPPORT_SET_POSITION, }, ), BASIC_CONFIG, ) assert trt.sync_attributes() == {} with pytest.raises(helpers.SmartHomeError): trt.query_attributes() calls = async_mock_service(hass, cover.DOMAIN, cover.SERVICE_SET_COVER_POSITION) await trt.execute(trait.COMMAND_OPENCLOSE, BASIC_DATA, {"openPercent": 40}, {}) assert len(calls) == 1 assert calls[0].data == { ATTR_ENTITY_ID: "cover.bla", cover.ATTR_POSITION: 40 } assert trt.query_attributes() == {"openPercent": 40}
async def test_openclose_cover_unknown_state(hass): """Test OpenClose trait support for cover domain with unknown state.""" assert helpers.get_google_type(cover.DOMAIN, None) is not None assert trait.OpenCloseTrait.supported(cover.DOMAIN, cover.SUPPORT_SET_POSITION, None) # No state trt = trait.OpenCloseTrait(hass, State('cover.bla', STATE_UNKNOWN, { }), BASIC_CONFIG) assert trt.sync_attributes() == {} with pytest.raises(helpers.SmartHomeError): trt.query_attributes() calls = async_mock_service( hass, cover.DOMAIN, cover.SERVICE_OPEN_COVER) await trt.execute( trait.COMMAND_OPENCLOSE, BASIC_DATA, {'openPercent': 100}, {}) assert len(calls) == 1 assert calls[0].data == { ATTR_ENTITY_ID: 'cover.bla', } assert trt.query_attributes() == {'openPercent': 100}
async def test_openclose_cover(hass): """Test cover trait.""" assert trait.OpenCloseTrait.supported(cover.DOMAIN, cover.SUPPORT_SET_POSITION) # No position trt = trait.OpenCloseTrait(hass, State('cover.bla', cover.STATE_OPEN, {}), BASIC_CONFIG) assert trt.sync_attributes() == {} assert trt.query_attributes() == {'openPercent': 100} # Assumed state trt = trait.OpenCloseTrait( hass, State('cover.bla', cover.STATE_OPEN, { ATTR_ASSUMED_STATE: True, }), BASIC_CONFIG) assert trt.sync_attributes() == {} assert trt.query_attributes() == {'openPercent': 50} trt = trait.OpenCloseTrait( hass, State('cover.bla', cover.STATE_OPEN, {cover.ATTR_CURRENT_POSITION: 75}), BASIC_CONFIG) assert trt.sync_attributes() == {} assert trt.query_attributes() == {'openPercent': 75} calls = async_mock_service(hass, cover.DOMAIN, cover.SERVICE_SET_COVER_POSITION) await trt.execute(trait.COMMAND_OPENCLOSE, BASIC_DATA, {'openPercent': 50}) assert len(calls) == 1 assert calls[0].data == { ATTR_ENTITY_ID: 'cover.bla', cover.ATTR_POSITION: 50 }
async def test_openclose_cover_no_position(hass): """Test OpenClose trait support for cover domain.""" assert helpers.get_google_type(cover.DOMAIN, None) is not None assert trait.OpenCloseTrait.supported(cover.DOMAIN, cover.SUPPORT_SET_POSITION, None) trt = trait.OpenCloseTrait(hass, State("cover.bla", cover.STATE_OPEN, {}), BASIC_CONFIG) assert trt.sync_attributes() == {} assert trt.query_attributes() == {"openPercent": 100} calls = async_mock_service(hass, cover.DOMAIN, cover.SERVICE_CLOSE_COVER) await trt.execute(trait.COMMAND_OPENCLOSE, BASIC_DATA, {"openPercent": 0}, {}) assert len(calls) == 1 assert calls[0].data == {ATTR_ENTITY_ID: "cover.bla"}