amazon-orders 3.2.0__tar.gz → 3.2.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/CHANGELOG.md +7 -0
  2. {amazon_orders-3.2.0/amazon_orders.egg-info → amazon_orders-3.2.1}/PKG-INFO +1 -1
  3. {amazon_orders-3.2.0 → amazon_orders-3.2.1/amazon_orders.egg-info}/PKG-INFO +1 -1
  4. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/__init__.py +1 -1
  5. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/selectors.py +39 -30
  6. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/transactions.py +12 -26
  7. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/tests/test_orders.py +21 -0
  8. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/tests/testcase.py +59 -7
  9. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/LICENSE +0 -0
  10. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/MANIFEST.in +0 -0
  11. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/README.md +0 -0
  12. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazon_orders.egg-info/SOURCES.txt +0 -0
  13. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazon_orders.egg-info/dependency_links.txt +0 -0
  14. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazon_orders.egg-info/entry_points.txt +0 -0
  15. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazon_orders.egg-info/requires.txt +0 -0
  16. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazon_orders.egg-info/top_level.txt +0 -0
  17. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/banner.txt +0 -0
  18. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/cli.py +0 -0
  19. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/conf.py +0 -0
  20. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/constants.py +0 -0
  21. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/entity/__init__.py +0 -0
  22. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/entity/item.py +0 -0
  23. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/entity/order.py +0 -0
  24. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/entity/parsable.py +0 -0
  25. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/entity/recipient.py +0 -0
  26. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/entity/seller.py +0 -0
  27. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/entity/shipment.py +0 -0
  28. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/entity/transaction.py +0 -0
  29. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/exception.py +0 -0
  30. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/forms.py +0 -0
  31. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/orders.py +0 -0
  32. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/session.py +0 -0
  33. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/util.py +0 -0
  34. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/pyproject.toml +0 -0
  35. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/setup.cfg +0 -0
  36. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/tests/test_cli.py +0 -0
  37. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/tests/test_conf.py +0 -0
  38. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/tests/test_session.py +0 -0
  39. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/tests/test_transactions.py +0 -0
  40. {amazon_orders-3.2.0 → amazon_orders-3.2.1}/tests/test_util.py +0 -0
@@ -6,6 +6,13 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
6
6
 
7
7
  ## [Unreleased](https://github.com/alexdlaird/amazon-orders/compare/3.2.0...HEAD)
8
8
 
9
+ ## [3.2.1](https://github.com/alexdlaird/amazon-orders/compare/3.2.0...3.2.1) - 2024-11-08
10
+
11
+ ### Fixed
12
+
13
+ - Issues with parsing Items and Shipments using the new `data-component`, selectors made more precise.
14
+ - Transactions use `util` selector methods, so consistent use of trying a list of selectors is maintained.
15
+
9
16
  ## [3.2.0](https://github.com/alexdlaird/amazon-orders/compare/3.1.0...3.2.0) - 2024-11-07
10
17
 
11
18
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: amazon-orders
3
- Version: 3.2.0
3
+ Version: 3.2.1
4
4
  Summary: A CLI and library for interacting with Amazon order history.
5
5
  Maintainer-email: Alex Laird <contact@alexlaird.com>
6
6
  License: MIT License
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: amazon-orders
3
- Version: 3.2.0
3
+ Version: 3.2.1
4
4
  Summary: A CLI and library for interacting with Amazon order history.
5
5
  Maintainer-email: Alex Laird <contact@alexlaird.com>
6
6
  License: MIT License
@@ -1,3 +1,3 @@
1
1
  __copyright__ = "Copyright (c) 2024 Alex Laird"
2
2
  __license__ = "MIT"
3
- __version__ = "3.2.0"
3
+ __version__ = "3.2.1"
@@ -45,20 +45,30 @@ class Selectors:
45
45
  # is passed.
46
46
  ##########################################################################
47
47
 
48
- ORDER_HISTORY_ENTITY_SELECTOR = ["div.order-card", "div.order"]
49
- ORDER_DETAILS_ENTITY_SELECTOR = ["div#orderDetails", "div#ordersContainer"]
50
- ITEM_ENTITY_SELECTOR = ["div:has(> div.yohtmlc-item)", ".item-box", "[data-component='purchasedItems']"]
51
- SHIPMENT_ENTITY_SELECTOR = ["div.shipment", "div.delivery-box",
52
- "[data-component='orderCard'] [data-component='shipments']"]
48
+ ORDER_HISTORY_ENTITY_SELECTOR = ["div.order-card",
49
+ "div.order"]
50
+ ORDER_DETAILS_ENTITY_SELECTOR = ["div#orderDetails",
51
+ "div#ordersContainer"]
52
+ ITEM_ENTITY_SELECTOR = ["[data-component='purchasedItems'] .a-fixed-left-grid",
53
+ "div:has(> div.yohtmlc-item)",
54
+ ".item-box"]
55
+ SHIPMENT_ENTITY_SELECTOR = ["[data-component='orderCard'] [data-component='shipments'] .a-box",
56
+ "div.shipment",
57
+ "div.delivery-box"]
53
58
 
54
59
  #####################################
55
60
  # CSS selectors for Item fields
56
61
  #####################################
57
62
 
58
63
  FIELD_ITEM_IMG_LINK_SELECTOR = "a img"
59
- FIELD_ITEM_QUANTITY_SELECTOR = [".od-item-view-qty", "span.item-view-qty", "span.product-image__qty"]
60
- FIELD_ITEM_TITLE_SELECTOR = ["[data-component='itemTitle']", ".yohtmlc-item a", ".yohtmlc-product-title"]
61
- FIELD_ITEM_LINK_SELECTOR = ["[data-component='itemTitle'] a", ".yohtmlc-item a", "a:has(> .yohtmlc-product-title)"]
64
+ FIELD_ITEM_QUANTITY_SELECTOR = [".od-item-view-qty",
65
+ "span.item-view-qty",
66
+ "span.product-image__qty"]
67
+ FIELD_ITEM_TITLE_SELECTOR = ["[data-component='itemTitle']",
68
+ ".yohtmlc-item a", ".yohtmlc-product-title"]
69
+ FIELD_ITEM_LINK_SELECTOR = ["[data-component='itemTitle'] a",
70
+ ".yohtmlc-item a",
71
+ "a:has(> .yohtmlc-product-title)"]
62
72
  FIELD_ITEM_TAG_ITERATOR_SELECTOR = [".yohtmlc-item div"]
63
73
  FIELD_ITEM_PRICE_SELECTOR = ["[data-component='unitPrice'] .a-text-price :not(.a-offscreen)",
64
74
  ".yohtmlc-item .a-color-price"]
@@ -70,9 +80,13 @@ class Selectors:
70
80
  #####################################
71
81
 
72
82
  FIELD_ORDER_DETAILS_LINK_SELECTOR = "a.yohtmlc-order-details-link"
73
- FIELD_ORDER_NUMBER_SELECTOR = [".order-date-invoice-item bdi[dir='ltr']", "bdi[dir='ltr']", "span[dir='ltr']"]
74
- FIELD_ORDER_GRAND_TOTAL_SELECTOR = ["div.yohtmlc-order-total span.value", "div.order-header div.a-column.a-span2"]
75
- FIELD_ORDER_PLACED_DATE_SELECTOR = ["span.order-date-invoice-item", "div.a-span3"]
83
+ FIELD_ORDER_NUMBER_SELECTOR = [".order-date-invoice-item bdi[dir='ltr']",
84
+ "bdi[dir='ltr']",
85
+ "span[dir='ltr']"]
86
+ FIELD_ORDER_GRAND_TOTAL_SELECTOR = ["div.yohtmlc-order-total span.value",
87
+ "div.order-header div.a-column.a-span2"]
88
+ FIELD_ORDER_PLACED_DATE_SELECTOR = ["span.order-date-invoice-item",
89
+ "div.a-span3"]
76
90
  FIELD_ORDER_PAYMENT_METHOD_SELECTOR = "img.pmts-payment-credit-card-instrument-logo"
77
91
  FIELD_ORDER_PAYMENT_METHOD_LAST_4_SELECTOR = "span:has(img.pmts-payment-credit-card-instrument-logo):last-child"
78
92
  FIELD_ORDER_SUBTOTALS_TAG_ITERATOR_SELECTOR = ["[data-component='orderSubtotals'] div.a-row",
@@ -88,7 +102,8 @@ class Selectors:
88
102
  # CSS selectors for Shipment fields
89
103
  #####################################
90
104
 
91
- FIELD_SHIPMENT_TRACKING_LINK_SELECTOR = ["span.track-package-button a", "a[href*='ship-track?itemId=']"]
105
+ FIELD_SHIPMENT_TRACKING_LINK_SELECTOR = ["span.track-package-button a",
106
+ "a[href*='ship-track?itemId=']"]
92
107
  FIELD_SHIPMENT_DELIVERY_STATUS_SELECTOR = ["div.js-shipment-info-container div.a-row",
93
108
  "span.delivery-box__primary-text",
94
109
  ".yohtmlc-shipment-status-primaryText",
@@ -122,25 +137,19 @@ class Selectors:
122
137
  TRANSACTIONS_CONTAINER_SELECTOR = "div"
123
138
  TRANSACTIONS_SELECTOR = "div.apx-transactions-line-item-component-container"
124
139
 
125
- TRANSACTIONS_NEXT_PAGE_INPUT_SELECTOR = (
126
- "input[type='submit'][name^='ppw-widgetEvent:DefaultNextPageNavigationEvent']"
127
- )
140
+ TRANSACTIONS_NEXT_PAGE_INPUT_SELECTOR = [
141
+ "input[type='submit'][name^='ppw-widgetEvent:DefaultNextPageNavigationEvent']"]
128
142
  TRANSACTIONS_NEXT_PAGE_INPUT_STATE_SELECTOR = "input[name='ppw-widgetState']"
129
143
  TRANSACTIONS_NEXT_PAGE_INPUT_IE_SELECTOR = "input[name='ie']"
130
144
 
131
145
  FIELD_TRANSACTION_COMPLETED_DATE_SELECTOR = "span"
132
- FIELD_TRANSACTION_PAYMENT_METHOD_SELECTOR = (
133
- "div.apx-transactions-line-item-component-container > div:nth-child(1) span.a-size-base"
134
- )
135
- FIELD_TRANSACTION_GRAND_TOTAL_SELECTOR = (
136
- "div.apx-transactions-line-item-component-container > div:nth-child(1) span.a-size-base-plus"
137
- )
138
- FIELD_TRANSACTION_ORDER_NUMBER_SELECTOR = (
139
- "div.apx-transactions-line-item-component-container > div:nth-child(2) a.a-link-normal"
140
- )
141
- FIELD_TRANSACTION_ORDER_LINK_SELECTOR = (
142
- "div.apx-transactions-line-item-component-container > div:nth-child(2) a.a-link-normal"
143
- )
144
- FIELD_TRANSACTION_SELLER_NAME_SELECTOR = (
145
- "div.apx-transactions-line-item-component-container > div:nth-child(3) span.a-size-base"
146
- )
146
+ FIELD_TRANSACTION_PAYMENT_METHOD_SELECTOR = [
147
+ "div.apx-transactions-line-item-component-container > div:nth-child(1) span.a-size-base"]
148
+ FIELD_TRANSACTION_GRAND_TOTAL_SELECTOR = [
149
+ "div.apx-transactions-line-item-component-container > div:nth-child(1) span.a-size-base-plus"]
150
+ FIELD_TRANSACTION_ORDER_NUMBER_SELECTOR = [
151
+ "div.apx-transactions-line-item-component-container > div:nth-child(2) a.a-link-normal"]
152
+ FIELD_TRANSACTION_ORDER_LINK_SELECTOR = [
153
+ "div.apx-transactions-line-item-component-container > div:nth-child(2) a.a-link-normal"]
154
+ FIELD_TRANSACTION_SELLER_NAME_SELECTOR = [
155
+ "div.apx-transactions-line-item-component-container > div:nth-child(3) span.a-size-base"]
@@ -8,6 +8,7 @@ from typing import Dict, List, Optional, Tuple
8
8
  from bs4 import Tag
9
9
  from dateutil import parser
10
10
 
11
+ from amazonorders import util
11
12
  from amazonorders.conf import AmazonOrdersConfig
12
13
  from amazonorders.entity.transaction import Transaction
13
14
  from amazonorders.exception import AmazonOrdersError
@@ -24,13 +25,9 @@ def _parse_transaction_form_tag(
24
25
  form_tag: Tag, config: AmazonOrdersConfig
25
26
  ) -> Tuple[List[Transaction], Optional[str], Optional[Dict[str, str]]]:
26
27
  transactions = []
27
- date_container_tags = form_tag.select(
28
- config.selectors.TRANSACTION_DATE_CONTAINERS_SELECTOR
29
- )
28
+ date_container_tags = util.select(form_tag, config.selectors.TRANSACTION_DATE_CONTAINERS_SELECTOR)
30
29
  for date_container_tag in date_container_tags:
31
- date_tag = date_container_tag.select_one(
32
- config.selectors.FIELD_TRANSACTION_COMPLETED_DATE_SELECTOR
33
- )
30
+ date_tag = util.select_one(date_container_tag, config.selectors.FIELD_TRANSACTION_COMPLETED_DATE_SELECTOR)
34
31
  if not date_tag:
35
32
  logger.warning("Could not find date tag in transaction form.")
36
33
  continue
@@ -39,30 +36,21 @@ def _parse_transaction_form_tag(
39
36
  date = parser.parse(date_str).date()
40
37
 
41
38
  transactions_container_tag = date_container_tag.find_next_sibling(
42
- config.selectors.TRANSACTIONS_CONTAINER_SELECTOR
43
- )
39
+ config.selectors.TRANSACTIONS_CONTAINER_SELECTOR)
44
40
  if not isinstance(transactions_container_tag, Tag):
45
41
  logger.warning(
46
42
  "Could not find transactions container tag in transaction form."
47
43
  )
48
44
  continue
49
45
 
50
- transaction_tags = transactions_container_tag.select(
51
- config.selectors.TRANSACTIONS_SELECTOR
52
- )
46
+ transaction_tags = util.select(transactions_container_tag, config.selectors.TRANSACTIONS_SELECTOR)
53
47
  for transaction_tag in transaction_tags:
54
48
  transaction = Transaction(transaction_tag, config, date)
55
49
  transactions.append(transaction)
56
50
 
57
- form_state_input = form_tag.select_one(
58
- config.selectors.TRANSACTIONS_NEXT_PAGE_INPUT_STATE_SELECTOR
59
- )
60
- form_ie_input = form_tag.select_one(
61
- config.selectors.TRANSACTIONS_NEXT_PAGE_INPUT_IE_SELECTOR
62
- )
63
- next_page_input = form_tag.select_one(
64
- config.selectors.TRANSACTIONS_NEXT_PAGE_INPUT_SELECTOR
65
- )
51
+ form_state_input = util.select_one(form_tag, config.selectors.TRANSACTIONS_NEXT_PAGE_INPUT_STATE_SELECTOR)
52
+ form_ie_input = util.select_one(form_tag, config.selectors.TRANSACTIONS_NEXT_PAGE_INPUT_IE_SELECTOR)
53
+ next_page_input = util.select_one(form_tag, config.selectors.TRANSACTIONS_NEXT_PAGE_INPUT_SELECTOR)
66
54
  if not next_page_input or not form_state_input or not form_ie_input:
67
55
  return (transactions, None, None)
68
56
 
@@ -118,9 +106,8 @@ class AmazonTransactions:
118
106
  if not self.amazon_session.last_response_parsed:
119
107
  raise AmazonOrdersError("Could not get transaction history landing page.")
120
108
 
121
- form_tag = self.amazon_session.last_response_parsed.select_one(
122
- self.config.selectors.TRANSACTION_HISTORY_FORM_SELECTOR
123
- )
109
+ form_tag = util.select_one(self.amazon_session.last_response_parsed,
110
+ self.config.selectors.TRANSACTION_HISTORY_FORM_SELECTOR)
124
111
 
125
112
  transactions: List[Transaction] = []
126
113
  while form_tag:
@@ -140,8 +127,7 @@ class AmazonTransactions:
140
127
  if not self.amazon_session.last_response_parsed:
141
128
  raise AmazonOrdersError("Could not get next transaction history page.")
142
129
 
143
- form_tag = self.amazon_session.last_response_parsed.select_one(
144
- self.config.selectors.TRANSACTION_HISTORY_FORM_SELECTOR
145
- )
130
+ form_tag = util.select_one(self.amazon_session.last_response_parsed,
131
+ self.config.selectors.TRANSACTION_HISTORY_FORM_SELECTOR)
146
132
 
147
133
  return transactions
@@ -308,6 +308,27 @@ class TestOrders(UnitTestCase):
308
308
  self.assert_order_114_8722141_6545058_data_component_subscription(order, True)
309
309
  self.assertEqual(1, resp1.call_count)
310
310
 
311
+ @responses.activate
312
+ def test_get_order_2024_data_component_multiple_shipments(self):
313
+ # GIVEN
314
+ self.amazon_session.is_authenticated = True
315
+ order_id = "111-6778632-7354601"
316
+ with open(os.path.join(self.RESOURCES_DIR, f"order-details-{order_id}.html"), "r",
317
+ encoding="utf-8") as f:
318
+ resp1 = responses.add(
319
+ responses.GET,
320
+ f"{self.test_config.constants.ORDER_DETAILS_URL}?orderID={order_id}",
321
+ body=f.read(),
322
+ status=200,
323
+ )
324
+
325
+ # WHEN
326
+ order = self.amazon_orders.get_order(order_id)
327
+
328
+ # THEN
329
+ self.assert_order_111_6778632_7354601_data_component_subscription(order, True)
330
+ self.assertEqual(1, resp1.call_count)
331
+
311
332
  @unittest.skipIf(not os.path.exists(temp_order_history_file_path),
312
333
  reason="Skipped, to debug an order history page, "
313
334
  "place it at tests/output/temp-order-history.html")
@@ -217,8 +217,8 @@ class TestCase(unittest.TestCase):
217
217
  self.assertIn("Delivered May 13", shipment.delivery_status)
218
218
  self.assertTrue(found_kimoe)
219
219
  self.assertTrue(found_amazon)
220
- self.assertEqual(str(order.items),
221
- str(order.shipments[0].items + order.shipments[1].items))
220
+ self.assertEqual(str(order.items.sort()),
221
+ str((order.shipments[0].items + order.shipments[1].items).sort()))
222
222
  self.assertEqual(2, len(order.items))
223
223
  found_kimoe = False
224
224
  found_amazon = False
@@ -439,6 +439,51 @@ class TestCase(unittest.TestCase):
439
439
  order.items[0].seller.name)
440
440
  self.assertIsNone(order.items[0].seller.link)
441
441
 
442
+ def assert_order_111_6778632_7354601_data_component_subscription(self, order, full_details=False):
443
+ self.assertEqual("111-6778632-7354601", order.order_number)
444
+ self.assertEqual(60.88, order.grand_total)
445
+ self.assertIsNotNone(order.order_details_link)
446
+ self.assertEqual(date(2024, 9, 8), order.order_placed_date)
447
+ self.assertEqual("Name1 & Name2", order.recipient.name)
448
+ self.assertIn("Address2", order.recipient.address)
449
+ self.assertEqual(2, len(order.shipments))
450
+ self.assertEqual(str(order.items.sort()),
451
+ str((order.shipments[0].items + order.shipments[1].items).sort()))
452
+ self.assertEqual(3, len(order.shipments[0].items))
453
+ self.assertEqual(1, len(order.shipments[1].items))
454
+ self.assertEqual("Delivered September 9", order.shipments[0].delivery_status)
455
+ self.assertEqual("Delivered September 9", order.shipments[1].delivery_status)
456
+ self.assertEqual(4, len(order.items))
457
+ self.assertEqual(
458
+ "Dxhycc Satin Pirate Sash Pirate Medieval Renaissance Large Sash Halloween Costume Waist "
459
+ "Sash Belt, Red",
460
+ order.items[0].title)
461
+ self.assertEqual("Ziploc Paper Sandwich and Snack Bags, Recyclable & Sealable with Fun Designs, "
462
+ "150 Total Bags",
463
+ order.items[3].title)
464
+ self.assertIsNotNone(order.items[0].link)
465
+ self.assertIsNotNone(order.items[0].image_link)
466
+ self.assertIsNotNone(order.items[3].link)
467
+ self.assertIsNotNone(order.items[3].image_link)
468
+
469
+ self.assertEqual(order.full_details, full_details)
470
+
471
+ if full_details:
472
+ self.assertEqual("Prime Visa", order.payment_method)
473
+ self.assertEqual(1111, order.payment_method_last_4)
474
+ self.assertEqual(57.69, order.subtotal)
475
+ self.assertEqual(2.99, order.shipping_total)
476
+ self.assertEqual(57.69, order.total_before_tax)
477
+ self.assertEqual(3.19, order.estimated_tax)
478
+ self.assertEqual(date(2024, 10, 9), order.items[0].return_eligible_date)
479
+ self.assertEqual(date(2024, 10, 9), order.items[1].return_eligible_date)
480
+ self.assertEqual(date(2024, 10, 9), order.items[2].return_eligible_date)
481
+ self.assertEqual(date(2024, 10, 9), order.items[3].return_eligible_date)
482
+ self.assertEqual(7.49, order.items[0].price)
483
+ self.assertEqual(18.95, order.items[1].price)
484
+ self.assertEqual(9.98, order.items[2].price)
485
+ self.assertEqual(21.27, order.items[3].price)
486
+
442
487
  def assert_populated_generic(self, order, full_details):
443
488
  self.assertIsNotNone(order.order_number)
444
489
  self.assertIsNotNone(order.grand_total)
@@ -448,10 +493,16 @@ class TestCase(unittest.TestCase):
448
493
  self.assertIsNotNone(order.recipient.name)
449
494
  self.assertIsNotNone(order.recipient.address)
450
495
  self.assertGreaterEqual(len(order.shipments), 1)
451
- self.assertEqual(str(order.items), str(order.shipments[0].items))
496
+ shipment_items = []
497
+ for shipment in order.shipments:
498
+ shipment_items += shipment.items
499
+ self.assertGreaterEqual(len(shipment.items), 1)
500
+ self.assertIsNotNone(shipment.delivery_status)
501
+ self.assertEqual(str(order.items.sort()), str(shipment_items.sort()))
452
502
  self.assertGreaterEqual(len(order.items), 1)
453
- self.assertIsNotNone(order.items[0].title)
454
- self.assertIsNotNone(order.items[0].link)
503
+ for item in order.items:
504
+ self.assertIsNotNone(item.title)
505
+ self.assertIsNotNone(item.link)
455
506
 
456
507
  self.assertEqual(order.full_details, full_details)
457
508
 
@@ -464,5 +515,6 @@ class TestCase(unittest.TestCase):
464
515
  self.assertIsNotNone(order.total_before_tax)
465
516
  self.assertIsNotNone(order.estimated_tax)
466
517
  if order.recipient:
467
- self.assertIsNotNone(order.items[0].price)
468
- self.assertIsNotNone(order.items[0].seller.name)
518
+ for item in order.items:
519
+ self.assertIsNotNone(item.price)
520
+ self.assertIsNotNone(item.seller.name)
File without changes
File without changes
File without changes
File without changes