-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
7 changed files
with
81 additions
and
54 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,23 +1,31 @@ | ||
import os | ||
|
||
import firebase_admin | ||
from firebase_admin import credentials | ||
|
||
|
||
def initialize_firebase(): | ||
private_key = os.getenv("FIREBASE_SVC_ACCOUNT_PRIVATE_KEY") | ||
if private_key: | ||
private_key = private_key.replace("\\n", "\n") | ||
|
||
cred = credentials.Certificate({ | ||
"type": "service_account", | ||
"project_id": os.getenv("FIREBASE_PROJECT_ID"), | ||
"private_key_id": os.getenv("FIREBASE_SVC_ACCOUNT_PRIVATE_KEY_ID"), | ||
"private_key": private_key, | ||
"client_email": os.getenv("FIREBASE_SVC_ACCOUNT_CLIENT_EMAIL"), | ||
"client_id": os.getenv("FIREBASE_SVC_ACCOUNT_CLIENT_ID"), | ||
"auth_uri": os.getenv("FIREBASE_SVC_ACCOUNT_AUTH_URI"), | ||
"token_uri": os.getenv("FIREBASE_SVC_ACCOUNT_TOKEN_URI"), | ||
"auth_provider_x509_cert_url": os.getenv("FIREBASE_SVC_ACCOUNT_AUTH_PROVIDER_X509_CERT_URL"), | ||
"client_x509_cert_url": os.getenv("FIREBASE_SVC_ACCOUNT_CLIENT_X509_CERT_URL"), | ||
}) | ||
cred = credentials.Certificate( | ||
{ | ||
"type": "service_account", | ||
"project_id": os.getenv("FIREBASE_PROJECT_ID"), | ||
"private_key_id": os.getenv("FIREBASE_SVC_ACCOUNT_PRIVATE_KEY_ID"), | ||
"private_key": private_key, | ||
"client_email": os.getenv("FIREBASE_SVC_ACCOUNT_CLIENT_EMAIL"), | ||
"client_id": os.getenv("FIREBASE_SVC_ACCOUNT_CLIENT_ID"), | ||
"auth_uri": os.getenv("FIREBASE_SVC_ACCOUNT_AUTH_URI"), | ||
"token_uri": os.getenv("FIREBASE_SVC_ACCOUNT_TOKEN_URI"), | ||
"auth_provider_x509_cert_url": os.getenv( | ||
"FIREBASE_SVC_ACCOUNT_AUTH_PROVIDER_X509_CERT_URL" | ||
), | ||
"client_x509_cert_url": os.getenv( | ||
"FIREBASE_SVC_ACCOUNT_CLIENT_X509_CERT_URL" | ||
), | ||
} | ||
) | ||
|
||
firebase_admin.initialize_app(cred) | ||
firebase_admin.initialize_app(cred) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,73 +1,82 @@ | ||
import pytest | ||
from sqlalchemy import create_engine | ||
from sqlalchemy.orm import sessionmaker | ||
|
||
from app.models import Role | ||
from app.models.Base import Base | ||
from app.models.User import User | ||
from app.models import Role | ||
from app.schemas.user import UserCreate, UserRole, UserInDB | ||
from app.schemas.user import UserCreate, UserInDB, UserRole | ||
from app.services.implementations.user_service import UserService | ||
|
||
# Test DB Configuration | ||
SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db" | ||
engine = create_engine( | ||
SQLALCHEMY_DATABASE_URL, | ||
connect_args={"check_same_thread": False} | ||
SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False} | ||
) | ||
TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) | ||
|
||
|
||
class MockFirebaseUser: | ||
"""Mock Firebase user response""" | ||
|
||
def __init__(self): | ||
self.uid = "test_firebase_uid" | ||
self.email = "[email protected]" | ||
|
||
|
||
class MockFirebaseError(Exception): | ||
"""Mock Firebase error""" | ||
|
||
pass | ||
|
||
|
||
class MockAuthError(MockFirebaseError): | ||
"""Mock Firebase auth error""" | ||
|
||
def __init__(self, code, message): | ||
self.code = code | ||
self.message = message | ||
super().__init__(f"{code}: {message}") | ||
|
||
|
||
@pytest.fixture | ||
def mock_firebase_auth(monkeypatch): | ||
"""Mock Firebase authentication service""" | ||
|
||
class MockAuth: | ||
def create_user(self, email, password): | ||
return MockFirebaseUser() | ||
|
||
def get_user_by_email(self, email): | ||
return MockFirebaseUser() | ||
|
||
def delete_user(self, uid): | ||
pass | ||
|
||
AuthError = MockAuthError | ||
|
||
mock_auth = MockAuth() | ||
monkeypatch.setattr('firebase_admin.auth', mock_auth) | ||
monkeypatch.setattr("firebase_admin.auth", mock_auth) | ||
return mock_auth | ||
|
||
|
||
@pytest.fixture(scope="function") | ||
def db_session(): | ||
"""Provide a clean database session for each test""" | ||
Base.metadata.create_all(bind=engine) | ||
session = TestingSessionLocal() | ||
|
||
try: | ||
# Clean up any existing data first | ||
session.query(User).delete() | ||
session.query(Role).delete() | ||
session.commit() | ||
|
||
# Create test role | ||
test_role = Role(id=1, name=UserRole.PARTICIPANT) | ||
session.add(test_role) | ||
session.commit() | ||
|
||
yield session | ||
finally: | ||
session.rollback() | ||
|
@@ -80,6 +89,7 @@ def db_session(): | |
session.close() | ||
Base.metadata.drop_all(bind=engine) | ||
|
||
|
||
@pytest.mark.asyncio | ||
async def test_create_user_service(mock_firebase_auth, db_session): | ||
"""Test user creation flow including Firebase auth and database storage""" | ||
|
@@ -91,7 +101,7 @@ async def test_create_user_service(mock_firebase_auth, db_session): | |
last_name="User", | ||
email="[email protected]", | ||
password="TestPass@123", | ||
role=UserRole.PARTICIPANT | ||
role=UserRole.PARTICIPANT, | ||
) | ||
|
||
# Act | ||
|
@@ -110,8 +120,8 @@ async def test_create_user_service(mock_firebase_auth, db_session): | |
assert db_user is not None | ||
assert db_user.auth_id == "test_firebase_uid" | ||
assert db_user.role_id == 1 | ||
|
||
db_session.commit() # Commit successful test | ||
except Exception: | ||
db_session.rollback() # Rollback on error | ||
raise | ||
raise |