69 lines
2.7 KiB
Python
69 lines
2.7 KiB
Python
from __future__ import annotations
|
|
|
|
import unittest
|
|
|
|
from iaai_scraper.parsing.parser import VehicleParser
|
|
|
|
|
|
class TestVehicleParserUnit(unittest.TestCase):
|
|
def setUp(self) -> None:
|
|
self.parser = VehicleParser()
|
|
|
|
def test_parse_dom_key_value_pairs_extracts_known_fields(self) -> None:
|
|
dom_text = """
|
|
Stock #:
|
|
45089484
|
|
VIN (Status):
|
|
1HGCM82633A123456 (OK)
|
|
Primary Damage:
|
|
Front End
|
|
"""
|
|
result = self.parser._parse_dom_key_value_pairs(dom_text)
|
|
self.assertEqual(result.get("lot_number"), "45089484")
|
|
self.assertEqual(result.get("vin"), "1HGCM82633A123456 (OK)")
|
|
self.assertEqual(result.get("primary_damage"), "Front End")
|
|
|
|
def test_parse_title_for_year_make_model(self) -> None:
|
|
parsed = self.parser._parse_title_for_year_make_model("2014 TOYOTA CAMRY for sale", "")
|
|
self.assertEqual(parsed["year"], "2014")
|
|
self.assertEqual(parsed["make"], "TOYOTA")
|
|
self.assertEqual(parsed["model"], "CAMRY")
|
|
|
|
def test_extract_image_urls_filters_other_vehicle(self) -> None:
|
|
vehicle_url = "https://www.iaai.com/VehicleDetail/45089484~US"
|
|
payloads = [
|
|
{
|
|
"imageUrls": [
|
|
"https://vis.iaai.com/resizer?imageKeys=45089484~SID1&width=845&height=633",
|
|
"https://vis.iaai.com/resizer?imageKeys=99999999~SID2&width=845&height=633",
|
|
]
|
|
}
|
|
]
|
|
urls = self.parser._extract_image_urls(payloads, "", vehicle_url)
|
|
self.assertEqual(len(urls), 1)
|
|
self.assertIn("45089484", urls[0])
|
|
|
|
def test_extract_image_urls_deduplicates_same_url(self) -> None:
|
|
vehicle_url = "https://www.iaai.com/VehicleDetail/45089484~US"
|
|
payloads = [{"imageUrls": [
|
|
"https://vis.iaai.com/resizer?imageKeys=45089484~SID1&width=845&height=633",
|
|
"https://vis.iaai.com/resizer?imageKeys=45089484~SID1&width=845&height=633",
|
|
]}]
|
|
urls = self.parser._extract_image_urls(payloads, "", vehicle_url)
|
|
self.assertEqual(len(urls), 1)
|
|
|
|
def test_dom_hints_detect_captcha_and_antibot(self) -> None:
|
|
hints = self.parser._dom_hints("Please verify you are human. CAPTCHA. Incapsula access denied.")
|
|
self.assertTrue(hints["has_captcha_text"])
|
|
self.assertTrue(hints["has_antibot_text"])
|
|
|
|
def test_access_notes_reflect_antibot_signals(self) -> None:
|
|
summary = {"vin": "", "image_urls": [], "note": "Incapsula access denied. Verify you are human."}
|
|
notes = self.parser._build_access_notes(summary, [])
|
|
self.assertTrue(notes["possible_captcha"])
|
|
self.assertTrue(notes["possible_antibot"])
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|