Files
devplacepy/tests/api/admin/gateway/providers.py
T

197 lines
6.3 KiB
Python
Raw Normal View History

# retoor <retoor@molodetz.nl>
import requests
from tests.conftest import BASE_URL
from tests.api.admin.gateway.index import (
JSON_gateway,
admin_session,
member_key,
_unique_gateway,
)
def test_providers_require_admin(seeded_db):
assert (
requests.get(
f"{BASE_URL}/admin/gateway/providers",
headers=JSON_gateway,
allow_redirects=False,
).status_code
== 401
)
key = member_key()
assert (
requests.get(
f"{BASE_URL}/admin/gateway/providers",
headers={**JSON_gateway, "X-API-KEY": key},
allow_redirects=False,
).status_code
== 403
)
assert (
admin_session(seeded_db)
.get(f"{BASE_URL}/admin/gateway/providers")
.status_code
== 200
)
def test_provider_create_update_delete(seeded_db):
admin = admin_session(seeded_db)
name = _unique_gateway("prov").lower()
created = admin.post(
f"{BASE_URL}/admin/gateway/providers",
json={
"name": name,
"base_url": "https://x.example/v1/chat/completions",
"api_key": "sk-x",
"is_active": True,
},
)
assert created.status_code == 200, created.text[:300]
assert created.json()["ok"] is True
listed = admin.get(f"{BASE_URL}/admin/gateway/providers").json()
match = next((p for p in listed["providers"] if p["name"] == name), None)
assert match is not None
assert match["base_url"] == "https://x.example/v1/chat/completions"
updated = admin.post(
f"{BASE_URL}/admin/gateway/providers",
json={"name": name, "base_url": "https://y.example/v1/chat/completions"},
)
assert updated.status_code == 200
relisted = admin.get(f"{BASE_URL}/admin/gateway/providers").json()
match = next(p for p in relisted["providers"] if p["name"] == name)
assert match["base_url"] == "https://y.example/v1/chat/completions"
deleted = admin.delete(f"{BASE_URL}/admin/gateway/providers/{name}")
assert deleted.status_code == 200 and deleted.json()["ok"] is True
assert (
admin.delete(f"{BASE_URL}/admin/gateway/providers/{name}").status_code == 404
)
def test_provider_name_validation(seeded_db):
admin = admin_session(seeded_db)
bad = admin.post(
f"{BASE_URL}/admin/gateway/providers",
json={"name": "has spaces!", "base_url": "https://z.example/v1/chat/completions"},
)
assert bad.status_code == 400
assert bad.json()["ok"] is False
def test_provider_form_pages_require_admin(seeded_db):
name = _unique_gateway("provpage").lower()
assert (
requests.get(
f"{BASE_URL}/admin/gateway/providers/new",
headers=JSON_gateway,
allow_redirects=False,
).status_code
== 401
)
key = member_key()
assert (
requests.get(
f"{BASE_URL}/admin/gateway/providers/new",
headers={**JSON_gateway, "X-API-KEY": key},
allow_redirects=False,
).status_code
== 403
)
assert (
requests.post(
f"{BASE_URL}/admin/gateway/providers/new",
data={"name": name},
headers={**JSON_gateway, "X-API-KEY": key},
allow_redirects=False,
).status_code
== 403
)
def test_provider_add_edit_delete_via_page(seeded_db):
admin = admin_session(seeded_db)
name = _unique_gateway("provpage").lower()
new_page = admin.get(f"{BASE_URL}/admin/gateway/providers/new")
assert new_page.status_code == 200
assert new_page.json()["is_edit"] is False
created = admin.post(
f"{BASE_URL}/admin/gateway/providers/new",
data={
"name": name,
"base_url": "https://page.example/v1/chat/completions",
"api_key": "sk-page",
"is_active": "1",
},
allow_redirects=False,
)
assert created.status_code == 302
assert created.headers["location"] == "/admin/gateway?tab=providers"
edit_page = admin.get(f"{BASE_URL}/admin/gateway/providers/{name}/edit")
assert edit_page.status_code == 200
edit_body = edit_page.json()
assert edit_body["is_edit"] is True
assert edit_body["form"]["base_url"] == "https://page.example/v1/chat/completions"
edit_html = admin.get(f"{BASE_URL}/admin/gateway/providers/{name}/edit", headers={"Accept": "text/html"})
assert f'value="{name}"' in edit_html.text
assert "readonly" in edit_html.text
updated = admin.post(
f"{BASE_URL}/admin/gateway/providers/{name}/edit",
data={"base_url": "https://page2.example/v1/chat/completions", "is_active": "0"},
allow_redirects=False,
)
assert updated.status_code == 302
relisted = admin.get(f"{BASE_URL}/admin/gateway/providers").json()
match = next(p for p in relisted["providers"] if p["name"] == name)
assert match["base_url"] == "https://page2.example/v1/chat/completions"
assert match["is_active"] is False
deleted = admin.post(
f"{BASE_URL}/admin/gateway/providers/{name}/delete", allow_redirects=False
)
assert deleted.status_code == 302
assert admin.get(f"{BASE_URL}/admin/gateway/providers/{name}/edit").status_code == 404
def test_provider_page_validation_error_rerenders_with_message(seeded_db):
admin = admin_session(seeded_db)
response = admin.post(
f"{BASE_URL}/admin/gateway/providers/new",
data={"name": "has spaces!"},
)
assert response.status_code == 400
assert "message" in response.json()["error"]
def test_provider_page_validation_error_shows_banner_in_html(seeded_db):
admin = admin_session(seeded_db)
response = admin.post(
f"{BASE_URL}/admin/gateway/providers/new",
data={"name": "has spaces!"},
headers={"Accept": "text/html"},
)
assert response.status_code == 400
assert "gw-error" in response.text
assert "letters, numbers, hyphen, underscore" in response.text
def test_provider_edit_page_404_for_missing_provider(seeded_db):
admin = admin_session(seeded_db)
missing = _unique_gateway("ghostprov").lower()
assert admin.get(f"{BASE_URL}/admin/gateway/providers/{missing}/edit").status_code == 404
assert (
admin.post(f"{BASE_URL}/admin/gateway/providers/{missing}/delete").status_code
== 404
)