diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..ff2d2a2 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,54 @@ +name: CI + +on: + pull_request: + +permissions: + contents: read + pull-requests: write + checks: write + +jobs: + build: + permissions: + contents: read + pull-requests: write + checks: write + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.11' + + - name: Install dependencies + working-directory: ./src + run: | + pip install poetry + poetry install + + - name: Start FastAPI + working-directory: ./src + run: | + poetry run uvicorn app:app --host 0.0.0.0 --port 8000 & + + - name: Run tests + working-directory: ./src + env: + BACKEND_CORS_ORIGINS: '["*"]' + run: | + sleep 5 # Wait a bit for the server to be fully up and running + poetry run pytest ./test/ --junitxml=./logs/pytest_report.xml + + - name: Publish Test Report + uses: dorny/test-reporter@v1 + if: failure() + with: + name: 'Test Report' + path: './src/logs/pytest_report.xml' + reporter: 'java-junit' + fail-on-error: false \ No newline at end of file diff --git a/src/logs/.gitignore b/src/logs/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/src/logs/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/src/poetry.lock b/src/poetry.lock index f00d80f..4297542 100644 --- a/src/poetry.lock +++ b/src/poetry.lock @@ -1671,4 +1671,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = ">=3.10,<3.12" -content-hash = "028ed7065abe88027ea3b0ada049730cb2390851664ecab2f4a3091f0bb3a592" +content-hash = "5b6deb5f6449b12d85e723c69940d04210c5fb138f64884541ed8770fddad8f9" diff --git a/src/pyproject.toml b/src/pyproject.toml index c3233ec..0b763a7 100644 --- a/src/pyproject.toml +++ b/src/pyproject.toml @@ -41,6 +41,7 @@ fastapi = {extras = ["all"], version = "^0.115.0"} fastapi-pagination = {extras = ["sqlalchemy"], version = "^0.12.27"} asyncer = "^0.0.8" httpx = "^0.27.2" +pytest = "^8.3.3" [tool.ruff.per-file-ignores] "__init__.py" = [ "F401",] diff --git a/src/test/feature/__init__.py b/src/test/feature/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/test/unit/__init__.py b/src/test/unit/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/test/unit/test_example.py b/src/test/unit/test_example.py new file mode 100644 index 0000000..41dc27a --- /dev/null +++ b/src/test/unit/test_example.py @@ -0,0 +1,13 @@ +from fastapi.testclient import TestClient +from app.main import app + +client = TestClient(app) + + +def test_root_endpoint(): + expected_response = {"message": "Hello World"} + + response = client.get("/") + + assert response.status_code == 200 + assert response.json() == expected_response