| import asyncio |
|
|
| from sqlalchemy import select |
|
|
| from src.database.db import session_pool |
| from src.model import UserSettings |
|
|
|
|
| def test_get_user_settings_creates_defaults(client, create_authenticated_user): |
| auth_user = create_authenticated_user(with_settings=False) |
|
|
| response = client.get("/api/v1/settings/", headers=auth_user["headers"]) |
|
|
| assert response.status_code == 200 |
| payload = response.json() |
| assert payload["user_id"] == auth_user["id"] |
| assert payload["api_keys_encrypted"] is None |
|
|
| async def _load_settings(): |
| async with session_pool() as session: |
| return ( |
| await session.execute( |
| select(UserSettings).where(UserSettings.user_id == auth_user["id"]) |
| ) |
| ).scalar_one_or_none() |
|
|
| assert asyncio.run(_load_settings()) is not None |
|
|
|
|
| def test_update_user_settings_encrypts_plaintext_api_keys( |
| client, create_authenticated_user |
| ): |
| auth_user = create_authenticated_user(with_settings=False) |
| plaintext_key = "sk-test-plaintext" |
|
|
| response = client.put( |
| "/api/v1/settings/", |
| headers=auth_user["headers"], |
| json={ |
| "location": "Bengaluru", |
| "custom_summary_instructions": "Focus on practical takeaways", |
| "api_keys_encrypted": [ |
| { |
| "id": 1, |
| "slug": "openai", |
| "name": "OpenAI", |
| "api_key": plaintext_key, |
| } |
| ], |
| }, |
| ) |
|
|
| assert response.status_code == 200 |
| payload = response.json() |
| assert payload["location"] == "Bengaluru" |
| assert payload["api_keys_encrypted"][0]["api_key"] != plaintext_key |
|
|
| async def _load_settings(): |
| async with session_pool() as session: |
| return ( |
| await session.execute( |
| select(UserSettings).where(UserSettings.user_id == auth_user["id"]) |
| ) |
| ).scalar_one() |
|
|
| settings = asyncio.run(_load_settings()) |
| assert settings.api_keys_encrypted[0]["api_key"] != plaintext_key |
| assert settings.api_keys[0]["api_key"] == plaintext_key |
|
|
|
|
| def test_update_user_settings_clears_keys_with_empty_list( |
| client, create_authenticated_user |
| ): |
| auth_user = create_authenticated_user(with_settings=True) |
|
|
| initial_response = client.put( |
| "/api/v1/settings/", |
| headers=auth_user["headers"], |
| json={ |
| "api_keys_encrypted": [ |
| { |
| "id": 1, |
| "slug": "openai", |
| "name": "OpenAI", |
| "api_key": "sk-initial", |
| } |
| ] |
| }, |
| ) |
| assert initial_response.status_code == 200 |
|
|
| clear_response = client.put( |
| "/api/v1/settings/", |
| headers=auth_user["headers"], |
| json={"api_keys_encrypted": []}, |
| ) |
|
|
| assert clear_response.status_code == 200 |
| assert clear_response.json()["api_keys_encrypted"] == [] |
|
|
| async def _load_settings(): |
| async with session_pool() as session: |
| return ( |
| await session.execute( |
| select(UserSettings).where(UserSettings.user_id == auth_user["id"]) |
| ) |
| ).scalar_one() |
|
|
| settings = asyncio.run(_load_settings()) |
| assert settings.api_keys_encrypted == [] |
|
|
|
|
| def test_get_services_and_resources_only_returns_active_entries( |
| client, create_authenticated_user, seed_catalog |
| ): |
| auth_user = create_authenticated_user() |
| seed_catalog() |
|
|
| services_response = client.get( |
| "/api/v1/settings/services", |
| headers=auth_user["headers"], |
| ) |
| resources_response = client.get( |
| "/api/v1/settings/resources", |
| headers=auth_user["headers"], |
| ) |
|
|
| assert services_response.status_code == 200 |
| services = services_response.json() |
| assert len(services) == 1 |
| assert services[0]["slug"] == "openai" |
|
|
| assert resources_response.status_code == 200 |
| resources = resources_response.json() |
| assert len(resources) == 1 |
| assert resources[0]["slug"] == "gpt-4.1" |
| assert resources[0]["service_slug"] == "openai" |
| assert resources[0]["service_name"] == "OpenAI" |
|
|