diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e46ec5a..34888ff 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -25,6 +25,7 @@ jobs: push: true file: ./Dockerfile platforms: linux/amd64 + target: prod tags: | gitea.le-memese.com/s3rius/zangramru:latest gitea.le-memese.com/s3rius/zangramru:${{ gitea.ref_name }} diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index ecc013e..7cd2d6d 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -4,12 +4,6 @@ on: push jobs: lint: - strategy: - matrix: - cmd: - - ruff-format - - ruff - - mypy runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -22,13 +16,11 @@ jobs: - name: Install deps run: uv sync - name: Run lint check - run: uv run pre-commit run -a ${{ matrix.cmd }} + run: uv run pre-commit run -a pytest: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Create .env - run: touch .env - name: Set up Python uses: actions/setup-python@v6 with: diff --git a/Dockerfile b/Dockerfile index d6921e5..80dd0d2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -31,3 +31,11 @@ RUN --mount=from=uv,source=/usr/local/bin/uv,target=/bin/uv \ uv sync --locked --no-dev CMD ["/usr/local/bin/python", "-m", "zangramru"] + +FROM prod AS dev + +RUN --mount=from=uv,source=/usr/local/bin/uv,target=/bin/uv \ + --mount=type=cache,target=/root/.cache/uv \ + uv sync --locked --all-groups + + diff --git a/tests/conftest.py b/tests/conftest.py index 7a390dd..14b5511 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -10,6 +10,7 @@ from piccolo.table import create_tables, drop_tables from zangramru.settings import settings from zangramru.web.application import get_app +from zangramru.web.lifespan import lifespan_setup @pytest.fixture(scope="session") @@ -73,14 +74,15 @@ async def setup_db() -> AsyncGenerator[None, None]: @pytest.fixture -def fastapi_app() -> FastAPI: +async def fastapi_app() -> AsyncGenerator[FastAPI, None]: """ Fixture for creating FastAPI app. :return: fastapi app with mocked dependencies. """ application = get_app() - return application # noqa: RET504 + async with lifespan_setup(application): + yield application @pytest.fixture diff --git a/tests/test_echo.py b/tests/test_echo.py deleted file mode 100644 index 9a5310a..0000000 --- a/tests/test_echo.py +++ /dev/null @@ -1,19 +0,0 @@ -import uuid - -from fastapi import FastAPI -from httpx import AsyncClient -from starlette import status - - -async def test_echo(fastapi_app: FastAPI, client: AsyncClient) -> None: - """ - Tests that echo route works. - - :param fastapi_app: current application. - :param client: client for the app. - """ - url = fastapi_app.url_path_for("send_echo_message") - message = uuid.uuid4().hex - response = await client.post(url, json={"message": message}) - assert response.status_code == status.HTTP_200_OK - assert response.json()["message"] == message diff --git a/tests/test_puzzles.py b/tests/test_puzzles.py new file mode 100644 index 0000000..36f4c7e --- /dev/null +++ b/tests/test_puzzles.py @@ -0,0 +1,20 @@ +from fastapi import FastAPI +from httpx import AsyncClient +from starlette import status + +from zangramru.web.api.puzzles.schema import PuzzleOutputDTO + + +async def test_get_random_puzzle(fastapi_app: FastAPI, client: AsyncClient) -> None: + """ + Tests that echo route works. + + :param fastapi_app: current application. + :param client: client for the app. + """ + url = fastapi_app.url_path_for("random_puzzle") + response = await client.get(url) + assert response.status_code == status.HTTP_200_OK + dto = PuzzleOutputDTO.model_validate(response.json()) + assert sum(len(row) for row in dto.board) == 16 + assert len(dto.solutions) >= 10