mirror of
https://github.com/Kludex/awesome-fastapi-projects.git
synced 2024-12-19 00:30:14 +00:00
104 lines
3.8 KiB
Python
104 lines
3.8 KiB
Python
|
"""Test the operations on the database models."""
|
||
|
import pytest
|
||
|
import sqlalchemy as sa
|
||
|
import sqlalchemy.orm
|
||
|
from dirty_equals import IsList
|
||
|
from sqlalchemy.ext.asyncio import AsyncSession
|
||
|
|
||
|
from app import database
|
||
|
from app.factories import DependencyCreateDataFactory
|
||
|
from app.models import DependencyCreateData
|
||
|
from app.source_graph.factories import SourceGraphRepoDataFactory
|
||
|
from app.source_graph.models import SourceGraphRepoData
|
||
|
|
||
|
pytestmark = pytest.mark.anyio
|
||
|
|
||
|
|
||
|
def _assert_repo_properties(
|
||
|
repo: database.Repo, source_graph_repo_data: SourceGraphRepoData
|
||
|
) -> bool:
|
||
|
"""Assert that the repo has the expected properties."""
|
||
|
assert repo.id is not None
|
||
|
assert repo.url == str(source_graph_repo_data.repo_url)
|
||
|
assert repo.description == source_graph_repo_data.description
|
||
|
assert repo.stars == source_graph_repo_data.stars
|
||
|
assert repo.source_graph_repo_id == source_graph_repo_data.repo_id
|
||
|
return True
|
||
|
|
||
|
|
||
|
async def test_create_repo_no_dependencies(
|
||
|
test_db_session: AsyncSession,
|
||
|
source_graph_repo_data_factory: SourceGraphRepoDataFactory,
|
||
|
) -> None:
|
||
|
"""Test creating a repo."""
|
||
|
source_graph_repo_data: SourceGraphRepoData = source_graph_repo_data_factory.build()
|
||
|
repo = database.Repo(
|
||
|
url=str(source_graph_repo_data.repo_url),
|
||
|
description=source_graph_repo_data.description,
|
||
|
stars=source_graph_repo_data.stars,
|
||
|
source_graph_repo_id=source_graph_repo_data.repo_id,
|
||
|
)
|
||
|
test_db_session.add(repo)
|
||
|
await test_db_session.flush()
|
||
|
await test_db_session.refresh(repo)
|
||
|
_assert_repo_properties(repo, source_graph_repo_data)
|
||
|
assert (await repo.awaitable_attrs.dependencies) == IsList(length=0)
|
||
|
|
||
|
|
||
|
async def test_create_repo_with_dependencies(
|
||
|
test_db_session: AsyncSession,
|
||
|
source_graph_repo_data_factory: SourceGraphRepoDataFactory,
|
||
|
dependency_create_data_factory: DependencyCreateDataFactory,
|
||
|
) -> None:
|
||
|
"""Test creating a repo with dependencies."""
|
||
|
source_graph_repo_data: SourceGraphRepoData = source_graph_repo_data_factory.build()
|
||
|
dependencies_create_data: list[
|
||
|
DependencyCreateData
|
||
|
] = dependency_create_data_factory.batch(5)
|
||
|
repo = database.Repo(
|
||
|
url=str(source_graph_repo_data.repo_url),
|
||
|
description=source_graph_repo_data.description,
|
||
|
stars=source_graph_repo_data.stars,
|
||
|
source_graph_repo_id=source_graph_repo_data.repo_id,
|
||
|
dependencies=[
|
||
|
database.Dependency(**dependency_create_data.model_dump())
|
||
|
for dependency_create_data in dependencies_create_data
|
||
|
],
|
||
|
)
|
||
|
test_db_session.add(repo)
|
||
|
await test_db_session.flush()
|
||
|
await test_db_session.refresh(repo)
|
||
|
_assert_repo_properties(repo, source_graph_repo_data)
|
||
|
repo_dependencies = await repo.awaitable_attrs.dependencies
|
||
|
assert repo_dependencies == IsList(length=5)
|
||
|
assert all(
|
||
|
repo_dependency.name == dependency.name
|
||
|
for repo_dependency, dependency in zip(
|
||
|
repo_dependencies, dependencies_create_data, strict=True
|
||
|
)
|
||
|
)
|
||
|
|
||
|
|
||
|
async def test_list_repositories(
|
||
|
test_db_session: AsyncSession,
|
||
|
some_repos: list[database.Repo],
|
||
|
) -> None:
|
||
|
"""Test listing repositories."""
|
||
|
repos_from_db_result = await test_db_session.execute(
|
||
|
sa.select(database.Repo).options(
|
||
|
sqlalchemy.orm.joinedload(database.Repo.dependencies)
|
||
|
)
|
||
|
)
|
||
|
repos_from_db = repos_from_db_result.scalars().unique().all()
|
||
|
assert repos_from_db == IsList(length=10)
|
||
|
assert all(
|
||
|
repo.id == repo_data.id
|
||
|
and all(
|
||
|
repo_dependency.name == dependency.name
|
||
|
for repo_dependency, dependency in zip(
|
||
|
repo.dependencies, repo_data.dependencies, strict=True
|
||
|
)
|
||
|
)
|
||
|
for repo, repo_data in zip(repos_from_db, some_repos, strict=True)
|
||
|
)
|