1 line
9.5 KiB
JSON
1 line
9.5 KiB
JSON
{"repo": "brucelee1024/aicost", "files": {"backend/tests/test_ai_settings.py": {"30aa790e9e6814bbdab5d8b3fbb71f46e194508a": {"t": 1785746926.2230182, "n": 4208, "h": "f1e3976c5a6c6fcd", "c": "\"\"\"Tests for AI settings management routes and multi-provider config.\"\"\"\n\nimport os\n\n\ndef test_get_ai_settings_returns_defaults(client, monkeypatch):\n \"\"\"GET /api/ai/settings should return default disabled state.\"\"\"\n # Ensure env is clean\n for key in list(os.environ):\n if key.startswith(\"AI_\"):\n monkeypatch.delenv(key, raising=False)\n\n r = client.get(\"/api/ai/settings\")\n assert r.status_code == 200\n body = r.json()\n assert body[\"provider\"] == \"disabled\"\n assert body[\"timeout_seconds\"] == 20.0\n assert body[\"enable_audit_logs\"] is False\n # All providers should be present\n for p in [\"deepseek\", \"qwen\", \"kimi\", \"glm\", \"openai\"]:\n assert p in body[\"providers\"]\n assert \"api_key\" in body[\"providers\"][p]\n assert \"base_url\" in body[\"providers\"][p]\n assert \"model\" in body[\"providers\"][p]\n\n\ndef test_put_ai_settings_persists_and_returns(client, monkeypatch):\n \"\"\"PUT /api/ai/settings should persist config and return updated state.\"\"\"\n for key in list(os.environ):\n if key.startswith(\"AI_\"):\n monkeypatch.delenv(key, raising=False)\n\n payload = {\n \"provider\": \"deepseek\",\n \"timeout_seconds\": 30,\n \"enable_audit_logs\": True,\n \"providers\": {\n \"deepseek\": {\n \"api_key\": \"sk-test-deepseek\",\n \"base_url\": \"https://api.deepseek.com\",\n \"model\": \"deepseek-chat\",\n },\n \"qwen\": {\n \"api_key\": \"sk-test-qwen\",\n \"base_url\": \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n \"model\": \"qwen-plus\",\n },\n \"kimi\": {\"api_key\": \"\", \"base_url\": \"\", \"model\": \"\"},\n \"glm\": {\"api_key\": \"\", \"base_url\": \"\", \"model\": \"\"},\n \"openai\": {\"api_key\": \"\", \"base_url\": \"\", \"model\": \"\"},\n },\n }\n r = client.put(\"/api/ai/settings\", json=payload)\n assert r.status_code == 200\n body = r.json()\n assert body[\"provider\"] == \"deepseek\"\n assert body[\"timeout_seconds\"] == 30.0\n assert body[\"enable_audit_logs\"] is True\n assert body[\"providers\"][\"deepseek\"][\"api_key\"] == \"sk-test-deepseek\"\n assert body[\"providers\"][\"qwen\"][\"api_key\"] == \"sk-test-qwen\"\n\n # Subsequent GET should reflect persisted state\n r2 = client.get(\"/api/ai/settings\")\n assert r2.json()[\"provider\"] == \"deepseek\"\n assert r2.json()[\"providers\"][\"deepseek\"][\"api_key\"] == \"sk-test-deepseek\"\n\n\ndef test_put_ai_settings_rejects_invalid_provider(client):\n \"\"\"PUT with unknown provider should return 400.\"\"\"\n payload = {\n \"provider\": \"nonexistent\",\n \"timeout_seconds\": 20,\n \"enable_audit_logs\": False,\n \"providers\": {\n \"deepseek\": {\"api_key\": \"\", \"base_url\": \"\", \"model\": \"\"},\n \"qwen\": {\"api_key\": \"\", \"base_url\": \"\", \"model\": \"\"},\n \"kimi\": {\"api_key\": \"\", \"base_url\": \"\", \"model\": \"\"},\n \"glm\": {\"api_key\": \"\", \"base_url\": \"\", \"model\": \"\"},\n \"openai\": {\"api_key\": \"\", \"base_url\": \"\", \"model\": \"\"},\n },\n }\n r = client.put(\"/api/ai/settings\", json=payload)\n assert r.status_code == 400\n\n\ndef test_put_ai_settings_switch_provider(client, monkeypatch):\n \"\"\"Switching active provider should reflect in GET.\"\"\"\n for key in list(os.environ):\n if key.startswith(\"AI_\"):\n monkeypatch.delenv(key, raising=False)\n\n base = {\n \"timeout_seconds\": 20,\n \"enable_audit_logs\": False,\n \"providers\": {\n \"deepseek\": {\"api_key\": \"sk-ds\", \"base_url\": \"\", \"model\": \"\"},\n \"qwen\": {\"api_key\": \"sk-qw\", \"base_url\": \"\", \"model\": \"\"},\n \"kimi\": {\"api_key\": \"\", \"base_url\": \"\", \"model\": \"\"},\n \"glm\": {\"api_key\": \"\", \"base_url\": \"\", \"model\": \"\"},\n \"openai\": {\"api_key\": \"\", \"base_url\": \"\", \"model\": \"\"},\n },\n }\n\n # Set deepseek first\n client.put(\"/api/ai/settings\", json={**base, \"provider\": \"deepseek\"})\n assert client.get(\"/api/ai/settings\").json()[\"provider\"] == \"deepseek\"\n\n # Switch to qwen\n client.put(\"/api/ai/settings\", json={**base, \"provider\": \"qwen\"})\n assert client.get(\"/api/ai/settings\").json()[\"provider\"] == \"qwen\"\n"}, "30efd453910ba9d69331d4be516f506bfcfef9d8": {"t": 1785769080.8727872, "n": 4208, "h": "f1e3976c5a6c6fcd", "c": "\"\"\"Tests for AI settings management routes and multi-provider config.\"\"\"\n\nimport os\n\n\ndef test_get_ai_settings_returns_defaults(client, monkeypatch):\n \"\"\"GET /api/ai/settings should return default disabled state.\"\"\"\n # Ensure env is clean\n for key in list(os.environ):\n if key.startswith(\"AI_\"):\n monkeypatch.delenv(key, raising=False)\n\n r = client.get(\"/api/ai/settings\")\n assert r.status_code == 200\n body = r.json()\n assert body[\"provider\"] == \"disabled\"\n assert body[\"timeout_seconds\"] == 20.0\n assert body[\"enable_audit_logs\"] is False\n # All providers should be present\n for p in [\"deepseek\", \"qwen\", \"kimi\", \"glm\", \"openai\"]:\n assert p in body[\"providers\"]\n assert \"api_key\" in body[\"providers\"][p]\n assert \"base_url\" in body[\"providers\"][p]\n assert \"model\" in body[\"providers\"][p]\n\n\ndef test_put_ai_settings_persists_and_returns(client, monkeypatch):\n \"\"\"PUT /api/ai/settings should persist config and return updated state.\"\"\"\n for key in list(os.environ):\n if key.startswith(\"AI_\"):\n monkeypatch.delenv(key, raising=False)\n\n payload = {\n \"provider\": \"deepseek\",\n \"timeout_seconds\": 30,\n \"enable_audit_logs\": True,\n \"providers\": {\n \"deepseek\": {\n \"api_key\": \"sk-test-deepseek\",\n \"base_url\": \"https://api.deepseek.com\",\n \"model\": \"deepseek-chat\",\n },\n \"qwen\": {\n \"api_key\": \"sk-test-qwen\",\n \"base_url\": \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n \"model\": \"qwen-plus\",\n },\n \"kimi\": {\"api_key\": \"\", \"base_url\": \"\", \"model\": \"\"},\n \"glm\": {\"api_key\": \"\", \"base_url\": \"\", \"model\": \"\"},\n \"openai\": {\"api_key\": \"\", \"base_url\": \"\", \"model\": \"\"},\n },\n }\n r = client.put(\"/api/ai/settings\", json=payload)\n assert r.status_code == 200\n body = r.json()\n assert body[\"provider\"] == \"deepseek\"\n assert body[\"timeout_seconds\"] == 30.0\n assert body[\"enable_audit_logs\"] is True\n assert body[\"providers\"][\"deepseek\"][\"api_key\"] == \"sk-test-deepseek\"\n assert body[\"providers\"][\"qwen\"][\"api_key\"] == \"sk-test-qwen\"\n\n # Subsequent GET should reflect persisted state\n r2 = client.get(\"/api/ai/settings\")\n assert r2.json()[\"provider\"] == \"deepseek\"\n assert r2.json()[\"providers\"][\"deepseek\"][\"api_key\"] == \"sk-test-deepseek\"\n\n\ndef test_put_ai_settings_rejects_invalid_provider(client):\n \"\"\"PUT with unknown provider should return 400.\"\"\"\n payload = {\n \"provider\": \"nonexistent\",\n \"timeout_seconds\": 20,\n \"enable_audit_logs\": False,\n \"providers\": {\n \"deepseek\": {\"api_key\": \"\", \"base_url\": \"\", \"model\": \"\"},\n \"qwen\": {\"api_key\": \"\", \"base_url\": \"\", \"model\": \"\"},\n \"kimi\": {\"api_key\": \"\", \"base_url\": \"\", \"model\": \"\"},\n \"glm\": {\"api_key\": \"\", \"base_url\": \"\", \"model\": \"\"},\n \"openai\": {\"api_key\": \"\", \"base_url\": \"\", \"model\": \"\"},\n },\n }\n r = client.put(\"/api/ai/settings\", json=payload)\n assert r.status_code == 400\n\n\ndef test_put_ai_settings_switch_provider(client, monkeypatch):\n \"\"\"Switching active provider should reflect in GET.\"\"\"\n for key in list(os.environ):\n if key.startswith(\"AI_\"):\n monkeypatch.delenv(key, raising=False)\n\n base = {\n \"timeout_seconds\": 20,\n \"enable_audit_logs\": False,\n \"providers\": {\n \"deepseek\": {\"api_key\": \"sk-ds\", \"base_url\": \"\", \"model\": \"\"},\n \"qwen\": {\"api_key\": \"sk-qw\", \"base_url\": \"\", \"model\": \"\"},\n \"kimi\": {\"api_key\": \"\", \"base_url\": \"\", \"model\": \"\"},\n \"glm\": {\"api_key\": \"\", \"base_url\": \"\", \"model\": \"\"},\n \"openai\": {\"api_key\": \"\", \"base_url\": \"\", \"model\": \"\"},\n },\n }\n\n # Set deepseek first\n client.put(\"/api/ai/settings\", json={**base, \"provider\": \"deepseek\"})\n assert client.get(\"/api/ai/settings\").json()[\"provider\"] == \"deepseek\"\n\n # Switch to qwen\n client.put(\"/api/ai/settings\", json={**base, \"provider\": \"qwen\"})\n assert client.get(\"/api/ai/settings\").json()[\"provider\"] == \"qwen\"\n"}}}} |