Spaces:
Running
Running
| """Test that the inference service falls back to a stub when OpenRouter fails.""" | |
| from __future__ import annotations | |
| import asyncio | |
| import json | |
| import sys | |
| from datetime import date | |
| from app.models.tech_stack import DailyWorkInput | |
| from app.services.tech_stack_service import infer_tech_stack | |
| async def _run() -> int: | |
| print("=" * 60) | |
| print(" Stub fallback test (forces OpenRouter failure)") | |
| print("=" * 60) | |
| # Force-fail OpenRouter by pointing at a black hole URL. | |
| from app.core.config import get_settings | |
| settings = get_settings() | |
| real_base = settings.openrouter_base_url | |
| settings.openrouter_base_url = "http://127.0.0.1:1" # always fails | |
| print(f"Temporarily set OPENROUTER_BASE_URL = {settings.openrouter_base_url}") | |
| sample = DailyWorkInput( | |
| raw_text="Залита плита перекрытия в осях А-В / 1-3", | |
| date_from=date(2026, 5, 1), | |
| date_to=date(2026, 5, 15), | |
| axes="А-В / 1-3", | |
| ) | |
| try: | |
| response = await infer_tech_stack(sample) | |
| finally: | |
| settings.openrouter_base_url = real_base | |
| print(f"\n[ok] stub response received") | |
| print(f" request_id : {response.request_id}") | |
| print(f" model_used : {response.tech_stack.model_used}") | |
| print(f" inferred_summary: {response.tech_stack.inferred_summary}") | |
| print(f" steps : {len(response.tech_stack.steps)}") | |
| for s in response.tech_stack.steps: | |
| print(f" - {s.title}") | |
| out_path = "tests/.last_stub.json" | |
| with open(out_path, "w", encoding="utf-8") as f: | |
| json.dump(response.model_dump(mode="json"), f, ensure_ascii=False, indent=2) | |
| print(f"\nFull JSON → {out_path}") | |
| assert response.tech_stack.model_used, "expected a model_used marker" | |
| assert len(response.tech_stack.steps) >= 1, "expected fallback steps" | |
| print( | |
| f"\n✅ PASS — model_used={response.tech_stack.model_used!r}, " | |
| f"steps={len(response.tech_stack.steps)}" | |
| ) | |
| return 0 | |
| if __name__ == "__main__": | |
| sys.exit(asyncio.run(_run())) | |