from __future__ import annotations from pino import scraper def test_parse_tgsc_page_falls_back_when_camofox_has_no_data(monkeypatch) -> None: camofox_result = { "boiling_point_k": None, "vapor_pressure_pa": None, "odor_description": "", "error": "blocked", } requests_result = { "boiling_point_k": 449.65, "vapor_pressure_pa": 205.45, "odor_description": "terpene pine", } monkeypatch.setattr(scraper, "parse_tgsc_page_camofox", lambda url: camofox_result) monkeypatch.setattr( scraper, "parse_tgsc_page_requests", lambda url, timeout=30.0: requests_result.copy(), ) result = scraper.parse_tgsc_page("https://example.test/material.html") assert result == { **requests_result, "camofox_error": "blocked", } def test_parse_tgsc_page_returns_camofox_data_without_fallback(monkeypatch) -> None: camofox_result = { "boiling_point_k": 449.65, "vapor_pressure_pa": 205.45, "odor_description": "terpene pine", } monkeypatch.setattr(scraper, "parse_tgsc_page_camofox", lambda url: camofox_result) def fail_requests(url, timeout=30.0): raise AssertionError("requests fallback should not be called") monkeypatch.setattr(scraper, "parse_tgsc_page_requests", fail_requests) assert scraper.parse_tgsc_page("https://example.test/material.html") == camofox_result def test_parse_tgsc_page_can_disable_fallback(monkeypatch) -> None: camofox_result = { "boiling_point_k": None, "vapor_pressure_pa": None, "odor_description": "", "error": "blocked", } monkeypatch.setattr(scraper, "parse_tgsc_page_camofox", lambda url: camofox_result) def fail_requests(url, timeout=30.0): raise AssertionError("requests fallback should not be called") monkeypatch.setattr(scraper, "parse_tgsc_page_requests", fail_requests) assert ( scraper.parse_tgsc_page( "https://example.test/material.html", fallback_to_requests=False, ) == camofox_result )