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