from __future__ import annotations import unittest from dubizzle_scraper.core.utils import deep_find_key from dubizzle_scraper.core.config import parse_listing_segments, _AUTO_YEAR_SPLITS class TestDeepFindKey(unittest.TestCase): def test_finds_nested_and_respects_depth(self) -> None: payload = { "root": { "target": "a", "nested": [{"target": "b"}, {"x": 1}], } } self.assertEqual(deep_find_key(payload, {"target"}), ["a", "b"]) deep_payload = {"l1": {"l2": {"l3": {"target": "value"}}}} self.assertEqual(deep_find_key(deep_payload, {"target"}, max_depth=2), []) self.assertEqual(deep_find_key(deep_payload, {"target"}, max_depth=8), ["value"]) class TestParseListingSegments(unittest.TestCase): def test_empty_and_invalid_return_empty(self) -> None: self.assertEqual(parse_listing_segments(""), []) self.assertEqual(parse_listing_segments(" "), []) self.assertEqual(parse_listing_segments("invalid"), []) def test_auto_segments_complete_coverage(self) -> None: """auto: все годовые диапазоны покрыты, без дыр и без make-фильтра.""" segs = parse_listing_segments("auto") self.assertEqual(len(segs), len(_AUTO_YEAR_SPLITS)) self.assertEqual( [(s["year_min"], s["year_max"]) for s in segs], list(_AUTO_YEAR_SPLITS), ) self.assertTrue(all(s["make"] is None for s in segs)) # Годовые диапазоны покрывают 1950-2027. years = set() for yr_min, yr_max in _AUTO_YEAR_SPLITS: years.update(range(yr_min, yr_max + 1)) for year in range(1950, 2027): self.assertIn(year, years) def test_json_input_formats(self) -> None: # Массив строк. segs = parse_listing_segments('["toyota", "ford"]') self.assertEqual(len(segs), 2) self.assertEqual(segs[0]["make"], "TOYOTA") # Массив объектов с годами. segs = parse_listing_segments('[{"make":"BMW","year_min":2020,"year_max":2025}]') self.assertEqual(segs[0]["make"], "BMW") self.assertEqual(segs[0]["year_min"], 2020) self.assertEqual(segs[0]["year_max"], 2025) if __name__ == "__main__": unittest.main()