169 lines
4.5 KiB
Python
169 lines
4.5 KiB
Python
"""Tests for settings, prompts, audit log, and config endpoints."""
|
|
import pytest
|
|
|
|
|
|
@pytest.mark.anyio
|
|
async def test_get_setting(client, admin_headers):
|
|
r = await client.get("/api/settings/auth_mode", headers=admin_headers)
|
|
assert r.status_code == 200
|
|
body = r.json()
|
|
assert "key" in body
|
|
assert "value" in body
|
|
|
|
|
|
@pytest.mark.anyio
|
|
async def test_put_setting(client, admin_headers):
|
|
r = await client.put(
|
|
"/api/settings/test_key",
|
|
json={"value": "test_value"},
|
|
headers=admin_headers,
|
|
)
|
|
assert r.status_code == 200
|
|
|
|
|
|
@pytest.mark.anyio
|
|
async def test_put_setting_non_admin(client, user_headers):
|
|
r = await client.put(
|
|
"/api/settings/test_key",
|
|
json={"value": "hack"},
|
|
headers=user_headers,
|
|
)
|
|
assert r.status_code == 403
|
|
|
|
|
|
@pytest.mark.anyio
|
|
async def test_sensitive_setting_blocked(client, user_headers):
|
|
r = await client.get("/api/settings/oidc_client_secret", headers=user_headers)
|
|
assert r.status_code == 403
|
|
|
|
|
|
@pytest.mark.anyio
|
|
async def test_sensitive_setting_admin(client, admin_headers):
|
|
r = await client.get("/api/settings/oidc_client_secret", headers=admin_headers)
|
|
assert r.status_code == 200
|
|
|
|
|
|
@pytest.mark.anyio
|
|
async def test_timezone_options(client, admin_headers):
|
|
r = await client.get("/api/settings/timezone/options", headers=admin_headers)
|
|
assert r.status_code == 200
|
|
body = r.json()
|
|
assert "timezones" in body
|
|
assert isinstance(body["timezones"], list)
|
|
|
|
|
|
@pytest.mark.anyio
|
|
async def test_get_system_prompts(client, admin_headers):
|
|
r = await client.get("/api/prompts/chat", headers=admin_headers)
|
|
assert r.status_code == 200
|
|
assert isinstance(r.json(), list)
|
|
|
|
|
|
@pytest.mark.anyio
|
|
async def test_create_system_prompt(client, admin_headers):
|
|
r = await client.post(
|
|
"/api/prompts",
|
|
json={
|
|
"agent": "chat",
|
|
"name": "test",
|
|
"content": "You are a test",
|
|
"is_active": False,
|
|
},
|
|
headers=admin_headers,
|
|
)
|
|
assert r.status_code == 200
|
|
|
|
|
|
@pytest.mark.anyio
|
|
async def test_update_system_prompt(client, admin_headers):
|
|
# Create a prompt first
|
|
r = await client.post(
|
|
"/api/prompts",
|
|
json={
|
|
"agent": "chat",
|
|
"name": "to_update",
|
|
"content": "original",
|
|
"is_active": False,
|
|
},
|
|
headers=admin_headers,
|
|
)
|
|
assert r.status_code == 200
|
|
pid = r.json().get("id")
|
|
assert pid is not None
|
|
|
|
r2 = await client.put(
|
|
f"/api/prompts/{pid}",
|
|
json={"content": "updated"},
|
|
headers=admin_headers,
|
|
)
|
|
assert r2.status_code == 200
|
|
|
|
|
|
@pytest.mark.anyio
|
|
async def test_delete_system_prompt(client, admin_headers):
|
|
# Create a prompt to delete
|
|
r = await client.post(
|
|
"/api/prompts",
|
|
json={
|
|
"agent": "chat",
|
|
"name": "to_delete",
|
|
"content": "temp",
|
|
"is_active": False,
|
|
},
|
|
headers=admin_headers,
|
|
)
|
|
assert r.status_code == 200
|
|
pid = r.json().get("id")
|
|
assert pid is not None
|
|
|
|
r2 = await client.delete(f"/api/prompts/{pid}", headers=admin_headers)
|
|
assert r2.status_code == 200
|
|
|
|
|
|
@pytest.mark.anyio
|
|
async def test_create_prompt_non_admin(client, user_headers):
|
|
r = await client.post(
|
|
"/api/prompts",
|
|
json={
|
|
"agent": "chat",
|
|
"name": "hacked",
|
|
"content": "nope",
|
|
"is_active": False,
|
|
},
|
|
headers=user_headers,
|
|
)
|
|
assert r.status_code == 403
|
|
|
|
|
|
@pytest.mark.anyio
|
|
async def test_audit_log(client, admin_headers):
|
|
r = await client.get("/api/audit-log", headers=admin_headers)
|
|
assert r.status_code == 200
|
|
assert isinstance(r.json(), list)
|
|
|
|
|
|
@pytest.mark.anyio
|
|
async def test_audit_log_user_sees_own(client, user_headers):
|
|
r = await client.get("/api/audit-log", headers=user_headers)
|
|
assert r.status_code == 200
|
|
|
|
|
|
@pytest.mark.anyio
|
|
async def test_config_logs(client, admin_headers):
|
|
r = await client.get("/api/config-logs", headers=admin_headers)
|
|
assert r.status_code == 200
|
|
assert isinstance(r.json(), list)
|
|
|
|
|
|
@pytest.mark.anyio
|
|
async def test_config_export(client, admin_headers):
|
|
r = await client.get("/api/config/export", headers=admin_headers)
|
|
assert r.status_code == 200
|
|
assert isinstance(r.json(), dict)
|
|
|
|
|
|
@pytest.mark.anyio
|
|
async def test_config_export_non_admin(client, user_headers):
|
|
r = await client.get("/api/config/export", headers=user_headers)
|
|
assert r.status_code == 403
|