conftest.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import asyncio
  2. from collections.abc import AsyncGenerator
  3. from typing import Generator
  4. import pytest
  5. import pytest_asyncio
  6. from httpx import AsyncClient
  7. from sqlalchemy import delete, select
  8. from sqlalchemy.orm import Session
  9. from app.core import config, security
  10. from app.core.session import engine
  11. from app.core.session import session as session_maker
  12. from app.main import app
  13. from app.models import Base, User
  14. default_user_id = "b75365d9-7bf9-4f54-add5-aeab333a087b"
  15. default_user_email = "geralt@wiedzmin.pl"
  16. default_user_password = "geralt"
  17. default_user_password_hash = security.get_password_hash(default_user_password)
  18. default_user_access_token = security.create_jwt_token(
  19. str(default_user_id), 60 * 60 * 24, refresh=False
  20. )[0]
  21. @pytest.fixture(scope="session")
  22. def event_loop():
  23. loop = asyncio.new_event_loop()
  24. asyncio.set_event_loop(loop)
  25. yield loop
  26. loop.close()
  27. @pytest_asyncio.fixture(scope="session")
  28. async def test_db_setup_sessionmaker():
  29. # assert if we use TEST_DB URL for 100%
  30. assert config.settings.ENVIRONMENT == "PYTEST"
  31. # always drop and create test db tables between tests session
  32. Base.metadata.drop_all(engine)
  33. Base.metadata.create_all(engine)
  34. @pytest_asyncio.fixture(autouse=True)
  35. async def session(test_db_setup_sessionmaker) -> AsyncGenerator[Session, None]:
  36. with session_maker() as db:
  37. yield db
  38. # delete all data from all tables after test
  39. for name, table in Base.metadata.tables.items():
  40. db.execute(delete(table))
  41. db.commit()
  42. @pytest_asyncio.fixture(scope="session")
  43. async def client() -> AsyncGenerator[AsyncClient, None]:
  44. async with AsyncClient(app=app, base_url="http://test") as client:
  45. client.headers.update({"Host": "localhost"})
  46. yield client
  47. @pytest_asyncio.fixture
  48. async def default_user(test_db_setup_sessionmaker) -> User:
  49. with session_maker() as db:
  50. result = db.execute(select(User).where(User.email == default_user_email))
  51. user = result.scalars().first()
  52. if user is None:
  53. new_user = User(
  54. email=default_user_email,
  55. hashed_password=default_user_password_hash,
  56. )
  57. new_user.id = default_user_id
  58. db.add(new_user)
  59. db.commit()
  60. db.refresh(new_user)
  61. return new_user
  62. return user
  63. @pytest.fixture
  64. def default_user_headers(default_user: User):
  65. return {"Authorization": f"Bearer {default_user_access_token}"}