test_oauth.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import base64
  2. import json
  3. from platforms.chatgpt.oauth import OAuthManager, generate_oauth_url
  4. def _jwt_payload(payload: dict[str, object]) -> str:
  5. raw = json.dumps(payload, separators=(",", ":")).encode("utf-8")
  6. encoded = base64.urlsafe_b64encode(raw).decode("ascii").rstrip("=")
  7. return f"header.{encoded}.sig"
  8. def test_generate_oauth_url_contains_state_and_verifier() -> None:
  9. result = generate_oauth_url()
  10. assert result.auth_url.startswith("https://")
  11. assert result.state
  12. assert result.code_verifier
  13. def test_handle_callback_extracts_token_fields(monkeypatch) -> None:
  14. id_token = _jwt_payload(
  15. {
  16. "email": "oauth@example.com",
  17. "https://api.openai.com/auth": {"chatgpt_account_id": "acct-123"},
  18. }
  19. )
  20. def fake_post_form(url, data, timeout=30, proxy_url=None): # type: ignore[no-untyped-def]
  21. del url, data, timeout, proxy_url
  22. return {
  23. "access_token": "access-token",
  24. "refresh_token": "refresh-token",
  25. "id_token": id_token,
  26. "expires_in": 3600,
  27. }
  28. monkeypatch.setattr("platforms.chatgpt.oauth._post_form", fake_post_form)
  29. result = OAuthManager().handle_callback(
  30. callback_url="http://localhost/callback?code=abc&state=demo-state",
  31. expected_state="demo-state",
  32. code_verifier="demo-verifier",
  33. )
  34. assert result["email"] == "oauth@example.com"
  35. assert result["account_id"] == "acct-123"
  36. assert result["access_token"] == "access-token"
  37. assert result["refresh_token"] == "refresh-token"