Spaces:
Paused
Paused
| import unittest | |
| from unittest import mock | |
| from services.register import openai_register | |
| class FakeResponse: | |
| def __init__(self, *, url="", status_code=200, headers=None, history=None, json_data=None, text=""): | |
| self.url = url | |
| self.status_code = status_code | |
| self.headers = headers or {} | |
| self.history = history or [] | |
| self._json_data = json_data if json_data is not None else {} | |
| self.text = text | |
| def json(self): | |
| return self._json_data | |
| class FakeSession: | |
| def __init__(self, authorize_response): | |
| self.authorize_response = authorize_response | |
| self.calls = [] | |
| def request(self, method, url, **kwargs): | |
| self.calls.append((method.upper(), url, kwargs)) | |
| if "/api/accounts/authorize" in url: | |
| return self.authorize_response | |
| if "/api/accounts/password/verify" in url: | |
| raise AssertionError("password verify should not be called when authorize already returned OAuth code") | |
| raise AssertionError(f"unexpected request {method} {url}") | |
| class OpenAIRegisterLoginFlowTests(unittest.TestCase): | |
| def test_extract_oauth_callback_params_from_response_uses_redirect_history_location(self): | |
| response = FakeResponse( | |
| url="https://auth.openai.com/authorize/done", | |
| history=[ | |
| FakeResponse(headers={"Location": "https://platform.openai.com/auth/callback?code=abc123&state=st&scope=openid"}), | |
| ], | |
| ) | |
| params = openai_register.extract_oauth_callback_params_from_response(response) | |
| self.assertEqual(params, {"code": "abc123", "state": "st", "scope": "openid"}) | |
| def test_login_exchange_uses_authorize_callback_without_password_verify(self): | |
| response = FakeResponse(url="https://platform.openai.com/auth/callback?code=abc123&state=st&scope=openid") | |
| session = FakeSession(response) | |
| registrar = openai_register.PlatformRegistrar.__new__(openai_register.PlatformRegistrar) | |
| registrar.session = session | |
| registrar.device_id = "device-1" | |
| expected_tokens = {"access_token": "access", "refresh_token": "refresh", "id_token": "id"} | |
| with ( | |
| mock.patch.object(openai_register, "exchange_oauth_callback_params", return_value=expected_tokens, create=True) as exchange, | |
| mock.patch.object(openai_register, "build_sentinel_token", return_value="sentinel"), | |
| mock.patch.object(openai_register, "step"), | |
| ): | |
| tokens = registrar._login_and_exchange_tokens("user@example.com", "Password1!", {}, 1) | |
| self.assertEqual(tokens, expected_tokens) | |
| exchange.assert_called_once() | |
| self.assertFalse(any("/api/accounts/password/verify" in url for _, url, _ in session.calls)) | |
| def test_login_authorize_does_not_follow_platform_callback_redirect(self): | |
| response = FakeResponse(headers={"Location": "https://platform.openai.com/auth/callback?code=abc123&state=st&scope=openid"}, status_code=302) | |
| session = FakeSession(response) | |
| registrar = openai_register.PlatformRegistrar.__new__(openai_register.PlatformRegistrar) | |
| registrar.session = session | |
| registrar.device_id = "device-1" | |
| expected_tokens = {"access_token": "access", "refresh_token": "refresh", "id_token": "id"} | |
| with ( | |
| mock.patch.object(openai_register, "exchange_oauth_callback_params", return_value=expected_tokens, create=True), | |
| mock.patch.object(openai_register, "build_sentinel_token", return_value="sentinel"), | |
| mock.patch.object(openai_register, "step"), | |
| ): | |
| tokens = registrar._login_and_exchange_tokens("user@example.com", "Password1!", {}, 1) | |
| self.assertEqual(tokens, expected_tokens) | |
| authorize_calls = [call for call in session.calls if "/api/accounts/authorize" in call[1]] | |
| self.assertEqual(len(authorize_calls), 1) | |
| self.assertFalse(authorize_calls[0][2]["allow_redirects"]) | |
| def test_platform_authorize_does_not_follow_platform_callback_redirect(self): | |
| response = FakeResponse(headers={"Location": "https://platform.openai.com/auth/callback?code=abc123&state=st&scope=openid"}, status_code=302) | |
| session = FakeSession(response) | |
| session.cookies = mock.Mock() | |
| registrar = openai_register.PlatformRegistrar.__new__(openai_register.PlatformRegistrar) | |
| registrar.session = session | |
| registrar.device_id = "device-1" | |
| with mock.patch.object(openai_register, "step"): | |
| registrar._platform_authorize("user@example.com", 1) | |
| authorize_calls = [call for call in session.calls if "/api/accounts/authorize" in call[1]] | |
| self.assertEqual(len(authorize_calls), 1) | |
| self.assertFalse(authorize_calls[0][2]["allow_redirects"]) | |
| def test_consent_session_returns_callback_url_without_fetching_platform(self): | |
| class NoNetworkSession: | |
| def get(self, *args, **kwargs): | |
| raise AssertionError("callback URL should be parsed, not fetched") | |
| params = openai_register.extract_oauth_callback_params_from_consent_session( | |
| NoNetworkSession(), | |
| "https://platform.openai.com/auth/callback?code=abc123&state=st&scope=openid", | |
| "device-1", | |
| ) | |
| self.assertEqual(params, {"code": "abc123", "state": "st", "scope": "openid"}) | |
| def test_consent_session_retries_transient_navigation_failure(self): | |
| class ConsentSession: | |
| def __init__(self): | |
| self.calls = 0 | |
| def request(self, method, url, **kwargs): | |
| self.calls += 1 | |
| if self.calls == 1: | |
| raise openai_register.requests.exceptions.ProxyError("proxy closed") | |
| return FakeResponse( | |
| status_code=302, | |
| headers={"Location": "https://platform.openai.com/auth/callback?code=abc123&state=st&scope=openid"}, | |
| url=url, | |
| ) | |
| session = ConsentSession() | |
| with mock.patch.object(openai_register.time, "sleep"): | |
| params = openai_register.extract_oauth_callback_params_from_consent_session(session, "https://auth.openai.com/consent", "device-1") | |
| self.assertEqual(params, {"code": "abc123", "state": "st", "scope": "openid"}) | |
| self.assertEqual(session.calls, 2) | |
| def test_exchange_oauth_callback_params_retries_transient_token_failure(self): | |
| class TokenSession: | |
| def __init__(self): | |
| self.calls = 0 | |
| def request(self, method, url, **kwargs): | |
| self.calls += 1 | |
| if self.calls == 1: | |
| raise openai_register.requests.exceptions.SSLError("unexpected eof") | |
| return FakeResponse( | |
| status_code=200, | |
| json_data={ | |
| "access_token": "header.eyJlbWFpbCI6InVzZXJAZXhhbXBsZS5jb20ifQ.sig", | |
| "refresh_token": "refresh", | |
| "id_token": "header.eyJlbWFpbCI6InVzZXJAZXhhbXBsZS5jb20ifQ.sig", | |
| }, | |
| ) | |
| def close(self): | |
| pass | |
| session = TokenSession() | |
| with ( | |
| mock.patch.object(openai_register, "create_session", return_value=session), | |
| mock.patch.object(openai_register.time, "sleep"), | |
| ): | |
| tokens = openai_register.exchange_oauth_callback_params("verifier", {"code": "abc123"}) | |
| self.assertEqual(tokens["email"], "user@example.com") | |
| self.assertEqual(session.calls, 2) | |
| def test_request_with_local_retry_retries_transient_http_status(self): | |
| class RetrySession: | |
| def __init__(self): | |
| self.calls = 0 | |
| def request(self, method, url, **kwargs): | |
| self.calls += 1 | |
| if self.calls == 1: | |
| return FakeResponse(status_code=502, text="bad gateway") | |
| return FakeResponse(status_code=200) | |
| session = RetrySession() | |
| with mock.patch.object(openai_register.time, "sleep"): | |
| resp, error = openai_register.request_with_local_retry(session, "get", "https://auth.openai.com/x", retry_statuses=(502,)) | |
| self.assertEqual(resp.status_code, 200) | |
| self.assertEqual(error, "") | |
| self.assertEqual(session.calls, 2) | |
| def test_build_sentinel_token_retries_transient_ssl_failure(self): | |
| class SentinelResponse: | |
| status_code = 200 | |
| def json(self): | |
| return {"token": "sentinel-token", "proofofwork": {"required": False}} | |
| class SentinelSession: | |
| def __init__(self): | |
| self.calls = 0 | |
| def post(self, *args, **kwargs): | |
| self.calls += 1 | |
| if self.calls == 1: | |
| raise openai_register.requests.exceptions.SSLError("unexpected eof") | |
| return SentinelResponse() | |
| session = SentinelSession() | |
| with mock.patch.object(openai_register.SentinelTokenGenerator, "generate_requirements_token", return_value="req-token"): | |
| token = openai_register.build_sentinel_token(session, "device-1", "password_verify") | |
| self.assertIn("sentinel-token", token) | |
| self.assertEqual(session.calls, 2) | |
| if __name__ == "__main__": | |
| unittest.main() | |