fix(subscription): process zero-day one-star payment
This commit is contained in:
1 parent
0dc54a26b9
commit
dc2ec6344b
6 files changed
+47
-31
No files matched your search
@@ -256,7 +256,7 @@ class ModeRoutingTests(unittest.IsolatedAsyncioTestCase):
|
||||
self.assertEqual(len(message.answers), 1)
|
||||
self.assertEqual(message.answers[0][0], "Выберите срок подписки")
|
||||
labels = [button.text for row in message.answers[0][1]["reply_markup"].inline_keyboard for button in row]
|
||||
self.assertEqual(labels, ["0 дней — 0 ⭐ (тест)", "1 день — 15 ⭐", "10 дней — 150 ⭐", "30 дней — 450 ⭐"])
|
||||
self.assertEqual(labels, ["0 дней — 1 ⭐", "1 день — 15 ⭐", "10 дней — 150 ⭐", "30 дней — 450 ⭐"])
|
||||
|
||||
async def test_subscription_action_button_is_rejected_outside_subscription_mode(self):
|
||||
message = _StubMessage(keyboards.RENEW_SUBSCRIPTION_BUTTON)
|
||||
@@ -278,7 +278,7 @@ class ModeRoutingTests(unittest.IsolatedAsyncioTestCase):
|
||||
self.assertEqual(len(message_bot.mock_calls), 2)
|
||||
sent = message_bot.mock_calls[-1].args[0]
|
||||
self.assertEqual(sent.text, "Выберите срок подписки")
|
||||
self.assertEqual([b.text for row in sent.reply_markup.inline_keyboard for b in row], ["0 дней — 0 ⭐ (тест)", "1 день — 15 ⭐", "10 дней — 150 ⭐", "30 дней — 450 ⭐"])
|
||||
self.assertEqual([b.text for row in sent.reply_markup.inline_keyboard for b in row], ["0 дней — 1 ⭐", "1 день — 15 ⭐", "10 дней — 150 ⭐", "30 дней — 450 ⭐"])
|
||||
|
||||
async def test_idea_command_generates_only_in_generation_mode(self):
|
||||
message = _StubMessage("/idea")
|
||||
|
||||
+26
-7
@@ -83,6 +83,16 @@ class PreCheckoutTests(unittest.IsolatedAsyncioTestCase):
|
||||
await payments.handle_pre_checkout(query)
|
||||
query.answer.assert_awaited_once_with(ok=True)
|
||||
|
||||
async def test_accepts_valid_zero_day_one_star_invoice(self):
|
||||
query = self._query(amount=1, payload="sub:0:20261001120000")
|
||||
await payments.handle_pre_checkout(query)
|
||||
query.answer.assert_awaited_once_with(ok=True)
|
||||
|
||||
async def test_rejects_zero_day_invoice_with_wrong_amount(self):
|
||||
query = self._query(amount=0, payload="sub:0:20261001120000")
|
||||
await payments.handle_pre_checkout(query)
|
||||
self.assertFalse(query.answer.await_args.kwargs["ok"])
|
||||
|
||||
async def test_rejects_wrong_amount(self):
|
||||
query = self._query(amount=1)
|
||||
await payments.handle_pre_checkout(query)
|
||||
@@ -230,13 +240,7 @@ class SubscribeCommandTests(unittest.IsolatedAsyncioTestCase):
|
||||
self.assertEqual(markup.inline_keyboard[0][0].text, "🧪 Оплатил (dev, 10 дн.)")
|
||||
self.assertEqual(markup.inline_keyboard[0][0].callback_data, "dev_paid:42:10")
|
||||
|
||||
async def test_zero_star_plan_is_present_and_probes_one_star_invoice(self):
|
||||
from pathlib import Path
|
||||
source = Path(bot.__file__).read_text(encoding="utf-8")
|
||||
body = source.split("async def _send_zero_star_invoice")[1].split("\n\nasync def _send_subscription_invoice")[0]
|
||||
self.assertIn("amount=1", body)
|
||||
self.assertNotIn("activate_subscription", body)
|
||||
|
||||
async def test_zero_day_plan_is_present_and_does_not_activate_in_dev_mode(self):
|
||||
callback = AsyncMock()
|
||||
callback.data = "dev_paid:42:0"
|
||||
callback.from_user = SimpleNamespace(id=42)
|
||||
@@ -248,6 +252,21 @@ class SubscribeCommandTests(unittest.IsolatedAsyncioTestCase):
|
||||
to_thread.assert_not_awaited()
|
||||
callback.answer.assert_awaited_once_with("Неизвестный срок подписки.", show_alert=True)
|
||||
|
||||
async def test_zero_day_plan_is_a_one_star_invoice_without_access_grant(self):
|
||||
self.assertEqual(payments.plan_for_payload("sub:0:20261001120000"), (0, 1))
|
||||
|
||||
message = _paid_message(amount=1, payload="sub:0:20261001120000")
|
||||
self.db = _db()
|
||||
with (
|
||||
patch.dict(os.environ, {"BOT_DB_PATH": self.db}),
|
||||
patch.object(payments.asyncio, "to_thread", new=_direct_thread_mock()),
|
||||
patch.object(payments, "activate_subscription_days") as activate,
|
||||
):
|
||||
await payments.handle_successful_payment(message)
|
||||
activate.assert_not_called()
|
||||
self.assertTrue(payments.payment_recorded("charge1", self.db))
|
||||
self.assertIn("Срок подписки не изменён", message.answers[0])
|
||||
|
||||
async def test_dev_confirmation_activates_selected_term_and_replies_with_status(self):
|
||||
callback = AsyncMock()
|
||||
callback.data = "dev_paid:42:10"
|
||||
|
||||
Reference in new issue
Block a user