Exemple #1
0
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}
Exemple #2
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
    }
Exemple #3
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)

    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
    }
Exemple #4
0
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"}
Exemple #5
0
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}
Exemple #7
0
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
    }
Exemple #8
0
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"}