Skip to content

Commit 2372555

Browse files
authored
Testing : Utility functions for test data setup (#275)
* utility functions for creating test data
1 parent 690b452 commit 2372555

File tree

13 files changed

+529
-575
lines changed

13 files changed

+529
-575
lines changed

backend/app/crud/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737
get_key_by_org,
3838
update_creds_for_org,
3939
remove_creds_for_org,
40+
get_provider_credential,
41+
remove_provider_credential,
4042
)
4143

4244
from .thread_results import upsert_thread_result, get_thread_result

backend/app/crud/credentials.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Optional, Dict, Any, List
1+
from typing import Optional, Dict, Any, List, Union
22
from sqlmodel import Session, select
33
from sqlalchemy.exc import IntegrityError
44
from datetime import datetime, timezone
@@ -88,9 +88,21 @@ def get_creds_by_org(
8888

8989

9090
def get_provider_credential(
91-
*, session: Session, org_id: int, provider: str, project_id: Optional[int] = None
92-
) -> Optional[Dict[str, Any]]:
93-
"""Fetches credentials for a specific provider of an organization."""
91+
*,
92+
session: Session,
93+
org_id: int,
94+
provider: str,
95+
project_id: Optional[int] = None,
96+
full: bool = False,
97+
) -> Optional[Union[Dict[str, Any], Credential]]:
98+
"""
99+
Fetch credentials for a specific provider within a project.
100+
101+
Returns:
102+
Optional[Union[Dict[str, Any], Credential]]:
103+
- If `full` is True, returns the full Credential SQLModel object.
104+
- Otherwise, returns the decrypted credentials as a dictionary.
105+
"""
94106
validate_provider(provider)
95107

96108
statement = select(Credential).where(
@@ -102,8 +114,7 @@ def get_provider_credential(
102114
creds = session.exec(statement).first()
103115

104116
if creds and creds.credential:
105-
# Decrypt entire credentials object
106-
return decrypt_credentials(creds.credential)
117+
return creds if full else decrypt_credentials(creds.credential)
107118
return None
108119

109120

backend/app/tests/api/routes/test_api_key.py

Lines changed: 21 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,19 @@
1-
import uuid
2-
import pytest
31
from fastapi.testclient import TestClient
42
from sqlmodel import Session
3+
54
from app.main import app
6-
from app.models import APIKey, User, Organization, Project
5+
from app.models import APIKey
76
from app.core.config import settings
8-
from app.crud.api_key import create_api_key
9-
from app.tests.utils.utils import random_email
10-
from app.core.security import get_password_hash
7+
from app.tests.utils.utils import get_non_existent_id
8+
from app.tests.utils.user import create_random_user
9+
from app.tests.utils.test_data import create_test_api_key, create_test_project
1110

1211
client = TestClient(app)
1312

1413

15-
def create_test_user(db: Session) -> User:
16-
user = User(
17-
email=random_email(),
18-
hashed_password=get_password_hash("password123"),
19-
is_superuser=True,
20-
)
21-
db.add(user)
22-
db.commit()
23-
db.refresh(user)
24-
return user
25-
26-
27-
def create_test_organization(db: Session) -> Organization:
28-
org = Organization(
29-
name=f"Test Organization {uuid.uuid4()}", description="Test Organization"
30-
)
31-
db.add(org)
32-
db.commit()
33-
db.refresh(org)
34-
return org
35-
36-
37-
def create_test_project(db: Session, organization_id: int) -> Project:
38-
project = Project(name="Test Project", organization_id=organization_id)
39-
db.add(project)
40-
db.commit()
41-
db.refresh(project)
42-
return project
43-
44-
4514
def test_create_api_key(db: Session, superuser_token_headers: dict[str, str]):
46-
user = create_test_user(db)
47-
org = create_test_organization(db)
48-
project = create_test_project(db, organization_id=org.id)
15+
user = create_random_user(db)
16+
project = create_test_project(db)
4917

5018
response = client.post(
5119
f"{settings.API_V1_STR}/apikeys",
@@ -57,14 +25,13 @@ def test_create_api_key(db: Session, superuser_token_headers: dict[str, str]):
5725
assert data["success"] is True
5826
assert "id" in data["data"]
5927
assert "key" in data["data"]
60-
assert data["data"]["organization_id"] == org.id
28+
assert data["data"]["organization_id"] == project.organization_id
6129
assert data["data"]["user_id"] == user.id
6230

6331

6432
def test_create_duplicate_api_key(db: Session, superuser_token_headers: dict[str, str]):
65-
user = create_test_user(db)
66-
org = create_test_organization(db)
67-
project = create_test_project(db, organization_id=org.id)
33+
user = create_random_user(db)
34+
project = create_test_project(db)
6835

6936
client.post(
7037
f"{settings.API_V1_STR}/apikeys",
@@ -81,16 +48,11 @@ def test_create_duplicate_api_key(db: Session, superuser_token_headers: dict[str
8148

8249

8350
def test_list_api_keys(db: Session, superuser_token_headers: dict[str, str]):
84-
user = create_test_user(db)
85-
org = create_test_organization(db)
86-
project = create_test_project(db, organization_id=org.id)
87-
api_key = create_api_key(
88-
db, organization_id=org.id, user_id=user.id, project_id=project.id
89-
)
51+
api_key = create_test_api_key(db)
9052

9153
response = client.get(
9254
f"{settings.API_V1_STR}/apikeys",
93-
params={"project_id": project.id},
55+
params={"project_id": api_key.project_id},
9456
headers=superuser_token_headers,
9557
)
9658
assert response.status_code == 200
@@ -100,17 +62,12 @@ def test_list_api_keys(db: Session, superuser_token_headers: dict[str, str]):
10062
assert len(data["data"]) > 0
10163

10264
first_key = data["data"][0]
103-
assert first_key["organization_id"] == org.id
104-
assert first_key["user_id"] == user.id
65+
assert first_key["organization_id"] == api_key.organization_id
66+
assert first_key["user_id"] == api_key.user_id
10567

10668

10769
def test_get_api_key(db: Session, superuser_token_headers: dict[str, str]):
108-
user = create_test_user(db)
109-
org = create_test_organization(db)
110-
project = create_test_project(db, organization_id=org.id)
111-
api_key = create_api_key(
112-
db, organization_id=org.id, user_id=user.id, project_id=project.id
113-
)
70+
api_key = create_test_api_key(db)
11471

11572
response = client.get(
11673
f"{settings.API_V1_STR}/apikeys/{api_key.id}",
@@ -121,25 +78,21 @@ def test_get_api_key(db: Session, superuser_token_headers: dict[str, str]):
12178
assert data["success"] is True
12279
assert data["data"]["id"] == api_key.id
12380
assert data["data"]["organization_id"] == api_key.organization_id
124-
assert data["data"]["user_id"] == user.id
81+
assert data["data"]["user_id"] == api_key.user_id
12582

12683

12784
def test_get_nonexistent_api_key(db: Session, superuser_token_headers: dict[str, str]):
85+
api_key_id = get_non_existent_id(db, APIKey)
12886
response = client.get(
129-
f"{settings.API_V1_STR}/apikeys/999999",
87+
f"{settings.API_V1_STR}/apikeys/{api_key_id}",
13088
headers=superuser_token_headers,
13189
)
13290
assert response.status_code == 404
13391
assert "API Key does not exist" in response.json()["error"]
13492

13593

13694
def test_revoke_api_key(db: Session, superuser_token_headers: dict[str, str]):
137-
user = create_test_user(db)
138-
org = create_test_organization(db)
139-
project = create_test_project(db, organization_id=org.id)
140-
api_key = create_api_key(
141-
db, organization_id=org.id, user_id=user.id, project_id=project.id
142-
)
95+
api_key = create_test_api_key(db)
14396

14497
response = client.delete(
14598
f"{settings.API_V1_STR}/apikeys/{api_key.id}",
@@ -154,11 +107,10 @@ def test_revoke_api_key(db: Session, superuser_token_headers: dict[str, str]):
154107
def test_revoke_nonexistent_api_key(
155108
db: Session, superuser_token_headers: dict[str, str]
156109
):
157-
user = create_test_user(db)
158-
org = create_test_organization(db)
110+
api_key_id = get_non_existent_id(db, APIKey)
159111

160112
response = client.delete(
161-
f"{settings.API_V1_STR}/apikeys/999999",
113+
f"{settings.API_V1_STR}/apikeys/{api_key_id}",
162114
headers=superuser_token_headers,
163115
)
164116
assert response.status_code == 404

0 commit comments

Comments
 (0)