refactor(auto-purchase): перезагрузка пользователя после списания баланса для восстановления связей

- Добавлен get_user_by_id в импорты
- Перезагрузка user через get_user_by_id после subtract_user_balance
- Восстановление связи user_promo_groups, сбрасываемой после db.refresh() в payment-сервисах
- Добавлен мок get_user_by_id в тесте
This commit is contained in:
gy9vin
2025-12-30 11:34:41 +03:00
parent 22129ecbec
commit 449f82d538
2 changed files with 17 additions and 1 deletions
@@ -13,7 +13,7 @@ from sqlalchemy.ext.asyncio import AsyncSession
from app.config import settings from app.config import settings
from app.database.crud.subscription import extend_subscription from app.database.crud.subscription import extend_subscription
from app.database.crud.transaction import create_transaction from app.database.crud.transaction import create_transaction
from app.database.crud.user import subtract_user_balance from app.database.crud.user import get_user_by_id, subtract_user_balance
from app.database.models import Subscription, TransactionType, User from app.database.models import Subscription, TransactionType, User
from app.localization.texts import get_texts from app.localization.texts import get_texts
from app.services.admin_notification_service import AdminNotificationService from app.services.admin_notification_service import AdminNotificationService
@@ -73,6 +73,17 @@ async def _prepare_auto_purchase(
) )
return None return None
# Перезагружаем user с нужными связями (user_promo_groups),
# т.к. после db.refresh() в payment-сервисах связи сбрасываются
fresh_user = await get_user_by_id(db, user.id)
if not fresh_user:
logger.warning(
"🔁 Автопокупка: не удалось перезагрузить пользователя %s",
user.telegram_id,
)
return None
user = fresh_user
miniapp_service = MiniAppSubscriptionPurchaseService() miniapp_service = MiniAppSubscriptionPurchaseService()
context = await miniapp_service.build_options(db, user) context = await miniapp_service.build_options(db, user)
@@ -172,6 +172,11 @@ async def test_auto_purchase_saved_cart_after_topup_success(monkeypatch):
"app.services.subscription_auto_purchase_service.AdminNotificationService", "app.services.subscription_auto_purchase_service.AdminNotificationService",
lambda bot: admin_service_mock, lambda bot: admin_service_mock,
) )
# Мокаем get_user_by_id чтобы вернуть того же user
monkeypatch.setattr(
"app.services.subscription_auto_purchase_service.get_user_by_id",
AsyncMock(return_value=user),
)
bot = AsyncMock() bot = AsyncMock()
db_session = AsyncMock(spec=AsyncSession) db_session = AsyncMock(spec=AsyncSession)