From 5cf2dcd9a8cd0f4f59af0fbe41663e7842a6e329 Mon Sep 17 00:00:00 2001 From: nishika26 Date: Tue, 15 Jul 2025 13:10:23 +0530 Subject: [PATCH 01/11] api key header --- .../collections/test_collection_info.py | 20 ++++++++------ .../collections/test_create_collections.py | 12 +++------ .../app/tests/api/routes/test_responses.py | 27 ++++++++----------- backend/app/tests/conftest.py | 20 ++++++++++++++ 4 files changed, 46 insertions(+), 33 deletions(-) diff --git a/backend/app/tests/api/routes/collections/test_collection_info.py b/backend/app/tests/api/routes/collections/test_collection_info.py index f6ada5995..4c366451c 100644 --- a/backend/app/tests/api/routes/collections/test_collection_info.py +++ b/backend/app/tests/api/routes/collections/test_collection_info.py @@ -10,8 +10,6 @@ client = TestClient(app) -original_api_key = "ApiKey No3x47A5qoIGhm0kVKjQ77dhCqEdWRIQZlEPzzzh7i8" - def create_collection( db, @@ -38,8 +36,10 @@ def create_collection( return collection -def test_collection_info_processing(db: Session, client: TestClient): - headers = {"X-API-KEY": original_api_key} +def test_collection_info_processing( + db: Session, client: TestClient, superuser_api_key_headers +): + headers = superuser_api_key_headers user = get_user_from_api_key(db, headers) collection = create_collection(db, user, status=CollectionStatus.processing) @@ -57,8 +57,10 @@ def test_collection_info_processing(db: Session, client: TestClient): assert data["llm_service_name"] is None -def test_collection_info_successful(db: Session, client: TestClient): - headers = {"X-API-KEY": original_api_key} +def test_collection_info_successful( + db: Session, client: TestClient, superuser_api_key_headers +): + headers = superuser_api_key_headers user = get_user_from_api_key(db, headers) collection = create_collection( db, user, status=CollectionStatus.successful, with_llm=True @@ -78,8 +80,10 @@ def test_collection_info_successful(db: Session, client: TestClient): assert data["llm_service_name"] == "gpt-4o" -def test_collection_info_failed(db: Session, client: TestClient): - headers = {"X-API-KEY": original_api_key} +def test_collection_info_failed( + db: Session, client: TestClient, superuser_api_key_headers +): + headers = superuser_api_key_headers user = get_user_from_api_key(db, headers) collection = create_collection(db, user, status=CollectionStatus.failed) diff --git a/backend/app/tests/api/routes/collections/test_create_collections.py b/backend/app/tests/api/routes/collections/test_create_collections.py index 2a97fb45b..5d99724d6 100644 --- a/backend/app/tests/api/routes/collections/test_create_collections.py +++ b/backend/app/tests/api/routes/collections/test_create_collections.py @@ -47,9 +47,7 @@ class TestCollectionRouteCreate: @openai_responses.mock() def test_create_collection_success( - self, - client: TestClient, - db: Session, + self, client: TestClient, db: Session, superuser_api_key_headers ): store = DocumentStore(db) documents = store.fill(self._n_documents) @@ -62,14 +60,10 @@ def test_create_collection_success( "instructions": "Test collection assistant.", "temperature": 0.1, } - original_api_key = "ApiKey No3x47A5qoIGhm0kVKjQ77dhCqEdWRIQZlEPzzzh7i8" - - headers = {"X-API-KEY": original_api_key} + headers = superuser_api_key_headers response = client.post( - f"{settings.API_V1_STR}/collections/create", - json=body, - headers=headers, + f"{settings.API_V1_STR}/collections/create", json=body, headers=headers ) assert response.status_code == 200 diff --git a/backend/app/tests/api/routes/test_responses.py b/backend/app/tests/api/routes/test_responses.py index e24b7a4d0..8e496a602 100644 --- a/backend/app/tests/api/routes/test_responses.py +++ b/backend/app/tests/api/routes/test_responses.py @@ -16,9 +16,7 @@ @patch("app.api.routes.responses.OpenAI") @patch("app.api.routes.responses.get_provider_credential") def test_responses_endpoint_success( - mock_get_credential, - mock_openai, - db, + mock_get_credential, mock_openai, db, superuser_api_key_headers: dict[str, str] ): """Test the /responses endpoint for successful response creation.""" # Setup mock credentials @@ -45,16 +43,18 @@ def test_responses_endpoint_success( pytest.skip("Glific project not found in the database") # Use the original API key from seed data (not the encrypted one) - original_api_key = "ApiKey No3x47A5qoIGhm0kVKjQ77dhCqEdWRIQZlEPzzzh7i8" - - headers = {"X-API-KEY": original_api_key} + # original_api_key = "ApiKey No3x47A5qoIGhm0kVKjQ77dhCqEdWRIQZlEPzzzh7i8" + # + # headers = {"X-API-KEY": original_api_key} request_data = { "assistant_id": "assistant_123", "question": "What is Glific?", "callback_url": "http://example.com/callback", } - response = client.post("/responses", json=request_data, headers=headers) + response = client.post( + "/responses", json=request_data, headers=superuser_api_key_headers + ) assert response.status_code == 200 response_json = response.json() assert response_json["success"] is True @@ -66,10 +66,7 @@ def test_responses_endpoint_success( @patch("app.api.routes.responses.get_provider_credential") @patch("app.api.routes.responses.get_assistant_by_id") def test_responses_endpoint_without_vector_store( - mock_get_assistant, - mock_get_credential, - mock_openai, - db, + mock_get_assistant, mock_get_credential, mock_openai, db, superuser_api_key_headers ): """Test the /responses endpoint when assistant has no vector store configured.""" # Setup mock credentials @@ -103,17 +100,15 @@ def test_responses_endpoint_without_vector_store( if not glific_project: pytest.skip("Glific project not found in the database") - # Use the original API key from seed data - original_api_key = "ApiKey No3x47A5qoIGhm0kVKjQ77dhCqEdWRIQZlEPzzzh7i8" - - headers = {"X-API-KEY": original_api_key} request_data = { "assistant_id": "assistant_123", "question": "What is Glific?", "callback_url": "http://example.com/callback", } - response = client.post("/responses", json=request_data, headers=headers) + response = client.post( + "/responses", json=request_data, headers=superuser_api_key_headers + ) assert response.status_code == 200 response_json = response.json() assert response_json["success"] is True diff --git a/backend/app/tests/conftest.py b/backend/app/tests/conftest.py index 5d68c3f1c..6915274e9 100644 --- a/backend/app/tests/conftest.py +++ b/backend/app/tests/conftest.py @@ -1,6 +1,7 @@ from collections.abc import Generator import pytest + from fastapi.testclient import TestClient from sqlmodel import Session from sqlalchemy import event @@ -11,6 +12,7 @@ from app.main import app from app.tests.utils.user import authentication_token_from_email from app.tests.utils.utils import get_superuser_token_headers +from app.tests.utils.api_keys import get_api_key_by_user_email from app.seed_data.seed_data import seed_database @@ -59,3 +61,21 @@ def normal_user_token_headers(client: TestClient, db: Session) -> dict[str, str] return authentication_token_from_email( client=client, email=settings.EMAIL_TEST_USER, db=db ) + + +@pytest.fixture(scope="function") +def superuser_api_key_headers() -> dict[str, str]: + """ + Returns headers with the superuser API key for making API requests. + """ + api_key = get_api_key_by_user_email(settings.FIRST_SUPERUSER) + return {"X-API-KEY": api_key} + + +@pytest.fixture(scope="function") +def normal_user_api_key_headers() -> dict[str, str]: + """ + Returns headers with the normal user API key for making API requests. + """ + api_key = get_api_key_by_user_email(settings.EMAIL_TEST_USER) + return {"X-API-KEY": api_key} From 4596b0707516e0c85b4021eadbc7c1b05896b2c5 Mon Sep 17 00:00:00 2001 From: nishika26 Date: Tue, 15 Jul 2025 13:12:16 +0530 Subject: [PATCH 02/11] removing code not needed --- backend/app/tests/api/routes/test_responses.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/backend/app/tests/api/routes/test_responses.py b/backend/app/tests/api/routes/test_responses.py index 8e496a602..5c48341f5 100644 --- a/backend/app/tests/api/routes/test_responses.py +++ b/backend/app/tests/api/routes/test_responses.py @@ -42,10 +42,6 @@ def test_responses_endpoint_success( if not glific_project: pytest.skip("Glific project not found in the database") - # Use the original API key from seed data (not the encrypted one) - # original_api_key = "ApiKey No3x47A5qoIGhm0kVKjQ77dhCqEdWRIQZlEPzzzh7i8" - # - # headers = {"X-API-KEY": original_api_key} request_data = { "assistant_id": "assistant_123", "question": "What is Glific?", From 451ebf677d43f53c805e4c1a382c51dae4bd8109 Mon Sep 17 00:00:00 2001 From: nishika26 Date: Tue, 15 Jul 2025 13:40:22 +0530 Subject: [PATCH 03/11] api key utility function --- backend/app/tests/utils/api_keys.py | 30 +++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 backend/app/tests/utils/api_keys.py diff --git a/backend/app/tests/utils/api_keys.py b/backend/app/tests/utils/api_keys.py new file mode 100644 index 000000000..b7de924ec --- /dev/null +++ b/backend/app/tests/utils/api_keys.py @@ -0,0 +1,30 @@ +import json +from pathlib import Path +from typing import Dict +import pytest +from fastapi.testclient import TestClient +from sqlalchemy.orm import Session + +SEED_DATA_PATH = ( + Path(__file__).resolve().parents[3] / "app" / "seed_data" / "seed_data.json" +) + + +def load_seed_data() -> Dict[str, list]: + """ + Load the list of API keys from seed_data.json. + """ + with open(SEED_DATA_PATH) as f: + return json.load(f) + + +def get_api_key_by_user_email(user_email: str) -> str: + """ + Retrieve the API key for a given user email from the seed data. + Raises ValueError if the user is not found. + """ + seed_data = load_seed_data() + for apikey in seed_data.get("apikeys", []): + if apikey["user_email"] == user_email: + return apikey["api_key"] + raise ValueError(f"API key for {user_email} not found.") From 06ba633aad5c0a9d998fcc78b25bd1cd05ddc065 Mon Sep 17 00:00:00 2001 From: nishika26 Date: Wed, 16 Jul 2025 00:12:46 +0530 Subject: [PATCH 04/11] try-excet for loading seed data --- backend/app/tests/utils/api_keys.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/backend/app/tests/utils/api_keys.py b/backend/app/tests/utils/api_keys.py index b7de924ec..c0d6a3261 100644 --- a/backend/app/tests/utils/api_keys.py +++ b/backend/app/tests/utils/api_keys.py @@ -1,7 +1,5 @@ import json from pathlib import Path -from typing import Dict -import pytest from fastapi.testclient import TestClient from sqlalchemy.orm import Session @@ -10,12 +8,15 @@ ) -def load_seed_data() -> Dict[str, list]: +def load_seed_data() -> dict[str, list]: """ Load the list of API keys from seed_data.json. """ - with open(SEED_DATA_PATH) as f: - return json.load(f) + try: + with open(SEED_DATA_PATH) as f: + return json.load(f) + except (FileNotFoundError, json.JSONDecodeError) as e: + raise ValueError(f"Failed to load seed data: {e}") def get_api_key_by_user_email(user_email: str) -> str: From adff526781beb1688dd43c0549152932fb96227f Mon Sep 17 00:00:00 2001 From: nishika26 Date: Wed, 16 Jul 2025 23:15:52 +0530 Subject: [PATCH 05/11] taking email from env --- backend/app/crud/__init__.py | 1 + backend/app/crud/api_key.py | 18 ++++++++++++++++ backend/app/seed_data/seed_data.json | 6 ++---- backend/app/seed_data/seed_data.py | 24 +++++++++++++++++++++ backend/app/tests/conftest.py | 19 +++++++++-------- backend/app/tests/utils/api_keys.py | 31 ---------------------------- backend/app/tests/utils/utils.py | 15 ++++++++++---- 7 files changed, 66 insertions(+), 48 deletions(-) delete mode 100644 backend/app/tests/utils/api_keys.py diff --git a/backend/app/crud/__init__.py b/backend/app/crud/__init__.py index 5c6fd1022..208c6c084 100644 --- a/backend/app/crud/__init__.py +++ b/backend/app/crud/__init__.py @@ -29,6 +29,7 @@ get_api_keys_by_project, get_api_key_by_project_user, delete_api_key, + get_api_key_by_user_id, ) from .credentials import ( diff --git a/backend/app/crud/api_key.py b/backend/app/crud/api_key.py index 56fa3045a..7a8b7c166 100644 --- a/backend/app/crud/api_key.py +++ b/backend/app/crud/api_key.py @@ -162,3 +162,21 @@ def get_api_keys_by_project(session: Session, project_id: int) -> list[APIKeyPub result.append(APIKeyPublic.model_validate(key_dict)) return result + + +def get_api_key_by_user_id(session: Session, user_id: int) -> APIKeyPublic | None: + """ + Retrieves the API key associated with a user by their user_id. + """ + api_key = ( + session.query(APIKey) + .filter(APIKey.user_id == user_id, APIKey.is_deleted == False) + .first() + ) + + if not api_key: + return None + + key_dict = api_key.model_dump() + key_dict["key"] = decrypt_api_key(api_key.key) + return APIKeyPublic.model_validate(key_dict) diff --git a/backend/app/seed_data/seed_data.json b/backend/app/seed_data/seed_data.json index 8fb40af52..28560b3a2 100644 --- a/backend/app/seed_data/seed_data.json +++ b/backend/app/seed_data/seed_data.json @@ -21,14 +21,12 @@ ], "users": [ { - "email": "superuser@example.com", "password": "changethis", "full_name": "SUPERUSER", "is_active": true, "is_superuser": true }, { - "email": "org_admin@example.com", "password": "admin123", "full_name": "ADMIN", "is_active": true, @@ -38,7 +36,7 @@ "apikeys": [ { "organization_name": "Project Tech4dev", - "user_email": "superuser@example.com", + "user_email": "{{SUPERUSER_EMAIL}}", "project_name": "Glific", "api_key": "ApiKey No3x47A5qoIGhm0kVKjQ77dhCqEdWRIQZlEPzzzh7i8", "is_deleted": false, @@ -46,7 +44,7 @@ }, { "organization_name": "Project Tech4dev", - "user_email": "org_admin@example.com", + "user_email": "{{ADMIN_EMAIL}}", "project_name": "Dalgo", "api_key": "ApiKey Px8y47B6roJHin1lWLkR88eiDrFdXSJRZmFQazzai8j9", "is_deleted": false, diff --git a/backend/app/seed_data/seed_data.py b/backend/app/seed_data/seed_data.py index 059c07943..385063dde 100644 --- a/backend/app/seed_data/seed_data.py +++ b/backend/app/seed_data/seed_data.py @@ -8,6 +8,7 @@ from sqlmodel import Session, delete, select from app.core.db import engine +from app.core import settings from app.core.security import encrypt_api_key, get_password_hash from app.models import APIKey, Organization, Project, User, Credential, Assistant @@ -311,6 +312,23 @@ def seed_database(session: Session) -> None: # Create users users = [] for user_data in seed_data["users"]: + # Directly map the emails from environment variables based on the user role + if user_data["full_name"] == "SUPERUSER": + user_data["email"] = settings.FIRST_SUPERUSER + elif user_data["full_name"] == "ADMIN": + user_data["email"] = settings.EMAIL_TEST_USER + else: + # If the user is not SUPERUSER or ADMIN, allow manual email assignment + if "email" not in user_data: + logging.warning( + f"Email not provided for user {user_data['full_name']}. Skipping user creation." + ) + continue # Skip if no email is provided for new users + logging.info( + f"Email manually provided for user: {user_data['full_name']}" + ) + + # Create the user in the database user = create_user(session, user_data) users.append(user) logging.info(f"Created user: {user.email} (ID: {user.id})") @@ -322,6 +340,12 @@ def seed_database(session: Session) -> None: projects.append(project) logging.info(f"Created project: {project.name} (ID: {project.id})") + for api_key_data in seed_data["apikeys"]: + if api_key_data["user_email"] == "{{SUPERUSER_EMAIL}}": + api_key_data["user_email"] = settings.FIRST_SUPERUSER + elif api_key_data["user_email"] == "{{ADMIN_EMAIL}}": + api_key_data["user_email"] = settings.EMAIL_TEST_USER + # Create API keys api_keys = [] for api_key_data in seed_data["apikeys"]: diff --git a/backend/app/tests/conftest.py b/backend/app/tests/conftest.py index 6915274e9..63197bbef 100644 --- a/backend/app/tests/conftest.py +++ b/backend/app/tests/conftest.py @@ -1,6 +1,7 @@ from collections.abc import Generator import pytest +import time from fastapi.testclient import TestClient from sqlmodel import Session @@ -11,8 +12,10 @@ from app.api.deps import get_db from app.main import app from app.tests.utils.user import authentication_token_from_email -from app.tests.utils.utils import get_superuser_token_headers -from app.tests.utils.api_keys import get_api_key_by_user_email +from app.tests.utils.utils import get_superuser_token_headers, get_api_key_by_email + +# from app.tests.utils.api_keys import get_api_key_by_user_email + from app.seed_data.seed_data import seed_database @@ -64,18 +67,16 @@ def normal_user_token_headers(client: TestClient, db: Session) -> dict[str, str] @pytest.fixture(scope="function") -def superuser_api_key_headers() -> dict[str, str]: - """ - Returns headers with the superuser API key for making API requests. - """ - api_key = get_api_key_by_user_email(settings.FIRST_SUPERUSER) +def superuser_api_key_headers(db: Session) -> dict[str, str]: + api_key = get_api_key_by_email(db, settings.FIRST_SUPERUSER) + return {"X-API-KEY": api_key} @pytest.fixture(scope="function") -def normal_user_api_key_headers() -> dict[str, str]: +def normal_user_api_key_headers(db: Session) -> dict[str, str]: """ Returns headers with the normal user API key for making API requests. """ - api_key = get_api_key_by_user_email(settings.EMAIL_TEST_USER) + api_key = get_api_key_by_email(db, settings.EMAIL_TEST_USER) return {"X-API-KEY": api_key} diff --git a/backend/app/tests/utils/api_keys.py b/backend/app/tests/utils/api_keys.py deleted file mode 100644 index c0d6a3261..000000000 --- a/backend/app/tests/utils/api_keys.py +++ /dev/null @@ -1,31 +0,0 @@ -import json -from pathlib import Path -from fastapi.testclient import TestClient -from sqlalchemy.orm import Session - -SEED_DATA_PATH = ( - Path(__file__).resolve().parents[3] / "app" / "seed_data" / "seed_data.json" -) - - -def load_seed_data() -> dict[str, list]: - """ - Load the list of API keys from seed_data.json. - """ - try: - with open(SEED_DATA_PATH) as f: - return json.load(f) - except (FileNotFoundError, json.JSONDecodeError) as e: - raise ValueError(f"Failed to load seed data: {e}") - - -def get_api_key_by_user_email(user_email: str) -> str: - """ - Retrieve the API key for a given user email from the seed data. - Raises ValueError if the user is not found. - """ - seed_data = load_seed_data() - for apikey in seed_data.get("apikeys", []): - if apikey["user_email"] == user_email: - return apikey["api_key"] - raise ValueError(f"API key for {user_email} not found.") diff --git a/backend/app/tests/utils/utils.py b/backend/app/tests/utils/utils.py index a9eefe457..76a6992d5 100644 --- a/backend/app/tests/utils/utils.py +++ b/backend/app/tests/utils/utils.py @@ -4,15 +4,15 @@ from typing import List import pytest +from pydantic import EmailStr from fastapi.testclient import TestClient from sqlmodel import Session, select from typing import Type, TypeVar from app.core.config import settings -from app.crud.user import get_user_by_email -from app.models import APIKeyPublic, Credential -from app.crud import create_api_key, get_api_key_by_value -from uuid import uuid4 +from app.crud import get_user_by_email, get_api_key_by_user_id +from app.models import APIKeyPublic, User, APIKey +from app.crud import get_api_key_by_value T = TypeVar("T") @@ -47,6 +47,13 @@ def get_superuser_token_headers(client: TestClient) -> dict[str, str]: return headers +def get_api_key_by_email(db: Session, email: EmailStr) -> str: + user = get_user_by_email(session=db, email=email) + api_key = get_api_key_by_user_id(db, user_id=user.id) + + return api_key.key + + def get_user_id_by_email(db: Session) -> int: user = get_user_by_email(session=db, email=settings.FIRST_SUPERUSER) return user.id From 577451e6e5af9f2a360e436e8576d0842ddeb9dc Mon Sep 17 00:00:00 2001 From: nishika26 Date: Wed, 16 Jul 2025 23:23:09 +0530 Subject: [PATCH 06/11] formatting fixing --- backend/app/tests/conftest.py | 7 ------- backend/app/tests/utils/utils.py | 3 +-- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/backend/app/tests/conftest.py b/backend/app/tests/conftest.py index 63197bbef..51dde40dc 100644 --- a/backend/app/tests/conftest.py +++ b/backend/app/tests/conftest.py @@ -13,9 +13,6 @@ from app.main import app from app.tests.utils.user import authentication_token_from_email from app.tests.utils.utils import get_superuser_token_headers, get_api_key_by_email - -# from app.tests.utils.api_keys import get_api_key_by_user_email - from app.seed_data.seed_data import seed_database @@ -69,14 +66,10 @@ def normal_user_token_headers(client: TestClient, db: Session) -> dict[str, str] @pytest.fixture(scope="function") def superuser_api_key_headers(db: Session) -> dict[str, str]: api_key = get_api_key_by_email(db, settings.FIRST_SUPERUSER) - return {"X-API-KEY": api_key} @pytest.fixture(scope="function") def normal_user_api_key_headers(db: Session) -> dict[str, str]: - """ - Returns headers with the normal user API key for making API requests. - """ api_key = get_api_key_by_email(db, settings.EMAIL_TEST_USER) return {"X-API-KEY": api_key} diff --git a/backend/app/tests/utils/utils.py b/backend/app/tests/utils/utils.py index eb63acf8a..da4c6abc1 100644 --- a/backend/app/tests/utils/utils.py +++ b/backend/app/tests/utils/utils.py @@ -10,11 +10,10 @@ from app.core.config import settings from app.crud import get_user_by_email, get_api_key_by_user_id -from app.models import APIKeyPublic, User, APIKey +from app.models import APIKeyPublic from app.crud import get_api_key_by_value - T = TypeVar("T") From d633bc532233ff87a3637adc2a87afcc8c64ce3b Mon Sep 17 00:00:00 2001 From: nishika26 Date: Wed, 16 Jul 2025 23:34:11 +0530 Subject: [PATCH 07/11] small fix --- backend/app/tests/utils/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/app/tests/utils/utils.py b/backend/app/tests/utils/utils.py index da4c6abc1..b49fa611b 100644 --- a/backend/app/tests/utils/utils.py +++ b/backend/app/tests/utils/utils.py @@ -10,7 +10,7 @@ from app.core.config import settings from app.crud import get_user_by_email, get_api_key_by_user_id -from app.models import APIKeyPublic +from app.models import APIKeyPublic, Project from app.crud import get_api_key_by_value From 37f4a1e9bc9b4a7938c65a361639b94625b8d22c Mon Sep 17 00:00:00 2001 From: nishika26 Date: Wed, 16 Jul 2025 23:47:19 +0530 Subject: [PATCH 08/11] api key function test --- backend/app/tests/crud/test_api_key.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/backend/app/tests/crud/test_api_key.py b/backend/app/tests/crud/test_api_key.py index a0f89ba37..9f4281dc5 100644 --- a/backend/app/tests/crud/test_api_key.py +++ b/backend/app/tests/crud/test_api_key.py @@ -98,3 +98,20 @@ def test_get_api_keys_by_project(db: Session) -> None: assert retrieved_key.id == created_key.id assert retrieved_key.project_id == project.id assert retrieved_key.key.startswith("ApiKey ") + + +def test_get_api_key_by_user_id(db: Session) -> None: + user = create_random_user(db) + project = create_test_project(db) + + created_key = api_key_crud.create_api_key( + db, project.organization_id, user.id, project.id + ) + + retrieved_key = api_key_crud.get_api_key_by_user_id(db, user.id) + + assert retrieved_key is not None + + assert retrieved_key.id == created_key.id + assert retrieved_key.user_id == user.id + assert retrieved_key.key.startswith("ApiKey ") From b00d09ce70f8d7d4973c7b76d090775f3217a877 Mon Sep 17 00:00:00 2001 From: nishika26 Date: Thu, 17 Jul 2025 12:42:35 +0530 Subject: [PATCH 09/11] assistants router test api key header --- backend/app/tests/api/routes/test_assistants.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/backend/app/tests/api/routes/test_assistants.py b/backend/app/tests/api/routes/test_assistants.py index 936e0c07c..b918c6216 100644 --- a/backend/app/tests/api/routes/test_assistants.py +++ b/backend/app/tests/api/routes/test_assistants.py @@ -4,16 +4,11 @@ from app.tests.utils.openai import mock_openai_assistant -@pytest.fixture -def normal_user_api_key_header(): - return {"X-API-KEY": "ApiKey Px8y47B6roJHin1lWLkR88eiDrFdXSJRZmFQazzai8j9"} - - @patch("app.api.routes.assistants.fetch_assistant_from_openai") def test_ingest_assistant_success( mock_fetch_assistant, client: TestClient, - normal_user_api_key_header: str, + normal_user_api_key_headers: dict[str, str], ): """Test successful assistant ingestion from OpenAI.""" mock_assistant = mock_openai_assistant() @@ -22,7 +17,7 @@ def test_ingest_assistant_success( response = client.post( f"/api/v1/assistant/{mock_assistant.id}/ingest", - headers=normal_user_api_key_header, + headers=normal_user_api_key_headers, ) assert response.status_code == 201 From dfe70ab51d17aaaa0eb656a8bf9fa945c5c2579a Mon Sep 17 00:00:00 2001 From: nishika26 Date: Thu, 17 Jul 2025 16:25:41 +0530 Subject: [PATCH 10/11] small fix --- backend/app/seed_data/seed_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/app/seed_data/seed_data.py b/backend/app/seed_data/seed_data.py index 7378ed6b2..68de6ad69 100644 --- a/backend/app/seed_data/seed_data.py +++ b/backend/app/seed_data/seed_data.py @@ -312,7 +312,7 @@ def seed_database(session: Session) -> None: # Create users users = [] for user_data in seed_data["users"]: - # Directly map the emails from environment variables based on the user role + # Directly map the emails from environment variables based on the user name if user_data["full_name"] == "SUPERUSER": user_data["email"] = settings.FIRST_SUPERUSER elif user_data["full_name"] == "ADMIN": From a7510642fe4443a4b4af7c117096c3f6fa07b793 Mon Sep 17 00:00:00 2001 From: nishika26 Date: Thu, 17 Jul 2025 18:25:38 +0530 Subject: [PATCH 11/11] normal users --- backend/app/seed_data/seed_data.json | 2 ++ backend/app/seed_data/seed_data.py | 23 +++++-------------- .../collections/test_collection_info.py | 12 +++++----- .../collections/test_create_collections.py | 4 ++-- .../documents/test_route_document_upload.py | 6 ++--- .../app/tests/api/routes/test_responses.py | 12 ++++++---- backend/app/tests/utils/document.py | 10 ++++---- backend/app/tests/utils/utils.py | 2 +- 8 files changed, 33 insertions(+), 38 deletions(-) diff --git a/backend/app/seed_data/seed_data.json b/backend/app/seed_data/seed_data.json index e800afc7d..8d4ce12ed 100644 --- a/backend/app/seed_data/seed_data.json +++ b/backend/app/seed_data/seed_data.json @@ -21,12 +21,14 @@ ], "users": [ { + "email": "{{SUPERUSER_EMAIL}}", "password": "changethis", "full_name": "SUPERUSER", "is_active": true, "is_superuser": true }, { + "email": "{{ADMIN_EMAIL}}", "password": "admin123", "full_name": "ADMIN", "is_active": true, diff --git a/backend/app/seed_data/seed_data.py b/backend/app/seed_data/seed_data.py index 68de6ad69..2c91d26f1 100644 --- a/backend/app/seed_data/seed_data.py +++ b/backend/app/seed_data/seed_data.py @@ -309,26 +309,15 @@ def seed_database(session: Session) -> None: f"Created organization: {organization.name} (ID: {organization.id})" ) - # Create users - users = [] for user_data in seed_data["users"]: - # Directly map the emails from environment variables based on the user name - if user_data["full_name"] == "SUPERUSER": + if user_data["email"] == "{{SUPERUSER_EMAIL}}": user_data["email"] = settings.FIRST_SUPERUSER - elif user_data["full_name"] == "ADMIN": + elif user_data["email"] == "{{ADMIN_EMAIL}}": user_data["email"] = settings.EMAIL_TEST_USER - else: - # If the user is not SUPERUSER or ADMIN, allow manual email assignment - if "email" not in user_data: - logging.warning( - f"Email not provided for user {user_data['full_name']}. Skipping user creation." - ) - continue # Skip if no email is provided for new users - logging.info( - f"Email manually provided for user: {user_data['full_name']}" - ) - - # Create the user in the database + + # Create users + users = [] + for user_data in seed_data["users"]: user = create_user(session, user_data) users.append(user) logging.info(f"Created user: {user.email} (ID: {user.id})") diff --git a/backend/app/tests/api/routes/collections/test_collection_info.py b/backend/app/tests/api/routes/collections/test_collection_info.py index 4c366451c..ba31baf26 100644 --- a/backend/app/tests/api/routes/collections/test_collection_info.py +++ b/backend/app/tests/api/routes/collections/test_collection_info.py @@ -37,9 +37,9 @@ def create_collection( def test_collection_info_processing( - db: Session, client: TestClient, superuser_api_key_headers + db: Session, client: TestClient, normal_user_api_key_headers ): - headers = superuser_api_key_headers + headers = normal_user_api_key_headers user = get_user_from_api_key(db, headers) collection = create_collection(db, user, status=CollectionStatus.processing) @@ -58,9 +58,9 @@ def test_collection_info_processing( def test_collection_info_successful( - db: Session, client: TestClient, superuser_api_key_headers + db: Session, client: TestClient, normal_user_api_key_headers ): - headers = superuser_api_key_headers + headers = normal_user_api_key_headers user = get_user_from_api_key(db, headers) collection = create_collection( db, user, status=CollectionStatus.successful, with_llm=True @@ -81,9 +81,9 @@ def test_collection_info_successful( def test_collection_info_failed( - db: Session, client: TestClient, superuser_api_key_headers + db: Session, client: TestClient, normal_user_api_key_headers ): - headers = superuser_api_key_headers + headers = normal_user_api_key_headers user = get_user_from_api_key(db, headers) collection = create_collection(db, user, status=CollectionStatus.failed) diff --git a/backend/app/tests/api/routes/collections/test_create_collections.py b/backend/app/tests/api/routes/collections/test_create_collections.py index 5d99724d6..8a458c444 100644 --- a/backend/app/tests/api/routes/collections/test_create_collections.py +++ b/backend/app/tests/api/routes/collections/test_create_collections.py @@ -47,7 +47,7 @@ class TestCollectionRouteCreate: @openai_responses.mock() def test_create_collection_success( - self, client: TestClient, db: Session, superuser_api_key_headers + self, client: TestClient, db: Session, normal_user_api_key_headers ): store = DocumentStore(db) documents = store.fill(self._n_documents) @@ -60,7 +60,7 @@ def test_create_collection_success( "instructions": "Test collection assistant.", "temperature": 0.1, } - headers = superuser_api_key_headers + headers = normal_user_api_key_headers response = client.post( f"{settings.API_V1_STR}/collections/create", json=body, headers=headers diff --git a/backend/app/tests/api/routes/documents/test_route_document_upload.py b/backend/app/tests/api/routes/documents/test_route_document_upload.py index aa28d23f6..6e9c26ded 100644 --- a/backend/app/tests/api/routes/documents/test_route_document_upload.py +++ b/backend/app/tests/api/routes/documents/test_route_document_upload.py @@ -25,7 +25,7 @@ def put(self, route: Route, scratch: Path): with scratch.open("rb") as fp: return self.client.post( str(route), - headers=self.superuser_token_headers, + headers=self.normal_user_api_key_headers, files={ "src": (str(scratch), fp, mtype), }, @@ -45,8 +45,8 @@ def route(): @pytest.fixture -def uploader(client: TestClient, superuser_token_headers: dict[str, str]): - return WebUploader(client, superuser_token_headers) +def uploader(client: TestClient, normal_user_api_key_headers: dict[str, str]): + return WebUploader(client, normal_user_api_key_headers) @pytest.fixture(scope="class") diff --git a/backend/app/tests/api/routes/test_responses.py b/backend/app/tests/api/routes/test_responses.py index e0b1b647d..19e5df5f1 100644 --- a/backend/app/tests/api/routes/test_responses.py +++ b/backend/app/tests/api/routes/test_responses.py @@ -16,7 +16,7 @@ @patch("app.api.routes.responses.OpenAI") @patch("app.api.routes.responses.get_provider_credential") def test_responses_endpoint_success( - mock_get_credential, mock_openai, db, superuser_api_key_headers: dict[str, str] + mock_get_credential, mock_openai, db, normal_user_api_key_headers: dict[str, str] ): """Test the /responses endpoint for successful response creation.""" # Setup mock credentials @@ -49,7 +49,7 @@ def test_responses_endpoint_success( } response = client.post( - "/responses", json=request_data, headers=superuser_api_key_headers + "/responses", json=request_data, headers=normal_user_api_key_headers ) assert response.status_code == 200 response_json = response.json() @@ -62,7 +62,11 @@ def test_responses_endpoint_success( @patch("app.api.routes.responses.get_provider_credential") @patch("app.api.routes.responses.get_assistant_by_id") def test_responses_endpoint_without_vector_store( - mock_get_assistant, mock_get_credential, mock_openai, db, superuser_api_key_headers + mock_get_assistant, + mock_get_credential, + mock_openai, + db, + normal_user_api_key_headers, ): """Test the /responses endpoint when assistant has no vector store configured.""" # Setup mock credentials @@ -103,7 +107,7 @@ def test_responses_endpoint_without_vector_store( } response = client.post( - "/responses", json=request_data, headers=superuser_api_key_headers + "/responses", json=request_data, headers=normal_user_api_key_headers ) assert response.status_code == 200 response_json = response.json() diff --git a/backend/app/tests/utils/document.py b/backend/app/tests/utils/document.py index 078ea1c0a..ab72d2cef 100644 --- a/backend/app/tests/utils/document.py +++ b/backend/app/tests/utils/document.py @@ -113,18 +113,18 @@ def append(self, doc: Document, suffix: str = None): @dataclass class WebCrawler: client: TestClient - superuser_token_headers: dict[str, str] + normal_user_api_key_headers: dict[str, str] def get(self, route: Route): return self.client.get( str(route), - headers=self.superuser_token_headers, + headers=self.normal_user_api_key_headers, ) def delete(self, route: Route): return self.client.delete( str(route), - headers=self.superuser_token_headers, + headers=self.normal_user_api_key_headers, ) @@ -158,5 +158,5 @@ def to_dict(self): @pytest.fixture -def crawler(client: TestClient, superuser_token_headers: dict[str, str]): - return WebCrawler(client, superuser_token_headers) +def crawler(client: TestClient, normal_user_api_key_headers: dict[str, str]): + return WebCrawler(client, normal_user_api_key_headers) diff --git a/backend/app/tests/utils/utils.py b/backend/app/tests/utils/utils.py index b49fa611b..92a714b05 100644 --- a/backend/app/tests/utils/utils.py +++ b/backend/app/tests/utils/utils.py @@ -54,7 +54,7 @@ def get_api_key_by_email(db: Session, email: EmailStr) -> str: def get_user_id_by_email(db: Session) -> int: - user = get_user_by_email(session=db, email=settings.FIRST_SUPERUSER) + user = get_user_by_email(session=db, email=settings.EMAIL_TEST_USER) return user.id