OLD | NEW |
(Empty) | |
| 1 #!/usr/bin/env python |
| 2 from boto.mws.connection import MWSConnection |
| 3 from boto.mws.response import (ResponseFactory, ResponseElement, Element, |
| 4 MemberList, ElementList, SimpleList) |
| 5 |
| 6 |
| 7 from tests.unit import AWSMockServiceTestCase |
| 8 from boto.compat import filter, map |
| 9 from tests.compat import unittest |
| 10 |
| 11 |
| 12 class TestMWSResponse(AWSMockServiceTestCase): |
| 13 connection_class = MWSConnection |
| 14 mws = True |
| 15 |
| 16 def test_parsing_nested_elements(self): |
| 17 class Test9one(ResponseElement): |
| 18 Nest = Element() |
| 19 Zoom = Element() |
| 20 |
| 21 class Test9Result(ResponseElement): |
| 22 Item = Element(Test9one) |
| 23 |
| 24 text = b"""<Test9Response><Test9Result> |
| 25 <Item> |
| 26 <Foo>Bar</Foo> |
| 27 <Nest> |
| 28 <Zip>Zap</Zip> |
| 29 <Zam>Zoo</Zam> |
| 30 </Nest> |
| 31 <Bif>Bam</Bif> |
| 32 </Item> |
| 33 </Test9Result></Test9Response>""" |
| 34 obj = self.check_issue(Test9Result, text) |
| 35 Item = obj._result.Item |
| 36 useful = lambda x: not x[0].startswith('_') |
| 37 nest = dict(filter(useful, Item.Nest.__dict__.items())) |
| 38 self.assertEqual(nest, dict(Zip='Zap', Zam='Zoo')) |
| 39 useful = lambda x: not x[0].startswith('_') and not x[0] == 'Nest' |
| 40 item = dict(filter(useful, Item.__dict__.items())) |
| 41 self.assertEqual(item, dict(Foo='Bar', Bif='Bam', Zoom=None)) |
| 42 |
| 43 def test_parsing_member_list_specification(self): |
| 44 class Test8extra(ResponseElement): |
| 45 Foo = SimpleList() |
| 46 |
| 47 class Test8Result(ResponseElement): |
| 48 Item = MemberList(SimpleList) |
| 49 Extra = MemberList(Test8extra) |
| 50 |
| 51 text = b"""<Test8Response><Test8Result> |
| 52 <Item> |
| 53 <member>0</member> |
| 54 <member>1</member> |
| 55 <member>2</member> |
| 56 <member>3</member> |
| 57 </Item> |
| 58 <Extra> |
| 59 <member><Foo>4</Foo><Foo>5</Foo></member> |
| 60 <member></member> |
| 61 <member><Foo>6</Foo><Foo>7</Foo></member> |
| 62 </Extra> |
| 63 </Test8Result></Test8Response>""" |
| 64 obj = self.check_issue(Test8Result, text) |
| 65 self.assertSequenceEqual( |
| 66 list(map(int, obj._result.Item)), |
| 67 list(range(4)), |
| 68 ) |
| 69 self.assertSequenceEqual( |
| 70 list(map(lambda x: list(map(int, x.Foo)), obj._result.Extra)), |
| 71 [[4, 5], [], [6, 7]], |
| 72 ) |
| 73 |
| 74 def test_parsing_nested_lists(self): |
| 75 class Test7Result(ResponseElement): |
| 76 Item = MemberList(Nest=MemberList(), |
| 77 List=ElementList(Simple=SimpleList())) |
| 78 |
| 79 text = b"""<Test7Response><Test7Result> |
| 80 <Item> |
| 81 <member> |
| 82 <Value>One</Value> |
| 83 <Nest> |
| 84 <member><Data>2</Data></member> |
| 85 <member><Data>4</Data></member> |
| 86 <member><Data>6</Data></member> |
| 87 </Nest> |
| 88 </member> |
| 89 <member> |
| 90 <Value>Two</Value> |
| 91 <Nest> |
| 92 <member><Data>1</Data></member> |
| 93 <member><Data>3</Data></member> |
| 94 <member><Data>5</Data></member> |
| 95 </Nest> |
| 96 <List> |
| 97 <Simple>4</Simple> |
| 98 <Simple>5</Simple> |
| 99 <Simple>6</Simple> |
| 100 </List> |
| 101 <List> |
| 102 <Simple>7</Simple> |
| 103 <Simple>8</Simple> |
| 104 <Simple>9</Simple> |
| 105 </List> |
| 106 </member> |
| 107 <member> |
| 108 <Value>Six</Value> |
| 109 <List> |
| 110 <Complex>Foo</Complex> |
| 111 <Simple>1</Simple> |
| 112 <Simple>2</Simple> |
| 113 <Simple>3</Simple> |
| 114 </List> |
| 115 <List> |
| 116 <Complex>Bar</Complex> |
| 117 </List> |
| 118 </member> |
| 119 </Item> |
| 120 </Test7Result></Test7Response>""" |
| 121 obj = self.check_issue(Test7Result, text) |
| 122 item = obj._result.Item |
| 123 self.assertEqual(len(item), 3) |
| 124 nests = [z.Nest for z in filter(lambda x: x.Nest, item)] |
| 125 self.assertSequenceEqual( |
| 126 [[y.Data for y in nest] for nest in nests], |
| 127 [[u'2', u'4', u'6'], [u'1', u'3', u'5']], |
| 128 ) |
| 129 self.assertSequenceEqual( |
| 130 [element.Simple for element in item[1].List], |
| 131 [[u'4', u'5', u'6'], [u'7', u'8', u'9']], |
| 132 ) |
| 133 self.assertSequenceEqual( |
| 134 item[-1].List[0].Simple, |
| 135 ['1', '2', '3'], |
| 136 ) |
| 137 self.assertEqual(item[-1].List[1].Simple, []) |
| 138 self.assertSequenceEqual( |
| 139 [e.Value for e in obj._result.Item], |
| 140 ['One', 'Two', 'Six'], |
| 141 ) |
| 142 |
| 143 def test_parsing_member_list(self): |
| 144 class Test6Result(ResponseElement): |
| 145 Item = MemberList() |
| 146 |
| 147 text = b"""<Test6Response><Test6Result> |
| 148 <Item> |
| 149 <member><Value>One</Value></member> |
| 150 <member><Value>Two</Value> |
| 151 <Error>Four</Error> |
| 152 </member> |
| 153 <member><Value>Six</Value></member> |
| 154 </Item> |
| 155 </Test6Result></Test6Response>""" |
| 156 obj = self.check_issue(Test6Result, text) |
| 157 self.assertSequenceEqual( |
| 158 [e.Value for e in obj._result.Item], |
| 159 ['One', 'Two', 'Six'], |
| 160 ) |
| 161 self.assertTrue(obj._result.Item[1].Error == 'Four') |
| 162 with self.assertRaises(AttributeError) as e: |
| 163 obj._result.Item[2].Error |
| 164 |
| 165 def test_parsing_empty_member_list(self): |
| 166 class Test5Result(ResponseElement): |
| 167 Item = MemberList(Nest=MemberList()) |
| 168 |
| 169 text = b"""<Test5Response><Test5Result> |
| 170 <Item/> |
| 171 </Test5Result></Test5Response>""" |
| 172 obj = self.check_issue(Test5Result, text) |
| 173 self.assertSequenceEqual(obj._result.Item, []) |
| 174 |
| 175 def test_parsing_missing_member_list(self): |
| 176 class Test4Result(ResponseElement): |
| 177 Item = MemberList(NestedItem=MemberList()) |
| 178 |
| 179 text = b"""<Test4Response><Test4Result> |
| 180 </Test4Result></Test4Response>""" |
| 181 obj = self.check_issue(Test4Result, text) |
| 182 self.assertSequenceEqual(obj._result.Item, []) |
| 183 |
| 184 def test_parsing_element_lists(self): |
| 185 class Test1Result(ResponseElement): |
| 186 Item = ElementList() |
| 187 |
| 188 text = b"""<Test1Response><Test1Result> |
| 189 <Item><Foo>Bar</Foo></Item> |
| 190 <Item><Zip>Bif</Zip></Item> |
| 191 <Item><Foo>Baz</Foo> |
| 192 <Zam>Zoo</Zam></Item> |
| 193 </Test1Result></Test1Response>""" |
| 194 obj = self.check_issue(Test1Result, text) |
| 195 self.assertTrue(len(obj._result.Item) == 3) |
| 196 elements = lambda x: getattr(x, 'Foo', getattr(x, 'Zip', '?')) |
| 197 elements = list(map(elements, obj._result.Item)) |
| 198 self.assertSequenceEqual(elements, ['Bar', 'Bif', 'Baz']) |
| 199 |
| 200 def test_parsing_missing_lists(self): |
| 201 class Test2Result(ResponseElement): |
| 202 Item = ElementList() |
| 203 |
| 204 text = b"""<Test2Response><Test2Result> |
| 205 </Test2Result></Test2Response>""" |
| 206 obj = self.check_issue(Test2Result, text) |
| 207 self.assertEqual(obj._result.Item, []) |
| 208 |
| 209 def test_parsing_simple_lists(self): |
| 210 class Test3Result(ResponseElement): |
| 211 Item = SimpleList() |
| 212 |
| 213 text = b"""<Test3Response><Test3Result> |
| 214 <Item>Bar</Item> |
| 215 <Item>Bif</Item> |
| 216 <Item>Baz</Item> |
| 217 </Test3Result></Test3Response>""" |
| 218 obj = self.check_issue(Test3Result, text) |
| 219 self.assertSequenceEqual(obj._result.Item, ['Bar', 'Bif', 'Baz']) |
| 220 |
| 221 def check_issue(self, klass, text): |
| 222 action = klass.__name__[:-len('Result')] |
| 223 factory = ResponseFactory(scopes=[{klass.__name__: klass}]) |
| 224 parser = factory(action, connection=self.service_connection) |
| 225 return self.service_connection._parse_response(parser, 'text/xml', text) |
| 226 |
| 227 |
| 228 if __name__ == "__main__": |
| 229 unittest.main() |
OLD | NEW |