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 self._evaluate_values: list[object] = [] 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): if self._evaluate_values: return self._evaluate_values.pop(0) 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_get_current_page_number_from_text_counter(self) -> None: page = _FakePage({}) page._evaluate_values = [5] self.assertEqual(ListingCollector._get_current_page_number(page), 5) def test_extract_vehicle_links_from_html_finds_detail_urls(self) -> None: collector = ListingCollector(Settings(), HumanPacer(Settings())) html = """

Car 1

""" 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()