Compare commits

..

1 Commits

Author SHA1 Message Date
Barcode Betty fbb7bf796a fix: remove dead dispose_engine import from API main.py
The top-level import of dispose_engine from cartsnitch_api.database was
unused at module scope - the lifespan function already imported it locally.
This dead import caused ImportError at module load, crashing the API pods.

Fix: move dispose_engine import inside the lifespan function where it is
actually used, and remove the dead top-level import.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-23 02:47:44 +00:00
7 changed files with 41 additions and 26 deletions
@@ -2,9 +2,9 @@ name: CI
on: on:
push: push:
branches: [main, dev, uat] branches: [main, dev]
pull_request: pull_request:
branches: [main, dev, uat] branches: [main, dev]
concurrency: concurrency:
group: ci-${{ github.ref }} group: ci-${{ github.ref }}
@@ -20,7 +20,7 @@ env:
jobs: jobs:
lint: lint:
runs-on: ubuntu-latest runs-on: runners-cartsnitch
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: actions/setup-python@v5 - uses: actions/setup-python@v5
@@ -34,7 +34,7 @@ jobs:
run: ruff format --check . run: ruff format --check .
typecheck: typecheck:
runs-on: ubuntu-latest runs-on: runners-cartsnitch
continue-on-error: true continue-on-error: true
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
@@ -49,7 +49,7 @@ jobs:
run: mypy src/cartsnitch_api run: mypy src/cartsnitch_api
test: test:
runs-on: ubuntu-latest runs-on: runners-cartsnitch
services: services:
postgres: postgres:
image: postgres:15-alpine image: postgres:15-alpine
@@ -96,7 +96,7 @@ jobs:
run: pytest --tb=short -q run: pytest --tb=short -q
build-and-push: build-and-push:
runs-on: ubuntu-latest runs-on: runners-cartsnitch
needs: [lint, test] needs: [lint, test]
outputs: outputs:
calver_tag: ${{ steps.calver.outputs.version }} calver_tag: ${{ steps.calver.outputs.version }}
@@ -172,7 +172,11 @@ jobs:
only-fixed: "true" only-fixed: "true"
output-format: sarif output-format: sarif
- name: Upload api scan results to GitHub Security
uses: github/codeql-action/upload-sarif@v3
if: always()
with:
sarif_file: ${{ steps.scan.outputs.sarif }}
- name: Push Docker image - name: Push Docker image
if: github.event_name == 'push' if: github.event_name == 'push'
@@ -194,15 +198,24 @@ jobs:
git push origin "v${{ steps.calver.outputs.version }}" git push origin "v${{ steps.calver.outputs.version }}"
deploy-dev: deploy-dev:
runs-on: ubuntu-latest runs-on: runners-cartsnitch
needs: [build-and-push] needs: [build-and-push]
if: always() && !cancelled() && github.event_name == 'push' && (github.ref == 'refs/heads/dev' || github.ref == 'refs/heads/main') if: always() && !cancelled() && github.event_name == 'push' && (github.ref == 'refs/heads/dev' || github.ref == 'refs/heads/main')
steps: steps:
- name: Generate GitHub App token
id: app-token
uses: actions/create-github-app-token@v1
with:
app-id: ${{ secrets.CARTSNITCH_APP_ID }}
private-key: ${{ secrets.CARTSNITCH_APP_PRIVATE_KEY }}
owner: ${{ github.repository_owner }}
repositories: infra
- name: Checkout infra repo - name: Checkout infra repo
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
repository: cartsnitch/infra repository: cartsnitch/infra
token: ${{ secrets.GITEA_TOKEN }} token: ${{ steps.app-token.outputs.token }}
ref: main ref: main
path: infra path: infra
@@ -238,15 +251,24 @@ jobs:
git push origin main git push origin main
deploy-uat: deploy-uat:
runs-on: ubuntu-latest runs-on: runners-cartsnitch
needs: [build-and-push] needs: [build-and-push]
if: always() && !cancelled() && github.event_name == 'push' && (github.ref == 'refs/heads/uat' || github.ref == 'refs/heads/main') if: always() && !cancelled() && github.event_name == 'push' && (github.ref == 'refs/heads/uat' || github.ref == 'refs/heads/main')
steps: steps:
- name: Generate GitHub App token
id: app-token
uses: actions/create-github-app-token@v1
with:
app-id: ${{ secrets.CARTSNITCH_APP_ID }}
private-key: ${{ secrets.CARTSNITCH_APP_PRIVATE_KEY }}
owner: ${{ github.repository_owner }}
repositories: infra
- name: Checkout infra repo - name: Checkout infra repo
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
repository: cartsnitch/infra repository: cartsnitch/infra
token: ${{ secrets.GITEA_TOKEN }} token: ${{ steps.app-token.outputs.token }}
ref: main ref: main
path: infra path: infra
+1 -6
View File
@@ -23,12 +23,7 @@ class Settings(BaseSettings):
auth_service_url: str = "http://auth:3001" auth_service_url: str = "http://auth:3001"
cors_origins: list[str] = [ cors_origins: list[str] = ["http://localhost:3000", "https://cartsnitch.com"]
"http://localhost:3000",
"https://cartsnitch.com",
"https://dev.cartsnitch.com",
"https://uat.cartsnitch.com",
]
receiptwitness_url: str = "http://receiptwitness:8001" receiptwitness_url: str = "http://receiptwitness:8001"
stickershock_url: str = "http://stickershock:8002" stickershock_url: str = "http://stickershock:8002"
+2 -4
View File
@@ -177,10 +177,8 @@ async def _create_test_user_and_session(
async with db_engine.begin() as conn: async with db_engine.begin() as conn:
await conn.execute( await conn.execute(
text( text(
"INSERT INTO users (id, email, hashed_password, display_name, " "INSERT INTO users (id, email, hashed_password, display_name, email_verified, created_at, updated_at) "
"email_verified, created_at, updated_at) " "VALUES (:id, :email, :hashed_password, :display_name, :email_verified, :created_at, :updated_at)"
"VALUES (:id, :email, :hashed_password, :display_name, :email_verified, "
":created_at, :updated_at)"
), ),
{ {
"id": user_id, "id": user_id,
+1 -2
View File
@@ -138,8 +138,7 @@ async def test_expired_session_rejected(client, db_engine):
async with db_engine.begin() as conn: async with db_engine.begin() as conn:
await conn.execute( await conn.execute(
text( text(
"INSERT INTO users (id, email, hashed_password, display_name, " "INSERT INTO users (id, email, hashed_password, display_name, email_verified, created_at, updated_at) "
"email_verified, created_at, updated_at) "
"VALUES (:id, :email, :hp, :dn, :ev, :ca, :ua)" "VALUES (:id, :email, :hp, :dn, :ev, :ca, :ua)"
), ),
{ {
+2
View File
@@ -1,5 +1,7 @@
"""Tests for Settings config, specifically the database_url env var fallback.""" """Tests for Settings config, specifically the database_url env var fallback."""
import os
from cartsnitch_api.config import Settings from cartsnitch_api.config import Settings
+1 -2
View File
@@ -65,8 +65,7 @@ class TestSessionValidation:
async with db_engine.begin() as conn: async with db_engine.begin() as conn:
await conn.execute( await conn.execute(
text( text(
"INSERT INTO users (id, email, hashed_password, display_name, " "INSERT INTO users (id, email, hashed_password, display_name, email_verified, created_at, updated_at) "
"email_verified, created_at, updated_at) "
"VALUES (:id, :email, :hp, :dn, :ev, :ca, :ua)" "VALUES (:id, :email, :hp, :dn, :ev, :ca, :ua)"
), ),
{ {
+1 -1
View File
@@ -1,7 +1,7 @@
"""Tests for rate limiting middleware.""" """Tests for rate limiting middleware."""
import time import time
from unittest.mock import AsyncMock, MagicMock from unittest.mock import AsyncMock, MagicMock, patch
import pytest import pytest