"""The tests for the hassio component.""" from aiohttp.hdrs import X_FORWARDED_FOR, X_FORWARDED_HOST, X_FORWARDED_PROTO from aiohttp.client_exceptions import WSServerHandshakeError import pytest @pytest.mark.parametrize( 'build_type', [ ("a3_vl", "test/beer/ping?index=1"), ("core", "index.html"), ("local", "panel/config"), ("jk_921", "editor.php?idx=3&ping=5") ]) async def test_ingress_request_get( hassio_client, build_type, aioclient_mock): """Test no auth needed for .""" aioclient_mock.get("http://127.0.0.1/addons/{}/web/{}".format( build_type[0], build_type[1]), text="test") resp = await hassio_client.get( '/api/hassio_ingress/{}/{}'.format(build_type[0], build_type[1]), headers={"X-Test-Header": "beer"} ) # Check we got right response assert resp.status == 200 body = await resp.text() assert body == "test" # Check we forwarded command assert len(aioclient_mock.mock_calls) == 1 assert aioclient_mock.mock_calls[-1][3]["X-Hassio-Key"] == "123456" assert aioclient_mock.mock_calls[-1][3]["X-Ingress-Path"] == \ "/api/hassio_ingress/{}".format(build_type[0]) assert aioclient_mock.mock_calls[-1][3]["X-Test-Header"] == "beer" assert aioclient_mock.mock_calls[-1][3][X_FORWARDED_FOR] assert aioclient_mock.mock_calls[-1][3][X_FORWARDED_HOST] assert aioclient_mock.mock_calls[-1][3][X_FORWARDED_PROTO] @pytest.mark.parametrize( 'build_type', [ ("a3_vl", "test/beer/ping?index=1"), ("core", "index.html"), ("local", "panel/config"), ("jk_921", "editor.php?idx=3&ping=5") ]) async def test_ingress_request_post( hassio_client, build_type, aioclient_mock): """Test no auth needed for .""" aioclient_mock.post("http://127.0.0.1/addons/{}/web/{}".format( build_type[0], build_type[1]), text="test") resp = await hassio_client.post( '/api/hassio_ingress/{}/{}'.format(build_type[0], build_type[1]), headers={"X-Test-Header": "beer"} ) # Check we got right response assert resp.status == 200 body = await resp.text() assert body == "test" # Check we forwarded command assert len(aioclient_mock.mock_calls) == 1 assert aioclient_mock.mock_calls[-1][3]["X-Hassio-Key"] == "123456" assert aioclient_mock.mock_calls[-1][3]["X-Ingress-Path"] == \ "/api/hassio_ingress/{}".format(build_type[0]) assert aioclient_mock.mock_calls[-1][3]["X-Test-Header"] == "beer" assert aioclient_mock.mock_calls[-1][3][X_FORWARDED_FOR] assert aioclient_mock.mock_calls[-1][3][X_FORWARDED_HOST] assert aioclient_mock.mock_calls[-1][3][X_FORWARDED_PROTO] @pytest.mark.parametrize( 'build_type', [ ("a3_vl", "test/beer/ping?index=1"), ("core", "index.html"), ("local", "panel/config"), ("jk_921", "editor.php?idx=3&ping=5") ]) async def test_ingress_request_put( hassio_client, build_type, aioclient_mock): """Test no auth needed for .""" aioclient_mock.put("http://127.0.0.1/addons/{}/web/{}".format( build_type[0], build_type[1]), text="test") resp = await hassio_client.put( '/api/hassio_ingress/{}/{}'.format(build_type[0], build_type[1]), headers={"X-Test-Header": "beer"} ) # Check we got right response assert resp.status == 200 body = await resp.text() assert body == "test" # Check we forwarded command assert len(aioclient_mock.mock_calls) == 1 assert aioclient_mock.mock_calls[-1][3]["X-Hassio-Key"] == "123456" assert aioclient_mock.mock_calls[-1][3]["X-Ingress-Path"] == \ "/api/hassio_ingress/{}".format(build_type[0]) assert aioclient_mock.mock_calls[-1][3]["X-Test-Header"] == "beer" assert aioclient_mock.mock_calls[-1][3][X_FORWARDED_FOR] assert aioclient_mock.mock_calls[-1][3][X_FORWARDED_HOST] assert aioclient_mock.mock_calls[-1][3][X_FORWARDED_PROTO] @pytest.mark.parametrize( 'build_type', [ ("a3_vl", "test/beer/ping?index=1"), ("core", "index.html"), ("local", "panel/config"), ("jk_921", "editor.php?idx=3&ping=5") ]) async def test_ingress_request_delete( hassio_client, build_type, aioclient_mock): """Test no auth needed for .""" aioclient_mock.delete("http://127.0.0.1/addons/{}/web/{}".format( build_type[0], build_type[1]), text="test") resp = await hassio_client.delete( '/api/hassio_ingress/{}/{}'.format(build_type[0], build_type[1]), headers={"X-Test-Header": "beer"} ) # Check we got right response assert resp.status == 200 body = await resp.text() assert body == "test" # Check we forwarded command assert len(aioclient_mock.mock_calls) == 1 assert aioclient_mock.mock_calls[-1][3]["X-Hassio-Key"] == "123456" assert aioclient_mock.mock_calls[-1][3]["X-Ingress-Path"] == \ "/api/hassio_ingress/{}".format(build_type[0]) assert aioclient_mock.mock_calls[-1][3]["X-Test-Header"] == "beer" assert aioclient_mock.mock_calls[-1][3][X_FORWARDED_FOR] assert aioclient_mock.mock_calls[-1][3][X_FORWARDED_HOST] assert aioclient_mock.mock_calls[-1][3][X_FORWARDED_PROTO] @pytest.mark.parametrize( 'build_type', [ ("a3_vl", "test/beer/ws"), ("core", "ws.php"), ("local", "panel/config/stream"), ("jk_921", "hulk"), ("demo", "ws/connection?id=9&token=SJAKWS283") ]) async def test_ingress_websocket( hassio_client, build_type, aioclient_mock): """Test no auth needed for .""" aioclient_mock.get("http://127.0.0.1/addons/{}/web/{}".format( build_type[0], build_type[1])) # Ignore error because we can setup a full IO infrastructure with pytest.raises(WSServerHandshakeError): await hassio_client.ws_connect( '/api/hassio_ingress/{}/{}'.format(build_type[0], build_type[1]), headers={"X-Test-Header": "beer"} ) # Check we forwarded command assert len(aioclient_mock.mock_calls) == 1 assert aioclient_mock.mock_calls[-1][3]["X-Hassio-Key"] == "123456" assert aioclient_mock.mock_calls[-1][3]["X-Ingress-Path"] == \ "/api/hassio_ingress/{}".format(build_type[0]) assert aioclient_mock.mock_calls[-1][3]["X-Test-Header"] == "beer" assert aioclient_mock.mock_calls[-1][3][X_FORWARDED_FOR] assert aioclient_mock.mock_calls[-1][3][X_FORWARDED_HOST] assert aioclient_mock.mock_calls[-1][3][X_FORWARDED_PROTO]