@@ -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