mirror of
https://github.com/home-assistant/core.git
synced 2025-12-24 21:06:19 +00:00
[Image_Processing][Breaking Change] Cleanup Base face class add support for microsoft face detect (#5802)
* [Image_Processing] Cleanup Base face class add support for microsoft face detect * fix lint * add unittest for micosoft detect * fix test
This commit is contained in:
committed by
Paulus Schoutsen
parent
3f82ef64a1
commit
881d53339b
@@ -110,7 +110,7 @@ class TestImageProcessing(object):
|
||||
|
||||
|
||||
class TestImageProcessingAlpr(object):
|
||||
"""Test class for image processing."""
|
||||
"""Test class for alpr image processing."""
|
||||
|
||||
def setup_method(self):
|
||||
"""Setup things to be run when tests are started."""
|
||||
@@ -142,7 +142,7 @@ class TestImageProcessingAlpr(object):
|
||||
"""Mock event."""
|
||||
self.alpr_events.append(event)
|
||||
|
||||
self.hass.bus.listen('found_plate', mock_alpr_event)
|
||||
self.hass.bus.listen('image_processing.found_plate', mock_alpr_event)
|
||||
|
||||
def teardown_method(self):
|
||||
"""Stop everything that was started."""
|
||||
@@ -211,8 +211,8 @@ class TestImageProcessingAlpr(object):
|
||||
assert event_data[0]['entity_id'] == 'image_processing.demo_alpr'
|
||||
|
||||
|
||||
class TestImageProcessingFaceIdentify(object):
|
||||
"""Test class for image processing."""
|
||||
class TestImageProcessingFace(object):
|
||||
"""Test class for face image processing."""
|
||||
|
||||
def setup_method(self):
|
||||
"""Setup things to be run when tests are started."""
|
||||
@@ -228,7 +228,7 @@ class TestImageProcessingFaceIdentify(object):
|
||||
}
|
||||
|
||||
with patch('homeassistant.components.image_processing.demo.'
|
||||
'DemoImageProcessingFaceIdentify.should_poll',
|
||||
'DemoImageProcessingFace.should_poll',
|
||||
new_callable=PropertyMock(return_value=False)):
|
||||
setup_component(self.hass, ip.DOMAIN, config)
|
||||
|
||||
@@ -244,7 +244,7 @@ class TestImageProcessingFaceIdentify(object):
|
||||
"""Mock event."""
|
||||
self.face_events.append(event)
|
||||
|
||||
self.hass.bus.listen('identify_face', mock_face_event)
|
||||
self.hass.bus.listen('image_processing.detect_face', mock_face_event)
|
||||
|
||||
def teardown_method(self):
|
||||
"""Stop everything that was started."""
|
||||
@@ -254,10 +254,10 @@ class TestImageProcessingFaceIdentify(object):
|
||||
"""Setup and scan a picture and test faces from event."""
|
||||
aioclient_mock.get(self.url, content=b'image')
|
||||
|
||||
ip.scan(self.hass, entity_id='image_processing.demo_face_identify')
|
||||
ip.scan(self.hass, entity_id='image_processing.demo_face')
|
||||
self.hass.block_till_done()
|
||||
|
||||
state = self.hass.states.get('image_processing.demo_face_identify')
|
||||
state = self.hass.states.get('image_processing.demo_face')
|
||||
|
||||
assert len(self.face_events) == 2
|
||||
assert state.state == 'Hans'
|
||||
@@ -268,5 +268,31 @@ class TestImageProcessingFaceIdentify(object):
|
||||
assert len(event_data) == 1
|
||||
assert event_data[0]['name'] == 'Hans'
|
||||
assert event_data[0]['confidence'] == 98.34
|
||||
assert event_data[0]['gender'] == 'male'
|
||||
assert event_data[0]['entity_id'] == \
|
||||
'image_processing.demo_face_identify'
|
||||
'image_processing.demo_face'
|
||||
|
||||
@patch('homeassistant.components.image_processing.demo.'
|
||||
'DemoImageProcessingFace.confidence',
|
||||
new_callable=PropertyMock(return_value=None))
|
||||
def test_face_event_call_no_confidence(self, mock_confi, aioclient_mock):
|
||||
"""Setup and scan a picture and test faces from event."""
|
||||
aioclient_mock.get(self.url, content=b'image')
|
||||
|
||||
ip.scan(self.hass, entity_id='image_processing.demo_face')
|
||||
self.hass.block_till_done()
|
||||
|
||||
state = self.hass.states.get('image_processing.demo_face')
|
||||
|
||||
assert len(self.face_events) == 3
|
||||
assert state.state == '4'
|
||||
assert state.attributes['total_faces'] == 4
|
||||
|
||||
event_data = [event.data for event in self.face_events if
|
||||
event.data.get('name') == 'Hans']
|
||||
assert len(event_data) == 1
|
||||
assert event_data[0]['name'] == 'Hans'
|
||||
assert event_data[0]['confidence'] == 98.34
|
||||
assert event_data[0]['gender'] == 'male'
|
||||
assert event_data[0]['entity_id'] == \
|
||||
'image_processing.demo_face'
|
||||
|
||||
159
tests/components/image_processing/test_microsoft_face_detect.py
Normal file
159
tests/components/image_processing/test_microsoft_face_detect.py
Normal file
@@ -0,0 +1,159 @@
|
||||
"""The tests for the microsoft face detect platform."""
|
||||
from unittest.mock import patch, PropertyMock
|
||||
|
||||
from homeassistant.core import callback
|
||||
from homeassistant.const import ATTR_ENTITY_PICTURE
|
||||
from homeassistant.bootstrap import setup_component
|
||||
import homeassistant.components.image_processing as ip
|
||||
import homeassistant.components.microsoft_face as mf
|
||||
|
||||
from tests.common import (
|
||||
get_test_home_assistant, assert_setup_component, load_fixture, mock_coro)
|
||||
|
||||
|
||||
class TestMicrosoftFaceDetectSetup(object):
|
||||
"""Test class for image processing."""
|
||||
|
||||
def setup_method(self):
|
||||
"""Setup things to be run when tests are started."""
|
||||
self.hass = get_test_home_assistant()
|
||||
|
||||
def teardown_method(self):
|
||||
"""Stop everything that was started."""
|
||||
self.hass.stop()
|
||||
|
||||
@patch('homeassistant.components.microsoft_face.'
|
||||
'MicrosoftFace.update_store', return_value=mock_coro()())
|
||||
def test_setup_platform(self, store_mock):
|
||||
"""Setup platform with one entity."""
|
||||
config = {
|
||||
ip.DOMAIN: {
|
||||
'platform': 'microsoft_face_detect',
|
||||
'source': {
|
||||
'entity_id': 'camera.demo_camera'
|
||||
},
|
||||
'attributes': ['age', 'gender'],
|
||||
},
|
||||
'camera': {
|
||||
'platform': 'demo'
|
||||
},
|
||||
mf.DOMAIN: {
|
||||
'api_key': '12345678abcdef6',
|
||||
}
|
||||
}
|
||||
|
||||
with assert_setup_component(1, ip.DOMAIN):
|
||||
setup_component(self.hass, ip.DOMAIN, config)
|
||||
|
||||
assert self.hass.states.get(
|
||||
'image_processing.microsoftface_demo_camera')
|
||||
|
||||
@patch('homeassistant.components.microsoft_face.'
|
||||
'MicrosoftFace.update_store', return_value=mock_coro()())
|
||||
def test_setup_platform_name(self, store_mock):
|
||||
"""Setup platform with one entity and set name."""
|
||||
config = {
|
||||
ip.DOMAIN: {
|
||||
'platform': 'microsoft_face_detect',
|
||||
'source': {
|
||||
'entity_id': 'camera.demo_camera',
|
||||
'name': 'test local'
|
||||
},
|
||||
},
|
||||
'camera': {
|
||||
'platform': 'demo'
|
||||
},
|
||||
mf.DOMAIN: {
|
||||
'api_key': '12345678abcdef6',
|
||||
}
|
||||
}
|
||||
|
||||
with assert_setup_component(1, ip.DOMAIN):
|
||||
setup_component(self.hass, ip.DOMAIN, config)
|
||||
|
||||
assert self.hass.states.get('image_processing.test_local')
|
||||
|
||||
|
||||
class TestMicrosoftFaceDetect(object):
|
||||
"""Test class for image processing."""
|
||||
|
||||
def setup_method(self):
|
||||
"""Setup things to be run when tests are started."""
|
||||
self.hass = get_test_home_assistant()
|
||||
|
||||
self.config = {
|
||||
ip.DOMAIN: {
|
||||
'platform': 'microsoft_face_detect',
|
||||
'source': {
|
||||
'entity_id': 'camera.demo_camera',
|
||||
'name': 'test local'
|
||||
},
|
||||
'attributes': ['age', 'gender'],
|
||||
},
|
||||
'camera': {
|
||||
'platform': 'demo'
|
||||
},
|
||||
mf.DOMAIN: {
|
||||
'api_key': '12345678abcdef6',
|
||||
}
|
||||
}
|
||||
|
||||
def teardown_method(self):
|
||||
"""Stop everything that was started."""
|
||||
self.hass.stop()
|
||||
|
||||
@patch('homeassistant.components.image_processing.microsoft_face_detect.'
|
||||
'MicrosoftFaceDetectEntity.should_poll',
|
||||
new_callable=PropertyMock(return_value=False))
|
||||
def test_ms_detect_process_image(self, poll_mock, aioclient_mock):
|
||||
"""Setup and scan a picture and test plates from event."""
|
||||
aioclient_mock.get(
|
||||
mf.FACE_API_URL.format("persongroups"),
|
||||
text=load_fixture('microsoft_face_persongroups.json')
|
||||
)
|
||||
aioclient_mock.get(
|
||||
mf.FACE_API_URL.format("persongroups/test_group1/persons"),
|
||||
text=load_fixture('microsoft_face_persons.json')
|
||||
)
|
||||
aioclient_mock.get(
|
||||
mf.FACE_API_URL.format("persongroups/test_group2/persons"),
|
||||
text=load_fixture('microsoft_face_persons.json')
|
||||
)
|
||||
|
||||
setup_component(self.hass, ip.DOMAIN, self.config)
|
||||
|
||||
state = self.hass.states.get('camera.demo_camera')
|
||||
url = "{0}{1}".format(
|
||||
self.hass.config.api.base_url,
|
||||
state.attributes.get(ATTR_ENTITY_PICTURE))
|
||||
|
||||
face_events = []
|
||||
|
||||
@callback
|
||||
def mock_face_event(event):
|
||||
"""Mock event."""
|
||||
face_events.append(event)
|
||||
|
||||
self.hass.bus.listen('image_processing.detect_face', mock_face_event)
|
||||
|
||||
aioclient_mock.get(url, content=b'image')
|
||||
|
||||
aioclient_mock.post(
|
||||
mf.FACE_API_URL.format("detect"),
|
||||
text=load_fixture('microsoft_face_detect.json'),
|
||||
params={'returnFaceAttributes': "age,gender"}
|
||||
)
|
||||
|
||||
ip.scan(self.hass, entity_id='image_processing.test_local')
|
||||
self.hass.block_till_done()
|
||||
|
||||
state = self.hass.states.get('image_processing.test_local')
|
||||
|
||||
assert len(face_events) == 1
|
||||
assert state.attributes.get('total_faces') == 1
|
||||
assert state.state == '1'
|
||||
|
||||
assert face_events[0].data['age'] == 71.0
|
||||
assert face_events[0].data['gender'] == 'male'
|
||||
assert face_events[0].data['entity_id'] == \
|
||||
'image_processing.test_local'
|
||||
@@ -106,7 +106,7 @@ class TestMicrosoftFaceIdentify(object):
|
||||
@patch('homeassistant.components.image_processing.microsoft_face_identify.'
|
||||
'MicrosoftFaceIdentifyEntity.should_poll',
|
||||
new_callable=PropertyMock(return_value=False))
|
||||
def test_openalpr_process_image(self, poll_mock, aioclient_mock):
|
||||
def test_ms_identify_process_image(self, poll_mock, aioclient_mock):
|
||||
"""Setup and scan a picture and test plates from event."""
|
||||
aioclient_mock.get(
|
||||
mf.FACE_API_URL.format("persongroups"),
|
||||
@@ -135,7 +135,7 @@ class TestMicrosoftFaceIdentify(object):
|
||||
"""Mock event."""
|
||||
face_events.append(event)
|
||||
|
||||
self.hass.bus.listen('identify_face', mock_face_event)
|
||||
self.hass.bus.listen('image_processing.detect_face', mock_face_event)
|
||||
|
||||
aioclient_mock.get(url, content=b'image')
|
||||
|
||||
|
||||
@@ -143,7 +143,7 @@ class TestOpenAlprCloud(object):
|
||||
"""Mock event."""
|
||||
self.alpr_events.append(event)
|
||||
|
||||
self.hass.bus.listen('found_plate', mock_alpr_event)
|
||||
self.hass.bus.listen('image_processing.found_plate', mock_alpr_event)
|
||||
|
||||
self.params = {
|
||||
'secret_key': "sk_abcxyz123456",
|
||||
|
||||
@@ -134,7 +134,7 @@ class TestOpenAlprLocal(object):
|
||||
"""Mock event."""
|
||||
self.alpr_events.append(event)
|
||||
|
||||
self.hass.bus.listen('found_plate', mock_alpr_event)
|
||||
self.hass.bus.listen('image_processing.found_plate', mock_alpr_event)
|
||||
|
||||
def teardown_method(self):
|
||||
"""Stop everything that was started."""
|
||||
|
||||
Reference in New Issue
Block a user