adobe-to-docusign-migrator/tests/test_api_auth.py

93 lines
3.2 KiB
Python

"""
tests/test_api_auth.py
----------------------
Tests for /api/auth/* endpoints.
All external OAuth calls are mocked with respx.
"""
import pytest
import respx
import httpx
from fastapi.testclient import TestClient
from web.app import app
client = TestClient(app, raise_server_exceptions=True)
def test_status_unauthenticated():
"""Fresh session → both platforms disconnected."""
resp = client.get("/api/auth/status", cookies={})
assert resp.status_code == 200
data = resp.json()
assert data["adobe"] is False
assert data["docusign"] is False
@respx.mock
def test_adobe_callback_stores_token():
"""Successful Adobe OAuth callback → session has adobe_access_token."""
respx.post("https://api.eu2.adobesign.com/oauth/v2/token").mock(
return_value=httpx.Response(200, json={
"access_token": "adobe-test-token",
"refresh_token": "adobe-refresh",
})
)
resp = client.get("/api/auth/adobe/callback?code=authcode123", follow_redirects=False)
# Should redirect to /
assert resp.status_code in (302, 307)
# Session cookie should now contain the token
session_cookie = resp.cookies.get("migrator_session")
assert session_cookie is not None
# Follow up with status check using the same session cookie
status_resp = client.get("/api/auth/status", cookies={"migrator_session": session_cookie})
assert status_resp.json()["adobe"] is True
@respx.mock
def test_docusign_callback_stores_token():
"""Successful DocuSign OAuth callback → session has docusign_access_token."""
from web.config import settings
respx.post(f"https://{settings.docusign_auth_server}/oauth/token").mock(
return_value=httpx.Response(200, json={
"access_token": "ds-test-token",
"refresh_token": "ds-refresh",
})
)
resp = client.get("/api/auth/docusign/callback?code=dscode123", follow_redirects=False)
assert resp.status_code in (302, 307)
session_cookie = resp.cookies.get("migrator_session")
assert session_cookie is not None
status_resp = client.get("/api/auth/status", cookies={"migrator_session": session_cookie})
assert status_resp.json()["docusign"] is True
@respx.mock
def test_disconnect_clears_token():
"""After disconnect, status shows platform as disconnected."""
# First connect Adobe
respx.post("https://api.eu2.adobesign.com/oauth/v2/token").mock(
return_value=httpx.Response(200, json={"access_token": "tok", "refresh_token": "ref"})
)
connect_resp = client.get("/api/auth/adobe/callback?code=abc", follow_redirects=False)
session_cookie = connect_resp.cookies["migrator_session"]
# Verify connected
status_resp = client.get("/api/auth/status", cookies={"migrator_session": session_cookie})
assert status_resp.json()["adobe"] is True
# Disconnect
disc_resp = client.get("/api/auth/adobe/disconnect", cookies={"migrator_session": session_cookie})
assert disc_resp.status_code == 200
new_cookie = disc_resp.cookies.get("migrator_session", session_cookie)
# Verify disconnected
status_resp2 = client.get("/api/auth/status", cookies={"migrator_session": new_cookie})
assert status_resp2.json()["adobe"] is False