mirror of
https://github.com/cnlimiter/codex-register.git
synced 2026-09-05 07:26:42 +08:00
feat(register): enhance workspace extraction and phase status reporting
This commit is contained in:
@@ -26,6 +26,36 @@ class FakeEmailService:
|
||||
return self.code
|
||||
|
||||
|
||||
class FakeCookies:
|
||||
def __init__(self, values):
|
||||
self.values = values
|
||||
|
||||
def get(self, name):
|
||||
return self.values.get(name)
|
||||
|
||||
|
||||
class FakeSession:
|
||||
def __init__(self, cookies=None):
|
||||
self.cookies = FakeCookies(cookies or {})
|
||||
self.get_calls = []
|
||||
|
||||
def get(self, *args, **kwargs):
|
||||
self.get_calls.append((args, kwargs))
|
||||
raise AssertionError("unexpected network call")
|
||||
|
||||
|
||||
class FakeResponse:
|
||||
def __init__(self, *, url="", text="", json_payload=None):
|
||||
self.url = url
|
||||
self.text = text
|
||||
self._json_payload = json_payload
|
||||
|
||||
def json(self):
|
||||
if isinstance(self._json_payload, Exception):
|
||||
raise self._json_payload
|
||||
return self._json_payload
|
||||
|
||||
|
||||
def _build_engine(monkeypatch, email_service):
|
||||
monkeypatch.setattr(register_module, "get_settings", lambda: DummySettings())
|
||||
return RegistrationEngine(email_service=email_service)
|
||||
@@ -103,3 +133,42 @@ def test_advance_login_authorization_sets_otp_anchor_before_password_submit(monk
|
||||
assert callback_url is None
|
||||
assert engine._otp_sent_at == 456.0
|
||||
assert seen_anchors == [456.0, 456.0]
|
||||
|
||||
|
||||
def test_get_device_id_reuses_existing_cookie_without_extra_request(monkeypatch):
|
||||
email_service = FakeEmailService(code=None)
|
||||
engine = _build_engine(monkeypatch, email_service)
|
||||
engine.oauth_start = type("OAuthStart", (), {"auth_url": "https://auth.example.test/authorize"})()
|
||||
engine.session = FakeSession(cookies={"oai-did": "did-cached"})
|
||||
|
||||
assert engine._get_device_id() == "did-cached"
|
||||
assert engine.session.get_calls == []
|
||||
|
||||
|
||||
def test_extract_workspace_id_from_response_payload(monkeypatch):
|
||||
email_service = FakeEmailService(code=None)
|
||||
engine = _build_engine(monkeypatch, email_service)
|
||||
response = FakeResponse(
|
||||
url="https://auth.example.test/consent?workspace_id=ws-url",
|
||||
json_payload={
|
||||
"page": {
|
||||
"workspace": {
|
||||
"id": "ws-json",
|
||||
}
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
assert engine._extract_workspace_id_from_response(response=response) == "ws-json"
|
||||
|
||||
|
||||
def test_extract_workspace_id_from_response_text_when_hidden_input_missing(monkeypatch):
|
||||
email_service = FakeEmailService(code=None)
|
||||
engine = _build_engine(monkeypatch, email_service)
|
||||
response = FakeResponse(
|
||||
url="https://auth.example.test/consent",
|
||||
text='<script>window.__NEXT_DATA__={"activeWorkspaceId":"ws-script"}</script>',
|
||||
json_payload=ValueError("not json"),
|
||||
)
|
||||
|
||||
assert engine._extract_workspace_id_from_response(response=response) == "ws-script"
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import asyncio
|
||||
|
||||
from src.web.routes.registration import _create_task_status_callback
|
||||
from src.web.task_manager import task_manager
|
||||
|
||||
|
||||
@@ -38,3 +39,34 @@ def test_update_status_broadcasts_to_registered_websocket():
|
||||
task_manager.unregister_websocket(task_uuid, websocket)
|
||||
|
||||
asyncio.run(run_test())
|
||||
|
||||
|
||||
def test_task_status_callback_broadcasts_phase_fields():
|
||||
async def run_test():
|
||||
task_uuid = "test-status-phase"
|
||||
websocket = FakeWebSocket()
|
||||
|
||||
task_manager.set_loop(asyncio.get_running_loop())
|
||||
task_manager.register_websocket(task_uuid, websocket)
|
||||
|
||||
try:
|
||||
callback = _create_task_status_callback(task_uuid, "tempmail")
|
||||
callback({
|
||||
"phase": "redirect_chain",
|
||||
"phase_detail": "跟随重定向 1/6",
|
||||
"step_index": 14,
|
||||
})
|
||||
|
||||
await asyncio.sleep(0.05)
|
||||
|
||||
assert websocket.messages, "expected a status message to be broadcast"
|
||||
assert websocket.messages[-1]["type"] == "status"
|
||||
assert websocket.messages[-1]["status"] == "running"
|
||||
assert websocket.messages[-1]["email_service"] == "tempmail"
|
||||
assert websocket.messages[-1]["phase"] == "redirect_chain"
|
||||
assert websocket.messages[-1]["phase_detail"] == "跟随重定向 1/6"
|
||||
assert websocket.messages[-1]["step_index"] == 14
|
||||
finally:
|
||||
task_manager.unregister_websocket(task_uuid, websocket)
|
||||
|
||||
asyncio.run(run_test())
|
||||
|
||||
Reference in New Issue
Block a user