From 7c5ee9bdc02ba56eb4ed0862eb3c5b7868393ace Mon Sep 17 00:00:00 2001 From: Savannah Savings <31+cs_savannah@noreply.git.farh.net> Date: Wed, 27 May 2026 01:57:23 +0000 Subject: [PATCH] =?UTF-8?q?Promote=20dev=20=E2=86=92=20uat:=20remove=20inv?= =?UTF-8?q?alid=20CI=20deploy=20jobs=20(CAR-1069)=20(#38)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 87 ------------------------------------ .mcp.json | 11 +++++ tests/conftest.py | 31 +++++++++---- tests/test_encrypted_json.py | 9 ++++ 4 files changed, 42 insertions(+), 96 deletions(-) create mode 100644 .mcp.json diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 12dcd77..c74a1d1 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -175,90 +175,3 @@ jobs: git tag "v${{ steps.calver.outputs.version }}" git push origin "v${{ steps.calver.outputs.version }}" - deploy-dev: - runs-on: ubuntu-latest - needs: [build-and-push] - if: always() && !cancelled() && github.event_name == 'push' && (github.ref == 'refs/heads/dev' || github.ref == 'refs/heads/main') - steps: - - name: Checkout infra repo - uses: actions/checkout@v4 - with: - repository: cartsnitch/infra - token: ${{ secrets.GITEA_TOKEN }} - ref: main - path: infra - - - name: Install kubectl - uses: azure/setup-kubectl@v4 - - - name: Install kustomize - uses: imranismail/setup-kustomize@v2 - - - name: Determine image tag - id: api_tag - run: | - if [ "${{ github.ref }}" == "refs/heads/main" ]; then - echo "tag=${{ needs.build-and-push.outputs.calver_tag }}" >> "$GITHUB_OUTPUT" - else - echo "tag=${{ needs.build-and-push.outputs.sha_tag }}" >> "$GITHUB_OUTPUT" - fi - - - name: Update api image tag - if: needs.build-and-push.result == 'success' - run: | - cd infra/apps/overlays/dev - kustomize edit set image ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.api_tag.outputs.tag }} - - - name: Commit and push to infra - run: | - cd infra - git config user.name "cartsnitch-ci[bot]" - git config user.email "cartsnitch-ci[bot]@users.noreply.github.com" - git add apps/overlays/dev/kustomization.yaml - git commit -m "ci(dev): update api image" - git pull --rebase origin main - git push origin main - - deploy-uat: - runs-on: ubuntu-latest - needs: [build-and-push] - if: always() && !cancelled() && github.event_name == 'push' && (github.ref == 'refs/heads/uat' || github.ref == 'refs/heads/main') - steps: - - name: Checkout infra repo - uses: actions/checkout@v4 - with: - repository: cartsnitch/infra - token: ${{ secrets.GITEA_TOKEN }} - ref: main - path: infra - - - name: Install kubectl - uses: azure/setup-kubectl@v4 - - - name: Install kustomize - uses: imranismail/setup-kustomize@v2 - - - name: Determine image tag - id: api_tag - run: | - if [ "${{ github.ref }}" == "refs/heads/main" ]; then - echo "tag=${{ needs.build-and-push.outputs.calver_tag }}" >> "$GITHUB_OUTPUT" - else - echo "tag=${{ needs.build-and-push.outputs.sha_tag }}" >> "$GITHUB_OUTPUT" - fi - - - name: Update api image tag - if: needs.build-and-push.result == 'success' - run: | - cd infra/apps/overlays/uat - kustomize edit set image ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.api_tag.outputs.tag }} - - - name: Commit and push to infra - run: | - cd infra - git config user.name "cartsnitch-ci[bot]" - git config user.email "cartsnitch-ci[bot]@users.noreply.github.com" - git add apps/overlays/uat/kustomization.yaml - git commit -m "ci(uat): update api image" - git pull --rebase origin main - git push origin main \ No newline at end of file diff --git a/.mcp.json b/.mcp.json new file mode 100644 index 0000000..6efc1ca --- /dev/null +++ b/.mcp.json @@ -0,0 +1,11 @@ +{ + "mcpServers": { + "gitea": { + "type": "http", + "url": "https://git-mcp.farh.net/mcp", + "headers": { + "Authorization": "Bearer ${GITEA_TOKEN}" + } + } + } +} diff --git a/tests/conftest.py b/tests/conftest.py index 5bd4e67..6439552 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -51,12 +51,21 @@ def disable_rate_limiting(): @pytest.fixture def engine(): - """Sync in-memory SQLite engine for model unit tests.""" - eng = create_engine("sqlite:///:memory:") - from cartsnitch_api.models.user import User + """Sync in-memory SQLite engine for model unit tests. + + Strips PostgreSQL-specific server_default expressions so SQLite can + handle all column inserts without missing-function errors. + """ + eng = create_engine("sqlite:///:memory:") + + for table in Base.metadata.tables.values(): + for col in table.columns.values(): + sd = col.server_default + if sd is not None: + expr_str = str(sd.expression).lower() + if "gen_random_uuid" in expr_str or "gen_random_bytes" in expr_str: + col.server_default = None - col = User.__table__.columns["email_inbound_token"] - col.server_default = None Base.metadata.create_all(eng) yield eng eng.dispose() @@ -80,12 +89,16 @@ async def db_engine(): cursor.execute("PRAGMA foreign_keys=ON") cursor.close() - async with engine.begin() as conn: - from cartsnitch_api.models.user import User + for table in Base.metadata.tables.values(): + for col in table.columns.values(): + sd = col.server_default + if sd is not None: + expr_str = str(sd.expression).lower() + if "gen_random_uuid" in expr_str or "gen_random_bytes" in expr_str: + col.server_default = None - User.__table__.columns["email_inbound_token"].server_default = None + async with engine.begin() as conn: await conn.run_sync(Base.metadata.create_all) - # Create Better-Auth tables (not managed by SQLAlchemy models) await conn.execute( text(""" CREATE TABLE IF NOT EXISTS sessions ( diff --git a/tests/test_encrypted_json.py b/tests/test_encrypted_json.py index 2ef3ccb..07cf44c 100644 --- a/tests/test_encrypted_json.py +++ b/tests/test_encrypted_json.py @@ -17,6 +17,15 @@ from cartsnitch_api.models.user import User, UserStoreAccount @pytest.fixture def engine(): eng = create_engine("sqlite:///:memory:") + + for table in Base.metadata.tables.values(): + for col in table.columns.values(): + sd = col.server_default + if sd is not None: + expr_str = str(sd.expression).lower() + if "gen_random_uuid" in expr_str or "gen_random_bytes" in expr_str: + col.server_default = None + Base.metadata.create_all(eng) yield eng eng.dispose()