2017-07-01 00:06:56 -04:00
|
|
|
"""The tests for local file camera component."""
|
2018-08-16 14:28:59 +02:00
|
|
|
from unittest.mock import mock_open, patch
|
2018-07-24 10:13:26 -07:00
|
|
|
|
|
|
|
import pytest
|
|
|
|
|
2020-04-11 21:10:15 +02:00
|
|
|
from homeassistant.components.camera import (
|
|
|
|
DOMAIN as CAMERA_DOMAIN,
|
|
|
|
SERVICE_ENABLE_MOTION,
|
|
|
|
SERVICE_TURN_OFF,
|
|
|
|
SERVICE_TURN_ON,
|
|
|
|
STATE_IDLE,
|
|
|
|
STATE_STREAMING,
|
|
|
|
async_get_image,
|
|
|
|
)
|
|
|
|
from homeassistant.components.demo import DOMAIN
|
|
|
|
from homeassistant.const import ATTR_ENTITY_ID
|
2018-07-24 10:13:26 -07:00
|
|
|
from homeassistant.exceptions import HomeAssistantError
|
2017-07-01 00:06:56 -04:00
|
|
|
from homeassistant.setup import async_setup_component
|
|
|
|
|
2020-04-11 21:10:15 +02:00
|
|
|
ENTITY_CAMERA = "camera.demo_camera"
|
2018-09-26 09:49:55 +02:00
|
|
|
|
2017-07-01 00:06:56 -04:00
|
|
|
|
2020-04-11 21:10:15 +02:00
|
|
|
@pytest.fixture(autouse=True)
|
2018-07-24 10:13:26 -07:00
|
|
|
def demo_camera(hass):
|
|
|
|
"""Initialize a demo camera platform."""
|
2019-07-31 12:25:30 -07:00
|
|
|
hass.loop.run_until_complete(
|
2020-04-11 21:10:15 +02:00
|
|
|
async_setup_component(
|
|
|
|
hass, CAMERA_DOMAIN, {CAMERA_DOMAIN: {"platform": DOMAIN}}
|
|
|
|
)
|
2019-07-31 12:25:30 -07:00
|
|
|
)
|
2018-07-24 10:13:26 -07:00
|
|
|
|
|
|
|
|
2020-04-11 21:10:15 +02:00
|
|
|
async def test_init_state_is_streaming(hass):
|
2018-07-24 10:13:26 -07:00
|
|
|
"""Demo camera initialize as streaming."""
|
2020-04-11 21:10:15 +02:00
|
|
|
state = hass.states.get(ENTITY_CAMERA)
|
|
|
|
assert state.state == STATE_STREAMING
|
2018-07-24 10:13:26 -07:00
|
|
|
|
2019-07-31 12:25:30 -07:00
|
|
|
mock_on_img = mock_open(read_data=b"ON")
|
|
|
|
with patch("homeassistant.components.demo.camera.open", mock_on_img, create=True):
|
2020-04-11 21:10:15 +02:00
|
|
|
image = await async_get_image(hass, ENTITY_CAMERA)
|
2018-07-24 10:13:26 -07:00
|
|
|
assert mock_on_img.called
|
2019-07-31 12:25:30 -07:00
|
|
|
assert mock_on_img.call_args_list[0][0][0][-6:] in [
|
|
|
|
"_0.jpg",
|
|
|
|
"_1.jpg",
|
|
|
|
"_2.jpg",
|
|
|
|
"_3.jpg",
|
|
|
|
]
|
|
|
|
assert image.content == b"ON"
|
2018-07-24 10:13:26 -07:00
|
|
|
|
|
|
|
|
2020-04-11 21:10:15 +02:00
|
|
|
async def test_turn_on_state_back_to_streaming(hass):
|
2018-07-24 10:13:26 -07:00
|
|
|
"""After turn on state back to streaming."""
|
2020-04-11 21:10:15 +02:00
|
|
|
state = hass.states.get(ENTITY_CAMERA)
|
|
|
|
assert state.state == STATE_STREAMING
|
2018-07-24 10:13:26 -07:00
|
|
|
|
2020-04-11 21:10:15 +02:00
|
|
|
await hass.services.async_call(
|
|
|
|
CAMERA_DOMAIN, SERVICE_TURN_OFF, {ATTR_ENTITY_ID: ENTITY_CAMERA}, blocking=True
|
|
|
|
)
|
|
|
|
|
|
|
|
state = hass.states.get(ENTITY_CAMERA)
|
|
|
|
assert state.state == STATE_IDLE
|
2018-07-24 10:13:26 -07:00
|
|
|
|
2020-04-11 21:10:15 +02:00
|
|
|
await hass.services.async_call(
|
|
|
|
CAMERA_DOMAIN, SERVICE_TURN_ON, {ATTR_ENTITY_ID: ENTITY_CAMERA}, blocking=True
|
|
|
|
)
|
2018-07-24 10:13:26 -07:00
|
|
|
|
2020-04-11 21:10:15 +02:00
|
|
|
state = hass.states.get(ENTITY_CAMERA)
|
|
|
|
assert state.state == STATE_STREAMING
|
2018-07-24 10:13:26 -07:00
|
|
|
|
|
|
|
|
2020-04-11 21:10:15 +02:00
|
|
|
async def test_turn_off_image(hass):
|
2018-07-24 10:13:26 -07:00
|
|
|
"""After turn off, Demo camera raise error."""
|
2020-04-11 21:10:15 +02:00
|
|
|
await hass.services.async_call(
|
|
|
|
CAMERA_DOMAIN, SERVICE_TURN_OFF, {ATTR_ENTITY_ID: ENTITY_CAMERA}, blocking=True
|
|
|
|
)
|
2018-07-24 10:13:26 -07:00
|
|
|
|
|
|
|
with pytest.raises(HomeAssistantError) as error:
|
2020-04-11 21:10:15 +02:00
|
|
|
await async_get_image(hass, ENTITY_CAMERA)
|
2019-07-31 12:25:30 -07:00
|
|
|
assert error.args[0] == "Camera is off"
|
2018-07-24 10:13:26 -07:00
|
|
|
|
|
|
|
|
2020-04-11 21:10:15 +02:00
|
|
|
async def test_turn_off_invalid_camera(hass):
|
2018-07-24 10:13:26 -07:00
|
|
|
"""Turn off non-exist camera should quietly fail."""
|
2020-04-11 21:10:15 +02:00
|
|
|
state = hass.states.get(ENTITY_CAMERA)
|
|
|
|
assert state.state == STATE_STREAMING
|
|
|
|
|
|
|
|
await hass.services.async_call(
|
|
|
|
CAMERA_DOMAIN,
|
|
|
|
SERVICE_TURN_OFF,
|
|
|
|
{ATTR_ENTITY_ID: "camera.invalid_camera"},
|
|
|
|
blocking=True,
|
|
|
|
)
|
2018-07-24 10:13:26 -07:00
|
|
|
|
2020-04-11 21:10:15 +02:00
|
|
|
state = hass.states.get(ENTITY_CAMERA)
|
|
|
|
assert state.state == STATE_STREAMING
|
2018-07-24 10:13:26 -07:00
|
|
|
|
|
|
|
|
|
|
|
async def test_motion_detection(hass):
|
2017-07-01 00:06:56 -04:00
|
|
|
"""Test motion detection services."""
|
|
|
|
|
|
|
|
# Fetch state and check motion detection attribute
|
2020-04-11 21:10:15 +02:00
|
|
|
state = hass.states.get(ENTITY_CAMERA)
|
2019-07-31 12:25:30 -07:00
|
|
|
assert not state.attributes.get("motion_detection")
|
2017-07-01 00:06:56 -04:00
|
|
|
|
|
|
|
# Call service to turn on motion detection
|
2020-04-11 21:10:15 +02:00
|
|
|
await hass.services.async_call(
|
|
|
|
CAMERA_DOMAIN,
|
|
|
|
SERVICE_ENABLE_MOTION,
|
|
|
|
{ATTR_ENTITY_ID: ENTITY_CAMERA},
|
|
|
|
blocking=True,
|
|
|
|
)
|
2017-07-01 00:06:56 -04:00
|
|
|
|
|
|
|
# Check if state has been updated.
|
2020-04-11 21:10:15 +02:00
|
|
|
state = hass.states.get(ENTITY_CAMERA)
|
2019-07-31 12:25:30 -07:00
|
|
|
assert state.attributes.get("motion_detection")
|