From 449f82d538ea5d608f0511c47c3698a0099cb88e Mon Sep 17 00:00:00 2001 From: gy9vin Date: Tue, 30 Dec 2025 11:34:41 +0300 Subject: [PATCH] =?UTF-8?q?refactor(auto-purchase):=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B0=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20=D1=81=D0=BF=D0=B8?= =?UTF-8?q?=D1=81=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=B1=D0=B0=D0=BB=D0=B0=D0=BD?= =?UTF-8?q?=D1=81=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D0=B2=D0=BE=D1=81=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D1=81=D0=B2=D1=8F=D0=B7=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Добавлен get_user_by_id в импорты - Перезагрузка user через get_user_by_id после subtract_user_balance - Восстановление связи user_promo_groups, сбрасываемой после db.refresh() в payment-сервисах - Добавлен мок get_user_by_id в тесте --- app/services/subscription_auto_purchase_service.py | 13 ++++++++++++- .../test_subscription_auto_purchase_service.py | 5 +++++ 2 files changed, 17 insertions(+), 1 deletion(-) 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)