File: test_quirks_registry.py

package info (click to toggle)
zigpy 0.80.1-2
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 3,012 kB
  • sloc: python: 34,822; sql: 2,109; makefile: 7
file content (161 lines) | stat: -rw-r--r-- 4,857 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
from collections import deque
from unittest import mock

import pytest

from zigpy.const import SIG_MODELS_INFO
from zigpy.quirks.registry import DeviceRegistry


class FakeDevice:
    def __init__(self):
        self.signature = {}


@pytest.fixture
def fake_dev():
    return FakeDevice()


def test_add_to_registry_new_sig(fake_dev):
    fake_dev.signature = {
        1: {},
        2: {},
        3: {
            "manufacturer": mock.sentinel.legacy_manufacturer,
            "model": mock.sentinel.legacy_model,
        },
        "endpoints": {
            1: {
                "manufacturer": mock.sentinel.manufacturer,
                "model": mock.sentinel.model,
            }
        },
        "manufacturer": mock.sentinel.dev_manufacturer,
        "model": mock.sentinel.dev_model,
    }

    reg = DeviceRegistry()
    reg.add_to_registry(fake_dev)

    assert reg._registry_v1[mock.sentinel.dev_manufacturer][
        mock.sentinel.dev_model
    ] == deque([fake_dev])


def test_add_to_registry_models_info(fake_dev):
    fake_dev.signature = {
        1: {},
        2: {},
        3: {
            "manufacturer": mock.sentinel.legacy_manufacturer,
            "model": mock.sentinel.legacy_model,
        },
        "endpoints": {
            1: {
                "manufacturer": mock.sentinel.manufacturer,
                "model": mock.sentinel.model,
            }
        },
        SIG_MODELS_INFO: [
            (mock.sentinel.manuf_1, mock.sentinel.model_1),
            (mock.sentinel.manuf_2, mock.sentinel.model_2),
        ],
    }

    reg = DeviceRegistry()
    reg.add_to_registry(fake_dev)

    assert reg._registry_v1[mock.sentinel.manuf_1][mock.sentinel.model_1] == deque(
        [fake_dev]
    )
    assert reg._registry_v1[mock.sentinel.manuf_2][mock.sentinel.model_2] == deque(
        [fake_dev]
    )


def test_remove_new_sig(fake_dev):
    fake_dev.signature = {
        1: {},
        2: {},
        3: {
            "manufacturer": mock.sentinel.legacy_manufacturer,
            "model": mock.sentinel.legacy_model,
        },
        "endpoints": {
            1: {
                "manufacturer": mock.sentinel.manufacturer,
                "model": mock.sentinel.model,
            }
        },
        "manufacturer": mock.sentinel.dev_manufacturer,
        "model": mock.sentinel.dev_model,
    }

    reg = DeviceRegistry()

    quirk_list = mock.MagicMock()
    model_dict = mock.MagicMock(spec_set=dict)
    model_dict.__getitem__.return_value = quirk_list
    manuf_dict = mock.MagicMock()
    manuf_dict.__getitem__.return_value = model_dict
    reg._registry_v1 = manuf_dict

    reg.remove(fake_dev)
    assert manuf_dict.__getitem__.call_count == 1
    assert manuf_dict.__getitem__.call_args[0][0] is mock.sentinel.dev_manufacturer
    assert model_dict.__getitem__.call_count == 1
    assert model_dict.__getitem__.call_args[0][0] is mock.sentinel.dev_model
    assert quirk_list.insert.call_count == 0
    assert quirk_list.remove.call_count == 1
    assert quirk_list.remove.call_args[0][0] is fake_dev


def test_remove_models_info(fake_dev):
    fake_dev.signature = {
        1: {},
        2: {},
        3: {
            "manufacturer": mock.sentinel.legacy_manufacturer,
            "model": mock.sentinel.legacy_model,
        },
        "endpoints": {
            1: {
                "manufacturer": mock.sentinel.manufacturer,
                "model": mock.sentinel.model,
            }
        },
        SIG_MODELS_INFO: [
            (mock.sentinel.manuf_1, mock.sentinel.model_1),
            (mock.sentinel.manuf_2, mock.sentinel.model_2),
        ],
    }

    reg = DeviceRegistry()

    quirk_list = mock.MagicMock()
    model_dict = mock.MagicMock(spec_set=dict)
    model_dict.__getitem__.return_value = quirk_list
    manuf_dict = mock.MagicMock()
    manuf_dict.__getitem__.return_value = model_dict
    reg._registry_v1 = manuf_dict

    reg.remove(fake_dev)
    assert manuf_dict.__getitem__.call_count == 2
    assert manuf_dict.__getitem__.call_args_list[0][0][0] is mock.sentinel.manuf_1
    assert manuf_dict.__getitem__.call_args_list[1][0][0] is mock.sentinel.manuf_2
    assert model_dict.__getitem__.call_count == 2
    assert model_dict.__getitem__.call_args_list[0][0][0] is mock.sentinel.model_1
    assert model_dict.__getitem__.call_args_list[1][0][0] is mock.sentinel.model_2
    assert quirk_list.insert.call_count == 0
    assert quirk_list.remove.call_count == 2
    assert quirk_list.remove.call_args_list[0][0][0] is fake_dev
    assert quirk_list.remove.call_args_list[1][0][0] is fake_dev


@pytest.mark.filterwarnings("ignore::DeprecationWarning")
def test_property_accessors():
    reg = DeviceRegistry()
    assert reg.registry is reg._registry_v1
    assert reg.registry_v1 is reg._registry_v1
    assert reg.registry_v2 is reg._registry_v2