diff --git a/app/services/subscription_auto_purchase_service.py b/app/services/subscription_auto_purchase_service.py index 3e8390ee..3cccb877 100644 --- a/app/services/subscription_auto_purchase_service.py +++ b/app/services/subscription_auto_purchase_service.py @@ -13,7 +13,7 @@ from sqlalchemy.ext.asyncio import AsyncSession from app.config import settings from app.database.crud.subscription import extend_subscription 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.localization.texts import get_texts from app.services.admin_notification_service import AdminNotificationService @@ -73,6 +73,17 @@ async def _prepare_auto_purchase( ) 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() context = await miniapp_service.build_options(db, user) diff --git a/tests/services/test_subscription_auto_purchase_service.py b/tests/services/test_subscription_auto_purchase_service.py index 123b0cdc..d1a1fd49 100644 --- a/tests/services/test_subscription_auto_purchase_service.py +++ b/tests/services/test_subscription_auto_purchase_service.py @@ -172,6 +172,11 @@ async def test_auto_purchase_saved_cart_after_topup_success(monkeypatch): "app.services.subscription_auto_purchase_service.AdminNotificationService", 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() db_session = AsyncMock(spec=AsyncSession)