# retoor 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 )