core/tests/components/http/test_init.py

256 lines
8.2 KiB
Python
Raw Normal View History

"""The tests for the Home Assistant HTTP component."""
import logging
import unittest
from unittest.mock import patch
import homeassistant.components.http as http
from homeassistant.setup import async_setup_component
from homeassistant.util.ssl import server_context_intermediate, server_context_modern
class TestView(http.HomeAssistantView):
2016-12-28 18:04:59 +00:00
"""Test the HTTP views."""
2019-07-31 19:25:30 +00:00
name = "test"
url = "/hello"
async def get(self, request):
"""Return a get request."""
2019-07-31 19:25:30 +00:00
return "hello"
2019-07-31 19:25:30 +00:00
async def test_registering_view_while_running(
hass, aiohttp_client, aiohttp_unused_port
):
"""Test that we can register a view while the server is running."""
await async_setup_component(
2019-07-31 19:25:30 +00:00
hass, http.DOMAIN, {http.DOMAIN: {http.CONF_SERVER_PORT: aiohttp_unused_port()}}
)
await hass.async_start()
# This raises a RuntimeError if app is frozen
hass.http.register_view(TestView)
2016-12-18 20:56:07 +00:00
class TestApiConfig(unittest.TestCase):
"""Test API configuration methods."""
def test_api_base_url_with_domain(hass):
"""Test setting API URL with domain."""
2019-07-31 19:25:30 +00:00
api_config = http.ApiConfig("example.com")
assert api_config.base_url == "http://example.com:8123"
def test_api_base_url_with_ip(hass):
"""Test setting API URL with IP."""
2019-07-31 19:25:30 +00:00
api_config = http.ApiConfig("1.1.1.1")
assert api_config.base_url == "http://1.1.1.1:8123"
def test_api_base_url_with_ip_and_port(hass):
"""Test setting API URL with IP and port."""
2019-07-31 19:25:30 +00:00
api_config = http.ApiConfig("1.1.1.1", 8124)
assert api_config.base_url == "http://1.1.1.1:8124"
def test_api_base_url_with_protocol(hass):
"""Test setting API URL with protocol."""
2019-07-31 19:25:30 +00:00
api_config = http.ApiConfig("https://example.com")
assert api_config.base_url == "https://example.com:8123"
def test_api_base_url_with_protocol_and_port(hass):
"""Test setting API URL with protocol and port."""
2019-07-31 19:25:30 +00:00
api_config = http.ApiConfig("https://example.com", 433)
assert api_config.base_url == "https://example.com:433"
def test_api_base_url_with_ssl_enable(hass):
"""Test setting API URL with use_ssl enabled."""
2019-07-31 19:25:30 +00:00
api_config = http.ApiConfig("example.com", use_ssl=True)
assert api_config.base_url == "https://example.com:8123"
def test_api_base_url_with_ssl_enable_and_port(hass):
"""Test setting API URL with use_ssl enabled and port."""
2019-07-31 19:25:30 +00:00
api_config = http.ApiConfig("1.1.1.1", use_ssl=True, port=8888)
assert api_config.base_url == "https://1.1.1.1:8888"
def test_api_base_url_with_protocol_and_ssl_enable(hass):
"""Test setting API URL with specific protocol and use_ssl enabled."""
2019-07-31 19:25:30 +00:00
api_config = http.ApiConfig("http://example.com", use_ssl=True)
assert api_config.base_url == "http://example.com:8123"
def test_api_base_url_removes_trailing_slash(hass):
"""Test a trialing slash is removed when setting the API URL."""
2019-07-31 19:25:30 +00:00
api_config = http.ApiConfig("http://example.com/")
assert api_config.base_url == "http://example.com:8123"
async def test_api_base_url_with_domain(hass):
"""Test setting API URL."""
2019-07-31 19:25:30 +00:00
result = await async_setup_component(
hass, "http", {"http": {"base_url": "example.com"}}
)
assert result
2019-07-31 19:25:30 +00:00
assert hass.config.api.base_url == "http://example.com"
2016-12-18 20:56:07 +00:00
async def test_api_base_url_with_ip(hass):
"""Test setting api url."""
2019-07-31 19:25:30 +00:00
result = await async_setup_component(
hass, "http", {"http": {"server_host": "1.1.1.1"}}
)
assert result
2019-07-31 19:25:30 +00:00
assert hass.config.api.base_url == "http://1.1.1.1:8123"
2016-12-18 20:56:07 +00:00
async def test_api_base_url_with_ip_port(hass):
"""Test setting api url."""
2019-07-31 19:25:30 +00:00
result = await async_setup_component(
hass, "http", {"http": {"base_url": "1.1.1.1:8124"}}
)
assert result
2019-07-31 19:25:30 +00:00
assert hass.config.api.base_url == "http://1.1.1.1:8124"
2016-12-18 20:56:07 +00:00
async def test_api_no_base_url(hass):
"""Test setting api url."""
2019-07-31 19:25:30 +00:00
result = await async_setup_component(hass, "http", {"http": {}})
assert result
2019-07-31 19:25:30 +00:00
assert hass.config.api.base_url == "http://127.0.0.1:8123"
async def test_api_base_url_removes_trailing_slash(hass):
"""Test setting api url."""
2019-07-31 19:25:30 +00:00
result = await async_setup_component(
hass, "http", {"http": {"base_url": "https://example.com/"}}
)
assert result
2019-07-31 19:25:30 +00:00
assert hass.config.api.base_url == "https://example.com"
async def test_not_log_password(hass, aiohttp_client, caplog, legacy_auth):
"""Test access with password doesn't get logged."""
2019-07-31 19:25:30 +00:00
assert await async_setup_component(hass, "api", {"http": {}})
client = await aiohttp_client(hass.http.app)
2019-07-31 19:25:30 +00:00
logging.getLogger("aiohttp.access").setLevel(logging.INFO)
2019-07-31 19:25:30 +00:00
resp = await client.get("/api/", params={"api_password": "test-password"})
assert resp.status == 401
logs = caplog.text
# Ensure we don't log API passwords
2019-07-31 19:25:30 +00:00
assert "/api/" in logs
assert "some-pass" not in logs
async def test_proxy_config(hass):
"""Test use_x_forwarded_for must config together with trusted_proxies."""
2019-07-31 19:25:30 +00:00
assert (
await async_setup_component(
hass,
"http",
{
"http": {
http.CONF_USE_X_FORWARDED_FOR: True,
http.CONF_TRUSTED_PROXIES: ["127.0.0.1"],
}
},
)
is True
)
async def test_proxy_config_only_use_xff(hass):
"""Test use_x_forwarded_for must config together with trusted_proxies."""
2019-07-31 19:25:30 +00:00
assert (
await async_setup_component(
hass, "http", {"http": {http.CONF_USE_X_FORWARDED_FOR: True}}
)
is not True
)
async def test_proxy_config_only_trust_proxies(hass):
"""Test use_x_forwarded_for must config together with trusted_proxies."""
2019-07-31 19:25:30 +00:00
assert (
await async_setup_component(
hass, "http", {"http": {http.CONF_TRUSTED_PROXIES: ["127.0.0.1"]}}
)
is not True
)
async def test_ssl_profile_defaults_modern(hass):
"""Test default ssl profile."""
2019-07-31 19:25:30 +00:00
assert await async_setup_component(hass, "http", {}) is True
2019-07-31 19:25:30 +00:00
hass.http.ssl_certificate = "bla"
2019-07-31 19:25:30 +00:00
with patch("ssl.SSLContext.load_cert_chain"), patch(
"homeassistant.util.ssl.server_context_modern",
side_effect=server_context_modern,
) as mock_context:
await hass.async_start()
await hass.async_block_till_done()
assert len(mock_context.mock_calls) == 1
async def test_ssl_profile_change_intermediate(hass):
"""Test setting ssl profile to intermediate."""
2019-07-31 19:25:30 +00:00
assert (
await async_setup_component(
hass, "http", {"http": {"ssl_profile": "intermediate"}}
)
is True
)
2019-07-31 19:25:30 +00:00
hass.http.ssl_certificate = "bla"
2019-07-31 19:25:30 +00:00
with patch("ssl.SSLContext.load_cert_chain"), patch(
"homeassistant.util.ssl.server_context_intermediate",
side_effect=server_context_intermediate,
) as mock_context:
await hass.async_start()
await hass.async_block_till_done()
assert len(mock_context.mock_calls) == 1
async def test_ssl_profile_change_modern(hass):
"""Test setting ssl profile to modern."""
2019-07-31 19:25:30 +00:00
assert (
await async_setup_component(hass, "http", {"http": {"ssl_profile": "modern"}})
is True
)
2019-07-31 19:25:30 +00:00
hass.http.ssl_certificate = "bla"
2019-07-31 19:25:30 +00:00
with patch("ssl.SSLContext.load_cert_chain"), patch(
"homeassistant.util.ssl.server_context_modern",
side_effect=server_context_modern,
) as mock_context:
await hass.async_start()
await hass.async_block_till_done()
assert len(mock_context.mock_calls) == 1
async def test_cors_defaults(hass):
"""Test the CORS default settings."""
with patch("homeassistant.components.http.setup_cors") as mock_setup:
assert await async_setup_component(hass, "http", {})
assert len(mock_setup.mock_calls) == 1
assert mock_setup.mock_calls[0][1][1] == ["https://cast.home-assistant.io"]
async def test_storing_config(hass, aiohttp_client, aiohttp_unused_port):
"""Test that we store last working config."""
config = {http.CONF_SERVER_PORT: aiohttp_unused_port()}
await async_setup_component(hass, http.DOMAIN, {http.DOMAIN: config})
await hass.async_start()
assert await hass.components.http.async_get_last_config() == http.HTTP_SCHEMA(
config
)