diff --git a/app/handlers/subscription/autopay.py b/app/handlers/subscription/autopay.py index dc57dd75..7921bb1f 100644 --- a/app/handlers/subscription/autopay.py +++ b/app/handlers/subscription/autopay.py @@ -56,6 +56,7 @@ from app.services.subscription_checkout_service import ( should_offer_checkout_resume, ) from app.services.subscription_service import SubscriptionService +from app.services.user_cart_service import user_cart_service from app.utils.miniapp_buttons import build_miniapp_or_callback_button from app.services.promo_offer_service import promo_offer_service from app.states import SubscriptionStates @@ -259,6 +260,9 @@ async def handle_subscription_cancel( await state.clear() await clear_subscription_checkout_draft(db_user.id) + # Удаляем сохраненную корзину, чтобы не показывать кнопку возврата + await user_cart_service.delete_user_cart(db_user.id) + from app.handlers.menu import show_main_menu await show_main_menu(callback, db_user, db) diff --git a/tests/test_subscription_cart_integration.py b/tests/test_subscription_cart_integration.py index 245de491..eb65f2bf 100644 --- a/tests/test_subscription_cart_integration.py +++ b/tests/test_subscription_cart_integration.py @@ -4,6 +4,7 @@ from aiogram.fsm.context import FSMContext from aiogram.types import CallbackQuery, User as TgUser, Message from sqlalchemy.ext.asyncio import AsyncSession from app.handlers.subscription.purchase import save_cart_and_redirect_to_topup, return_to_saved_cart, clear_saved_cart +from app.handlers.subscription.autopay import handle_subscription_cancel from app.database.models import User, Subscription @pytest.fixture @@ -207,4 +208,26 @@ async def test_clear_saved_cart(mock_callback_query, mock_state, mock_user, mock mock_state.clear.assert_called_once() # Проверяем, что вызван answer - mock_callback_query.answer.assert_called_once() \ No newline at end of file + mock_callback_query.answer.assert_called_once() + +@pytest.mark.asyncio +async def test_handle_subscription_cancel_clears_saved_cart(mock_callback_query, mock_state, mock_user, mock_db): + """Отмена покупки должна очищать сохраненную корзину""" + mock_clear_draft = AsyncMock() + mock_show_main_menu = AsyncMock() + + with patch('app.handlers.subscription.autopay.user_cart_service') as mock_cart_service, \ + patch('app.handlers.subscription.autopay.clear_subscription_checkout_draft', new=mock_clear_draft), \ + patch('app.localization.texts.get_texts', return_value=MagicMock()) as _, \ + patch('app.handlers.menu.show_main_menu', new=mock_show_main_menu): + + mock_cart_service.delete_user_cart = AsyncMock(return_value=True) + + await handle_subscription_cancel(mock_callback_query, mock_state, mock_user, mock_db) + + mock_state.clear.assert_called_once() + mock_clear_draft.assert_awaited_once_with(mock_user.id) + mock_cart_service.delete_user_cart.assert_awaited_once_with(mock_user.id) + mock_show_main_menu.assert_awaited_once_with(mock_callback_query, mock_user, mock_db) + mock_callback_query.answer.assert_called_once_with("❌ Покупка отменена") +