feat: harden sync flow, proxy bridge, and data normalization
This commit is contained in:
@@ -50,6 +50,8 @@ class TestScraperSync(unittest.TestCase):
|
||||
scraper.persistence.start_sync_run = MagicMock(return_value=2)
|
||||
scraper.persistence.finish_sync_run = MagicMock()
|
||||
scraper.persistence.upsert_car = MagicMock(return_value={"action": "inserted", "images_upserted": 1})
|
||||
scraper.persistence.get_existing_origin_urls = MagicMock(return_value=set())
|
||||
scraper.persistence.get_existing_origin_ids = MagicMock(return_value=set())
|
||||
|
||||
scraper.collect_listing = MagicMock(return_value={"vehicle_urls": ["https://www.iaai.com/VehicleDetail/222~US"]})
|
||||
page = MagicMock()
|
||||
@@ -73,6 +75,8 @@ class TestScraperSync(unittest.TestCase):
|
||||
scraper.persistence.start_sync_run = MagicMock(return_value=3)
|
||||
scraper.persistence.finish_sync_run = MagicMock()
|
||||
scraper.persistence.upsert_car = MagicMock(return_value={"action": "inserted", "images_upserted": 1})
|
||||
scraper.persistence.get_existing_origin_urls = MagicMock(return_value=set())
|
||||
scraper.persistence.get_existing_origin_ids = MagicMock(return_value=set())
|
||||
scraper.collect_listing = MagicMock(return_value={
|
||||
"vehicle_urls": [
|
||||
"https://www.iaai.com/VehicleDetail/222~US",
|
||||
@@ -93,6 +97,8 @@ class TestScraperSync(unittest.TestCase):
|
||||
scraper.persistence.start_sync_run = MagicMock(return_value=4)
|
||||
scraper.persistence.finish_sync_run = MagicMock()
|
||||
scraper.persistence.upsert_car = MagicMock(return_value={"action": "skipped", "images_upserted": 0})
|
||||
scraper.persistence.get_existing_origin_urls = MagicMock(return_value=set())
|
||||
scraper.persistence.get_existing_origin_ids = MagicMock(return_value=set())
|
||||
scraper.collect_listing = MagicMock(return_value={"vehicle_urls": ["https://www.iaai.com/VehicleDetail/444~US"]})
|
||||
scraper._scrape_on_page = MagicMock(return_value={"db_record": make_db_record("444")})
|
||||
scraper._get_page = MagicMock(return_value=MagicMock())
|
||||
@@ -101,6 +107,35 @@ class TestScraperSync(unittest.TestCase):
|
||||
|
||||
self.assertEqual(result["cars_upserted"], 0)
|
||||
|
||||
def test_sync_listing_only_new_filters_existing_by_url_and_origin_id(self) -> None:
|
||||
scraper = self._make_scraper()
|
||||
|
||||
scraper.persistence.create_tables = MagicMock()
|
||||
scraper.persistence.start_sync_run = MagicMock(return_value=5)
|
||||
scraper.persistence.finish_sync_run = MagicMock()
|
||||
scraper.persistence.upsert_car = MagicMock(return_value={"action": "inserted", "images_upserted": 0})
|
||||
scraper.persistence.get_existing_origin_urls = MagicMock(return_value={"https://www.iaai.com/VehicleDetail/111~US"})
|
||||
scraper.persistence.get_existing_origin_ids = MagicMock(return_value={"222"})
|
||||
|
||||
scraper.collect_listing = MagicMock(return_value={
|
||||
"vehicle_urls": [
|
||||
"https://www.iaai.com/VehicleDetail/111~US", # exists by URL
|
||||
"https://www.iaai.com/VehicleDetail/222~US", # exists by ID
|
||||
"https://www.iaai.com/VehicleDetail/333~US", # new
|
||||
]
|
||||
})
|
||||
page = MagicMock()
|
||||
scraper._get_page = MagicMock(return_value=page)
|
||||
scraper._scrape_on_page = MagicMock(return_value={"db_record": make_db_record("333")})
|
||||
|
||||
result = scraper.sync_listing(only_new=True)
|
||||
|
||||
self.assertEqual(result["skipped_existing"], 2)
|
||||
self.assertEqual(result["cars_upserted"], 1)
|
||||
self.assertEqual(scraper._scrape_on_page.call_count, 1)
|
||||
scraper.persistence.get_existing_origin_urls.assert_called_once()
|
||||
scraper.persistence.get_existing_origin_ids.assert_called_once()
|
||||
|
||||
def test_close_resets_browser_state(self) -> None:
|
||||
scraper = self._make_scraper()
|
||||
scraper.context = MagicMock()
|
||||
|
||||
Reference in New Issue
Block a user