65 lines
2.0 KiB
Python
65 lines
2.0 KiB
Python
from __future__ import annotations
|
|
|
|
import unittest
|
|
|
|
from iaai_scraper.browser.pace import HumanPacer
|
|
from iaai_scraper.core.config import Settings
|
|
from iaai_scraper.browser.listing import ListingCollector
|
|
|
|
|
|
class _FakePage:
|
|
def __init__(self, counts: dict[str, int]) -> None:
|
|
self._counts = counts
|
|
self._evaluate_result = False
|
|
|
|
class _Locator:
|
|
def __init__(self, count_value: int) -> None:
|
|
self._count_value = count_value
|
|
|
|
def count(self) -> int:
|
|
return self._count_value
|
|
|
|
def locator(self, selector: str) -> "_FakePage._Locator":
|
|
return _FakePage._Locator(self._counts.get(selector, 0))
|
|
|
|
def evaluate(self, _script: str):
|
|
return self._evaluate_result
|
|
|
|
|
|
class TestListingUnit(unittest.TestCase):
|
|
def test_has_next_page_true_for_known_selector(self) -> None:
|
|
page = _FakePage({"a[aria-label*='Next']": 1})
|
|
self.assertTrue(ListingCollector._has_next_page(page))
|
|
|
|
def test_has_next_page_false_when_no_selectors(self) -> None:
|
|
page = _FakePage({})
|
|
self.assertFalse(ListingCollector._has_next_page(page))
|
|
|
|
def test_has_next_page_true_for_numeric_pagination_fallback(self) -> None:
|
|
page = _FakePage({})
|
|
page._evaluate_result = True
|
|
self.assertTrue(ListingCollector._has_next_page(page))
|
|
|
|
def test_extract_vehicle_links_from_html_finds_detail_urls(self) -> None:
|
|
collector = ListingCollector(Settings(), HumanPacer(Settings()))
|
|
html = """
|
|
<div>
|
|
<h4><a href=\"/VehicleDetail/45184893~US\">Car 1</a></h4>
|
|
<script>window.__data = {\"href\":\"\\/VehicleDetail\\/45171480~US\"}</script>
|
|
</div>
|
|
"""
|
|
|
|
links = collector._extract_vehicle_links_from_html(html)
|
|
|
|
self.assertEqual(
|
|
links,
|
|
[
|
|
("https://www.iaai.com/VehicleDetail/45184893~US", "45184893"),
|
|
("https://www.iaai.com/VehicleDetail/45171480~US", "45171480"),
|
|
],
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|