"""The tests for the hassio component.""" import asyncio from unittest.mock import patch import pytest from homeassistant.const import HTTP_HEADER_HA_AUTH from . import API_PASSWORD @asyncio.coroutine def test_forward_request(hassio_client, aioclient_mock): """Test fetching normal path.""" aioclient_mock.post("http://127.0.0.1/beer", text="response") resp = yield from hassio_client.post('/api/hassio/beer', headers={ HTTP_HEADER_HA_AUTH: API_PASSWORD }) # Check we got right response assert resp.status == 200 body = yield from resp.text() assert body == 'response' # Check we forwarded command assert len(aioclient_mock.mock_calls) == 1 @asyncio.coroutine @pytest.mark.parametrize( 'build_type', [ 'supervisor/info', 'homeassistant/update', 'host/info' ]) def test_auth_required_forward_request(hassio_noauth_client, build_type): """Test auth required for normal request.""" resp = yield from hassio_noauth_client.post( "/api/hassio/{}".format(build_type)) # Check we got right response assert resp.status == 401 @asyncio.coroutine @pytest.mark.parametrize( 'build_type', [ 'app/index.html', 'app/hassio-app.html', 'app/index.html', 'app/hassio-app.html', 'app/some-chunk.js', 'app/app.js', ]) def test_forward_request_no_auth_for_panel( hassio_client, build_type, aioclient_mock): """Test no auth needed for .""" aioclient_mock.get( "http://127.0.0.1/{}".format(build_type), text="response") resp = yield from hassio_client.get('/api/hassio/{}'.format(build_type)) # Check we got right response assert resp.status == 200 body = yield from resp.text() assert body == 'response' # Check we forwarded command assert len(aioclient_mock.mock_calls) == 1 @asyncio.coroutine def test_forward_request_no_auth_for_logo(hassio_client, aioclient_mock): """Test no auth needed for .""" aioclient_mock.get( "http://127.0.0.1/addons/bl_b392/logo", text="response") resp = yield from hassio_client.get('/api/hassio/addons/bl_b392/logo') # Check we got right response assert resp.status == 200 body = yield from resp.text() assert body == 'response' # Check we forwarded command assert len(aioclient_mock.mock_calls) == 1 @asyncio.coroutine def test_forward_log_request(hassio_client, aioclient_mock): """Test fetching normal log path doesn't remove ANSI color escape codes.""" aioclient_mock.get( "http://127.0.0.1/beer/logs", text="\033[32mresponse\033[0m") resp = yield from hassio_client.get('/api/hassio/beer/logs', headers={ HTTP_HEADER_HA_AUTH: API_PASSWORD }) # Check we got right response assert resp.status == 200 body = yield from resp.text() assert body == '\033[32mresponse\033[0m' # Check we forwarded command assert len(aioclient_mock.mock_calls) == 1 @asyncio.coroutine def test_bad_gateway_when_cannot_find_supervisor(hassio_client): """Test we get a bad gateway error if we can't find supervisor.""" with patch('homeassistant.components.hassio.http.async_timeout.timeout', side_effect=asyncio.TimeoutError): resp = yield from hassio_client.get( '/api/hassio/addons/test/info', headers={ HTTP_HEADER_HA_AUTH: API_PASSWORD }) assert resp.status == 502 async def test_forwarding_user_info(hassio_client, hass_admin_user, aioclient_mock): """Test that we forward user info correctly.""" aioclient_mock.get('http://127.0.0.1/hello') resp = await hassio_client.get('/api/hassio/hello') # Check we got right response assert resp.status == 200 assert len(aioclient_mock.mock_calls) == 1 req_headers = aioclient_mock.mock_calls[0][-1] req_headers['X-Hass-User-ID'] == hass_admin_user.id req_headers['X-Hass-Is-Admin'] == '1'