test_paypal_flow.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import unittest
  2. from unittest.mock import patch
  3. import paypal_flow
  4. class _FakeInput:
  5. def __init__(self):
  6. self.filled = []
  7. self.first = self
  8. def fill(self, value):
  9. self.filled.append(value)
  10. class _FakePage:
  11. def __init__(self, url):
  12. self.url = url
  13. self.email_input = _FakeInput()
  14. def wait_for_load_state(self, *_args, **_kwargs):
  15. return None
  16. def wait_for_timeout(self, *_args, **_kwargs):
  17. return None
  18. def locator(self, selector):
  19. if "input#email" in selector:
  20. return self.email_input
  21. raise AssertionError(f"unexpected selector: {selector}")
  22. class EnsureCheckoutwebTests(unittest.TestCase):
  23. def test_pay_url_with_password_still_tries_next_first(self):
  24. page = _FakePage("https://www.paypal.com/pay?token=abc")
  25. with patch("paypal_flow.detect_landing_state", side_effect=[
  26. {
  27. "kind": "login_email_password",
  28. "email_count": 1,
  29. "password_count": 1,
  30. "url": page.url,
  31. },
  32. {
  33. "kind": "checkoutweb",
  34. "email_count": 0,
  35. "password_count": 0,
  36. "url": "https://www.paypal.com/checkoutweb/signup?token=abc",
  37. },
  38. ]), patch("paypal_flow.click_login_next", return_value=True) as click_next, patch(
  39. "paypal_flow.click_create_account", return_value=False
  40. ) as click_create:
  41. result = paypal_flow.ensure_checkoutweb(
  42. page,
  43. fallback_email="trial@example.com",
  44. log=lambda *_: None,
  45. )
  46. self.assertEqual(result, "login")
  47. self.assertEqual(page.email_input.filled, ["trial@example.com"])
  48. click_next.assert_called_once()
  49. click_create.assert_not_called()
  50. def test_pay_url_falls_back_to_create_account_when_next_does_not_enter_checkoutweb(self):
  51. page = _FakePage("https://www.paypal.com/pay?token=abc")
  52. with patch("paypal_flow.detect_landing_state", side_effect=[
  53. {
  54. "kind": "login_email_password",
  55. "email_count": 1,
  56. "password_count": 1,
  57. "url": page.url,
  58. },
  59. {
  60. "kind": "login_email_password",
  61. "email_count": 1,
  62. "password_count": 1,
  63. "url": page.url,
  64. },
  65. ]), patch("paypal_flow.click_login_next", return_value=False) as click_next, patch(
  66. "paypal_flow.click_create_account", return_value=True
  67. ) as click_create, patch("paypal_flow.wait_for_checkoutweb", return_value=True):
  68. result = paypal_flow.ensure_checkoutweb(
  69. page,
  70. fallback_email="trial@example.com",
  71. log=lambda *_: None,
  72. )
  73. self.assertEqual(result, "create")
  74. self.assertEqual(page.email_input.filled, ["trial@example.com"])
  75. click_next.assert_called_once()
  76. click_create.assert_called_once()
  77. if __name__ == "__main__":
  78. unittest.main()