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:
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user