Skip to content

Commit 4ff2591

Browse files
committed
Mixin to skip tests when packages are not installed
1 parent d64e6e5 commit 4ff2591

File tree

1 file changed

+109
-88
lines changed

1 file changed

+109
-88
lines changed

tests/test_adapter.py

Lines changed: 109 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ def test_repr_dict(self):
1212
adapter = ItemAdapter(item)
1313
self.assertEqual(repr(adapter), "ItemAdapter for type dict: {'name': 'asdf'}")
1414

15+
@unittest.skipIf(not ScrapySubclassedItem, "scrapy module is not available")
1516
def test_repr_scrapy_item(self):
1617
item = ScrapySubclassedItem(name="asdf", value=1234)
1718
adapter = ItemAdapter(item)
@@ -37,7 +38,7 @@ def test_repr_attrs(self):
3738
)
3839

3940

40-
class ItemAdapterTestCase(unittest.TestCase):
41+
class ItemAdapterInitError(unittest.TestCase):
4142
def test_non_item(self):
4243
with self.assertRaises(TypeError):
4344
ItemAdapter(ScrapySubclassedItem)
@@ -46,109 +47,129 @@ def test_non_item(self):
4647
with self.assertRaises(TypeError):
4748
ItemAdapter(1234)
4849

50+
51+
class BaseTestMixin:
52+
53+
item_class = dict
54+
55+
def setUp(self):
56+
if self.item_class is None:
57+
raise unittest.SkipTest()
58+
4959
def test_get_set_value(self):
50-
for cls in filter(None, [ScrapySubclassedItem, dict, DataClassItem, AttrsItem]):
51-
item = cls()
52-
adapter = ItemAdapter(item)
53-
self.assertEqual(adapter.get("name"), None)
54-
self.assertEqual(adapter.get("value"), None)
55-
adapter["name"] = "asdf"
56-
adapter["value"] = 1234
57-
self.assertEqual(adapter.get("name"), "asdf")
58-
self.assertEqual(adapter.get("value"), 1234)
59-
self.assertEqual(adapter["name"], "asdf")
60-
self.assertEqual(adapter["value"], 1234)
61-
62-
for cls in filter(None, [ScrapySubclassedItem, dict, DataClassItem, AttrsItem]):
63-
item = cls(name="asdf", value=1234)
64-
adapter = ItemAdapter(item)
65-
self.assertEqual(adapter.get("name"), "asdf")
66-
self.assertEqual(adapter.get("value"), 1234)
67-
self.assertEqual(adapter["name"], "asdf")
68-
self.assertEqual(adapter["value"], 1234)
69-
70-
def test_get_value_keyerror_all(self):
71-
for cls in filter(None, [ScrapySubclassedItem, dict, DataClassItem, AttrsItem]):
72-
item = cls()
73-
adapter = ItemAdapter(item)
74-
with self.assertRaises(KeyError):
75-
adapter["undefined_field"]
60+
item = self.item_class()
61+
adapter = ItemAdapter(item)
62+
self.assertEqual(adapter.get("name"), None)
63+
self.assertEqual(adapter.get("value"), None)
64+
adapter["name"] = "asdf"
65+
adapter["value"] = 1234
66+
self.assertEqual(adapter.get("name"), "asdf")
67+
self.assertEqual(adapter.get("value"), 1234)
68+
self.assertEqual(adapter["name"], "asdf")
69+
self.assertEqual(adapter["value"], 1234)
70+
71+
item = self.item_class(name="asdf", value=1234)
72+
adapter = ItemAdapter(item)
73+
self.assertEqual(adapter.get("name"), "asdf")
74+
self.assertEqual(adapter.get("value"), 1234)
75+
self.assertEqual(adapter["name"], "asdf")
76+
self.assertEqual(adapter["value"], 1234)
77+
78+
def test_get_value_keyerror(self):
79+
item = self.item_class()
80+
adapter = ItemAdapter(item)
81+
with self.assertRaises(KeyError):
82+
adapter["undefined_field"]
83+
84+
def test_as_dict(self):
85+
item = self.item_class(name="asdf", value=1234)
86+
adapter = ItemAdapter(item)
87+
self.assertEqual(dict(name="asdf", value=1234), dict(adapter))
88+
89+
def test_field_names(self):
90+
item = self.item_class(name="asdf", value=1234)
91+
adapter = ItemAdapter(item)
92+
self.assertIsInstance(adapter.field_names(), list)
93+
self.assertEqual(sorted(adapter.field_names()), ["name", "value"])
7694

77-
def test_get_value_keyerror_item_dict(self):
78-
"""
79-
scrapy.item.Item and dicts can be initialized without default values for all fields
80-
"""
81-
for cls in [ScrapySubclassedItem, dict]:
82-
item = cls()
83-
adapter = ItemAdapter(item)
84-
with self.assertRaises(KeyError):
85-
adapter["name"]
8695

96+
class NonDictTestMixin(BaseTestMixin):
8797
def test_set_value_keyerror(self):
88-
for cls in filter(None, [ScrapySubclassedItem, DataClassItem, AttrsItem]):
89-
item = cls()
90-
adapter = ItemAdapter(item)
91-
with self.assertRaises(KeyError):
92-
adapter["undefined_field"] = "some value"
98+
item = self.item_class()
99+
adapter = ItemAdapter(item)
100+
with self.assertRaises(KeyError):
101+
adapter["undefined_field"] = "some value"
102+
103+
def test_metadata_common(self):
104+
adapter = ItemAdapter(self.item_class())
105+
self.assertIsInstance(adapter.get_field_meta("name"), MappingProxyType)
106+
self.assertIsInstance(adapter.get_field_meta("value"), MappingProxyType)
107+
with self.assertRaises(KeyError):
108+
adapter.get_field_meta("undefined_field")
109+
110+
def test_get_field_meta_defined_fields(self):
111+
adapter = ItemAdapter(self.item_class())
112+
self.assertEqual(adapter.get_field_meta("name"), MappingProxyType({"serializer": str}))
113+
self.assertEqual(adapter.get_field_meta("value"), MappingProxyType({"serializer": int}))
93114

94115
def test_delitem_len_iter(self):
95-
for cls in filter(None, [ScrapySubclassedItem, dict, DataClassItem, AttrsItem]):
96-
item = cls(name="asdf", value=1234)
97-
adapter = ItemAdapter(item)
98-
self.assertEqual(len(adapter), 2)
99-
self.assertEqual(sorted(list(iter(adapter))), ["name", "value"])
116+
item = self.item_class(name="asdf", value=1234)
117+
adapter = ItemAdapter(item)
118+
self.assertEqual(len(adapter), 2)
119+
self.assertEqual(sorted(list(iter(adapter))), ["name", "value"])
100120

101-
del adapter["name"]
102-
self.assertEqual(len(adapter), 1)
103-
self.assertEqual(sorted(list(iter(adapter))), ["value"])
121+
del adapter["name"]
122+
self.assertEqual(len(adapter), 1)
123+
self.assertEqual(sorted(list(iter(adapter))), ["value"])
124+
125+
del adapter["value"]
126+
self.assertEqual(len(adapter), 0)
127+
self.assertEqual(sorted(list(iter(adapter))), [])
104128

129+
with self.assertRaises(KeyError):
130+
del adapter["name"]
131+
with self.assertRaises(KeyError):
105132
del adapter["value"]
106-
self.assertEqual(len(adapter), 0)
107-
self.assertEqual(sorted(list(iter(adapter))), [])
133+
with self.assertRaises(KeyError):
134+
del adapter["undefined_field"]
108135

109-
with self.assertRaises(KeyError):
110-
del adapter["name"]
111-
with self.assertRaises(KeyError):
112-
del adapter["value"]
113-
with self.assertRaises(KeyError):
114-
del adapter["undefined_field"]
115136

116-
def test_as_dict(self):
117-
for cls in filter(None, [ScrapySubclassedItem, dict, DataClassItem, AttrsItem]):
118-
item = cls(name="asdf", value=1234)
119-
adapter = ItemAdapter(item)
120-
self.assertEqual(dict(name="asdf", value=1234), dict(adapter))
137+
class DictTestCase(unittest.TestCase, BaseTestMixin):
121138

122-
def test_field_names(self):
123-
for cls in filter(None, [ScrapySubclassedItem, dict, DataClassItem, AttrsItem]):
124-
item = cls(name="asdf", value=1234)
125-
adapter = ItemAdapter(item)
126-
self.assertIsInstance(adapter.field_names(), list)
127-
self.assertEqual(sorted(adapter.field_names()), ["name", "value"])
128-
129-
130-
class MetadataTestCase(unittest.TestCase):
131-
def test_meta_common(self):
132-
for cls in filter(None, [ScrapySubclassedItem, DataClassItem, AttrsItem]):
133-
adapter = ItemAdapter(cls())
134-
self.assertIsInstance(adapter.get_field_meta("name"), MappingProxyType)
135-
self.assertIsInstance(adapter.get_field_meta("value"), MappingProxyType)
136-
with self.assertRaises(KeyError):
137-
adapter.get_field_meta("undefined_field")
138-
139-
def test_meta_dict(self):
140-
adapter = ItemAdapter(dict(name="foo", value=5))
139+
item_class = dict
140+
141+
def test_get_value_keyerror_item_dict(self):
142+
"""Instantiate without default values"""
143+
adapter = ItemAdapter(self.item_class())
144+
with self.assertRaises(KeyError):
145+
adapter["name"]
146+
147+
def test_no_metadata_support(self):
148+
adapter = ItemAdapter(self.item_class(name="foo", value=5))
141149
with self.assertRaises(TypeError):
142150
adapter.get_field_meta("name")
143151
with self.assertRaises(TypeError):
144152
adapter.get_field_meta("value")
145153
with self.assertRaises(TypeError):
146154
adapter.get_field_meta("undefined_field")
147155

148-
def test_get_field_meta_defined_fields(self):
149-
for cls in filter(None, [ScrapySubclassedItem, DataClassItem, AttrsItem]):
150-
adapter = ItemAdapter(cls())
151-
self.assertEqual(adapter.get_field_meta("name"), MappingProxyType({"serializer": str}))
152-
self.assertEqual(
153-
adapter.get_field_meta("value"), MappingProxyType({"serializer": int})
154-
)
156+
157+
class ScrapySubclassedItemTestCase(NonDictTestMixin, unittest.TestCase):
158+
159+
item_class = ScrapySubclassedItem
160+
161+
def test_get_value_keyerror_item_dict(self):
162+
"""Instantiate without default values"""
163+
adapter = ItemAdapter(self.item_class())
164+
with self.assertRaises(KeyError):
165+
adapter["name"]
166+
167+
168+
class DataClassItemTestCase(NonDictTestMixin, unittest.TestCase):
169+
170+
item_class = DataClassItem
171+
172+
173+
class AttrsItemTestCase(NonDictTestMixin, unittest.TestCase):
174+
175+
item_class = AttrsItem

0 commit comments

Comments
 (0)