-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathtest_loader_initialization.py
144 lines (122 loc) · 6.2 KB
/
test_loader_initialization.py
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
import unittest
from itemloaders import ItemLoader
from itemloaders.processors import TakeFirst
class InitializationTestMixin:
item_class = None
def test_keep_single_value(self):
"""Loaded item should contain values from the initial item"""
input_item = self.item_class(name='foo')
il = ItemLoader(item=input_item)
loaded_item = il.load_item()
self.assertIsInstance(loaded_item, self.item_class)
self.assertEqual(dict(loaded_item), {'name': ['foo']})
def test_keep_list(self):
"""Loaded item should contain values from the initial item"""
input_item = self.item_class(name=['foo', 'bar'])
il = ItemLoader(item=input_item)
loaded_item = il.load_item()
self.assertIsInstance(loaded_item, self.item_class)
self.assertEqual(dict(loaded_item), {'name': ['foo', 'bar']})
def test_add_value_singlevalue_singlevalue(self):
"""Values added after initialization should be appended"""
input_item = self.item_class(name='foo')
il = ItemLoader(item=input_item)
il.add_value('name', 'bar')
loaded_item = il.load_item()
self.assertIsInstance(loaded_item, self.item_class)
self.assertEqual(dict(loaded_item), {'name': ['foo', 'bar']})
def test_add_value_singlevalue_list(self):
"""Values added after initialization should be appended"""
input_item = self.item_class(name='foo')
il = ItemLoader(item=input_item)
il.add_value('name', ['item', 'loader'])
loaded_item = il.load_item()
self.assertIsInstance(loaded_item, self.item_class)
self.assertEqual(dict(loaded_item), {'name': ['foo', 'item', 'loader']})
def test_add_value_list_singlevalue(self):
"""Values added after initialization should be appended"""
input_item = self.item_class(name=['foo', 'bar'])
il = ItemLoader(item=input_item)
il.add_value('name', 'qwerty')
loaded_item = il.load_item()
self.assertIsInstance(loaded_item, self.item_class)
self.assertEqual(dict(loaded_item), {'name': ['foo', 'bar', 'qwerty']})
def test_add_value_list_list(self):
"""Values added after initialization should be appended"""
input_item = self.item_class(name=['foo', 'bar'])
il = ItemLoader(item=input_item)
il.add_value('name', ['item', 'loader'])
loaded_item = il.load_item()
self.assertIsInstance(loaded_item, self.item_class)
self.assertEqual(dict(loaded_item), {'name': ['foo', 'bar', 'item', 'loader']})
def test_get_output_value_singlevalue(self):
"""Getting output value must not remove value from item"""
input_item = self.item_class(name='foo')
il = ItemLoader(item=input_item)
self.assertEqual(il.get_output_value('name'), ['foo'])
loaded_item = il.load_item()
self.assertIsInstance(loaded_item, self.item_class)
self.assertEqual(loaded_item, dict({'name': ['foo']}))
def test_get_output_value_list(self):
"""Getting output value must not remove value from item"""
input_item = self.item_class(name=['foo', 'bar'])
il = ItemLoader(item=input_item)
self.assertEqual(il.get_output_value('name'), ['foo', 'bar'])
loaded_item = il.load_item()
self.assertIsInstance(loaded_item, self.item_class)
self.assertEqual(loaded_item, dict({'name': ['foo', 'bar']}))
def test_get_output_value_default_singlevalue(self):
"""
The default value should be used only when the returned value is
empty (None, '', etc.) and there is a default value defined
"""
input_item = self.item_class()
il = ItemLoader(item=input_item)
il.default_output_processor = TakeFirst() # make "name" field single
self.assertEqual(il.get_output_value('name'), None)
self.assertEqual(il.get_output_value('name', ''), '')
self.assertEqual(il.get_output_value('name', []), [])
self.assertEqual(il.get_output_value('name', 'foo'), 'foo')
il.add_value('name', '')
self.assertEqual(il.get_output_value('name'), None)
self.assertEqual(il.get_output_value('name', ''), '')
self.assertEqual(il.get_output_value('name', []), [])
self.assertEqual(il.get_output_value('name', 'foo'), 'foo')
self.assertEqual(il.load_item(), {})
input_item2 = self.item_class()
il2 = ItemLoader(item=input_item2)
il2.default_output_processor = TakeFirst()
il2.add_value('name', 'foo')
self.assertEqual(il2.get_output_value('name'), 'foo')
self.assertEqual(il2.get_output_value('name', 'bar'), 'foo')
self.assertEqual(il2.load_item(), dict({'name': 'foo'}))
def test_get_output_value_default_list(self):
"""
The default value should be used only when the returned value is
empty ([], etc.) and there is a default value defined
"""
input_item = self.item_class()
il = ItemLoader(item=input_item)
il.add_value('name', [])
self.assertEqual(il.get_output_value('name'), [])
self.assertEqual(il.get_output_value('name', ['foo']), ['foo'])
self.assertEqual(il.get_output_value('name', 'foo'), 'foo')
self.assertEqual(il.load_item(), {})
input_item2 = self.item_class()
il2 = ItemLoader(item=input_item2)
il2.add_value('name', ['foo', 'bar'])
self.assertEqual(il2.get_output_value('name'), ['foo', 'bar'])
self.assertEqual(il2.get_output_value('name', ['spam']), ['foo', 'bar'])
self.assertEqual(il2.load_item(), dict({'name': ['foo', 'bar']}))
def test_values_single(self):
"""Values from initial item must be added to loader._values"""
input_item = self.item_class(name='foo')
il = ItemLoader(item=input_item)
self.assertEqual(il._values.get('name'), ['foo'])
def test_values_list(self):
"""Values from initial item must be added to loader._values"""
input_item = self.item_class(name=['foo', 'bar'])
il = ItemLoader(item=input_item)
self.assertEqual(il._values.get('name'), ['foo', 'bar'])
class InitializationFromDictTest(InitializationTestMixin, unittest.TestCase):
item_class = dict