import pytest from sqlalchemy import create_engine, event from sqlalchemy.orm import sessionmaker from fastapi.testclient import TestClient import typing as t from app.core import config, security from app.db.session import Base, get_db from app.db import models,schemas from app.main import app SQLALCHEMY_DATABASE_URI = f"postgresql+psycopg2://kabAdmin:P%40ssw0rd!@kintonetooldb.postgres.database.azure.com/test" engine = create_engine(SQLALCHEMY_DATABASE_URI,echo=True) test_session_maker = sessionmaker(autocommit=False, autoflush=False, bind=engine) @pytest.fixture(scope="function") def test_db(): connection = engine.connect() transaction = connection.begin() test_session = test_session_maker(bind=connection) yield test_session test_session.close() transaction.rollback() connection.close() @pytest.fixture(scope="function") def test_client(test_db): def get_test_db(): try: yield test_db finally: test_db.close() app.dependency_overrides[get_db] = get_test_db with TestClient(app) as test_client: yield test_client @pytest.fixture(scope="function") def test_user(test_db): password ="test" user = models.User( email = "test@test.com", first_name = "test", last_name = "abc", hashed_password = security.get_password_hash(password), is_active = True, is_superuser = False ) test_db.add(user) test_db.commit() test_db.refresh(user) dicUser = user.__dict__ dicUser["password"] = password return dicUser @pytest.fixture(scope="function") def test_admin(test_db): password ="admin" user = models.User( email = "admin@test.com", first_name = "admin", last_name = "abc", hashed_password = security.get_password_hash(password), is_active = True, is_superuser = True ) test_db.add(user) test_db.commit() test_db.refresh(user) dicUser = user.__dict__ dicUser["password"] = password return dicUser # @pytest.fixture # def test_password() -> str: # return "securepassword" # def get_password_hash() -> str: # """ # Password hashing can be expensive so a mock will be much faster # """ # return "supersecrethash" # @pytest.fixture # def test_user(test_db) -> models.User: # """ # Make a test user in the database # """ # user = models.User( # email="fake@email.com", # hashed_password=get_password_hash(), # is_active=True, # ) # test_db.add(user) # test_db.commit() # return user # @pytest.fixture # def test_superuser(test_db) -> models.User: # """ # Superuser for testing # """ # user = models.User( # email="fakeadmin@email.com", # hashed_password=get_password_hash(), # is_superuser=True, # ) # test_db.add(user) # test_db.commit() # return user # def verify_password_mock(first: str, second: str) -> bool: # return True # @pytest.fixture # def user_token_headers( # client: TestClient, test_user, test_password, monkeypatch # ) -> t.Dict[str, str]: # monkeypatch.setattr(security, "verify_password", verify_password_mock) # login_data = { # "username": test_user.email, # "password": test_password, # } # r = client.post("/api/token", data=login_data) # tokens = r.json() # a_token = tokens["access_token"] # headers = {"Authorization": f"Bearer {a_token}"} # return headers # @pytest.fixture # def superuser_token_headers( # client: TestClient, test_superuser, test_password, monkeypatch # ) -> t.Dict[str, str]: # monkeypatch.setattr(security, "verify_password", verify_password_mock) # login_data = { # "username": test_superuser.email, # "password": test_password, # } # r = client.post("/api/token", data=login_data) # tokens = r.json() # a_token = tokens["access_token"] # headers = {"Authorization": f"Bearer {a_token}"} # return headers