Start preparing for homekit_controller config entries (#21564)

* Start preparing for homekit_controller config entries

* Review feedback

* Review feedback

* Only use the vol.strip validator for pairing_code

* CV not required now

* Changes from review

* Changes after review
This commit is contained in:
Jc2k 2019-03-07 03:44:52 +00:00 committed by Paulus Schoutsen
parent 5616505032
commit dbf129dfdd
8 changed files with 1219 additions and 52 deletions

View file

@ -22,38 +22,47 @@ class FakePairing:
class.
"""
def __init__(self, accessory):
def __init__(self, accessories):
"""Create a fake pairing from an accessory model."""
self.accessory = accessory
self.pairing_data = {
'accessories': self.list_accessories_and_characteristics()
}
self.accessories = accessories
self.pairing_data = {}
def list_accessories_and_characteristics(self):
"""Fake implementation of list_accessories_and_characteristics."""
return [self.accessory.to_accessory_and_service_list()]
accessories = [
a.to_accessory_and_service_list() for a in self.accessories
]
# replicate what happens upstream right now
self.pairing_data['accessories'] = accessories
return accessories
def get_characteristics(self, characteristics):
"""Fake implementation of get_characteristics."""
results = {}
for aid, cid in characteristics:
for service in self.accessory.services:
for char in service.characteristics:
if char.iid != cid:
continue
results[(aid, cid)] = {
'value': char.get_value()
}
for accessory in self.accessories:
if aid != accessory.aid:
continue
for service in accessory.services:
for char in service.characteristics:
if char.iid != cid:
continue
results[(aid, cid)] = {
'value': char.get_value()
}
return results
def put_characteristics(self, characteristics):
"""Fake implementation of put_characteristics."""
for _, cid, new_val in characteristics:
for service in self.accessory.services:
for char in service.characteristics:
if char.iid != cid:
continue
char.set_value(new_val)
for aid, cid, new_val in characteristics:
for accessory in self.accessories:
if aid != accessory.aid:
continue
for service in accessory.services:
for char in service.characteristics:
if char.iid != cid:
continue
char.set_value(new_val)
class FakeController:
@ -68,9 +77,9 @@ class FakeController:
"""Create a Fake controller with no pairings."""
self.pairings = {}
def add(self, accessory):
def add(self, accessories):
"""Create and register a fake pairing for a simulated accessory."""
pairing = FakePairing(accessory)
pairing = FakePairing(accessories)
self.pairings['00:00:00:00:00:00'] = pairing
return pairing
@ -134,6 +143,20 @@ class FakeService(AbstractService):
return char
async def setup_platform(hass):
"""Load the platform but with a fake Controller API."""
config = {
'discovery': {
}
}
with mock.patch('homekit.Controller') as controller:
fake_controller = controller.return_value = FakeController()
await async_setup_component(hass, DOMAIN, config)
return fake_controller
async def setup_test_component(hass, services, capitalize=False, suffix=None):
"""Load a fake homekit accessory based on a homekit accessory model.
@ -150,18 +173,11 @@ async def setup_test_component(hass, services, capitalize=False, suffix=None):
assert domain, 'Cannot map test homekit services to homeassistant domain'
config = {
'discovery': {
}
}
with mock.patch('homekit.Controller') as controller:
fake_controller = controller.return_value = FakeController()
await async_setup_component(hass, DOMAIN, config)
fake_controller = await setup_platform(hass)
accessory = Accessory('TestDevice', 'example.com', 'Test', '0001', '0.1')
accessory.services.extend(services)
pairing = fake_controller.add(accessory)
pairing = fake_controller.add([accessory])
discovery_info = {
'host': '127.0.0.1',