import unittest from src.evidence import make_evidence from src.models import SiteSelection from src.safety import find_forbidden_phrases from src.small_model_assistant import build_assistant_brief class SmallModelAssistantTests(unittest.TestCase): def test_template_fallback_is_safe_and_evidence_bound(self): selection = SiteSelection( id="S1", selection_type="pin_radius", coordinate_mode="wgs84", geometry_geojson=None, local_geometry=None, anchor_lat=21.0, anchor_lon=70.0, radius_m=250, area_sqm=196000, perimeter_m=1570, centroid=(21.0, 70.0), bbox=None, unit_source="meters", accuracy_label="pin-radius approximation", limitations=["Pin-radius is approximate."], ) evidence = [ make_evidence( category="Climate", finding="Forecast/current climate was retrieved for site-visit timing.", source_name="Open-Meteo", source_url="https://open-meteo.com/", source_type="public weather API", resolution_or_scope="forecast/current", confidence="medium", limitation="Not long-term climate.", design_implication="Use for site-visit timing.", verification_needed="Check weather locally.", output_label="public_data", ) ] brief = build_assistant_brief( selection=selection, evidence_rows=evidence, warnings=[], project_type="resort", ) self.assertIn("template fallback active", brief) self.assertRegex(brief, r"E\d{3}: Forecast/current climate") self.assertIn("radius-based context analysis", brief) self.assertEqual(find_forbidden_phrases(brief), []) if __name__ == "__main__": unittest.main()