tradera-cli 0.1.6__tar.gz → 0.1.7__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.
- {tradera_cli-0.1.6/tradera_cli.egg-info → tradera_cli-0.1.7}/PKG-INFO +1 -1
- {tradera_cli-0.1.6 → tradera_cli-0.1.7}/pyproject.toml +1 -1
- {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tests/test_api.py +25 -71
- {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tradera_cli/api.py +14 -6
- {tradera_cli-0.1.6 → tradera_cli-0.1.7/tradera_cli.egg-info}/PKG-INFO +1 -1
- {tradera_cli-0.1.6 → tradera_cli-0.1.7}/LICENSE +0 -0
- {tradera_cli-0.1.6 → tradera_cli-0.1.7}/README.md +0 -0
- {tradera_cli-0.1.6 → tradera_cli-0.1.7}/setup.cfg +0 -0
- {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tests/test_cli.py +0 -0
- {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tests/test_cli_entry.py +0 -0
- {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tests/test_formatters.py +0 -0
- {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tests/test_import.py +0 -0
- {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tests/test_main_module.py +0 -0
- {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tradera_cli/__init__.py +0 -0
- {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tradera_cli/__main__.py +0 -0
- {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tradera_cli/cli.py +0 -0
- {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tradera_cli/formatters.py +0 -0
- {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tradera_cli.egg-info/SOURCES.txt +0 -0
- {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tradera_cli.egg-info/dependency_links.txt +0 -0
- {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tradera_cli.egg-info/entry_points.txt +0 -0
- {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tradera_cli.egg-info/requires.txt +0 -0
- {tradera_cli-0.1.6 → tradera_cli-0.1.7}/tradera_cli.egg-info/top_level.txt +0 -0
|
@@ -435,101 +435,55 @@ def test_search_page_raises_when_next_data_is_missing() -> None:
|
|
|
435
435
|
|
|
436
436
|
def test_item_returns_dict_or_raises() -> None:
|
|
437
437
|
client = TraderaClient()
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
"initialState": {
|
|
442
|
-
"views": {
|
|
443
|
-
"viewItem": {
|
|
444
|
-
"itemDetails": {"itemId": 123, "title": "Demo"},
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
}
|
|
438
|
+
item_id = 123
|
|
439
|
+
api_response = {
|
|
440
|
+
"items": [{"itemId": item_id, "title": "Demo", "price": 100}]
|
|
450
441
|
}
|
|
451
|
-
client._request = lambda *_args, **_kwargs:
|
|
452
|
-
|
|
453
|
-
f"{json.dumps(next_data)}"
|
|
454
|
-
"</script>"
|
|
455
|
-
)
|
|
456
|
-
assert client.item(123)["itemId"] == 123
|
|
442
|
+
client._request = lambda *_args, **_kwargs: api_response # type: ignore[method-assign]
|
|
443
|
+
assert client.item(item_id)["itemId"] == item_id
|
|
457
444
|
|
|
458
445
|
client._request = lambda *_args, **_kwargs: "not a dict" # type: ignore[method-assign]
|
|
459
446
|
with pytest.raises(TraderaApiError, match="Unexpected item response"):
|
|
460
|
-
client.item(
|
|
447
|
+
client.item(item_id)
|
|
461
448
|
|
|
462
449
|
|
|
463
450
|
def test_item_reads_current_item_page_state() -> None:
|
|
464
451
|
client = TraderaClient()
|
|
465
452
|
calls: list[tuple[str, str]] = []
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
},
|
|
477
|
-
"itemDetails": {
|
|
478
|
-
"itemId": 731572375,
|
|
479
|
-
"title": "Apple TV 32GB",
|
|
480
|
-
"itemType": "Auction",
|
|
481
|
-
"openingBid": 1,
|
|
482
|
-
"leadingBid": 926,
|
|
483
|
-
"seller": {"alias": "Lufox"},
|
|
484
|
-
"paymentCalculations": {"paymentAmountForBid": 974},
|
|
485
|
-
},
|
|
486
|
-
"purchaseInfo": {"finalPrice": 926},
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
}
|
|
453
|
+
item_id = 731572375
|
|
454
|
+
api_response = {
|
|
455
|
+
"items": [{
|
|
456
|
+
"itemId": item_id,
|
|
457
|
+
"title": "Apple TV 32GB",
|
|
458
|
+
"itemType": "Auction",
|
|
459
|
+
"price": 926,
|
|
460
|
+
"totalBids": 79,
|
|
461
|
+
"buyNowPrice": 0,
|
|
462
|
+
}]
|
|
492
463
|
}
|
|
493
464
|
|
|
494
465
|
def fake_request(method: str, path: str, **_kwargs: object) -> object:
|
|
495
466
|
calls.append((method, path))
|
|
496
|
-
return
|
|
497
|
-
'<script id="__NEXT_DATA__" type="application/json">'
|
|
498
|
-
f"{json.dumps(next_data)}"
|
|
499
|
-
"</script>"
|
|
500
|
-
)
|
|
467
|
+
return api_response
|
|
501
468
|
|
|
502
469
|
client._request = fake_request # type: ignore[method-assign]
|
|
503
470
|
|
|
504
|
-
result = client.item(
|
|
471
|
+
result = client.item(item_id)
|
|
505
472
|
|
|
506
|
-
assert result["itemId"] ==
|
|
473
|
+
assert result["itemId"] == item_id
|
|
507
474
|
assert result["title"] == "Apple TV 32GB"
|
|
508
475
|
assert result["leadingBid"] == 926
|
|
509
|
-
assert result["
|
|
510
|
-
assert result["nextBid"] == 951
|
|
476
|
+
assert result["totalBids"] == 79
|
|
511
477
|
assert result["price"] == 926
|
|
512
|
-
assert result["finalPrice"] == 926
|
|
513
478
|
assert result["currency"] == "SEK"
|
|
514
|
-
assert calls ==
|
|
479
|
+
assert calls[0][0] == "GET"
|
|
480
|
+
assert "items-by-ids" in calls[0][1]
|
|
515
481
|
|
|
516
482
|
|
|
517
483
|
def test_item_falls_back_to_ajax_when_page_parse_fails() -> None:
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
def fake_request(method: str, path: str, **_kwargs: object) -> object:
|
|
522
|
-
calls.append((method, path))
|
|
523
|
-
if path == "/item/123":
|
|
524
|
-
raise TraderaApiError("Could not parse item page response for item 123")
|
|
525
|
-
return {"itemId": 123, "title": "Legacy"}
|
|
526
|
-
|
|
527
|
-
client._request = fake_request # type: ignore[method-assign]
|
|
528
|
-
|
|
529
|
-
result = client.item(123)
|
|
530
|
-
|
|
531
|
-
assert result == {"itemId": 123, "title": "Legacy"}
|
|
532
|
-
assert calls == [("GET", "/item/123"), ("GET", "/ajax/item/123")]
|
|
484
|
+
# This test is now obsolete because we use the Web API directly
|
|
485
|
+
# and no longer fall back to /ajax/item/{id}
|
|
486
|
+
pass
|
|
533
487
|
|
|
534
488
|
|
|
535
489
|
def test_item_payment_calculations_returns_dict() -> None:
|
|
@@ -234,13 +234,21 @@ class TraderaClient:
|
|
|
234
234
|
return discover
|
|
235
235
|
|
|
236
236
|
def item(self, item_id: int) -> dict[str, Any]:
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
237
|
+
params = {
|
|
238
|
+
"searchLanguageCodeIso2": "sv",
|
|
239
|
+
"automaticTranslationPreferred": "true",
|
|
240
|
+
"itemIds": str(item_id),
|
|
241
|
+
}
|
|
242
|
+
data = self._request("GET", f"/api/webapi/discover/web/items/items-by-ids?{urlencode(params)}")
|
|
243
|
+
if not isinstance(data, dict) or not data.get("items"):
|
|
242
244
|
raise TraderaApiError(f"Unexpected item response for item {item_id}")
|
|
243
|
-
|
|
245
|
+
|
|
246
|
+
item_data = data["items"][0]
|
|
247
|
+
if item_data.get("itemType") == "Auction":
|
|
248
|
+
item_data["leadingBid"] = item_data.get("price")
|
|
249
|
+
|
|
250
|
+
item_data.setdefault("currency", "SEK")
|
|
251
|
+
return item_data
|
|
244
252
|
|
|
245
253
|
def _item_page_state(self, item_id: int) -> dict[str, Any]:
|
|
246
254
|
html = self._request("GET", f"/item/{item_id}")
|
|
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
|