conftest.py 2.6 KB

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