435 lines
16 KiB
Python
435 lines
16 KiB
Python
|
import responses
|
||
|
from responses import matchers
|
||
|
|
||
|
from unifi_access.schemas import DoorGroupId, DoorId, DoorLockingRuleType
|
||
|
|
||
|
from .base import UnifiAccessTests
|
||
|
|
||
|
|
||
|
class SpaceTests(UnifiAccessTests):
|
||
|
@responses.activate
|
||
|
def test_fetch_door_group_topology(self) -> None:
|
||
|
"""7.1 Fetch Door Group Topology"""
|
||
|
responses.get(
|
||
|
f"https://{self.host}/api/v1/developer/door_groups/topology",
|
||
|
match=[matchers.header_matcher(self.common_headers)],
|
||
|
json={
|
||
|
"code": "SUCCESS",
|
||
|
"data": [
|
||
|
{
|
||
|
"id": "d5573467-d6b3-4e8f-8e48-8a322b91664a",
|
||
|
"name": "All Doors",
|
||
|
"resource_topologies": [
|
||
|
{
|
||
|
"id": "9bee6e0e-108d-4c52-9107-76f2c7dea4f1",
|
||
|
"name": "Main Floor",
|
||
|
"resources": [
|
||
|
{
|
||
|
"id": "6ff875d2-af87-470b-9cb5-774c6596afc8",
|
||
|
"name": "Door 3855",
|
||
|
"type": "door",
|
||
|
"is_bind_hub": True,
|
||
|
}
|
||
|
],
|
||
|
"type": "floor",
|
||
|
}
|
||
|
],
|
||
|
"type": "building",
|
||
|
},
|
||
|
{
|
||
|
"id": "5c496423-6d25-4e4f-8cdf-95ad5135188a",
|
||
|
"name": "customized group",
|
||
|
"resource_topologies": [
|
||
|
{
|
||
|
"id": "9bee6e0e-108d-4c52-9107-76f2c7dea4f1",
|
||
|
"name": "Main Floor",
|
||
|
"resources": [
|
||
|
{
|
||
|
"id": "6ff875d2-af87-470b-9cb5-774c6596afc8",
|
||
|
"name": "Door 3855",
|
||
|
"type": "door",
|
||
|
"is_bind_hub": True,
|
||
|
}
|
||
|
],
|
||
|
"type": "floor",
|
||
|
}
|
||
|
],
|
||
|
"type": "access",
|
||
|
},
|
||
|
],
|
||
|
"msg": "success",
|
||
|
},
|
||
|
)
|
||
|
|
||
|
resp = self.client.fetch_door_group_topology().success_or_raise()
|
||
|
|
||
|
@responses.activate
|
||
|
def test_create_door_group(self) -> None:
|
||
|
"""7.2 Create Door Group"""
|
||
|
responses.post(
|
||
|
f"https://{self.host}/api/v1/developer/door_groups",
|
||
|
match=[
|
||
|
matchers.header_matcher(self.common_headers),
|
||
|
matchers.json_params_matcher(
|
||
|
{
|
||
|
"group_name": "Test",
|
||
|
"resources": ["6ff875d2-af87-470b-9cb5-774c6596afc8"],
|
||
|
}
|
||
|
),
|
||
|
],
|
||
|
json={
|
||
|
"code": "SUCCESS",
|
||
|
"data": {
|
||
|
"id": "0140fa3d-8973-4305-a0ce-5306ae277878",
|
||
|
"name": "Customized Door Group",
|
||
|
"resources": [
|
||
|
{"id": "6ff875d2-af87-470b-9cb5-774c6596afc8", "type": "door"}
|
||
|
],
|
||
|
"type": "access",
|
||
|
},
|
||
|
"msg": "success",
|
||
|
},
|
||
|
)
|
||
|
|
||
|
# XXX: TODO: test if this supports both doors and door groups
|
||
|
resp = self.client.create_door_group(
|
||
|
group_name="Test",
|
||
|
resources=[DoorId("6ff875d2-af87-470b-9cb5-774c6596afc8")],
|
||
|
).success_or_raise()
|
||
|
|
||
|
@responses.activate
|
||
|
def test_fetch_door_group_building(self) -> None:
|
||
|
"""7.3 Fetch Door Group"""
|
||
|
door_group_id = DoorGroupId("d5573467-d6b3-4e8f-8e48-8a322b91664a")
|
||
|
responses.get(
|
||
|
f"https://{self.host}/api/v1/developer/door_groups/{door_group_id}",
|
||
|
match=[matchers.header_matcher(self.common_headers)],
|
||
|
# Group type is building
|
||
|
json={
|
||
|
"code": "SUCCESS",
|
||
|
"data": {
|
||
|
"id": "d5573467-d6b3-4e8f-8e48-8a322b91664a",
|
||
|
"name": "All Doors",
|
||
|
"resources": [
|
||
|
{
|
||
|
"id": "6ff875d2-af87-470b-9cb5-774c6596afc8",
|
||
|
"name": "Door 3855",
|
||
|
"type": "door",
|
||
|
},
|
||
|
{
|
||
|
"id": "7cc1823f-9cdb-447b-b01b-4cb2abc661c0",
|
||
|
"name": "A2 Door",
|
||
|
"type": "door",
|
||
|
},
|
||
|
{
|
||
|
"id": "ececa68e-239f-4b82-adc4-0c9ce70c60ff",
|
||
|
"name": "A3",
|
||
|
"type": "door",
|
||
|
},
|
||
|
],
|
||
|
"type": "building",
|
||
|
},
|
||
|
"msg": "success",
|
||
|
},
|
||
|
)
|
||
|
|
||
|
resp = self.client.fetch_door_group(
|
||
|
door_group_id=door_group_id
|
||
|
).success_or_raise()
|
||
|
|
||
|
@responses.activate
|
||
|
def test_fetch_door_group_customized_groups(self) -> None:
|
||
|
"""7.3 Fetch Door Group"""
|
||
|
door_group_id = DoorGroupId("1be0c995-0347-4cb2-93b3-66a9624af568")
|
||
|
responses.get(
|
||
|
f"https://{self.host}/api/v1/developer/door_groups/{door_group_id}",
|
||
|
match=[matchers.header_matcher(self.common_headers)],
|
||
|
# Customized groups
|
||
|
json={
|
||
|
"code": "SUCCESS",
|
||
|
"data": {
|
||
|
"id": "1be0c995-0347-4cb2-93b3-66a9624af568",
|
||
|
"name": "Door Group 01",
|
||
|
"resources": [
|
||
|
{
|
||
|
"id": "6ff875d2-af87-470b-9cb5-774c6596afc8",
|
||
|
"type": "door",
|
||
|
"name": "Door 385",
|
||
|
}
|
||
|
],
|
||
|
"type": "access",
|
||
|
},
|
||
|
"msg": "success",
|
||
|
},
|
||
|
)
|
||
|
|
||
|
resp = self.client.fetch_door_group(
|
||
|
door_group_id=door_group_id
|
||
|
).success_or_raise()
|
||
|
|
||
|
@responses.activate
|
||
|
def test_update_door_group(self) -> None:
|
||
|
"""7.4 Update Door Group"""
|
||
|
door_group_id = DoorGroupId("0140fa3d-8973-4305-a0ce-5306ae277878")
|
||
|
responses.put(
|
||
|
f"https://{self.host}/api/v1/developer/door_groups/{door_group_id}",
|
||
|
match=[
|
||
|
matchers.header_matcher(self.common_headers),
|
||
|
matchers.json_params_matcher(
|
||
|
{
|
||
|
"resources": [
|
||
|
"6ff875d2-af87-470b-9cb5-774c6596afc8",
|
||
|
"5a2c3d4e-1f6b-4c8d-9e0f-2a3b4c5d6e7f",
|
||
|
"2p3q4r5s-6t7u-8v9w-x0y1-z2a3b4c5d6e",
|
||
|
]
|
||
|
}
|
||
|
),
|
||
|
],
|
||
|
json={
|
||
|
"code": "SUCCESS",
|
||
|
"data": {
|
||
|
"id": "0140fa3d-8973-4305-a0ce-5306ae277878",
|
||
|
"name": "test",
|
||
|
"resources": [
|
||
|
{"id": "6ff875d2-af87-470b-9cb5-774c6596afc8", "type": "door"}
|
||
|
],
|
||
|
"type": "access",
|
||
|
},
|
||
|
"msg": "success",
|
||
|
},
|
||
|
)
|
||
|
|
||
|
# XXX: TODO: verify that this accepts both Doors and Door Groups
|
||
|
resp = self.client.update_door_group(
|
||
|
door_group_id=door_group_id,
|
||
|
resources=[
|
||
|
DoorId("6ff875d2-af87-470b-9cb5-774c6596afc8"),
|
||
|
DoorId("5a2c3d4e-1f6b-4c8d-9e0f-2a3b4c5d6e7f"),
|
||
|
DoorGroupId("2p3q4r5s-6t7u-8v9w-x0y1-z2a3b4c5d6e"),
|
||
|
],
|
||
|
).success_or_raise()
|
||
|
|
||
|
@responses.activate
|
||
|
def test_update_door_group_delete_resources(self) -> None:
|
||
|
"""7.4 Update Door Group"""
|
||
|
door_group_id = DoorGroupId("0140fa3d-8973-4305-a0ce-5306ae277878")
|
||
|
responses.put(
|
||
|
f"https://{self.host}/api/v1/developer/door_groups/{door_group_id}",
|
||
|
match=[
|
||
|
matchers.header_matcher(self.common_headers),
|
||
|
matchers.json_params_matcher({"resources": []}),
|
||
|
],
|
||
|
# NOTE: no example provided in API docs
|
||
|
json={
|
||
|
"code": "SUCCESS",
|
||
|
"data": {
|
||
|
"id": "0140fa3d-8973-4305-a0ce-5306ae277878",
|
||
|
"name": "test",
|
||
|
"resources": [],
|
||
|
"type": "access",
|
||
|
},
|
||
|
"msg": "success",
|
||
|
},
|
||
|
)
|
||
|
|
||
|
resp = self.client.update_door_group(
|
||
|
door_group_id=door_group_id,
|
||
|
resources=[],
|
||
|
).success_or_raise()
|
||
|
|
||
|
@responses.activate
|
||
|
def test_fetch_all_door_groups(self) -> None:
|
||
|
"""7.5 Fetch All Door Groups"""
|
||
|
responses.get(
|
||
|
f"https://{self.host}/api/v1/developer/door_groups",
|
||
|
match=[matchers.header_matcher(self.common_headers)],
|
||
|
json={
|
||
|
"code": "SUCCESS",
|
||
|
"data": [
|
||
|
{
|
||
|
"id": "5c496423-6d25-4e4f-8cdf-95ad5135188a",
|
||
|
"name": "Test",
|
||
|
"resources": [
|
||
|
{
|
||
|
"id": "6ff875d2-af87-470b-9cb5-774c6596afc8",
|
||
|
"type": "door",
|
||
|
}
|
||
|
],
|
||
|
"type": "access",
|
||
|
},
|
||
|
{
|
||
|
"id": "1907cc46-0a73-4077-94c1-95b625bdb0f8",
|
||
|
"name": "Test2",
|
||
|
"resources": [
|
||
|
{
|
||
|
"id": "6ff875d2-af87-470b-9cb5-774c6596afc8",
|
||
|
"type": "door",
|
||
|
}
|
||
|
],
|
||
|
"type": "access",
|
||
|
},
|
||
|
],
|
||
|
"msg": "success",
|
||
|
},
|
||
|
)
|
||
|
|
||
|
resp = self.client.fetch_all_door_groups().success_or_raise()
|
||
|
|
||
|
@responses.activate
|
||
|
def test_delete_door_groups(self) -> None:
|
||
|
"""7.6 Delete Door Group"""
|
||
|
door_group_id = DoorGroupId("0140fa3d-8973-4305-a0ce-5306ae277878")
|
||
|
responses.get(
|
||
|
f"https://{self.host}/api/v1/developer/door_groups/{door_group_id}",
|
||
|
match=[matchers.header_matcher(self.common_headers)],
|
||
|
json={"code": "SUCCESS", "data": "success", "msg": "success"},
|
||
|
)
|
||
|
|
||
|
resp = self.client.delete_door_group(
|
||
|
door_group_id=door_group_id
|
||
|
).success_or_raise()
|
||
|
|
||
|
@responses.activate
|
||
|
def test_fetch_door(self) -> None:
|
||
|
"""7.7 Fetch Door"""
|
||
|
door_id = DoorId("0ed545f8-2fcd-4839-9021-b39e707f6aa9")
|
||
|
responses.get(
|
||
|
f"https://{self.host}/api/v1/developer/doors/{door_id}",
|
||
|
match=[matchers.header_matcher(self.common_headers)],
|
||
|
json={
|
||
|
"code": "SUCCESS",
|
||
|
"data": {
|
||
|
"door_lock_relay_status": "lock",
|
||
|
"door_position_status": "",
|
||
|
"floor_id": "3275af8d-3fa7-4902-a11b-011e41c8464a",
|
||
|
"full_name": "UNVR - 1F - Main Door",
|
||
|
"id": "0ed545f8-2fcd-4839-9021-b39e707f6aa9",
|
||
|
"is_bind_hub": True,
|
||
|
"name": "Main Door",
|
||
|
"type": "door",
|
||
|
},
|
||
|
"msg": "success",
|
||
|
},
|
||
|
)
|
||
|
|
||
|
resp = self.client.fetch_door(door_id=door_id).success_or_raise()
|
||
|
|
||
|
@responses.activate
|
||
|
def test_fetch_all_doors(self) -> None:
|
||
|
"""7.8 Fetch All Doors"""
|
||
|
responses.get(
|
||
|
f"https://{self.host}/api/v1/developer/doors",
|
||
|
match=[matchers.header_matcher(self.common_headers)],
|
||
|
json={
|
||
|
"code": "SUCCESS",
|
||
|
"data": [
|
||
|
{
|
||
|
"door_lock_relay_status": "unlock",
|
||
|
"door_position_status": "open",
|
||
|
"floor_id": "23c5db06-b59b-494d-94f1-23e88fbe4909",
|
||
|
"full_name": "UNVR - 2F - A2 Door",
|
||
|
"id": "0ed545f8-2fcd-4839-9021-b39e707f6aa9",
|
||
|
"is_bind_hub": True,
|
||
|
"name": "A2 Door",
|
||
|
"type": "door",
|
||
|
},
|
||
|
{
|
||
|
"door_lock_relay_status": "lock",
|
||
|
"door_position_status": "close",
|
||
|
"floor_id": "7c62b4b3-692f-44ea-8eb8-e212833b4e0f",
|
||
|
"full_name": "UNVR - 1F - Door 3855",
|
||
|
"id": "5785e97b-6123-4596-ba49-b6e51164db9b",
|
||
|
"is_bind_hub": True,
|
||
|
"name": "Door 3855",
|
||
|
"type": "door",
|
||
|
},
|
||
|
],
|
||
|
"msg": "success",
|
||
|
},
|
||
|
)
|
||
|
|
||
|
resp = self.client.fetch_all_doors().success_or_raise()
|
||
|
|
||
|
@responses.activate
|
||
|
def test_unlock_door(self) -> None:
|
||
|
"""7.9 Remote Door Unlocking"""
|
||
|
door_id = DoorId("5785e97b-6123-4596-ba49-b6e51164db9b")
|
||
|
responses.put(
|
||
|
f"https://{self.host}/api/v1/developer/doors/{door_id}/unlock",
|
||
|
match=[matchers.header_matcher(self.common_headers)],
|
||
|
json={"code": "SUCCESS", "data": "success", "msg": "success"},
|
||
|
)
|
||
|
|
||
|
resp = self.client.unlock_door(door_id=door_id).success_or_raise()
|
||
|
|
||
|
@responses.activate
|
||
|
def test_set_temporary_door_locking_rule(self) -> None:
|
||
|
"""7.10 Set Temporary Door Locking Rule"""
|
||
|
door_id = DoorId("e4978b83-203d-4015-97df-b86efc91cb0c")
|
||
|
responses.put(
|
||
|
f"https://{self.host}/api/v1/developer/doors/{door_id}/lock_rule",
|
||
|
match=[
|
||
|
matchers.header_matcher(self.common_headers),
|
||
|
matchers.json_params_matcher({"type": "custom", "interval": 10}),
|
||
|
],
|
||
|
json={"code": "SUCCESS", "data": "success", "msg": "success"},
|
||
|
)
|
||
|
|
||
|
# Customized 10-minute unlocked
|
||
|
resp = self.client.set_temporary_door_locking_rule(
|
||
|
door_id=door_id, type_=DoorLockingRuleType.CUSTOM, interval=10
|
||
|
).success_or_raise()
|
||
|
|
||
|
# XXX: TODO: test the other examples?
|
||
|
|
||
|
@responses.activate
|
||
|
def test_fetch_door_locking_rule(self) -> None:
|
||
|
"""7.11 Fetch Door Locking Rule"""
|
||
|
door_id = DoorId("e4978b83-203d-4015-97df-b86efc91cb0c")
|
||
|
responses.get(
|
||
|
f"https://{self.host}/api/v1/developer/doors/{door_id}/lock_rule",
|
||
|
match=[matchers.header_matcher(self.common_headers)],
|
||
|
# Keep it locked
|
||
|
json={
|
||
|
"code": "SUCCESS",
|
||
|
"data": {"ended_time": 3602128309, "type": "keep_lock"},
|
||
|
"msg": "success",
|
||
|
},
|
||
|
)
|
||
|
|
||
|
resp = self.client.fetch_door_locking_rule(door_id=door_id).success_or_raise()
|
||
|
# XXX: TODO: test the other examples?
|
||
|
|
||
|
@responses.activate
|
||
|
def test_set_door_emergency_status(self) -> None:
|
||
|
"""7.12 Set Door Emergency Status"""
|
||
|
responses.put(
|
||
|
f"https://{self.host}/api/v1/developer/doors/settings/emergency",
|
||
|
match=[
|
||
|
matchers.header_matcher(self.common_headers),
|
||
|
matchers.json_params_matcher({"lockdown": True, "evacuation": False}),
|
||
|
],
|
||
|
json={"code": "SUCCESS", "data": "success", "msg": "success"},
|
||
|
)
|
||
|
|
||
|
# Keep it locked
|
||
|
resp = self.client.set_door_emergency_status(
|
||
|
lockdown=True, evacuation=False
|
||
|
).success_or_raise()
|
||
|
# XXX: TODO: test the other examples?
|
||
|
|
||
|
@responses.activate
|
||
|
def test_fetch_door_emergency_status(self) -> None:
|
||
|
"""7.13 Fetch Door Emergency Status"""
|
||
|
responses.get(
|
||
|
f"https://{self.host}/api/v1/developer/doors/settings/emergency",
|
||
|
match=[matchers.header_matcher(self.common_headers)],
|
||
|
json={
|
||
|
"code": "SUCCESS",
|
||
|
"data": {"evacuation": True, "lockdown": False},
|
||
|
"msg": "success",
|
||
|
},
|
||
|
)
|
||
|
|
||
|
resp = self.client.fetch_door_emergency_status().success_or_raise()
|