T5: Dependency Injection — services через composition root

- AssistantService теперь принимает ForecastService в конструкторе
  (раньше создавал new ForecastService() внутри analyze/advice)
- infrastructure/cli/main.py: _build_services() — composition root,
  собирает граф ForecastService, ScenarioService, AssistantService, CurrencyConverter
- Все CLI-команды используют _build_services(model) вместо прямого new
- test_ai.py: обновлён под новый контракт AssistantService

Tests: 67/67 pass.
This commit is contained in:
2026-10-08 16:53:04 +03:00
parent 3f7268d14c
commit 541a76835f
3 changed files with 36 additions and 30 deletions
+5 -10
View File
@@ -1,24 +1,19 @@
from application.forecast import ForecastService
from infrastructure.ai.assistant import AssistantService
from infrastructure.ai.prompts import ADVICE_PROMPT, ANALYZE_PROMPT
class TestAssistantService:
def test_analyze_returns_prompt(self, sample_model):
assistant = AssistantService(sample_model)
forecast_service = ForecastService(sample_model)
assistant = AssistantService(sample_model, forecast_service=forecast_service)
result = assistant.analyze(months=6)
assert "prompt" in result
assert "summary" in result
assert "forecast" in result
assert result["ai_response"] is None
def test_advice_returns_prompt(self, sample_model):
assistant = AssistantService(sample_model)
forecast_service = ForecastService(sample_model)
assistant = AssistantService(sample_model, forecast_service=forecast_service)
result = assistant.advice("Как мне сэкономить?", months=6)
assert "prompt" in result
assert "ai_response" in result
def test_prompt_templates(self):
assert "{model_json}" in ANALYZE_PROMPT
assert "{forecast_json}" in ANALYZE_PROMPT
assert "{model_json}" in ADVICE_PROMPT
assert "{question}" in ADVICE_PROMPT