from __future__ import annotations import unittest from mobilede_scraper.browser.pace import HumanPacer from mobilede_scraper.core.config import Settings from mobilede_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_pagination_detection_and_page_number(self) -> None: # Есть кнопка Next → True. self.assertTrue(ListingCollector._has_next_page(_FakePage({"a[aria-label*='Next']": 1}))) # Нет селекторов → False. self.assertFalse(ListingCollector._has_next_page(_FakePage({}))) # Числовая пагинация через JS → True только если evaluate явно нашёл next. page = _FakePage({}) page._evaluate_result = True self.assertTrue(ListingCollector._has_next_page(page)) # Номер текущей страницы. page2 = _FakePage({}) page2._evaluate_values = [5] self.assertEqual(ListingCollector._get_current_page_number(page2), 5) def test_extract_vehicle_links_from_html_finds_detail_urls(self) -> None: collector = ListingCollector(Settings(), HumanPacer(Settings())) html = """
""" links = collector._extract_vehicle_links_from_html(html) self.assertEqual( links, [ ("https://www.MOBILEDE.com/VehicleDetail/45184893~US", "45184893"), ("https://www.MOBILEDE.com/VehicleDetail/45171480~US", "45171480"), ], ) if __name__ == "__main__": unittest.main()