|
|
@@ -18,6 +18,64 @@ class CallbackUrlTests(unittest.TestCase):
|
|
|
|
|
|
|
|
|
class FetchOauthUrlTests(unittest.TestCase):
|
|
|
+ def test_stops_retrying_when_management_login_stays_on_login_page(self):
|
|
|
+ import cpa_oauth
|
|
|
+
|
|
|
+ class _FakeLocator:
|
|
|
+ def __init__(self, page, selector):
|
|
|
+ self.page = page
|
|
|
+ self.selector = selector
|
|
|
+
|
|
|
+ def count(self):
|
|
|
+ if "password" in self.selector:
|
|
|
+ return 1
|
|
|
+ if 'has-text("Login")' in self.selector:
|
|
|
+ return 1
|
|
|
+ return 0
|
|
|
+
|
|
|
+ def nth(self, _idx):
|
|
|
+ return self
|
|
|
+
|
|
|
+ def is_visible(self):
|
|
|
+ return True
|
|
|
+
|
|
|
+ def is_enabled(self):
|
|
|
+ return True
|
|
|
+
|
|
|
+ def fill(self, value):
|
|
|
+ self.page.filled.append((self.selector, value))
|
|
|
+
|
|
|
+ def click(self, **_kwargs):
|
|
|
+ self.page.clicked.append(self.selector)
|
|
|
+
|
|
|
+ class _FakePage:
|
|
|
+ def __init__(self):
|
|
|
+ self.url = ""
|
|
|
+ self.filled = []
|
|
|
+ self.clicked = []
|
|
|
+
|
|
|
+ def goto(self, url, **_kwargs):
|
|
|
+ self.url = url.rsplit("#", 1)[0] + "#/login"
|
|
|
+
|
|
|
+ def wait_for_timeout(self, *_args, **_kwargs):
|
|
|
+ pass
|
|
|
+
|
|
|
+ def locator(self, selector):
|
|
|
+ return _FakeLocator(self, selector)
|
|
|
+
|
|
|
+ page = _FakePage()
|
|
|
+
|
|
|
+ with self.assertRaisesRegex(RuntimeError, "CPA 管理登录失败"):
|
|
|
+ cpa_oauth.fetch_cpa_oauth_url(
|
|
|
+ page,
|
|
|
+ cpa_url="https://cpa.example/management.html#/oauth",
|
|
|
+ management_key="bad-key",
|
|
|
+ log=lambda *_: None,
|
|
|
+ timeout_sec=5,
|
|
|
+ )
|
|
|
+
|
|
|
+ self.assertLessEqual(len(page.clicked), 3)
|
|
|
+
|
|
|
def test_waits_for_oauth_panel_after_management_login(self):
|
|
|
import cpa_oauth
|
|
|
|