()
| 134 | |
| 135 | |
| 136 | def test_value_items(): |
| 137 | v = ['a', 'b', 'c'] |
| 138 | vi = ValueItems(v, {0, -1}) |
| 139 | assert vi.is_excluded(2) |
| 140 | assert [v_ for i, v_ in enumerate(v) if not vi.is_excluded(i)] == ['b'] |
| 141 | |
| 142 | assert vi.is_included(2) |
| 143 | assert [v_ for i, v_ in enumerate(v) if vi.is_included(i)] == ['a', 'c'] |
| 144 | |
| 145 | v2 = {'a': v, 'b': {'a': 1, 'b': (1, 2)}, 'c': 1} |
| 146 | |
| 147 | vi = ValueItems(v2, {'a': {0, -1}, 'b': {'a': ..., 'b': -1}}) |
| 148 | |
| 149 | assert not vi.is_excluded('a') |
| 150 | assert vi.is_included('a') |
| 151 | assert not vi.is_excluded('c') |
| 152 | assert not vi.is_included('c') |
| 153 | |
| 154 | assert str(vi) == "{'a': {0, -1}, 'b': {'a': Ellipsis, 'b': -1}}" |
| 155 | assert repr(vi) == "ValueItems({'a': {0, -1}, 'b': {'a': Ellipsis, 'b': -1}})" |
| 156 | |
| 157 | excluded = {k_: v_ for k_, v_ in v2.items() if not vi.is_excluded(k_)} |
| 158 | assert excluded == {'a': v, 'b': {'a': 1, 'b': (1, 2)}, 'c': 1} |
| 159 | |
| 160 | included = {k_: v_ for k_, v_ in v2.items() if vi.is_included(k_)} |
| 161 | assert included == {'a': v, 'b': {'a': 1, 'b': (1, 2)}} |
| 162 | |
| 163 | sub_v = included['a'] |
| 164 | sub_vi = ValueItems(sub_v, vi.for_element('a')) |
| 165 | assert repr(sub_vi) == 'ValueItems({0: Ellipsis, 2: Ellipsis})' |
| 166 | |
| 167 | assert sub_vi.is_excluded(2) |
| 168 | assert [v_ for i, v_ in enumerate(sub_v) if not sub_vi.is_excluded(i)] == ['b'] |
| 169 | |
| 170 | assert sub_vi.is_included(2) |
| 171 | assert [v_ for i, v_ in enumerate(sub_v) if sub_vi.is_included(i)] == ['a', 'c'] |
| 172 | |
| 173 | vi = ValueItems([], {'__all__': {}}) |
| 174 | assert vi._items == {} |
| 175 | |
| 176 | with pytest.raises(TypeError, match='Unexpected type of exclude value for index "a" <class \'NoneType\'>'): |
| 177 | ValueItems(['a', 'b'], {'a': None}) |
| 178 | |
| 179 | m = ( |
| 180 | 'Excluding fields from a sequence of sub-models or dicts must be performed index-wise: ' |
| 181 | 'expected integer keys or keyword "__all__"' |
| 182 | ) |
| 183 | with pytest.raises(TypeError, match=m): |
| 184 | ValueItems(['a', 'b'], {'a': {}}) |
| 185 | |
| 186 | vi = ValueItems([1, 2, 3, 4], {'__all__': True}) |
| 187 | assert repr(vi) == 'ValueItems({0: Ellipsis, 1: Ellipsis, 2: Ellipsis, 3: Ellipsis})' |
| 188 | |
| 189 | vi = ValueItems([1, 2], {'__all__': {1, 2}}) |
| 190 | assert repr(vi) == 'ValueItems({0: {1: Ellipsis, 2: Ellipsis}, 1: {1: Ellipsis, 2: Ellipsis}})' |
| 191 | |
| 192 | |
| 193 | @pytest.mark.parametrize( |
nothing calls this directly
no test coverage detected