import unittest from unittest.mock import patch import automation class StripeAmountDecisionTests(unittest.TestCase): def test_trial_eligible_account_continues_paypal_when_amount_is_non_zero(self): decision = automation.decide_paypal_flow_for_amount("$20.00", trial_eligible=True) self.assertEqual(decision["mode"], "paid_retry") self.assertTrue(decision["continue_payment"]) self.assertFalse(decision["is_free_trial"]) def test_non_trial_account_skips_non_free_amount(self): decision = automation.decide_paypal_flow_for_amount("$20.00", trial_eligible=False) self.assertEqual(decision["mode"], "manual_payment_required") self.assertFalse(decision["continue_payment"]) self.assertFalse(decision["is_free_trial"]) def test_zero_amount_is_still_free_trial(self): decision = automation.decide_paypal_flow_for_amount("$0.00", trial_eligible=None) self.assertEqual(decision["mode"], "free_trial") self.assertTrue(decision["continue_payment"]) self.assertTrue(decision["is_free_trial"]) class PayPalSessionHandlingTests(unittest.TestCase): def test_does_not_clear_paypal_session_after_datadome_is_solved(self): class _FakePage: url = "https://www.paypal.com/pay?token=abc" def wait_for_load_state(self, *_args, **_kwargs): return None def wait_for_timeout(self, *_args, **_kwargs): return None ctx = automation.RunContext(token="tok", log=lambda *_: None) with patch("automation._detect_datadome_captcha", side_effect=["captcha", ""]), patch( "automation._wait_for_datadome_solved", return_value=True ), patch("automation._paypal_clear_session") as clear_session, patch( "automation._dump_page" ), patch("paypal_flow.ensure_checkoutweb", return_value="unknown"): with self.assertRaises(automation.PayPalPaymentFailed): automation._paypal_signup_and_pay(ctx, _FakePage()) clear_session.assert_not_called() if __name__ == "__main__": unittest.main()