import unittest from unittest.mock import patch import paypal_flow class _FakeInput: def __init__(self): self.filled = [] self.first = self def fill(self, value): self.filled.append(value) class _FakePage: def __init__(self, url): self.url = url self.email_input = _FakeInput() def wait_for_load_state(self, *_args, **_kwargs): return None def wait_for_timeout(self, *_args, **_kwargs): return None def locator(self, selector): if "input#email" in selector: return self.email_input raise AssertionError(f"unexpected selector: {selector}") class EnsureCheckoutwebTests(unittest.TestCase): def test_pay_url_with_password_still_tries_next_first(self): page = _FakePage("https://www.paypal.com/pay?token=abc") with patch("paypal_flow.detect_landing_state", side_effect=[ { "kind": "login_email_password", "email_count": 1, "password_count": 1, "url": page.url, }, { "kind": "checkoutweb", "email_count": 0, "password_count": 0, "url": "https://www.paypal.com/checkoutweb/signup?token=abc", }, ]), patch("paypal_flow.click_login_next", return_value=True) as click_next, patch( "paypal_flow.click_create_account", return_value=False ) as click_create: result = paypal_flow.ensure_checkoutweb( page, fallback_email="trial@example.com", log=lambda *_: None, ) self.assertEqual(result, "login") self.assertEqual(page.email_input.filled, ["trial@example.com"]) click_next.assert_called_once() click_create.assert_not_called() def test_pay_url_falls_back_to_create_account_when_next_does_not_enter_checkoutweb(self): page = _FakePage("https://www.paypal.com/pay?token=abc") with patch("paypal_flow.detect_landing_state", side_effect=[ { "kind": "login_email_password", "email_count": 1, "password_count": 1, "url": page.url, }, { "kind": "login_email_password", "email_count": 1, "password_count": 1, "url": page.url, }, ]), patch("paypal_flow.click_login_next", return_value=False) as click_next, patch( "paypal_flow.click_create_account", return_value=True ) as click_create, patch("paypal_flow.wait_for_checkoutweb", return_value=True): result = paypal_flow.ensure_checkoutweb( page, fallback_email="trial@example.com", log=lambda *_: None, ) self.assertEqual(result, "create") self.assertEqual(page.email_input.filled, ["trial@example.com"]) click_next.assert_called_once() click_create.assert_called_once() if __name__ == "__main__": unittest.main()