added proxy support
This commit is contained in:
@@ -5,7 +5,7 @@ from sqlalchemy import create_engine
|
||||
from sqlalchemy.orm import Session, sessionmaker
|
||||
|
||||
from app.db.models import Base, FitnessProfile, FoodLog, User
|
||||
from app.daily.metrics import DayMetricsService, plan_hit
|
||||
from app.daily.metrics import DayMetricsService, plan_hit, signed_balance
|
||||
|
||||
|
||||
class DayMetricsTests(unittest.TestCase):
|
||||
@@ -30,6 +30,13 @@ class DayMetricsTests(unittest.TestCase):
|
||||
)
|
||||
db.commit()
|
||||
|
||||
def test_signed_balance_uses_tdee_not_calorie_target(self) -> None:
|
||||
tdee = 2500.0
|
||||
calorie_target = tdee - 500
|
||||
self.assertEqual(signed_balance({"calories": 2500}, tdee, "lose"), 0)
|
||||
self.assertEqual(signed_balance({"calories": calorie_target}, tdee, "lose"), 500)
|
||||
self.assertEqual(signed_balance({"calories": 2800}, tdee, "gain"), 300)
|
||||
|
||||
def test_plan_hit_lose(self) -> None:
|
||||
self.assertTrue(
|
||||
plan_hit(
|
||||
|
||||
@@ -1,6 +1,14 @@
|
||||
from datetime import date, datetime, timezone
|
||||
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.orm import Session, sessionmaker
|
||||
|
||||
from app.db.models import Base, ChatSession, Message, User
|
||||
from app.homelab.evening_summary import (
|
||||
_fallback_summary,
|
||||
_format_context_block,
|
||||
_parse_llm_payload,
|
||||
collect_day_context,
|
||||
format_evening_notice,
|
||||
)
|
||||
|
||||
@@ -46,3 +54,62 @@ def test_format_evening_notice_text_only():
|
||||
notice = format_evening_notice("Только текст.")
|
||||
assert "Только текст." in notice
|
||||
assert "![day]" not in notice
|
||||
|
||||
|
||||
def test_collect_day_context_includes_chat_excerpt():
|
||||
engine = create_engine("sqlite:///:memory:")
|
||||
Base.metadata.create_all(engine)
|
||||
SessionLocal = sessionmaker(bind=engine)
|
||||
tz = timezone.utc
|
||||
day = date(2026, 7, 3)
|
||||
msg_time = datetime(2026, 7, 3, 14, 30, tzinfo=tz)
|
||||
|
||||
with SessionLocal() as db:
|
||||
user = User(username="u", api_token_hash="x")
|
||||
db.add(user)
|
||||
db.commit()
|
||||
db.refresh(user)
|
||||
|
||||
session = ChatSession(user_id=user.id, title="Болею")
|
||||
db.add(session)
|
||||
db.commit()
|
||||
db.refresh(session)
|
||||
|
||||
db.add_all(
|
||||
[
|
||||
Message(
|
||||
session_id=session.id,
|
||||
role="user",
|
||||
content="Сегодня болею, температура, работать не могу",
|
||||
created_at=msg_time,
|
||||
),
|
||||
Message(
|
||||
session_id=session.id,
|
||||
role="assistant",
|
||||
content="Отдыхай, поправляйся",
|
||||
created_at=msg_time,
|
||||
),
|
||||
]
|
||||
)
|
||||
db.commit()
|
||||
|
||||
ctx = collect_day_context(db, user.id, day, tz)
|
||||
|
||||
assert "болею" in ctx["chat_excerpt"].lower()
|
||||
block = _format_context_block(ctx)
|
||||
assert "Последний чат за день" in block
|
||||
assert "болею" in block.lower()
|
||||
|
||||
|
||||
def test_fallback_summary_uses_chat_context():
|
||||
ctx = {
|
||||
"pomodoro_sessions": 0,
|
||||
"has_fitness_data": False,
|
||||
"calories": 0,
|
||||
"calorie_target": 2000,
|
||||
"workouts_count": 0,
|
||||
"completed_reminders": [],
|
||||
"chat_excerpt": "Пользователь: Сегодня болею и лежу дома",
|
||||
}
|
||||
text, _scene = _fallback_summary(ctx)
|
||||
assert "болею" in text.lower() or "В чате" in text
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
import unittest
|
||||
|
||||
import httpx
|
||||
|
||||
from app.llm.http_client import _mask_proxy_url, build_openrouter_http_client
|
||||
|
||||
|
||||
class LlmProxyTests(unittest.TestCase):
|
||||
def test_build_client_without_proxy(self) -> None:
|
||||
self.assertIsNone(build_openrouter_http_client(""))
|
||||
self.assertIsNone(build_openrouter_http_client(" "))
|
||||
|
||||
def test_build_client_with_proxy(self) -> None:
|
||||
client = build_openrouter_http_client("socks5://127.0.0.1:1080")
|
||||
self.assertIsInstance(client, httpx.AsyncClient)
|
||||
|
||||
def test_mask_proxy_url(self) -> None:
|
||||
self.assertEqual(
|
||||
_mask_proxy_url("socks5://user:secret@proxy.local:1080"),
|
||||
"socks5://***@proxy.local:1080",
|
||||
)
|
||||
self.assertEqual(
|
||||
_mask_proxy_url("socks5://127.0.0.1:1080"),
|
||||
"socks5://127.0.0.1:1080",
|
||||
)
|
||||
Reference in New Issue
Block a user