개선관리 요구사항과 Google 로그인을 완료

This commit is contained in:
Yun Chan 2026-08-28 16:07:09 +09:00
parent cc0a15b7c6
commit 2a39636163
112 changed files with 10166 additions and 527 deletions

View file

@ -297,6 +297,75 @@ class GatewayAuthenticationTest(unittest.TestCase):
self.assertEqual(async_client_cls.call_args.kwargs["headers"], {})
class EngineClientReadinessTest(unittest.IsolatedAsyncioTestCase):
@staticmethod
def _response(status_code, payload):
return engine_client.httpx.Response(
status_code,
json=payload,
request=engine_client.httpx.Request("GET", "http://127.0.0.1:9099/ready"),
)
async def test_health_fails_when_dedicated_live_client_provider_is_unready(self):
client = engine_client.EngineClient("http://127.0.0.1:9099")
client.engine_mode = "agy_cli"
client.default_model = "gemini-3.6-flash-high"
client.default_reasoning_effort = "high"
client.live_client_provider = "claude_cli"
client._client = AsyncMock()
client._client.get = AsyncMock(
side_effect=[
self._response(200, {"ok": True, "detail": "agy ready"}),
self._response(503, {"ok": False, "detail": "claude login required"}),
]
)
detail = await client.health_detail()
self.assertFalse(detail["ok"])
self.assertEqual(detail["default_engine"]["provider"], "agy_cli")
self.assertTrue(detail["default_engine"]["ok"])
self.assertEqual(detail["live_client_engine"]["provider"], "claude_cli")
self.assertFalse(detail["live_client_engine"]["ok"])
self.assertIn("실시간 내담자 공급자 claude_cli", detail["detail"])
calls = client._client.get.await_args_list
self.assertEqual(calls[0].kwargs["params"]["provider"], "agy_cli")
self.assertEqual(calls[0].kwargs["params"]["model"], "gemini-3.6-flash-high")
self.assertEqual(calls[1].kwargs["params"], {"provider": "claude_cli"})
async def test_health_reuses_one_probe_when_live_and_default_provider_match(self):
client = engine_client.EngineClient("http://127.0.0.1:9099")
client.engine_mode = "claude_cli"
client.live_client_provider = "claude_cli"
client._client = AsyncMock()
client._client.get = AsyncMock(
return_value=self._response(200, {"ok": True, "detail": "ready"})
)
detail = await client.health_detail()
self.assertTrue(detail["ok"])
client._client.get.assert_awaited_once()
async def test_gateway_liveness_does_not_replace_provider_readiness(self):
client = engine_client.EngineClient("http://127.0.0.1:9099")
client.engine_mode = "claude_cli"
client.live_client_provider = "claude_cli"
client._client = AsyncMock()
client._client.get = AsyncMock(
side_effect=[
self._response(404, {"detail": "missing"}),
self._response(200, {"status": "ok"}),
]
)
detail = await client.health_detail()
self.assertFalse(detail["ok"])
self.assertIn("공급자 준비상태 엔드포인트", detail["detail"])
self.assertEqual(client._client.get.await_count, 2)
class GatewayModelTest(unittest.TestCase):
def test_contract_owns_gateway_default_model_sentinel(self):
self.assertEqual(contract.ENGINE_GATEWAY_DEFAULT_MODEL_SENTINEL, "gateway-default")