Beispiel #1
0
async def test_google_config_local_fulfillment(hass, aioclient_mock,
                                               hass_storage):
    """Test the google config for local fulfillment."""
    agent_user_id = "user"
    local_webhook_id = "webhook"

    hass_storage["google_assistant"] = {
        "version": 1,
        "minor_version": 1,
        "key": "google_assistant",
        "data": {
            "agent_user_ids": {
                agent_user_id: {
                    "local_webhook_id": local_webhook_id,
                }
            },
        },
    }

    config = GoogleConfig(hass, DUMMY_CONFIG)
    await config.async_initialize()

    with patch.object(config, "async_call_homegraph_api"):
        # Wait for google_assistant.helpers.async_initialize.sync_google to be called
        await hass.async_block_till_done()

    assert config.get_local_webhook_id(agent_user_id) == local_webhook_id
    assert config.get_local_agent_user_id(local_webhook_id) == agent_user_id
    assert config.get_local_agent_user_id("INCORRECT") is None
Beispiel #2
0
async def test_update_access_token(hass):
    """Test the function to update access token when expired."""
    jwt = "dummyjwt"

    config = GoogleConfig(hass, DUMMY_CONFIG)
    await config.async_initialize()

    base_time = datetime(2019, 10, 14, tzinfo=timezone.utc)
    with patch(
            "homeassistant.components.google_assistant.http._get_homegraph_token"
    ) as mock_get_token, patch(
            "homeassistant.components.google_assistant.http._get_homegraph_jwt"
    ) as mock_get_jwt, patch(
            "homeassistant.core.dt_util.utcnow") as mock_utcnow:
        mock_utcnow.return_value = base_time
        mock_get_jwt.return_value = jwt
        mock_get_token.return_value = MOCK_TOKEN

        await config._async_update_token()
        mock_get_token.assert_called_once()

        mock_get_token.reset_mock()

        mock_utcnow.return_value = base_time + timedelta(seconds=3600)
        await config._async_update_token()
        mock_get_token.assert_not_called()

        mock_get_token.reset_mock()

        mock_utcnow.return_value = base_time + timedelta(seconds=3601)
        await config._async_update_token()
        mock_get_token.assert_called_once()
Beispiel #3
0
async def test_should_expose(hass):
    """Test the google config should expose method."""
    config = GoogleConfig(hass, DUMMY_CONFIG)
    await config.async_initialize()

    with patch.object(config, "async_call_homegraph_api"):
        # Wait for google_assistant.helpers.async_initialize.sync_google to be called
        await hass.async_block_till_done()

    assert (config.should_expose(
        State(DOMAIN + ".mock", "mock", {"view": "not None"})) is False)

    with patch.object(config, "async_call_homegraph_api"):
        # Wait for google_assistant.helpers.async_initialize.sync_google to be called
        await hass.async_block_till_done()

    assert config.should_expose(State(CLOUD_NEVER_EXPOSED_ENTITIES[0],
                                      "mock")) is False
Beispiel #4
0
async def test_report_state(hass, aioclient_mock, hass_storage):
    """Test the report state function."""
    agent_user_id = "user"
    config = GoogleConfig(hass, DUMMY_CONFIG)
    await config.async_initialize()

    await config.async_connect_agent_user(agent_user_id)
    message = {"devices": {}}

    with patch.object(config, "async_call_homegraph_api") as mock_call:
        await config.async_report_state(message, agent_user_id)
        mock_call.assert_called_once_with(
            REPORT_STATE_BASE_URL,
            {"requestId": ANY, "agentUserId": agent_user_id, "payload": message},
        )
Beispiel #5
0
async def test_secure_device_pin_config(hass):
    """Test the setting of the secure device pin configuration."""
    secure_pin = "TEST"
    secure_config = GOOGLE_ASSISTANT_SCHEMA({
        "project_id": "1234",
        "service_account": {
            "private_key":
            "-----BEGIN PRIVATE KEY-----\nMIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKYscIlwm7soDsHAz6L6YvUkCvkrX19rS6yeYOmovvhoK5WeYGWUsd8V72zmsyHB7XO94YgJVjvxfzn5K8bLePjFzwoSJjZvhBJ/ZQ05d8VmbvgyWUoPdG9oEa4fZ/lCYrXoaFdTot2xcJvrb/ZuiRl4s4eZpNeFYvVK/Am7UeFPAgMBAAECgYAUetOfzLYUudofvPCaKHu7tKZ5kQPfEa0w6BAPnBF1Mfl1JiDBRDMryFtKs6AOIAVwx00dY/Ex0BCbB3+Cr58H7t4NaPTJxCpmR09pK7o17B7xAdQv8+SynFNud9/5vQ5AEXMOLNwKiU7wpXT6Z7ZIibUBOR7ewsWgsHCDpN1iqQJBAOMODPTPSiQMwRAUHIc6GPleFSJnIz2PAoG3JOG9KFAL6RtIc19lob2ZXdbQdzKtjSkWo+O5W20WDNAl1k32h6MCQQC7W4ZCIY67mPbL6CxXfHjpSGF4Dr9VWJ7ZrKHr6XUoOIcEvsn/pHvWonjMdy93rQMSfOE8BKd/I1+GHRmNVgplAkAnSo4paxmsZVyfeKt7Jy2dMY+8tVZe17maUuQaAE7Sk00SgJYegwrbMYgQnWCTL39HBfj0dmYA2Zj8CCAuu6O7AkEAryFiYjaUAO9+4iNoL27+ZrFtypeeadyov7gKs0ZKaQpNyzW8A+Zwi7TbTeSqzic/E+z/bOa82q7p/6b7141xsQJBANCAcIwMcVb6KVCHlQbOtKspo5Eh4ZQi8bGl+IcwbQ6JSxeTx915IfAldgbuU047wOB04dYCFB2yLDiUGVXTifU=\n-----END PRIVATE KEY-----\n",
            "client_email": "*****@*****.**",
        },
        "secure_devices_pin": secure_pin,
    })
    config = GoogleConfig(hass, secure_config)

    assert config.secure_devices_pin == secure_pin
Beispiel #6
0
async def test_call_homegraph_api_key_fail(hass, aioclient_mock, hass_storage):
    """Test the function to call the homegraph api."""
    config = GoogleConfig(
        hass,
        GOOGLE_ASSISTANT_SCHEMA({
            "project_id": "1234",
            "api_key": "dummy_key"
        }),
    )
    await config.async_initialize()

    aioclient_mock.post(MOCK_URL, status=666, json={})

    res = await config.async_call_homegraph_api_key(MOCK_URL, MOCK_JSON)
    assert res == 666
    assert aioclient_mock.call_count == 1
Beispiel #7
0
async def test_missing_service_account(hass):
    """Test the google config _async_request_sync_devices."""
    incorrect_config = GOOGLE_ASSISTANT_SCHEMA({
        "project_id": "1234",
    })
    config = GoogleConfig(hass, incorrect_config)
    await config.async_initialize()

    with patch.object(config, "async_call_homegraph_api"):
        # Wait for google_assistant.helpers.async_initialize.sync_google to be called
        await hass.async_block_till_done()

    assert (await config._async_request_sync_devices("mock") is
            HTTPStatus.INTERNAL_SERVER_ERROR)
    renew = config._access_token_renew
    await config._async_update_token()
    assert config._access_token_renew is renew
Beispiel #8
0
async def test_call_homegraph_api(hass, aioclient_mock, hass_storage):
    """Test the function to call the homegraph api."""
    config = GoogleConfig(hass, DUMMY_CONFIG)
    with patch(
            "homeassistant.components.google_assistant.http._get_homegraph_token"
    ) as mock_get_token:
        mock_get_token.return_value = MOCK_TOKEN

        aioclient_mock.post(MOCK_URL, status=200, json={})

        await config.async_call_homegraph_api(MOCK_URL, MOCK_JSON)

        assert mock_get_token.call_count == 1
        assert aioclient_mock.call_count == 1

        call = aioclient_mock.mock_calls[0]
        assert call[2] == MOCK_JSON
        assert call[3] == MOCK_HEADER
Beispiel #9
0
async def test_report_state(hass, aioclient_mock, hass_storage):
    """Test the report state function."""
    config = GoogleConfig(hass, DUMMY_CONFIG)
    message = {"devices": {}}
    owner = User(name="Test User", perm_lookup=None, groups=[], is_owner=True)

    with patch.object(config,
                      "async_call_homegraph_api") as mock_call, patch.object(
                          hass.auth, "async_get_owner") as mock_get_owner:
        mock_get_owner.return_value = owner

        await config.async_report_state(message)
        mock_call.assert_called_once_with(
            REPORT_STATE_BASE_URL,
            {
                "requestId": ANY,
                "agentUserId": owner.id,
                "payload": message
            },
        )
Beispiel #10
0
async def test_call_homegraph_api_retry(hass, aioclient_mock, hass_storage):
    """Test the that the calls get retried with new token on 401."""
    config = GoogleConfig(hass, DUMMY_CONFIG)
    with patch(
            "homeassistant.components.google_assistant.http._get_homegraph_token"
    ) as mock_get_token:
        mock_get_token.return_value = MOCK_TOKEN

        aioclient_mock.post(MOCK_URL, status=401, json={})

        await config.async_call_homegraph_api(MOCK_URL, MOCK_JSON)

        assert mock_get_token.call_count == 2
        assert aioclient_mock.call_count == 2

        call = aioclient_mock.mock_calls[0]
        assert call[2] == MOCK_JSON
        assert call[3] == MOCK_HEADER
        call = aioclient_mock.mock_calls[1]
        assert call[2] == MOCK_JSON
        assert call[3] == MOCK_HEADER
Beispiel #11
0
async def test_async_enable_local_sdk(hass, hass_client, hass_storage, caplog):
    """Test the google config enable and disable local sdk."""
    command_events = async_capture_events(hass, EVENT_COMMAND_RECEIVED)
    turn_on_calls = async_mock_service(hass, "light", "turn_on")
    hass.states.async_set("light.ceiling_lights", "off")

    assert await async_setup_component(hass, "webhook", {})

    hass_storage["google_assistant"] = {
        "version": 1,
        "minor_version": 1,
        "key": "google_assistant",
        "data": {
            "agent_user_ids": {
                "agent_1": {
                    "local_webhook_id": "mock_webhook_id",
                },
            },
        },
    }
    config = GoogleConfig(hass, DUMMY_CONFIG)
    await config.async_initialize()

    with patch.object(config, "async_call_homegraph_api"):
        # Wait for google_assistant.helpers.async_initialize.sync_google to be called
        await hass.async_block_till_done()

    assert config.is_local_sdk_active is True

    client = await hass_client()

    resp = await client.post(
        "/api/webhook/mock_webhook_id",
        json={
            "inputs": [{
                "context": {
                    "locale_country": "US",
                    "locale_language": "en"
                },
                "intent": "action.devices.EXECUTE",
                "payload": {
                    "commands": [{
                        "devices": [{
                            "id": "light.ceiling_lights"
                        }],
                        "execution": [{
                            "command": "action.devices.commands.OnOff",
                            "params": {
                                "on": True
                            },
                        }],
                    }],
                    "structureData": {},
                },
            }],
            "requestId":
            "mock_req_id",
        },
    )
    assert resp.status == HTTPStatus.OK
    result = await resp.json()
    assert result["requestId"] == "mock_req_id"

    assert len(command_events) == 1
    assert command_events[0].context.user_id == "agent_1"

    assert len(turn_on_calls) == 1
    assert turn_on_calls[0].context is command_events[0].context

    config.async_disable_local_sdk()
    assert config.is_local_sdk_active is False

    config._store._data = {
        STORE_AGENT_USER_IDS: {
            "agent_1": {
                STORE_GOOGLE_LOCAL_WEBHOOK_ID: "mock_webhook_id"
            },
            "agent_2": {
                STORE_GOOGLE_LOCAL_WEBHOOK_ID: "mock_webhook_id"
            },
        },
    }
    config.async_enable_local_sdk()
    assert config.is_local_sdk_active is False

    config._store._data = {
        STORE_AGENT_USER_IDS: {
            "agent_1": {
                STORE_GOOGLE_LOCAL_WEBHOOK_ID: None
            },
        },
    }
    config.async_enable_local_sdk()
    assert config.is_local_sdk_active is False

    config._store._data = {
        STORE_AGENT_USER_IDS: {
            "agent_2": {
                STORE_GOOGLE_LOCAL_WEBHOOK_ID: "mock_webhook_id"
            },
            "agent_1": {
                STORE_GOOGLE_LOCAL_WEBHOOK_ID: None
            },
        },
    }
    config.async_enable_local_sdk()
    assert config.is_local_sdk_active is False

    config.async_disable_local_sdk()

    config._store._data = {
        STORE_AGENT_USER_IDS: {
            "agent_1": {
                STORE_GOOGLE_LOCAL_WEBHOOK_ID: "mock_webhook_id"
            },
        },
    }
    config.async_enable_local_sdk()

    config._store.pop_agent_user_id("agent_1")

    caplog.clear()

    resp = await client.post(
        "/api/webhook/mock_webhook_id",
        json={
            "inputs": [{
                "context": {
                    "locale_country": "US",
                    "locale_language": "en"
                },
                "intent": "action.devices.EXECUTE",
                "payload": {
                    "commands": [{
                        "devices": [{
                            "id": "light.ceiling_lights"
                        }],
                        "execution": [{
                            "command": "action.devices.commands.OnOff",
                            "params": {
                                "on": True
                            },
                        }],
                    }],
                    "structureData": {},
                },
            }],
            "requestId":
            "mock_req_id",
        },
    )
    assert resp.status == HTTPStatus.OK
    assert (
        "Cannot process request for webhook mock_webhook_id as no linked agent user is found:"
        in caplog.text)