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.
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/CHANGELOG.md +7 -0
- {amazon_orders-3.2.0/amazon_orders.egg-info → amazon_orders-3.2.1}/PKG-INFO +1 -1
- {amazon_orders-3.2.0 → amazon_orders-3.2.1/amazon_orders.egg-info}/PKG-INFO +1 -1
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/__init__.py +1 -1
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/selectors.py +39 -30
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/transactions.py +12 -26
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/tests/test_orders.py +21 -0
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/tests/testcase.py +59 -7
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/LICENSE +0 -0
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/MANIFEST.in +0 -0
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/README.md +0 -0
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazon_orders.egg-info/SOURCES.txt +0 -0
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazon_orders.egg-info/dependency_links.txt +0 -0
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazon_orders.egg-info/entry_points.txt +0 -0
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazon_orders.egg-info/requires.txt +0 -0
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazon_orders.egg-info/top_level.txt +0 -0
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/banner.txt +0 -0
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/cli.py +0 -0
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/conf.py +0 -0
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/constants.py +0 -0
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/entity/__init__.py +0 -0
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/entity/item.py +0 -0
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/entity/order.py +0 -0
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/entity/parsable.py +0 -0
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/entity/recipient.py +0 -0
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/entity/seller.py +0 -0
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/entity/shipment.py +0 -0
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/entity/transaction.py +0 -0
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/exception.py +0 -0
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/forms.py +0 -0
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/orders.py +0 -0
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/session.py +0 -0
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/amazonorders/util.py +0 -0
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/pyproject.toml +0 -0
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/setup.cfg +0 -0
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/tests/test_cli.py +0 -0
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/tests/test_conf.py +0 -0
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/tests/test_session.py +0 -0
- {amazon_orders-3.2.0 → amazon_orders-3.2.1}/tests/test_transactions.py +0 -0
- {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
|
|
@@ -45,20 +45,30 @@ class Selectors:
|
|
|
45
45
|
# is passed.
|
|
46
46
|
##########################################################################
|
|
47
47
|
|
|
48
|
-
ORDER_HISTORY_ENTITY_SELECTOR = ["div.order-card",
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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",
|
|
60
|
-
|
|
61
|
-
|
|
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']",
|
|
74
|
-
|
|
75
|
-
|
|
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",
|
|
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
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
"div.apx-transactions-line-item-component-container > div:nth-child(2) a.a-link-normal"
|
|
140
|
-
|
|
141
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
58
|
-
|
|
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
|
|
122
|
-
|
|
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
|
|
144
|
-
|
|
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
|
-
|
|
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
|
-
|
|
454
|
-
|
|
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
|
-
|
|
468
|
-
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|