From f7c5ac2d89da02ff192e7aead54632ac78086cb2 Mon Sep 17 00:00:00 2001 From: M Dombaugh Date: Sun, 1 Mar 2026 14:45:15 +0000 Subject: [PATCH] Commit prior to Claude Code implementation on VM --- deploy-tests-fix.sh | 462 + deploy-tests.sh | 1564 +++ pytest.ini | 5 + smoke-results.txt | 18321 +++++++++++++++++++++++++++++++++ tests/__init__.py | 0 tests/conftest.py | 202 + tests/form_factory.py | 195 + tests/introspect.py | 357 + tests/registry.py | 69 + tests/route_report.py | 65 + tests/run_tests.sh | 22 + tests/test_business_logic.py | 212 + tests/test_crud_dynamic.py | 161 + tests/test_smoke_dynamic.py | 76 + 14 files changed, 21711 insertions(+) create mode 100644 deploy-tests-fix.sh create mode 100644 deploy-tests.sh create mode 100644 pytest.ini create mode 100644 smoke-results.txt create mode 100644 tests/__init__.py create mode 100644 tests/conftest.py create mode 100644 tests/form_factory.py create mode 100644 tests/introspect.py create mode 100644 tests/registry.py create mode 100644 tests/route_report.py create mode 100755 tests/run_tests.sh create mode 100644 tests/test_business_logic.py create mode 100644 tests/test_crud_dynamic.py create mode 100644 tests/test_smoke_dynamic.py diff --git a/deploy-tests-fix.sh b/deploy-tests-fix.sh new file mode 100644 index 0000000..f4e5a05 --- /dev/null +++ b/deploy-tests-fix.sh @@ -0,0 +1,462 @@ +#!/bin/bash +set -e + +echo "=== Life OS Test Suite Fix ===" +echo "Fixes: event loop conflicts, seed data approach, search/api 422" +echo "" + +# ────────────────────────────────────────────────────────────── +# Step 1: Install psycopg2-binary for sync seed data +# ────────────────────────────────────────────────────────────── +echo "[1/6] Installing psycopg2-binary..." +docker exec lifeos-dev pip install psycopg2-binary --break-system-packages -q 2>/dev/null +echo " Done" + +# ────────────────────────────────────────────────────────────── +# Step 1b: Update pytest.ini for session-scoped loop +# ────────────────────────────────────────────────────────────── +echo " Updating pytest.ini..." +cat > /opt/lifeos/dev/pytest.ini << 'PYTESTINI_EOF' +[pytest] +asyncio_mode = auto +asyncio_default_fixture_loop_scope = session +testpaths = tests +addopts = -v --tb=short +PYTESTINI_EOF + +# ────────────────────────────────────────────────────────────── +# Step 2: Probe the app to verify engine location +# ────────────────────────────────────────────────────────────── +echo "[2/6] Probing app structure..." +docker exec lifeos-dev python3 -c " +import os +os.environ['DATABASE_URL'] = 'postgresql+asyncpg://postgres:UCTOQDZiUhN8U@lifeos-db:5432/lifeos_test' +from core.database import engine +print(f' Engine found: {engine.url}') +print(f' Engine class: {type(engine).__name__}') +" 2>&1 || { echo "ERROR: Could not find engine in core.database"; exit 1; } + +# ────────────────────────────────────────────────────────────── +# Step 3: Probe actual table columns for seed data accuracy +# ────────────────────────────────────────────────────────────── +echo "[3/6] Probing table columns for seed data..." +SEED_COLUMNS=$(docker exec lifeos-db psql -U postgres -d lifeos_dev -t -A -c " +SELECT table_name, string_agg(column_name || ':' || is_nullable || ':' || data_type, ',') +FROM information_schema.columns +WHERE table_schema='public' + AND table_name IN ('domains','areas','projects','tasks','contacts','notes','meetings','decisions','appointments','weblink_folders','lists','links','weblinks','capture_inbox','daily_focus','time_entries','files') +GROUP BY table_name +ORDER BY table_name; +") +echo " Columns retrieved for seed tables" + +# Verify critical table names exist +echo " Verifying table names..." +docker exec lifeos-db psql -U postgres -d lifeos_test -t -A -c " +SELECT tablename FROM pg_tables WHERE schemaname='public' +AND tablename IN ('domains','areas','projects','tasks','contacts','notes','meetings','decisions','appointments','weblink_folders','lists','links','weblinks','capture_inbox','daily_focus','time_entries','files') +ORDER BY tablename; +" + +# Check if capture table is 'capture' or 'capture_inbox' +CAPTURE_TABLE=$(docker exec lifeos-db psql -U postgres -d lifeos_test -t -A -c " +SELECT tablename FROM pg_tables WHERE schemaname='public' AND tablename LIKE 'capture%' LIMIT 1; +") +echo " Capture table name: $CAPTURE_TABLE" + +# Check daily_focus vs daily_focus +FOCUS_TABLE=$(docker exec lifeos-db psql -U postgres -d lifeos_test -t -A -c " +SELECT tablename FROM pg_tables WHERE schemaname='public' AND tablename LIKE '%focus%' LIMIT 1; +") +echo " Focus table name: $FOCUS_TABLE" + +# ────────────────────────────────────────────────────────────── +# Step 4: Write fixed registry.py +# ────────────────────────────────────────────────────────────── +echo "[4/6] Writing fixed registry.py..." +cat > /opt/lifeos/dev/tests/registry.py << 'REGISTRY_EOF' +""" +Route registry - imports app, runs introspection once, exposes route data. +Disposes the async engine after introspection to avoid event loop conflicts. +""" +import os +import asyncio + +# Point the app at the test database BEFORE importing +os.environ["DATABASE_URL"] = "postgresql+asyncpg://postgres:UCTOQDZiUhN8U@lifeos-db:5432/lifeos_test" + +from main import app +from tests.introspect import introspect_routes, classify_route + +# Build route registry from live app +ROUTE_REGISTRY = introspect_routes(app) + +# Classify routes into buckets for parametrized tests +GET_NO_PARAMS = [r for r in ROUTE_REGISTRY if r.method == "GET" and not r.path_params] +GET_WITH_PARAMS = [r for r in ROUTE_REGISTRY if r.method == "GET" and r.path_params] +POST_CREATE = [r for r in ROUTE_REGISTRY if r.method == "POST" and r.kind == "create"] +POST_EDIT = [r for r in ROUTE_REGISTRY if r.method == "POST" and r.kind == "edit"] +POST_DELETE = [r for r in ROUTE_REGISTRY if r.method == "POST" and r.kind == "delete"] +POST_ACTION = [r for r in ROUTE_REGISTRY if r.method == "POST" and r.kind in ("action", "toggle")] + +# Map route prefixes to seed fixture keys +PREFIX_TO_SEED = { + "/domains": "domain", + "/areas": "area", + "/projects": "project", + "/tasks": "task", + "/notes": "note", + "/links": "link", + "/contacts": "contact", + "/lists": "list", + "/meetings": "meeting", + "/decisions": "decision", + "/weblinks": "weblink", + "/weblinks/folders": "weblink_folder", + "/appointments": "appointment", + "/focus": "focus", + "/capture": "capture", + "/time": "task", + "/files": None, + "/admin/trash": None, +} + +def resolve_path(path_template, seeds): + """Replace {id} placeholders with real seed UUIDs.""" + import re + result = path_template + for param in re.findall(r"\{(\w+)\}", path_template): + # Find prefix for this route + for prefix, seed_key in sorted(PREFIX_TO_SEED.items(), key=lambda x: -len(x[0])): + if path_template.startswith(prefix) and seed_key and seed_key in seeds: + result = result.replace(f"{{{param}}}", str(seeds[seed_key])) + break + return result + +# CRITICAL: Dispose the async engine created at import time. +# It was bound to whatever event loop existed during collection. +# When tests run, pytest-asyncio creates a NEW event loop. +# The engine will lazily recreate its connection pool on that new loop. +try: + from core.database import engine + loop = asyncio.new_event_loop() + loop.run_until_complete(engine.dispose()) + loop.close() +except Exception: + pass # If disposal fails, tests will still try to proceed +REGISTRY_EOF +echo " registry.py written" + +# ────────────────────────────────────────────────────────────── +# Step 5: Write fixed conftest.py +# ────────────────────────────────────────────────────────────── +echo "[5/6] Writing fixed conftest.py..." +cat > /opt/lifeos/dev/tests/conftest.py << 'CONFTEST_EOF' +""" +Test fixtures - uses psycopg2 (sync) for seed data to avoid event loop conflicts. +Seeds are session-scoped and committed so the app can see them via its own engine. +""" +import asyncio +import uuid +import pytest +import psycopg2 +from httpx import AsyncClient, ASGITransport + +from tests.registry import app + +TEST_DB_DSN = "host=lifeos-db port=5432 dbname=lifeos_test user=postgres password=UCTOQDZiUhN8U" + +# ── Fixed seed UUIDs (stable across test runs) ────────────── +SEED_IDS = { + "domain": "a0000000-0000-0000-0000-000000000001", + "area": "a0000000-0000-0000-0000-000000000002", + "project": "a0000000-0000-0000-0000-000000000003", + "task": "a0000000-0000-0000-0000-000000000004", + "contact": "a0000000-0000-0000-0000-000000000005", + "note": "a0000000-0000-0000-0000-000000000006", + "meeting": "a0000000-0000-0000-0000-000000000007", + "decision": "a0000000-0000-0000-0000-000000000008", + "appointment": "a0000000-0000-0000-0000-000000000009", + "weblink_folder": "a0000000-0000-0000-0000-00000000000a", + "list": "a0000000-0000-0000-0000-00000000000b", + "link": "a0000000-0000-0000-0000-00000000000c", + "weblink": "a0000000-0000-0000-0000-00000000000d", + "capture": "a0000000-0000-0000-0000-00000000000e", + "focus": "a0000000-0000-0000-0000-00000000000f", +} + + +# ── Session-scoped event loop ─────────────────────────────── +# All async tests share one loop so the app's engine pool stays valid. +@pytest.fixture(scope="session") +def event_loop(): + loop = asyncio.new_event_loop() + yield loop + loop.close() + + +# ── Sync DB connection for seed management ────────────────── +@pytest.fixture(scope="session") +def sync_conn(): + conn = psycopg2.connect(TEST_DB_DSN) + conn.autocommit = False + yield conn + conn.close() + + +# ── Seed data (session-scoped, committed) ─────────────────── +@pytest.fixture(scope="session") +def all_seeds(sync_conn): + """Insert all seed data once. Committed so the app's engine can see it.""" + cur = sync_conn.cursor() + d = SEED_IDS + + try: + # Domain + cur.execute(""" + INSERT INTO domains (id, name, color, description, sort_order, is_deleted, created_at, updated_at) + VALUES (%s, 'Test Domain', '#FF5733', 'Auto test domain', 0, false, now(), now()) + ON CONFLICT (id) DO NOTHING + """, (d["domain"],)) + + # Area + cur.execute(""" + INSERT INTO areas (id, name, domain_id, description, status, sort_order, is_deleted, created_at, updated_at) + VALUES (%s, 'Test Area', %s, 'Auto test area', 'active', 0, false, now(), now()) + ON CONFLICT (id) DO NOTHING + """, (d["area"], d["domain"])) + + # Project + cur.execute(""" + INSERT INTO projects (id, name, domain_id, area_id, description, status, priority, sort_order, is_deleted, created_at, updated_at) + VALUES (%s, 'Test Project', %s, %s, 'Auto test project', 'active', 2, 0, false, now(), now()) + ON CONFLICT (id) DO NOTHING + """, (d["project"], d["domain"], d["area"])) + + # Task + cur.execute(""" + INSERT INTO tasks (id, title, domain_id, project_id, description, priority, status, sort_order, is_deleted, created_at, updated_at) + VALUES (%s, 'Test Task', %s, %s, 'Auto test task', 2, 'todo', 0, false, now(), now()) + ON CONFLICT (id) DO NOTHING + """, (d["task"], d["domain"], d["project"])) + + # Contact + cur.execute(""" + INSERT INTO contacts (id, first_name, last_name, company, email, is_deleted, created_at, updated_at) + VALUES (%s, 'Test', 'Contact', 'TestCorp', 'test@example.com', false, now(), now()) + ON CONFLICT (id) DO NOTHING + """, (d["contact"],)) + + # Note + cur.execute(""" + INSERT INTO notes (id, title, domain_id, body, content_format, is_deleted, created_at, updated_at) + VALUES (%s, 'Test Note', %s, 'Test body content', 'markdown', false, now(), now()) + ON CONFLICT (id) DO NOTHING + """, (d["note"], d["domain"])) + + # Meeting + cur.execute(""" + INSERT INTO meetings (id, title, meeting_date, status, is_deleted, created_at, updated_at) + VALUES (%s, 'Test Meeting', '2025-06-15', 'scheduled', false, now(), now()) + ON CONFLICT (id) DO NOTHING + """, (d["meeting"],)) + + # Decision + cur.execute(""" + INSERT INTO decisions (id, title, status, impact, is_deleted, created_at, updated_at) + VALUES (%s, 'Test Decision', 'decided', 'high', false, now(), now()) + ON CONFLICT (id) DO NOTHING + """, (d["decision"],)) + + # Appointment + cur.execute(""" + INSERT INTO appointments (id, title, start_at, end_at, all_day, is_deleted, created_at, updated_at) + VALUES (%s, 'Test Appointment', '2025-06-15 10:00:00', '2025-06-15 11:00:00', false, false, now(), now()) + ON CONFLICT (id) DO NOTHING + """, (d["appointment"],)) + + # Weblink folder + cur.execute(""" + INSERT INTO weblink_folders (id, name, is_deleted, created_at, updated_at) + VALUES (%s, 'Test Folder', false, now(), now()) + ON CONFLICT (id) DO NOTHING + """, (d["weblink_folder"],)) + + # List + cur.execute(""" + INSERT INTO lists (id, name, domain_id, project_id, list_type, is_deleted, created_at, updated_at) + VALUES (%s, 'Test List', %s, %s, 'checklist', false, now(), now()) + ON CONFLICT (id) DO NOTHING + """, (d["list"], d["domain"], d["project"])) + + # Link + cur.execute(""" + INSERT INTO links (id, label, url, domain_id, is_deleted, created_at, updated_at) + VALUES (%s, 'Test Link', 'https://example.com', %s, false, now(), now()) + ON CONFLICT (id) DO NOTHING + """, (d["link"], d["domain"])) + + # Weblink + cur.execute(""" + INSERT INTO weblinks (id, label, url, folder_id, is_deleted, created_at, updated_at) + VALUES (%s, 'Test Weblink', 'https://example.com/wl', %s, false, now(), now()) + ON CONFLICT (id) DO NOTHING + """, (d["weblink"], d["weblink_folder"])) + + # Capture + cur.execute(""" + INSERT INTO capture_inbox (id, raw_text, status, is_deleted, created_at, updated_at) + VALUES (%s, 'Test capture item', 'pending', false, now(), now()) + ON CONFLICT (id) DO NOTHING + """, (d["capture"],)) + + # Daily focus + cur.execute(""" + INSERT INTO daily_focus (id, task_id, focus_date, is_completed, created_at) + VALUES (%s, %s, CURRENT_DATE, false, now()) + ON CONFLICT (id) DO NOTHING + """, (d["focus"], d["task"])) + + sync_conn.commit() + except Exception as e: + sync_conn.rollback() + raise RuntimeError(f"Seed data insertion failed: {e}") from e + + yield d + + # Cleanup: delete all seed data (reverse dependency order) + try: + cur.execute("DELETE FROM daily_focus WHERE id = %s", (d["focus"],)) + cur.execute("DELETE FROM capture_inbox WHERE id = %s", (d["capture"],)) + cur.execute("DELETE FROM weblinks WHERE id = %s", (d["weblink"],)) + cur.execute("DELETE FROM links WHERE id = %s", (d["link"],)) + cur.execute("DELETE FROM lists WHERE id = %s", (d["list"],)) + cur.execute("DELETE FROM weblink_folders WHERE id = %s", (d["weblink_folder"],)) + cur.execute("DELETE FROM appointments WHERE id = %s", (d["appointment"],)) + cur.execute("DELETE FROM decisions WHERE id = %s", (d["decision"],)) + cur.execute("DELETE FROM meetings WHERE id = %s", (d["meeting"],)) + cur.execute("DELETE FROM notes WHERE id = %s", (d["note"],)) + cur.execute("DELETE FROM contacts WHERE id = %s", (d["contact"],)) + cur.execute("DELETE FROM tasks WHERE id = %s", (d["task"],)) + cur.execute("DELETE FROM projects WHERE id = %s", (d["project"],)) + cur.execute("DELETE FROM areas WHERE id = %s", (d["area"],)) + cur.execute("DELETE FROM domains WHERE id = %s", (d["domain"],)) + sync_conn.commit() + except Exception: + sync_conn.rollback() + finally: + cur.close() + + +# ── HTTP client (function-scoped) ─────────────────────────── +@pytest.fixture +async def client(): + transport = ASGITransport(app=app) + async with AsyncClient(transport=transport, base_url="http://test") as c: + yield c +CONFTEST_EOF +echo " conftest.py written" + +# ────────────────────────────────────────────────────────────── +# Step 6: Write fixed test_smoke_dynamic.py +# ────────────────────────────────────────────────────────────── +echo "[6/6] Writing fixed test_smoke_dynamic.py..." +cat > /opt/lifeos/dev/tests/test_smoke_dynamic.py << 'SMOKE_EOF' +""" +Dynamic smoke tests - auto-parametrized from introspected routes. +Tests that all GET endpoints return 200 (or acceptable alternatives). +""" +import pytest +from tests.registry import ( + GET_NO_PARAMS, GET_WITH_PARAMS, + resolve_path, PREFIX_TO_SEED, ROUTE_REGISTRY, +) + +# Routes that require query params to avoid 422 +ROUTES_NEEDING_QUERY = { + "/search/api": "?q=test", +} + +# Routes that may legitimately return non-200 without full context +ACCEPTABLE_CODES = {200, 307, 308} + + +# ── Test 1: All GET endpoints without path params ─────────── +@pytest.mark.parametrize( + "path", + [r.path for r in GET_NO_PARAMS], + ids=[f"GET {r.path}" for r in GET_NO_PARAMS], +) +async def test_get_no_params_returns_200(client, path): + """Every GET endpoint without path params should return 200.""" + url = path + # Append required query params if needed + for route_prefix, query_string in ROUTES_NEEDING_QUERY.items(): + if path == route_prefix or path.rstrip("/") == route_prefix.rstrip("/"): + url = path + query_string + break + + r = await client.get(url, follow_redirects=True) + assert r.status_code in ACCEPTABLE_CODES or r.status_code == 200, \ + f"GET {url} returned {r.status_code}" + + +# ── Test 2: All GET endpoints with valid seed IDs ─────────── +@pytest.mark.parametrize( + "path_template", + [r.path for r in GET_WITH_PARAMS], + ids=[f"GET {r.path}" for r in GET_WITH_PARAMS], +) +async def test_get_with_valid_id_returns_200(client, all_seeds, path_template): + """GET endpoints with a valid seed UUID should return 200.""" + path = resolve_path(path_template, all_seeds) + # Skip if we couldn't resolve (no seed for this prefix) + if "{" in path: + pytest.skip(f"No seed mapping for {path_template}") + + r = await client.get(path, follow_redirects=True) + assert r.status_code == 200, f"GET {path} returned {r.status_code}" + + +# ── Test 3: GET with fake UUID returns 404 ────────────────── +FAKE_UUID = "00000000-0000-0000-0000-000000000000" + +# Build fake-ID test cases from routes that have path params +_fake_id_cases = [] +for r in GET_WITH_PARAMS: + import re + fake_path = re.sub(r"\{[^}]+\}", FAKE_UUID, r.path) + _fake_id_cases.append((fake_path, r.path)) + +@pytest.mark.parametrize( + "path,template", + _fake_id_cases if _fake_id_cases else [pytest.param("", "", marks=pytest.mark.skip)], + ids=[f"404 {c[1]}" for c in _fake_id_cases] if _fake_id_cases else ["NOTSET"], +) +async def test_get_with_fake_id_returns_404(client, path, template): + """GET endpoints with a nonexistent UUID should return 404.""" + r = await client.get(path, follow_redirects=True) + assert r.status_code in (404, 302, 303), \ + f"GET {path} returned {r.status_code}, expected 404 or redirect" +SMOKE_EOF +echo " test_smoke_dynamic.py written" + +# ────────────────────────────────────────────────────────────── +# Verify deployment +# ────────────────────────────────────────────────────────────── +echo "" +echo "=== Fix deployed ===" +echo "" +echo "Changes made:" +echo " 1. Installed psycopg2-binary (sync DB driver for seed data)" +echo " 2. registry.py: disposes async engine after introspection" +echo " 3. conftest.py: session-scoped event loop, psycopg2 seeds, fixed UUIDs" +echo " 4. test_smoke_dynamic.py: handles /search/api query param, better assertions" +echo "" +echo "Now run:" +echo " docker exec lifeos-dev bash /app/tests/run_tests.sh smoke" +echo "" +echo "If smoke tests pass, run:" +echo " docker exec lifeos-dev bash /app/tests/run_tests.sh crud" +echo " docker exec lifeos-dev bash /app/tests/run_tests.sh logic" +echo " docker exec lifeos-dev bash /app/tests/run_tests.sh # full suite" diff --git a/deploy-tests.sh b/deploy-tests.sh new file mode 100644 index 0000000..cadbd12 --- /dev/null +++ b/deploy-tests.sh @@ -0,0 +1,1564 @@ +#!/bin/bash +set -e +echo "=== Life OS Dynamic Test Suite ===" + +echo "" +echo "[1/5] Setting up test database..." +docker exec lifeos-db psql -U postgres -c "DROP DATABASE IF EXISTS lifeos_test;" 2>/dev/null || true +docker exec lifeos-db psql -U postgres -c "CREATE DATABASE lifeos_test;" +docker exec lifeos-db pg_dump -U postgres -d lifeos_dev --schema-only -f /tmp/lifeos_schema_dump.sql +docker exec lifeos-db psql -U postgres -d lifeos_test -f /tmp/lifeos_schema_dump.sql -q +TABLE_COUNT=$(docker exec lifeos-db psql -U postgres -d lifeos_test -t -c \ + "SELECT count(*) FROM information_schema.tables WHERE table_schema='public' AND table_type='BASE TABLE';") +echo " Test DB: $(echo ${TABLE_COUNT} | tr -d ' ') tables (cloned from lifeos_dev)" + +echo "" +echo "[2/5] Installing test dependencies..." +docker exec lifeos-dev pip install pytest pytest-asyncio httpx --break-system-packages -q 2>&1 | tail -1 + +echo "" +echo "[3/5] Writing test files..." +mkdir -p /opt/lifeos/dev/tests + + +cat > /opt/lifeos/dev/tests/__init__.py << 'EOF_tests___init___py' +EOF_tests___init___py + +cat > /opt/lifeos/dev/tests/introspect.py << 'EOF_tests_introspect_py' +""" +Route Introspection Engine +========================== +Imports the live FastAPI app and extracts a complete route registry: + - All paths, methods, endpoint names + - Path parameters (e.g. {id}) + - Form fields with types and defaults (from function signatures) + - Route classification (list, detail, create, edit, delete, etc.) + +This is the single source of truth for all dynamic tests. +No hardcoded routes anywhere in the test suite. +""" +from __future__ import annotations + +import inspect +import json +import re +from dataclasses import dataclass, field, asdict +from enum import Enum +from typing import Any, Optional + +from fastapi import Form, UploadFile +from fastapi.params import Depends +from fastapi.routing import APIRoute + + +class RouteKind(str, Enum): + """Classification of route purpose based on path pattern + method.""" + LIST = "list" # GET /entities/ + DETAIL = "detail" # GET /entities/{id} + CREATE_FORM = "create_form" # GET /entities/create + EDIT_FORM = "edit_form" # GET /entities/{id}/edit + CREATE = "create" # POST /entities/create + EDIT = "edit" # POST /entities/{id}/edit + DELETE = "delete" # POST /entities/{id}/delete + TOGGLE = "toggle" # POST /entities/{id}/toggle + ACTION = "action" # POST with other patterns + JSON_ENDPOINT = "json" # GET returning JSON (e.g. /time/running) + PAGE = "page" # GET catch-all (dashboard, search, etc.) + OTHER = "other" + + +@dataclass +class FormField: + """A form field extracted from a route endpoint's signature.""" + name: str + annotation: str # str, int, Optional[str], etc. + required: bool + default: Any = None # Default value if not required + is_file: bool = False # True for UploadFile params + + +@dataclass +class RouteInfo: + """Complete metadata for a single route.""" + path: str + methods: list[str] + endpoint_name: str + kind: RouteKind + path_params: list[str] # e.g. ["id"] from /tasks/{id} + form_fields: list[FormField] # Form() params from signature + query_params: list[str] # Non-Form, non-Depends, non-Request params + has_file_upload: bool = False + prefix: str = "" # Router prefix, e.g. "/tasks" + + @property + def needs_seed_data(self) -> bool: + """True if this route needs an entity ID to test.""" + return bool(self.path_params) + + @property + def entity_prefix(self) -> str: + """Extract the entity prefix, e.g. '/tasks' from '/tasks/{id}/edit'.""" + if self.prefix: + return self.prefix + parts = self.path.strip("/").split("/") + return f"/{parts[0]}" if parts else "" + + +def _classify_route(path: str, methods: set[str]) -> RouteKind: + """Determine route purpose from path pattern and HTTP method.""" + is_get = "GET" in methods + is_post = "POST" in methods + + if is_get: + if path.endswith("/create"): + return RouteKind.CREATE_FORM + if path.endswith("/edit"): + return RouteKind.EDIT_FORM + if "{" in path: + return RouteKind.DETAIL + # Heuristic: paths ending in known JSON endpoints + if any(path.endswith(p) for p in ["/running"]): + return RouteKind.JSON_ENDPOINT + if re.match(r"^/[^/]+/?$", path) or path == "/": + return RouteKind.LIST if path != "/" else RouteKind.PAGE + return RouteKind.PAGE + + if is_post: + if path.endswith("/create"): + return RouteKind.CREATE + if path.endswith("/edit"): + return RouteKind.EDIT + if path.endswith("/delete"): + return RouteKind.DELETE + if path.endswith("/toggle"): + return RouteKind.TOGGLE + return RouteKind.ACTION + + return RouteKind.OTHER + + +def _extract_path_params(path: str) -> list[str]: + """Pull {param_name} from path template.""" + return re.findall(r"\{(\w+)\}", path) + + +def _extract_form_fields(endpoint) -> list[FormField]: + """ + Inspect the endpoint function signature to find Form() parameters. + Returns list of FormField with name, type, required status, and defaults. + """ + fields = [] + try: + sig = inspect.signature(endpoint) + except (ValueError, TypeError): + return fields + + for name, param in sig.parameters.items(): + # Skip non-form params + if name in ("request", "self", "cls"): + continue + + default = param.default + + # Check if it's a Depends() - skip those + if isinstance(default, Depends): + continue + + # Check for UploadFile annotation + annotation = param.annotation + ann_str = _annotation_to_str(annotation) + + if annotation is UploadFile or (hasattr(annotation, "__origin__") and UploadFile in getattr(annotation, "__args__", ())): + fields.append(FormField( + name=name, + annotation=ann_str, + required=True, + is_file=True, + )) + continue + + # Check if default is a Form() instance + is_form = False + form_default = inspect.Parameter.empty + + if hasattr(default, "__class__") and default.__class__.__name__ in ("Form", "FieldInfo"): + is_form = True + # Extract the actual default from the Form() wrapper + if hasattr(default, "default"): + form_default = default.default + + if not is_form: + # Could also be Form via Annotated types (FastAPI 0.95+) + if hasattr(annotation, "__metadata__"): + for meta in annotation.__metadata__: + if hasattr(meta, "__class__") and meta.__class__.__name__ in ("Form", "FieldInfo"): + is_form = True + if hasattr(meta, "default"): + form_default = meta.default + break + + if is_form: + # Determine if required + required = form_default is inspect.Parameter.empty or form_default is Ellipsis or form_default is None and "Optional" not in ann_str + actual_default = None if form_default in (inspect.Parameter.empty, Ellipsis) else form_default + + fields.append(FormField( + name=name, + annotation=ann_str, + required=required, + default=actual_default, + )) + + return fields + + +def _extract_query_params(endpoint, path_params: list[str]) -> list[str]: + """Extract query parameters (non-Form, non-Depends, non-special params).""" + params = [] + skip = {"request", "self", "cls", "db"} | set(path_params) + + try: + sig = inspect.signature(endpoint) + except (ValueError, TypeError): + return params + + for name, param in sig.parameters.items(): + if name in skip: + continue + default = param.default + if isinstance(default, Depends): + continue + # If it has a Form() default, skip (handled by form_fields) + if hasattr(default, "__class__") and default.__class__.__name__ in ("Form", "FieldInfo"): + continue + # Check Annotated metadata + annotation = param.annotation + if hasattr(annotation, "__metadata__"): + has_form = any( + hasattr(m, "__class__") and m.__class__.__name__ in ("Form", "FieldInfo") + for m in annotation.__metadata__ + ) + if has_form: + continue + # Remaining non-special params are likely query params + if param.annotation is not UploadFile: + params.append(name) + + return params + + +def _annotation_to_str(annotation) -> str: + """Convert a type annotation to readable string.""" + if annotation is inspect.Parameter.empty: + return "Any" + if hasattr(annotation, "__name__"): + return annotation.__name__ + return str(annotation).replace("typing.", "") + + +def _extract_prefix(path: str) -> str: + """Get the router prefix from a path.""" + # /tasks/{id}/edit -> /tasks + # /admin/trash/ -> /admin/trash + # /weblinks/folders/create -> /weblinks + parts = path.strip("/").split("/") + if not parts: + return "/" + # Walk until we hit a {param} or known action word + prefix_parts = [] + for part in parts: + if part.startswith("{"): + break + if part in ("create", "edit", "delete", "toggle"): + break + prefix_parts.append(part) + return "/" + "/".join(prefix_parts) if prefix_parts else "/" + + +def introspect_app(app) -> list[RouteInfo]: + """ + Walk all registered routes on the FastAPI app. + Returns a complete RouteInfo list - the single source of truth for tests. + """ + routes = [] + + for route in app.routes: + if not isinstance(route, APIRoute): + continue + + path = route.path + methods = route.methods or set() + endpoint = route.endpoint + endpoint_name = endpoint.__name__ if hasattr(endpoint, "__name__") else str(endpoint) + + path_params = _extract_path_params(path) + form_fields = _extract_form_fields(endpoint) + query_params = _extract_query_params(endpoint, path_params) + has_file = any(f.is_file for f in form_fields) + + # Classify each method separately if route has both GET and POST + for method in methods: + kind = _classify_route(path, {method}) + prefix = _extract_prefix(path) + + routes.append(RouteInfo( + path=path, + methods=[method], + endpoint_name=endpoint_name, + kind=kind, + path_params=path_params, + form_fields=form_fields if method == "POST" else [], + query_params=query_params if method == "GET" else [], + has_file_upload=has_file, + prefix=prefix, + )) + + return routes + + +def get_route_registry(app) -> dict: + """ + Build a structured registry keyed by route kind. + Convenience wrapper for test parametrization. + """ + all_routes = introspect_app(app) + + registry = { + "all": all_routes, + "get_no_params": [r for r in all_routes if "GET" in r.methods and not r.path_params], + "get_with_params": [r for r in all_routes if "GET" in r.methods and r.path_params], + "post_create": [r for r in all_routes if r.kind == RouteKind.CREATE], + "post_edit": [r for r in all_routes if r.kind == RouteKind.EDIT], + "post_delete": [r for r in all_routes if r.kind == RouteKind.DELETE], + "post_action": [r for r in all_routes if r.kind in (RouteKind.ACTION, RouteKind.TOGGLE)], + "lists": [r for r in all_routes if r.kind == RouteKind.LIST], + "details": [r for r in all_routes if r.kind == RouteKind.DETAIL], + "create_forms": [r for r in all_routes if r.kind == RouteKind.CREATE_FORM], + "edit_forms": [r for r in all_routes if r.kind == RouteKind.EDIT_FORM], + } + + # Group by prefix for entity-level operations + by_prefix: dict[str, list[RouteInfo]] = {} + for r in all_routes: + by_prefix.setdefault(r.prefix, []).append(r) + registry["by_prefix"] = by_prefix + + return registry + + +def dump_registry_report(app) -> str: + """ + Generate a human-readable report of all discovered routes. + Useful for debugging / verifying introspection output. + """ + routes = introspect_app(app) + lines = [ + "=" * 70, + "LIFE OS ROUTE REGISTRY", + f"Total routes discovered: {len(routes)}", + "=" * 70, + "", + ] + + # Group by prefix + by_prefix: dict[str, list[RouteInfo]] = {} + for r in routes: + by_prefix.setdefault(r.prefix, []).append(r) + + for prefix in sorted(by_prefix.keys()): + prefix_routes = by_prefix[prefix] + lines.append(f" {prefix}") + lines.append(f" {'─' * 60}") + for r in sorted(prefix_routes, key=lambda x: (x.path, x.methods)): + method = r.methods[0] if r.methods else "?" + form_str = "" + if r.form_fields: + field_names = [f.name + ("*" if f.required else "") for f in r.form_fields] + form_str = f" fields=[{', '.join(field_names)}]" + query_str = "" + if r.query_params: + query_str = f" query=[{', '.join(r.query_params)}]" + lines.append(f" {method:6s} {r.path:40s} {r.kind.value:15s}{form_str}{query_str}") + lines.append("") + + return "\n".join(lines) +EOF_tests_introspect_py + +cat > /opt/lifeos/dev/tests/form_factory.py << 'EOF_tests_form_factory_py' +""" +Form Data Factory +================= +Generates valid POST form data for any route, using: + 1. Introspected Form field names/types from the route + 2. Seed data UUIDs for FK references (domain_id, project_id, etc.) + 3. Heuristic value generation based on field name patterns + +This eliminates hardcoded form data in tests. When a route's +form fields change, tests automatically adapt. +""" +from __future__ import annotations + +from datetime import date, datetime, timezone +from typing import Any + +from tests.introspect import FormField + + +# --------------------------------------------------------------------------- +# Field name -> value resolution rules +# --------------------------------------------------------------------------- + +# FK fields map to seed fixture keys +FK_FIELD_MAP = { + "domain_id": "domain", + "area_id": "area", + "project_id": "project", + "task_id": "task", + "folder_id": "weblink_folder", + "parent_id": None, # Usually optional, skip + "meeting_id": None, + "contact_id": "contact", + "release_id": None, + "note_id": "note", + "list_id": "list", +} + +# Field name pattern -> static test value +NAME_PATTERNS: list[tuple[str, Any]] = [ + # Exact matches first + ("title", "Test Title Auto"), + ("name", "Test Name Auto"), + ("first_name", "TestFirst"), + ("last_name", "TestLast"), + ("description", "Auto-generated test description"), + ("body", "Auto-generated test body content"), + ("raw_text", "Auto capture line 1\nAuto capture line 2"), + ("url", "https://test.example.com"), + ("email", "autotest@example.com"), + ("phone", "555-0199"), + ("company", "Test Corp"), + ("role", "Tester"), + ("color", "#AA55CC"), + ("icon", "star"), + ("status", "active"), + ("priority", "3"), + ("content_format", "rich"), + ("meeting_date", None), # Resolved dynamically + ("start_date", None), + ("end_date", None), + ("start_time", None), + ("end_time", None), + ("due_date", None), + ("start_at", None), + ("end_at", None), + ("focus_date", None), + ("sort_order", "0"), + ("estimated_minutes", "30"), + ("energy_required", "medium"), + ("context", ""), + ("recurrence", ""), + ("version_label", "v1.0"), + ("agenda", "Test agenda"), + ("notes_body", "Test notes"), + ("location", "Test Location"), + ("tags", ""), + ("notes", "Test notes field"), +] + + +def _resolve_date_field(field_name: str) -> str: + """Generate appropriate date/time string based on field name.""" + now = datetime.now(timezone.utc) + if "time" in field_name and "date" not in field_name: + return now.strftime("%H:%M") + if "date" in field_name: + return date.today().isoformat() + if field_name in ("start_at", "end_at"): + return now.isoformat() + return date.today().isoformat() + + +def build_form_data( + form_fields: list[FormField], + seed_data: dict[str, dict] | None = None, +) -> dict[str, str]: + """ + Build a valid form data dict for a POST request. + + Args: + form_fields: List of FormField from route introspection. + seed_data: Dict mapping entity type to seed fixture dict. + e.g. {"domain": {"id": "abc-123", ...}, "project": {"id": "def-456", ...}} + + Returns: + Dict of field_name -> string value, ready for httpx POST data. + """ + seed_data = seed_data or {} + data: dict[str, str] = {} + + for field in form_fields: + if field.is_file: + continue # Skip file uploads in form data + + value = _resolve_field_value(field, seed_data) + if value is not None: + data[field.name] = str(value) + + return data + + +def _resolve_field_value( + field: FormField, + seed_data: dict[str, dict], +) -> Any | None: + """Resolve a single field's test value.""" + name = field.name + + # 1. FK fields -> look up seed data UUID + if name in FK_FIELD_MAP: + entity_type = FK_FIELD_MAP[name] + if entity_type is None: + # Optional FK with no mapping, return None (skip) + return "" if not field.required else None + if entity_type in seed_data and "id" in seed_data[entity_type]: + return seed_data[entity_type]["id"] + # Required FK but no seed data available + return None if not field.required else "" + + # 2. Date/time fields + if any(kw in name for kw in ("date", "time", "_at")): + return _resolve_date_field(name) + + # 3. Pattern matching on field name + for pattern_name, pattern_value in NAME_PATTERNS: + if name == pattern_name: + if pattern_value is None: + return _resolve_date_field(name) + return pattern_value + + # 4. Partial name matching for common patterns + if "title" in name: + return "Test Title Auto" + if "name" in name: + return "Test Name Auto" + if "description" in name or "desc" in name: + return "Auto test description" + if "url" in name: + return "https://test.example.com" + if "email" in name: + return "auto@test.com" + + # 5. Type-based fallback + if "int" in field.annotation.lower(): + return "0" + if "bool" in field.annotation.lower(): + return "false" + + # 6. If field has a default, use it + if field.default is not None: + return str(field.default) + + # 7. Last resort for required string fields + if field.required: + return f"test_{name}" + + return "" + + +def build_edit_data( + form_fields: list[FormField], + seed_data: dict[str, dict] | None = None, +) -> dict[str, str]: + """ + Build form data for an edit/update request. + Same as build_form_data but prefixes string values with "Updated " + so tests can verify the edit took effect. + """ + data = build_form_data(form_fields, seed_data) + for key, value in data.items(): + # Only modify display-name fields, not IDs/dates/status + if key in ("title", "name", "first_name", "last_name", "description", "body"): + data[key] = f"Updated {value}" + return data +EOF_tests_form_factory_py + +cat > /opt/lifeos/dev/tests/registry.py << 'EOF_tests_registry_py' +""" +Route Registry +=============== +Imports the live FastAPI app, runs introspection once at import time, +and exposes the results for test parametrization. + +Separated from conftest.py so test files can import cleanly +without conflicting with pytest's automatic conftest loading. +""" +from __future__ import annotations + +import os +import sys + +# Ensure DATABASE_URL points to test DB before app import +os.environ["DATABASE_URL"] = os.environ.get( + "TEST_DATABASE_URL", + "postgresql+asyncpg://postgres:UCTOQDZiUhN8U@lifeos-db:5432/lifeos_test", +) + +from main import app # noqa: E402 +from tests.introspect import get_route_registry, RouteKind # noqa: E402 + +# --------------------------------------------------------------------------- +# Built once at import time from the live app +# --------------------------------------------------------------------------- +ROUTE_REGISTRY = get_route_registry(app) +ALL_ROUTES = ROUTE_REGISTRY["all"] + +# --------------------------------------------------------------------------- +# Prefix -> seed entity mapping for dynamic route resolution +# Maps route prefix to the seed fixture key that provides its {id} param +# --------------------------------------------------------------------------- +PREFIX_TO_SEED: dict[str, str | None] = { + "/domains": "domain", + "/areas": "area", + "/projects": "project", + "/tasks": "task", + "/contacts": "contact", + "/notes": "note", + "/meetings": "meeting", + "/decisions": "decision", + "/appointments": "appointment", + "/weblinks": "weblink", + "/weblinks/folders": "weblink_folder", + "/lists": "list", + "/links": "link", + "/focus": "focus", + "/capture": "capture", + "/time": "task", # Time routes use task_id + "/files": None, # File routes need special handling + "/admin/trash": None, + "/admin": None, + "/search": None, +} + + +def resolve_path(route_path: str, all_seeds: dict[str, dict]) -> str | None: + """ + Replace {param} placeholders in a route path with actual seed data IDs. + Returns None if we can't resolve (missing seed data for this entity). + """ + if "{" not in route_path: + return route_path + + # Match longest prefix first + for prefix, seed_key in sorted(PREFIX_TO_SEED.items(), key=lambda x: -len(x[0])): + if route_path.startswith(prefix) and seed_key and seed_key in all_seeds: + resolved = route_path.replace("{id}", all_seeds[seed_key]["id"]) + # Handle other path params if any + for param_name in ["folder_id", "task_id"]: + if f"{{{param_name}}}" in resolved: + mapped = param_name.replace("_id", "") + if mapped in all_seeds: + resolved = resolved.replace(f"{{{param_name}}}", all_seeds[mapped]["id"]) + if "{" not in resolved: + return resolved + + return None +EOF_tests_registry_py + +cat > /opt/lifeos/dev/tests/conftest.py << 'EOF_tests_conftest_py' +""" +Life OS - Test Fixtures +======================= +Per-test transaction rollback, HTTP client, and seed data. +Route registry lives in tests/registry.py (imported by test files directly). +""" +from __future__ import annotations + +import os +import uuid +from datetime import date, datetime, timezone +from typing import AsyncGenerator + +import pytest +import pytest_asyncio +from httpx import ASGITransport, AsyncClient +from sqlalchemy import text +from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine + +# --------------------------------------------------------------------------- +# Override DATABASE_URL BEFORE importing app +# --------------------------------------------------------------------------- +os.environ["DATABASE_URL"] = os.environ.get( + "TEST_DATABASE_URL", + "postgresql+asyncpg://postgres:UCTOQDZiUhN8U@lifeos-db:5432/lifeos_test", +) + +from main import app # noqa: E402 +from core.database import get_db # noqa: E402 + +# --------------------------------------------------------------------------- +# Test DB engine +# --------------------------------------------------------------------------- +test_engine = create_async_engine(os.environ["DATABASE_URL"], echo=False) + + +@pytest_asyncio.fixture +async def db_session() -> AsyncGenerator[AsyncSession, None]: + """Session wrapped in a transaction that rolls back after each test.""" + async with test_engine.connect() as conn: + trans = await conn.begin() + session = AsyncSession(bind=conn, expire_on_commit=False) + try: + yield session + finally: + await session.close() + await trans.rollback() + + +@pytest_asyncio.fixture +async def client(db_session: AsyncSession) -> AsyncGenerator[AsyncClient, None]: + """Async HTTP client hitting the real app with test DB session.""" + async def _override(): + yield db_session + app.dependency_overrides[get_db] = _override + transport = ASGITransport(app=app) + async with AsyncClient(transport=transport, base_url="http://test") as c: + yield c + app.dependency_overrides.clear() + + +# =========================================================================== +# Seed Data Fixtures +# =========================================================================== +def _uuid() -> str: + return str(uuid.uuid4()) + + +@pytest_asyncio.fixture +async def seed_domain(db_session: AsyncSession) -> dict: + _id = _uuid() + await db_session.execute( + text("INSERT INTO domains (id, name, color, description, sort_order, is_deleted, created_at, updated_at) " + "VALUES (:id, :name, :color, :desc, 0, false, now(), now())"), + {"id": _id, "name": "Test Domain", "color": "#FF5733", "desc": "Auto test domain"}, + ) + await db_session.flush() + return {"id": _id, "name": "Test Domain", "color": "#FF5733"} + + +@pytest_asyncio.fixture +async def seed_area(db_session: AsyncSession, seed_domain: dict) -> dict: + _id = _uuid() + await db_session.execute( + text("INSERT INTO areas (id, domain_id, name, status, sort_order, is_deleted, created_at, updated_at) " + "VALUES (:id, :did, :name, 'active', 0, false, now(), now())"), + {"id": _id, "did": seed_domain["id"], "name": "Test Area"}, + ) + await db_session.flush() + return {"id": _id, "domain_id": seed_domain["id"], "name": "Test Area"} + + +@pytest_asyncio.fixture +async def seed_project(db_session: AsyncSession, seed_domain: dict, seed_area: dict) -> dict: + _id = _uuid() + await db_session.execute( + text("INSERT INTO projects (id, domain_id, area_id, name, status, priority, sort_order, is_deleted, created_at, updated_at) " + "VALUES (:id, :did, :aid, :name, 'active', 3, 0, false, now(), now())"), + {"id": _id, "did": seed_domain["id"], "aid": seed_area["id"], "name": "Test Project"}, + ) + await db_session.flush() + return {"id": _id, "domain_id": seed_domain["id"], "area_id": seed_area["id"], "name": "Test Project"} + + +@pytest_asyncio.fixture +async def seed_task(db_session: AsyncSession, seed_domain: dict, seed_project: dict) -> dict: + _id = _uuid() + await db_session.execute( + text("INSERT INTO tasks (id, domain_id, project_id, title, status, priority, sort_order, is_deleted, created_at, updated_at) " + "VALUES (:id, :did, :pid, :title, 'open', 3, 0, false, now(), now())"), + {"id": _id, "did": seed_domain["id"], "pid": seed_project["id"], "title": "Test Task Alpha"}, + ) + await db_session.flush() + return {"id": _id, "domain_id": seed_domain["id"], "project_id": seed_project["id"], "title": "Test Task Alpha"} + + +@pytest_asyncio.fixture +async def seed_contact(db_session: AsyncSession) -> dict: + _id = _uuid() + await db_session.execute( + text("INSERT INTO contacts (id, first_name, last_name, email, sort_order, is_deleted, created_at, updated_at) " + "VALUES (:id, 'Test', 'Contact', 'test@example.com', 0, false, now(), now())"), + {"id": _id}, + ) + await db_session.flush() + return {"id": _id, "first_name": "Test", "last_name": "Contact"} + + +@pytest_asyncio.fixture +async def seed_note(db_session: AsyncSession, seed_domain: dict) -> dict: + _id = _uuid() + await db_session.execute( + text("INSERT INTO notes (id, domain_id, title, body, content_format, sort_order, is_deleted, created_at, updated_at) " + "VALUES (:id, :did, 'Test Note', 'Body content', 'rich', 0, false, now(), now())"), + {"id": _id, "did": seed_domain["id"]}, + ) + await db_session.flush() + return {"id": _id, "domain_id": seed_domain["id"], "title": "Test Note"} + + +@pytest_asyncio.fixture +async def seed_meeting(db_session: AsyncSession) -> dict: + _id = _uuid() + await db_session.execute( + text("INSERT INTO meetings (id, title, meeting_date, status, sort_order, is_deleted, created_at, updated_at) " + "VALUES (:id, 'Test Meeting', :d, 'scheduled', 0, false, now(), now())"), + {"id": _id, "d": date.today().isoformat()}, + ) + await db_session.flush() + return {"id": _id, "title": "Test Meeting"} + + +@pytest_asyncio.fixture +async def seed_decision(db_session: AsyncSession, seed_domain: dict, seed_project: dict) -> dict: + _id = _uuid() + await db_session.execute( + text("INSERT INTO decisions (id, domain_id, project_id, title, status, sort_order, is_deleted, created_at, updated_at) " + "VALUES (:id, :did, :pid, 'Test Decision', 'active', 0, false, now(), now())"), + {"id": _id, "did": seed_domain["id"], "pid": seed_project["id"]}, + ) + await db_session.flush() + return {"id": _id, "title": "Test Decision"} + + +@pytest_asyncio.fixture +async def seed_appointment(db_session: AsyncSession, seed_domain: dict) -> dict: + _id = _uuid() + now_iso = datetime.now(timezone.utc).isoformat() + await db_session.execute( + text("INSERT INTO appointments (id, domain_id, title, start_at, end_at, status, sort_order, is_deleted, created_at, updated_at) " + "VALUES (:id, :did, 'Test Appointment', :s, :e, 'scheduled', 0, false, now(), now())"), + {"id": _id, "did": seed_domain["id"], "s": now_iso, "e": now_iso}, + ) + await db_session.flush() + return {"id": _id, "title": "Test Appointment"} + + +@pytest_asyncio.fixture +async def seed_weblink_folder(db_session: AsyncSession) -> dict: + _id = _uuid() + await db_session.execute( + text("INSERT INTO weblink_folders (id, name, sort_order, is_deleted, created_at, updated_at) " + "VALUES (:id, 'Test Folder', 0, false, now(), now())"), + {"id": _id}, + ) + await db_session.flush() + return {"id": _id, "name": "Test Folder"} + + +@pytest_asyncio.fixture +async def seed_list(db_session: AsyncSession, seed_domain: dict, seed_project: dict) -> dict: + _id = _uuid() + await db_session.execute( + text("INSERT INTO lists (id, domain_id, project_id, name, sort_order, is_deleted, created_at, updated_at) " + "VALUES (:id, :did, :pid, 'Test List', 0, false, now(), now())"), + {"id": _id, "did": seed_domain["id"], "pid": seed_project["id"]}, + ) + await db_session.flush() + return {"id": _id, "name": "Test List"} + + +@pytest_asyncio.fixture +async def seed_link(db_session: AsyncSession, seed_domain: dict) -> dict: + _id = _uuid() + await db_session.execute( + text("INSERT INTO links (id, domain_id, title, url, sort_order, is_deleted, created_at, updated_at) " + "VALUES (:id, :did, 'Test Link', 'https://test.com', 0, false, now(), now())"), + {"id": _id, "did": seed_domain["id"]}, + ) + await db_session.flush() + return {"id": _id, "title": "Test Link"} + + +@pytest_asyncio.fixture +async def seed_weblink(db_session: AsyncSession, seed_weblink_folder: dict) -> dict: + _id = _uuid() + await db_session.execute( + text("INSERT INTO weblinks (id, folder_id, title, url, sort_order, is_deleted, created_at, updated_at) " + "VALUES (:id, :fid, 'Test Weblink', 'https://webtest.com', 0, false, now(), now())"), + {"id": _id, "fid": seed_weblink_folder["id"]}, + ) + await db_session.flush() + return {"id": _id, "title": "Test Weblink"} + + +@pytest_asyncio.fixture +async def seed_capture(db_session: AsyncSession) -> dict: + _id = _uuid() + await db_session.execute( + text("INSERT INTO capture (id, raw_text, processed, is_deleted, created_at, updated_at) " + "VALUES (:id, 'Captured item', false, false, now(), now())"), + {"id": _id}, + ) + await db_session.flush() + return {"id": _id, "raw_text": "Captured item"} + + +@pytest_asyncio.fixture +async def seed_focus(db_session: AsyncSession, seed_task: dict) -> dict: + _id = _uuid() + await db_session.execute( + text("INSERT INTO daily_focus (id, task_id, focus_date, is_completed, sort_order, is_deleted, created_at, updated_at) " + "VALUES (:id, :tid, CURRENT_DATE, false, 0, false, now(), now())"), + {"id": _id, "tid": seed_task["id"]}, + ) + await db_session.flush() + return {"id": _id, "task_id": seed_task["id"]} + + +@pytest_asyncio.fixture +async def all_seeds( + seed_domain, seed_area, seed_project, seed_task, seed_contact, + seed_note, seed_meeting, seed_decision, seed_appointment, + seed_weblink_folder, seed_list, seed_link, seed_weblink, + seed_capture, seed_focus, +) -> dict[str, dict]: + """All seed entities keyed by type for dynamic path resolution.""" + return { + "domain": seed_domain, + "area": seed_area, + "project": seed_project, + "task": seed_task, + "contact": seed_contact, + "note": seed_note, + "meeting": seed_meeting, + "decision": seed_decision, + "appointment": seed_appointment, + "weblink_folder": seed_weblink_folder, + "list": seed_list, + "link": seed_link, + "weblink": seed_weblink, + "capture": seed_capture, + "focus": seed_focus, + } +EOF_tests_conftest_py + +cat > /opt/lifeos/dev/tests/route_report.py << 'EOF_tests_route_report_py' +""" +Route Registry Report +===================== +Run inside the container to see exactly what the introspection engine +discovers from the live app. Use this to verify before running tests. + +Usage: + docker exec lifeos-dev python -m tests.route_report +""" +from __future__ import annotations + +import sys +sys.path.insert(0, "/app") + +from tests.registry import ALL_ROUTES, ROUTE_REGISTRY, PREFIX_TO_SEED # noqa: E402 +from tests.introspect import dump_registry_report, RouteKind # noqa: E402 +from main import app # noqa: E402 + + +def main(): + print(dump_registry_report(app)) + + reg = ROUTE_REGISTRY + print("\n" + "=" * 70) + print("SUMMARY") + print("=" * 70) + print(f" Total routes: {len(reg['all'])}") + print(f" GET (no params): {len(reg['get_no_params'])}") + print(f" GET (with params): {len(reg['get_with_params'])}") + print(f" POST create: {len(reg['post_create'])}") + print(f" POST edit: {len(reg['post_edit'])}") + print(f" POST delete: {len(reg['post_delete'])}") + print(f" POST action/toggle: {len(reg['post_action'])}") + print(f" Entity prefixes: {len(reg['by_prefix'])}") + print() + + # Warn about POST routes with no discovered form fields + for r in reg["post_create"]: + if not r.form_fields: + print(f" WARNING: {r.path} has no discovered Form() fields") + for r in reg["post_edit"]: + if not r.form_fields: + print(f" WARNING: {r.path} has no discovered Form() fields") + + # Show seed mapping coverage + print() + print("PREFIX_TO_SEED coverage:") + print("-" * 70) + for prefix in sorted(reg["by_prefix"].keys()): + has_seed = prefix in PREFIX_TO_SEED and PREFIX_TO_SEED[prefix] is not None + marker = "OK" if has_seed else "SKIP (no seed)" + print(f" {prefix:30s} {marker}") + + print() + print("Form field details for create routes:") + print("-" * 70) + for r in reg["post_create"]: + if r.form_fields: + fields = [f" {f.name}: {f.annotation}{'*' if f.required else ''}" for f in r.form_fields] + print(f"\n {r.path}") + print("\n".join(fields)) + + +if __name__ == "__main__": + main() +EOF_tests_route_report_py + +cat > /opt/lifeos/dev/tests/test_smoke_dynamic.py << 'EOF_tests_test_smoke_dynamic_py' +""" +Dynamic Smoke Tests +=================== +Auto-discovers ALL GET routes from the FastAPI app via introspection. +No hardcoded paths. When you add a new router, these tests cover it +automatically on next run. + +Tests: + - All GET routes with no path params return 200 + - All GET routes with path params return 200 (with seed data) + - All GET routes with path params return 404/redirect for fake IDs +""" +from __future__ import annotations + +import uuid + +import pytest +from httpx import AsyncClient + +from tests.registry import ALL_ROUTES, resolve_path +from tests.introspect import RouteKind + + +# --------------------------------------------------------------------------- +# Collect GET routes dynamically +# --------------------------------------------------------------------------- +_GET_NO_PARAMS = [ + r for r in ALL_ROUTES + if "GET" in r.methods and not r.path_params +] + +_GET_WITH_PARAMS = [ + r for r in ALL_ROUTES + if "GET" in r.methods and r.path_params +] + + +# --------------------------------------------------------------------------- +# Parametrized: every GET route with no path params should return 200 +# --------------------------------------------------------------------------- +@pytest.mark.asyncio +@pytest.mark.parametrize( + "path", + [r.path for r in _GET_NO_PARAMS], + ids=[f"{r.methods[0]} {r.path}" for r in _GET_NO_PARAMS], +) +async def test_get_no_params_returns_200(client: AsyncClient, path: str): + """Every parameterless GET route should return 200.""" + r = await client.get(path) + assert r.status_code == 200, f"GET {path} returned {r.status_code}" + + +# --------------------------------------------------------------------------- +# Parametrized: every GET route with path params should return 200 with valid IDs +# --------------------------------------------------------------------------- +@pytest.mark.asyncio +@pytest.mark.parametrize( + "route_path,prefix", + [(r.path, r.prefix) for r in _GET_WITH_PARAMS], + ids=[f"GET {r.path}" for r in _GET_WITH_PARAMS], +) +async def test_get_with_valid_id_returns_200( + client: AsyncClient, all_seeds: dict, route_path: str, prefix: str +): + """GET routes with valid seed IDs should return 200.""" + resolved = resolve_path(route_path, all_seeds) + if resolved is None: + pytest.skip(f"No seed data mapping for {route_path}") + r = await client.get(resolved) + assert r.status_code == 200, f"GET {resolved} (from {route_path}) returned {r.status_code}" + + +# --------------------------------------------------------------------------- +# Parametrized: every GET detail/edit route should return 404/redirect for fake ID +# --------------------------------------------------------------------------- +_DETAIL_AND_EDIT_ROUTES = [ + r for r in ALL_ROUTES + if "GET" in r.methods + and r.kind in (RouteKind.DETAIL, RouteKind.EDIT_FORM) + and "id" in r.path_params +] + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "route_path", + [r.path for r in _DETAIL_AND_EDIT_ROUTES], + ids=[f"404 {r.path}" for r in _DETAIL_AND_EDIT_ROUTES], +) +async def test_get_with_fake_id_returns_404(client: AsyncClient, route_path: str): + """GET detail/edit routes with nonexistent ID should return 404 or redirect.""" + fake = str(uuid.uuid4()) + path = route_path.replace("{id}", fake) + # Replace any other params with fake UUIDs too + import re + path = re.sub(r"\{[^}]+\}", fake, path) + r = await client.get(path) + assert r.status_code in (404, 302, 303), ( + f"GET {path} with fake ID returned {r.status_code}, expected 404/redirect" + ) +EOF_tests_test_smoke_dynamic_py + +cat > /opt/lifeos/dev/tests/test_crud_dynamic.py << 'EOF_tests_test_crud_dynamic_py' +""" +Dynamic CRUD Tests +================== +Auto-discovers all POST routes and generates valid form data from +introspected Form() field signatures. No hardcoded form payloads. + +When you add a new entity router with standard CRUD, these tests +automatically cover create/edit/delete on next run. + +Tests: + - All POST /create routes accept valid form data and redirect 303 + - All POST /{id}/edit routes accept valid form data and redirect 303 + - All POST /{id}/delete routes redirect 303 + - All POST action routes don't crash (303 or other non-500) +""" +from __future__ import annotations + +import re +import uuid + +import pytest +from httpx import AsyncClient + +from tests.registry import ALL_ROUTES, resolve_path +from tests.introspect import RouteKind +from tests.form_factory import build_form_data, build_edit_data + + +# --------------------------------------------------------------------------- +# Collect POST routes by kind +# --------------------------------------------------------------------------- +_CREATE_ROUTES = [r for r in ALL_ROUTES if r.kind == RouteKind.CREATE and not r.has_file_upload] +_EDIT_ROUTES = [r for r in ALL_ROUTES if r.kind == RouteKind.EDIT and not r.has_file_upload] +_DELETE_ROUTES = [r for r in ALL_ROUTES if r.kind == RouteKind.DELETE] +_ACTION_ROUTES = [r for r in ALL_ROUTES if r.kind in (RouteKind.ACTION, RouteKind.TOGGLE)] + + +# --------------------------------------------------------------------------- +# Create: POST /entity/create with auto-generated form data -> 303 +# --------------------------------------------------------------------------- +@pytest.mark.asyncio +@pytest.mark.parametrize( + "route", + _CREATE_ROUTES, + ids=[f"CREATE {r.path}" for r in _CREATE_ROUTES], +) +async def test_create_redirects(client: AsyncClient, all_seeds: dict, route): + """POST to create routes with valid form data should redirect 303.""" + form_data = build_form_data(route.form_fields, all_seeds) + if not form_data: + pytest.skip(f"No form fields discovered for {route.path}") + + r = await client.post(route.path, data=form_data, follow_redirects=False) + assert r.status_code in (303, 302, 307), ( + f"POST {route.path} returned {r.status_code} with data {form_data}" + ) + + +# --------------------------------------------------------------------------- +# Edit: POST /entity/{id}/edit with auto-generated form data -> 303 +# --------------------------------------------------------------------------- +@pytest.mark.asyncio +@pytest.mark.parametrize( + "route", + _EDIT_ROUTES, + ids=[f"EDIT {r.path}" for r in _EDIT_ROUTES], +) +async def test_edit_redirects(client: AsyncClient, all_seeds: dict, route): + """POST to edit routes with valid form data should redirect 303.""" + resolved = resolve_path(route.path, all_seeds) + if resolved is None: + pytest.skip(f"No seed data mapping for {route.path}") + + form_data = build_edit_data(route.form_fields, all_seeds) + if not form_data: + pytest.skip(f"No form fields discovered for {route.path}") + + r = await client.post(resolved, data=form_data, follow_redirects=False) + assert r.status_code in (303, 302, 307), ( + f"POST {resolved} returned {r.status_code} with data {form_data}" + ) + + +# --------------------------------------------------------------------------- +# Delete: POST /entity/{id}/delete -> 303 +# --------------------------------------------------------------------------- +@pytest.mark.asyncio +@pytest.mark.parametrize( + "route", + _DELETE_ROUTES, + ids=[f"DELETE {r.path}" for r in _DELETE_ROUTES], +) +async def test_delete_redirects(client: AsyncClient, all_seeds: dict, route): + """POST to delete routes should redirect 303.""" + resolved = resolve_path(route.path, all_seeds) + if resolved is None: + pytest.skip(f"No seed data mapping for {route.path}") + + r = await client.post(resolved, follow_redirects=False) + assert r.status_code in (303, 302, 307, 404), ( + f"POST {resolved} returned {r.status_code}" + ) + + +# --------------------------------------------------------------------------- +# Action routes: POST /entity/{id}/toggle, etc. -> non-500 +# --------------------------------------------------------------------------- +@pytest.mark.asyncio +@pytest.mark.parametrize( + "route", + _ACTION_ROUTES, + ids=[f"ACTION {r.path}" for r in _ACTION_ROUTES], +) +async def test_action_does_not_crash(client: AsyncClient, all_seeds: dict, route): + """POST action routes should not return 500.""" + resolved = resolve_path(route.path, all_seeds) + if resolved is None: + # Try building form data for actions that need it (e.g. /focus/add) + form_data = build_form_data(route.form_fields, all_seeds) if route.form_fields else {} + r = await client.post(route.path, data=form_data, follow_redirects=False) + else: + form_data = build_form_data(route.form_fields, all_seeds) if route.form_fields else {} + r = await client.post(resolved, data=form_data, follow_redirects=False) + + assert r.status_code != 500, ( + f"POST {resolved or route.path} returned 500 (server error)" + ) + + +# --------------------------------------------------------------------------- +# Verify create actually persists: create then check list page +# --------------------------------------------------------------------------- +@pytest.mark.asyncio +@pytest.mark.parametrize( + "route", + [r for r in _CREATE_ROUTES if r.prefix in ("/domains", "/contacts", "/meetings")], + ids=[f"PERSIST {r.path}" for r in _CREATE_ROUTES if r.prefix in ("/domains", "/contacts", "/meetings")], +) +async def test_create_persists_in_list(client: AsyncClient, all_seeds: dict, route): + """Items created via POST should appear on the list page.""" + form_data = build_form_data(route.form_fields, all_seeds) + if not form_data: + pytest.skip(f"No form fields for {route.path}") + + # Use a unique name to search for + marker = f"AutoTest_{uuid.uuid4().hex[:8]}" + for key in ("name", "title", "first_name"): + if key in form_data: + form_data[key] = marker + break + else: + pytest.skip(f"No name/title field found for {route.path}") + + await client.post(route.path, data=form_data, follow_redirects=False) + + # Check the list page + list_path = route.prefix + "/" + r = await client.get(list_path) + assert marker in r.text, ( + f"Created item '{marker}' not found on {list_path}" + ) +EOF_tests_test_crud_dynamic_py + +cat > /opt/lifeos/dev/tests/test_business_logic.py << 'EOF_tests_test_business_logic_py' +""" +Business Logic Tests +==================== +Hand-written tests for specific behavioral contracts. +These test LOGIC, not routes, so they stay manual. + +When to add tests here: + - New constraint (e.g. "only one timer running at a time") + - State transitions (e.g. "completing a task sets completed_at") + - Cross-entity effects (e.g. "deleting a project hides its tasks") + - Search behavior + - Sidebar data integrity +""" +from __future__ import annotations + +import uuid +from datetime import date, datetime, timezone + +import pytest +from httpx import AsyncClient +from sqlalchemy import text +from sqlalchemy.ext.asyncio import AsyncSession + + +# =========================================================================== +# Time Tracking +# =========================================================================== +class TestTimerConstraints: + """Only one timer can run at a time. Starting a new one auto-stops the old.""" + + @pytest.mark.asyncio + async def test_single_timer_constraint( + self, client: AsyncClient, db_session: AsyncSession, + seed_domain: dict, seed_project: dict, + ): + t1 = await _create_task(db_session, seed_domain["id"], seed_project["id"], "Timer1") + t2 = await _create_task(db_session, seed_domain["id"], seed_project["id"], "Timer2") + + await client.post("/time/start", data={"task_id": t1}, follow_redirects=False) + await client.post("/time/start", data={"task_id": t2}, follow_redirects=False) + + result = await db_session.execute( + text("SELECT count(*) FROM time_entries WHERE end_at IS NULL") + ) + assert result.scalar() <= 1 + + @pytest.mark.asyncio + async def test_stop_sets_end_at( + self, client: AsyncClient, db_session: AsyncSession, seed_task: dict, + ): + await client.post("/time/start", data={"task_id": seed_task["id"]}, follow_redirects=False) + await client.post("/time/stop", follow_redirects=False) + + result = await db_session.execute( + text("SELECT count(*) FROM time_entries WHERE end_at IS NULL AND task_id = :tid"), + {"tid": seed_task["id"]}, + ) + assert result.scalar() == 0 + + @pytest.mark.asyncio + async def test_running_endpoint_returns_json( + self, client: AsyncClient, seed_task: dict, + ): + await client.post("/time/start", data={"task_id": seed_task["id"]}, follow_redirects=False) + r = await client.get("/time/running") + assert r.status_code == 200 + # Should be valid JSON + data = r.json() + assert data is not None + + +# =========================================================================== +# Soft Delete & Restore +# =========================================================================== +class TestSoftDeleteBehavior: + """Soft-deleted items should vanish from lists and reappear after restore.""" + + @pytest.mark.asyncio + async def test_deleted_task_hidden_from_list( + self, client: AsyncClient, seed_task: dict, + ): + await client.post(f"/tasks/{seed_task['id']}/delete", follow_redirects=False) + r = await client.get("/tasks/") + assert seed_task["title"] not in r.text + + @pytest.mark.asyncio + async def test_restore_task_reappears( + self, client: AsyncClient, seed_task: dict, + ): + await client.post(f"/tasks/{seed_task['id']}/delete", follow_redirects=False) + await client.post( + f"/admin/trash/restore/tasks/{seed_task['id']}", + follow_redirects=False, + ) + r = await client.get("/tasks/") + assert seed_task["title"] in r.text + + @pytest.mark.asyncio + async def test_deleted_project_hidden( + self, client: AsyncClient, seed_project: dict, + ): + await client.post(f"/projects/{seed_project['id']}/delete", follow_redirects=False) + r = await client.get("/projects/") + assert seed_project["name"] not in r.text + + +# =========================================================================== +# Search +# =========================================================================== +class TestSearchBehavior: + @pytest.mark.asyncio + async def test_search_does_not_crash_on_sql_injection(self, client: AsyncClient): + r = await client.get("/search/?q='; DROP TABLE tasks; --") + assert r.status_code == 200 + + @pytest.mark.asyncio + async def test_search_empty_query(self, client: AsyncClient): + r = await client.get("/search/?q=") + assert r.status_code == 200 + + @pytest.mark.asyncio + async def test_search_special_unicode(self, client: AsyncClient): + r = await client.get("/search/?q=日本語テスト") + assert r.status_code == 200 + + +# =========================================================================== +# Sidebar +# =========================================================================== +class TestSidebarIntegrity: + @pytest.mark.asyncio + async def test_sidebar_shows_domain_on_every_page( + self, client: AsyncClient, seed_domain: dict, + ): + """Domain should appear in sidebar across all pages.""" + # Sample a few different page types + for path in ("/", "/tasks/", "/notes/", "/projects/"): + r = await client.get(path) + assert seed_domain["name"] in r.text, f"Domain missing from sidebar on {path}" + + @pytest.mark.asyncio + async def test_sidebar_shows_project_hierarchy( + self, client: AsyncClient, seed_domain: dict, seed_area: dict, seed_project: dict, + ): + r = await client.get("/") + assert seed_project["name"] in r.text + + +# =========================================================================== +# Focus & Capture Workflows +# =========================================================================== +class TestFocusWorkflow: + @pytest.mark.asyncio + async def test_add_and_remove_from_focus( + self, client: AsyncClient, db_session: AsyncSession, seed_task: dict, + ): + # Add to focus + r = await client.post("/focus/add", data={"task_id": seed_task["id"]}, follow_redirects=False) + assert r.status_code in (303, 302) + + @pytest.mark.asyncio + async def test_capture_multi_line_creates_multiple( + self, client: AsyncClient, db_session: AsyncSession, + ): + await client.post( + "/capture/add", + data={"raw_text": "Line one\nLine two\nLine three"}, + follow_redirects=False, + ) + result = await db_session.execute( + text("SELECT count(*) FROM capture WHERE is_deleted = false") + ) + count = result.scalar() + # Should have created at least 2 items (3 lines) + assert count >= 2, f"Expected multiple capture items, got {count}" + + +# =========================================================================== +# Edge Cases +# =========================================================================== +class TestEdgeCases: + @pytest.mark.asyncio + async def test_invalid_uuid_in_path(self, client: AsyncClient): + r = await client.get("/tasks/not-a-valid-uuid") + assert r.status_code in (404, 422, 400) + + @pytest.mark.asyncio + async def test_timer_start_without_task_id(self, client: AsyncClient): + r = await client.post("/time/start", data={}, follow_redirects=False) + assert r.status_code != 200 # Should error, not silently succeed + + @pytest.mark.asyncio + async def test_double_delete_doesnt_crash( + self, client: AsyncClient, seed_task: dict, + ): + await client.post(f"/tasks/{seed_task['id']}/delete", follow_redirects=False) + r = await client.post(f"/tasks/{seed_task['id']}/delete", follow_redirects=False) + assert r.status_code in (303, 302, 404) + + +# =========================================================================== +# Helpers +# =========================================================================== +async def _create_task(db: AsyncSession, domain_id: str, project_id: str, title: str) -> str: + _id = str(uuid.uuid4()) + await db.execute( + text("INSERT INTO tasks (id, domain_id, project_id, title, status, priority, sort_order, is_deleted, created_at, updated_at) " + "VALUES (:id, :did, :pid, :title, 'open', 3, 0, false, now(), now())"), + {"id": _id, "did": domain_id, "pid": project_id, "title": title}, + ) + await db.flush() + return _id +EOF_tests_test_business_logic_py + +cat > /opt/lifeos/dev/pytest.ini << 'EOF_pytest_ini' +[pytest] +asyncio_mode = auto +testpaths = tests +python_files = test_*.py +python_classes = Test* +python_functions = test_* +addopts = -v --tb=short +EOF_pytest_ini + +cat > /opt/lifeos/dev/tests/run_tests.sh << 'EOF_RUN' +#!/bin/bash +set -e +cd /app +pip install pytest pytest-asyncio httpx --break-system-packages -q 2>/dev/null + +echo "=============================================" +echo " Life OS Dynamic Test Suite" +echo "=============================================" +echo "" + +case "${1}" in + smoke) echo ">> Smoke tests"; python -m pytest tests/test_smoke_dynamic.py -v --tb=short ;; + crud) echo ">> CRUD tests"; python -m pytest tests/test_crud_dynamic.py -v --tb=short ;; + logic) echo ">> Business logic"; python -m pytest tests/test_business_logic.py -v --tb=short ;; + report) echo ">> Route report"; python -m tests.route_report ;; + fast) echo ">> Smoke, stop on fail"; python -m pytest tests/test_smoke_dynamic.py -v --tb=short -x ;; + "") echo ">> Full suite"; python -m pytest tests/ -v --tb=short ;; + *) echo ">> Custom: $@"; python -m pytest tests/ "$@" ;; +esac + +echo "" +echo "Done" +EOF_RUN +chmod +x /opt/lifeos/dev/tests/run_tests.sh + +echo "" +echo "[4/5] Verifying route introspection..." +docker exec lifeos-dev python -c " +import os, sys +sys.path.insert(0, '/app') +os.environ['DATABASE_URL'] = 'postgresql+asyncpg://postgres:UCTOQDZiUhN8U@lifeos-db:5432/lifeos_test' +from main import app +from tests.introspect import get_route_registry +reg = get_route_registry(app) +print(f' Routes discovered: {len(reg[\"all\"])}') +print(f' GET (no params): {len(reg[\"get_no_params\"])}') +print(f' GET (with params): {len(reg[\"get_with_params\"])}') +print(f' POST create: {len(reg[\"post_create\"])}') +print(f' POST edit: {len(reg[\"post_edit\"])}') +print(f' POST delete: {len(reg[\"post_delete\"])}') +print(f' POST action: {len(reg[\"post_action\"])}') +print(f' Entity prefixes: {len(reg[\"by_prefix\"])}') +" + +echo "" +echo "[5/5] Files deployed..." +find /opt/lifeos/dev/tests -name "*.py" -o -name "*.sh" | sort | while read f; do + lines=$(wc -l < "$f") + echo " ${f#/opt/lifeos/dev/} (${lines} lines)" +done + +echo "" +echo "=== Deployment complete ===" +echo "" +echo " docker exec lifeos-dev bash /app/tests/run_tests.sh report # Verify routes" +echo " docker exec lifeos-dev bash /app/tests/run_tests.sh smoke # All GETs" +echo " docker exec lifeos-dev bash /app/tests/run_tests.sh crud # All CRUDs" +echo " docker exec lifeos-dev bash /app/tests/run_tests.sh logic # Business logic" +echo " docker exec lifeos-dev bash /app/tests/run_tests.sh # Full suite" +echo "" diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 0000000..bdd0e0d --- /dev/null +++ b/pytest.ini @@ -0,0 +1,5 @@ +[pytest] +asyncio_mode = auto +asyncio_default_fixture_loop_scope = session +testpaths = tests +addopts = -v --tb=short diff --git a/smoke-results.txt b/smoke-results.txt new file mode 100644 index 0000000..820d180 --- /dev/null +++ b/smoke-results.txt @@ -0,0 +1,18321 @@ +============================================= + Life OS Dynamic Test Suite +============================================= + +>> Smoke tests +============================= test session starts ============================== +platform linux -- Python 3.12.12, pytest-9.0.2, pluggy-1.6.0 -- /usr/local/bin/python +cachedir: .pytest_cache +rootdir: /app +configfile: pytest.ini +plugins: asyncio-1.3.0, anyio-4.12.1 +asyncio: mode=Mode.AUTO, debug=False, asyncio_default_fixture_loop_scope=session, asyncio_default_test_loop_scope=function +collecting ... collected 82 items + +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /] PASSED [ 1%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /health] PASSED [ 2%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /domains/] PASSED [ 3%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /domains/create] FAILED [ 4%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /areas/] PASSED [ 6%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /areas/create] FAILED [ 7%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /projects/] PASSED [ 8%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /projects/create] FAILED [ 9%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /tasks/] PASSED [ 10%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /tasks/create] FAILED [ 12%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /notes/] PASSED [ 13%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /notes/create] FAILED [ 14%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /links/] PASSED [ 15%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /links/create] FAILED [ 17%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /focus/] FAILED [ 18%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /capture/] FAILED [ 19%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /contacts/] PASSED [ 20%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /contacts/create] FAILED [ 21%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /search/api] PASSED [ 23%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /search/] FAILED [ 24%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /admin/trash/] PASSED [ 25%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /lists/] FAILED [ 26%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /lists/create] PASSED [ 28%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /files/] FAILED [ 29%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /files/upload] PASSED [ 30%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /meetings/] FAILED [ 31%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /meetings/create] PASSED [ 32%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /decisions/] FAILED [ 34%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /decisions/create] PASSED [ 35%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /weblinks/] FAILED [ 36%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /weblinks/create] PASSED [ 37%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /weblinks/folders/create] FAILED [ 39%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /appointments/] PASSED [ 40%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /appointments/new] FAILED [ 41%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /time/] PASSED [ 42%] +tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /time/running] FAILED [ 43%] +tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /domains/{domain_id}/edit] ERROR [ 45%] +tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /areas/{area_id}/edit] ERROR [ 46%] +tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /projects/{project_id}] ERROR [ 47%] +tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /projects/{project_id}/edit] ERROR [ 48%] +tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /tasks/{task_id}] ERROR [ 50%] +tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /tasks/{task_id}/edit] ERROR [ 51%] +tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /notes/{note_id}] ERROR [ 52%] +tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /notes/{note_id}/edit] ERROR [ 53%] +tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /links/{link_id}/edit] ERROR [ 54%] +tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /contacts/{contact_id}] ERROR [ 56%] +tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /contacts/{contact_id}/edit] ERROR [ 57%] +tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /lists/{list_id}] ERROR [ 58%] +tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /lists/{list_id}/edit] ERROR [ 59%] +tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /files/{file_id}/download] ERROR [ 60%] +tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /files/{file_id}/preview] ERROR [ 62%] +tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /files/{file_id}/serve] ERROR [ 63%] +tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /meetings/{meeting_id}] ERROR [ 64%] +tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /meetings/{meeting_id}/edit] ERROR [ 65%] +tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /decisions/{decision_id}] ERROR [ 67%] +tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /decisions/{decision_id}/edit] ERROR [ 68%] +tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /weblinks/{weblink_id}/edit] ERROR [ 69%] +tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /appointments/{appointment_id}] ERROR [ 70%] +tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /appointments/{appointment_id}/edit] ERROR [ 71%] +tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /domains/{domain_id}/edit] FAILED [ 73%] +tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /areas/{area_id}/edit] FAILED [ 74%] +tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /projects/{project_id}] FAILED [ 75%] +tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /projects/{project_id}/edit] FAILED [ 76%] +tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /tasks/{task_id}] FAILED [ 78%] +tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /tasks/{task_id}/edit] FAILED [ 79%] +tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /notes/{note_id}] FAILED [ 80%] +tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /notes/{note_id}/edit] FAILED [ 81%] +tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /links/{link_id}/edit] FAILED [ 82%] +tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /contacts/{contact_id}] FAILED [ 84%] +tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /contacts/{contact_id}/edit] FAILED [ 85%] +tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /lists/{list_id}] FAILED [ 86%] +tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /lists/{list_id}/edit] FAILED [ 87%] +tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /files/{file_id}/download] FAILED [ 89%] +tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /files/{file_id}/preview] FAILED [ 90%] +tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /files/{file_id}/serve] FAILED [ 91%] +tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /meetings/{meeting_id}] FAILED [ 92%] +tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /meetings/{meeting_id}/edit] FAILED [ 93%] +tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /decisions/{decision_id}] FAILED [ 95%] +tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /decisions/{decision_id}/edit] FAILED [ 96%] +tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /weblinks/{weblink_id}/edit] FAILED [ 97%] +tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /appointments/{appointment_id}] FAILED [ 98%] +tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /appointments/{appointment_id}/edit] FAILED [100%] + +==================================== ERRORS ==================================== +_ ERROR at setup of test_get_with_valid_id_returns_200[GET /domains/{domain_id}/edit] _ +tests/conftest.py:146: in all_seeds + cur.execute(""" +E psycopg2.errors.UndefinedColumn: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ + +The above exception was the direct cause of the following exception: +/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: in setup + return super().setup() + ^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py:730: in pytest_fixture_setup + return (yield) + ^^^^^ +tests/conftest.py:169: in all_seeds + raise RuntimeError(f"Seed data insertion failed: {e}") from e +E RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ +_ ERROR at setup of test_get_with_valid_id_returns_200[GET /areas/{area_id}/edit] _ +tests/conftest.py:146: in all_seeds + cur.execute(""" +E psycopg2.errors.UndefinedColumn: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ + +The above exception was the direct cause of the following exception: +/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: in setup + return super().setup() + ^^^^^^^^^^^^^^^ +tests/conftest.py:169: in all_seeds + raise RuntimeError(f"Seed data insertion failed: {e}") from e +E RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ +_ ERROR at setup of test_get_with_valid_id_returns_200[GET /projects/{project_id}] _ +tests/conftest.py:146: in all_seeds + cur.execute(""" +E psycopg2.errors.UndefinedColumn: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ + +The above exception was the direct cause of the following exception: +/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: in setup + return super().setup() + ^^^^^^^^^^^^^^^ +tests/conftest.py:169: in all_seeds + raise RuntimeError(f"Seed data insertion failed: {e}") from e +E RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ +_ ERROR at setup of test_get_with_valid_id_returns_200[GET /projects/{project_id}/edit] _ +tests/conftest.py:146: in all_seeds + cur.execute(""" +E psycopg2.errors.UndefinedColumn: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ + +The above exception was the direct cause of the following exception: +/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: in setup + return super().setup() + ^^^^^^^^^^^^^^^ +tests/conftest.py:169: in all_seeds + raise RuntimeError(f"Seed data insertion failed: {e}") from e +E RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ +__ ERROR at setup of test_get_with_valid_id_returns_200[GET /tasks/{task_id}] __ +tests/conftest.py:146: in all_seeds + cur.execute(""" +E psycopg2.errors.UndefinedColumn: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ + +The above exception was the direct cause of the following exception: +/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: in setup + return super().setup() + ^^^^^^^^^^^^^^^ +tests/conftest.py:169: in all_seeds + raise RuntimeError(f"Seed data insertion failed: {e}") from e +E RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ +_ ERROR at setup of test_get_with_valid_id_returns_200[GET /tasks/{task_id}/edit] _ +tests/conftest.py:146: in all_seeds + cur.execute(""" +E psycopg2.errors.UndefinedColumn: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ + +The above exception was the direct cause of the following exception: +/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: in setup + return super().setup() + ^^^^^^^^^^^^^^^ +tests/conftest.py:169: in all_seeds + raise RuntimeError(f"Seed data insertion failed: {e}") from e +E RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ +__ ERROR at setup of test_get_with_valid_id_returns_200[GET /notes/{note_id}] __ +tests/conftest.py:146: in all_seeds + cur.execute(""" +E psycopg2.errors.UndefinedColumn: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ + +The above exception was the direct cause of the following exception: +/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: in setup + return super().setup() + ^^^^^^^^^^^^^^^ +tests/conftest.py:169: in all_seeds + raise RuntimeError(f"Seed data insertion failed: {e}") from e +E RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ +_ ERROR at setup of test_get_with_valid_id_returns_200[GET /notes/{note_id}/edit] _ +tests/conftest.py:146: in all_seeds + cur.execute(""" +E psycopg2.errors.UndefinedColumn: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ + +The above exception was the direct cause of the following exception: +/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: in setup + return super().setup() + ^^^^^^^^^^^^^^^ +tests/conftest.py:169: in all_seeds + raise RuntimeError(f"Seed data insertion failed: {e}") from e +E RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ +_ ERROR at setup of test_get_with_valid_id_returns_200[GET /links/{link_id}/edit] _ +tests/conftest.py:146: in all_seeds + cur.execute(""" +E psycopg2.errors.UndefinedColumn: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ + +The above exception was the direct cause of the following exception: +/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: in setup + return super().setup() + ^^^^^^^^^^^^^^^ +tests/conftest.py:169: in all_seeds + raise RuntimeError(f"Seed data insertion failed: {e}") from e +E RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ +_ ERROR at setup of test_get_with_valid_id_returns_200[GET /contacts/{contact_id}] _ +tests/conftest.py:146: in all_seeds + cur.execute(""" +E psycopg2.errors.UndefinedColumn: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ + +The above exception was the direct cause of the following exception: +/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: in setup + return super().setup() + ^^^^^^^^^^^^^^^ +tests/conftest.py:169: in all_seeds + raise RuntimeError(f"Seed data insertion failed: {e}") from e +E RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ +_ ERROR at setup of test_get_with_valid_id_returns_200[GET /contacts/{contact_id}/edit] _ +tests/conftest.py:146: in all_seeds + cur.execute(""" +E psycopg2.errors.UndefinedColumn: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ + +The above exception was the direct cause of the following exception: +/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: in setup + return super().setup() + ^^^^^^^^^^^^^^^ +tests/conftest.py:169: in all_seeds + raise RuntimeError(f"Seed data insertion failed: {e}") from e +E RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ +__ ERROR at setup of test_get_with_valid_id_returns_200[GET /lists/{list_id}] __ +tests/conftest.py:146: in all_seeds + cur.execute(""" +E psycopg2.errors.UndefinedColumn: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ + +The above exception was the direct cause of the following exception: +/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: in setup + return super().setup() + ^^^^^^^^^^^^^^^ +tests/conftest.py:169: in all_seeds + raise RuntimeError(f"Seed data insertion failed: {e}") from e +E RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ +_ ERROR at setup of test_get_with_valid_id_returns_200[GET /lists/{list_id}/edit] _ +tests/conftest.py:146: in all_seeds + cur.execute(""" +E psycopg2.errors.UndefinedColumn: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ + +The above exception was the direct cause of the following exception: +/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: in setup + return super().setup() + ^^^^^^^^^^^^^^^ +tests/conftest.py:169: in all_seeds + raise RuntimeError(f"Seed data insertion failed: {e}") from e +E RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ +_ ERROR at setup of test_get_with_valid_id_returns_200[GET /files/{file_id}/download] _ +tests/conftest.py:146: in all_seeds + cur.execute(""" +E psycopg2.errors.UndefinedColumn: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ + +The above exception was the direct cause of the following exception: +/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: in setup + return super().setup() + ^^^^^^^^^^^^^^^ +tests/conftest.py:169: in all_seeds + raise RuntimeError(f"Seed data insertion failed: {e}") from e +E RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ +_ ERROR at setup of test_get_with_valid_id_returns_200[GET /files/{file_id}/preview] _ +tests/conftest.py:146: in all_seeds + cur.execute(""" +E psycopg2.errors.UndefinedColumn: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ + +The above exception was the direct cause of the following exception: +/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: in setup + return super().setup() + ^^^^^^^^^^^^^^^ +tests/conftest.py:169: in all_seeds + raise RuntimeError(f"Seed data insertion failed: {e}") from e +E RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ +_ ERROR at setup of test_get_with_valid_id_returns_200[GET /files/{file_id}/serve] _ +tests/conftest.py:146: in all_seeds + cur.execute(""" +E psycopg2.errors.UndefinedColumn: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ + +The above exception was the direct cause of the following exception: +/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: in setup + return super().setup() + ^^^^^^^^^^^^^^^ +tests/conftest.py:169: in all_seeds + raise RuntimeError(f"Seed data insertion failed: {e}") from e +E RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ +_ ERROR at setup of test_get_with_valid_id_returns_200[GET /meetings/{meeting_id}] _ +tests/conftest.py:146: in all_seeds + cur.execute(""" +E psycopg2.errors.UndefinedColumn: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ + +The above exception was the direct cause of the following exception: +/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: in setup + return super().setup() + ^^^^^^^^^^^^^^^ +tests/conftest.py:169: in all_seeds + raise RuntimeError(f"Seed data insertion failed: {e}") from e +E RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ +_ ERROR at setup of test_get_with_valid_id_returns_200[GET /meetings/{meeting_id}/edit] _ +tests/conftest.py:146: in all_seeds + cur.execute(""" +E psycopg2.errors.UndefinedColumn: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ + +The above exception was the direct cause of the following exception: +/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: in setup + return super().setup() + ^^^^^^^^^^^^^^^ +tests/conftest.py:169: in all_seeds + raise RuntimeError(f"Seed data insertion failed: {e}") from e +E RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ +_ ERROR at setup of test_get_with_valid_id_returns_200[GET /decisions/{decision_id}] _ +tests/conftest.py:146: in all_seeds + cur.execute(""" +E psycopg2.errors.UndefinedColumn: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ + +The above exception was the direct cause of the following exception: +/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: in setup + return super().setup() + ^^^^^^^^^^^^^^^ +tests/conftest.py:169: in all_seeds + raise RuntimeError(f"Seed data insertion failed: {e}") from e +E RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ +_ ERROR at setup of test_get_with_valid_id_returns_200[GET /decisions/{decision_id}/edit] _ +tests/conftest.py:146: in all_seeds + cur.execute(""" +E psycopg2.errors.UndefinedColumn: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ + +The above exception was the direct cause of the following exception: +/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: in setup + return super().setup() + ^^^^^^^^^^^^^^^ +tests/conftest.py:169: in all_seeds + raise RuntimeError(f"Seed data insertion failed: {e}") from e +E RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ +_ ERROR at setup of test_get_with_valid_id_returns_200[GET /weblinks/{weblink_id}/edit] _ +tests/conftest.py:146: in all_seeds + cur.execute(""" +E psycopg2.errors.UndefinedColumn: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ + +The above exception was the direct cause of the following exception: +/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: in setup + return super().setup() + ^^^^^^^^^^^^^^^ +tests/conftest.py:169: in all_seeds + raise RuntimeError(f"Seed data insertion failed: {e}") from e +E RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ +_ ERROR at setup of test_get_with_valid_id_returns_200[GET /appointments/{appointment_id}] _ +tests/conftest.py:146: in all_seeds + cur.execute(""" +E psycopg2.errors.UndefinedColumn: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ + +The above exception was the direct cause of the following exception: +/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: in setup + return super().setup() + ^^^^^^^^^^^^^^^ +tests/conftest.py:169: in all_seeds + raise RuntimeError(f"Seed data insertion failed: {e}") from e +E RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ +_ ERROR at setup of test_get_with_valid_id_returns_200[GET /appointments/{appointment_id}/edit] _ +tests/conftest.py:146: in all_seeds + cur.execute(""" +E psycopg2.errors.UndefinedColumn: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ + +The above exception was the direct cause of the following exception: +/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py:458: in setup + return super().setup() + ^^^^^^^^^^^^^^^ +tests/conftest.py:169: in all_seeds + raise RuntimeError(f"Seed data insertion failed: {e}") from e +E RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +E LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... +E ^ +=================================== FAILURES =================================== +_____________ test_get_no_params_returns_200[GET /domains/create] ______________ + + Exception Group Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 76, in collapse_excgroups + | yield + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 186, in __call__ + | async with anyio.create_task_group() as task_group: + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 783, in __aexit__ + | raise BaseExceptionGroup( + | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) + +-+---------------- 1 ---------------- + | Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 353, in from_call + | result: TResult | None = func() + | ^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 245, in + | lambda: runtest_hook(item=item, **kwds), + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/logging.py", line 850, in pytest_runtest_call + | yield + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/capture.py", line 900, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/skipping.py", line 268, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 179, in pytest_runtest_call + | item.runtest() + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 469, in runtest + | super().runtest() + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 1720, in runtest + | self.ihook.pytest_pyfunc_call(pyfuncitem=self) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper + | return result.get_result() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_result.py", line 103, in get_result + | raise exc.with_traceback(tb) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper + | res = yield + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 166, in pytest_pyfunc_call + | result = testfunction(**testargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 716, in inner + | runner.run(coro, context=context) + | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run + | return self._loop.run_until_complete(task) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete + | return future.result() + | ^^^^^^^^^^^^^^^ + | File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + | r = await client.get(url, follow_redirects=True) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + | return await self.request( + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + | return await self.send(request, auth=auth, follow_redirects=follow_redirects) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + | response = await self._send_handling_auth( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + | response = await self._send_handling_redirects( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + | response = await self._send_single_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + | response = await transport.handle_async_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + | await super().__call__(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + | await self.app(scope, receive, _send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + | with collapse_excgroups(): + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + | self.gen.throw(value) + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + | response = await self.dispatch_func(request, call_next) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/main.py", line 79, in add_request_context + | response = await call_next(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + | raise app_exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + | await self.app(scope, receive_or_disconnect, send_no_error) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + | await route.handle(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + | await wrap_app_handling_exceptions(app, request)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + | response = await f(request) + | ^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + | raw_response = await run_endpoint_function( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + | return await dependant.call(**values) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/routers/domains.py", line 30, in create_form + | sidebar = await get_sidebar_data(db) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/core/sidebar.py", line 14, in get_sidebar_data + | result = await db.execute(text(""" + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + | result = await greenlet_spawn( + | ^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + | result = context.throw(*sys.exc_info()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + | return self._execute_internal( + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + | conn = self._connection_for_bind(bind) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + | return trans._connection_for_bind(engine, execution_options) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "", line 2, in _connection_for_bind + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + | ret_value = fn(self, *arg, **kw) + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + | conn = bind.connect() + | ^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + | return self._connection_cls(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + | self._dbapi_connection = engine.raw_connection() + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + | return self.pool.connect() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + | return _ConnectionFairy._checkout(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + | with util.safe_reraise(): + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + | raise exc_value.with_traceback(exc_tb) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + | result = pool._dialect._do_ping_w_event( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + | return self.do_ping(dbapi_connection) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + | dbapi_connection.ping() + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + | self._handle_exception(error) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + | raise error + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + | _ = self.await_(self._async_ping()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + | value = await result + | ^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + | await tr.start() + | File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + | await self._connection.execute(query) + | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + | result = await self._protocol.query(query, timeout) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "asyncpg/protocol/protocol.pyx", line 375, in query + | RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +------------------------------------ + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + return await self.request( + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + response = await self._send_handling_auth( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + response = await self._send_handling_redirects( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + await self.app(scope, receive, _send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + self.gen.throw(value) + File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/main.py", line 79, in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + raise app_exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + await self.app(scope, receive_or_disconnect, send_no_error) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + await route.handle(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + response = await f(request) + ^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/routers/domains.py", line 30, in create_form + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/core/sidebar.py", line 14, in get_sidebar_data + result = await db.execute(text(""" + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + result = await greenlet_spawn( + ^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + return self._execute_internal( + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 2, in _connection_for_bind + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + raise exc_value.with_traceback(exc_tb) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + result = pool._dialect._do_ping_w_event( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + dbapi_connection.ping() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + self._handle_exception(error) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + raise error + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + await tr.start() + File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + await self._connection.execute(query) + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "asyncpg/protocol/protocol.pyx", line 375, in query +RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +During handling of the above exception, another exception occurred: +tests/test_smoke_dynamic.py:35: in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1768: in get + return await self.request( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1540: in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1629: in send + response = await self._send_handling_auth( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1657: in _send_handling_auth + response = await self._send_handling_redirects( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1694: in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1730: in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py:170: in handle_async_request + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/fastapi/applications.py:1054: in __call__ + await super().__call__(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/applications.py:113: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:187: in __call__ + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:165: in __call__ + await self.app(scope, receive, _send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:185: in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/contextlib.py:158: in __exit__ + self.gen.throw(value) +/usr/local/lib/python3.12/site-packages/starlette/_utils.py:82: in collapse_excgroups + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:187: in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +main.py:79: in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:163: in call_next + raise app_exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149: in coro + await self.app(scope, receive_or_disconnect, send_no_error) +/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py:62: in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:715: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:735: in app + await route.handle(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:288: in handle + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:76: in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:73: in app + response = await f(request) + ^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:301: in app + raw_response = await run_endpoint_function( +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:212: in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +routers/domains.py:30: in create_form + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +core/sidebar.py:14: in get_sidebar_data + result = await db.execute(text(""" +/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py:461: in execute + result = await greenlet_spawn( +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2362: in execute + return self._execute_internal( +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2237: in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2106: in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +:2: in _connection_for_bind + ??? +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py:139: in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:1189: in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3278: in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:146: in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3302: in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:449: in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1362: in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py:146: in __exit__ + raise exc_value.with_traceback(exc_tb) +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1300: in _checkout + result = pool._dialect._do_ping_w_event( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py:716: in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:1150: in do_ping + dbapi_connection.ping() +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:801: in ping + self._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:782: in _handle_exception + raise error +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:799: in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn + value = await result + ^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:808: in _async_ping + await tr.start() +/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py:146: in start + await self._connection.execute(query) +/usr/local/lib/python3.12/site-packages/asyncpg/connection.py:349: in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +asyncpg/protocol/protocol.pyx:375: in query + ??? +E RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +------------------------------ Captured log call ------------------------------- +ERROR sqlalchemy.pool.impl.AsyncAdaptedQueuePool:base.py:378 Exception terminating connection > +Traceback (most recent call last): + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection + self._dialect.do_terminate(connection) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1117, in do_terminate + dbapi_connection.terminate() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 895, in terminate + self.await_(self._connection.close(timeout=2)) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1504, in close + await self._protocol.close(timeout) + File "asyncpg/protocol/protocol.pyx", line 627, in close + File "asyncpg/protocol/protocol.pyx", line 660, in asyncpg.protocol.protocol.BaseProtocol._request_cancel + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1673, in _cancel_current_command + self._cancellations.add(self._loop.create_task(self._cancel(waiter))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 455, in create_task + self._check_closed() + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 545, in _check_closed + raise RuntimeError('Event loop is closed') +RuntimeError: Event loop is closed +______________ test_get_no_params_returns_200[GET /areas/create] _______________ + + Exception Group Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 76, in collapse_excgroups + | yield + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 186, in __call__ + | async with anyio.create_task_group() as task_group: + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 783, in __aexit__ + | raise BaseExceptionGroup( + | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) + +-+---------------- 1 ---------------- + | Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 353, in from_call + | result: TResult | None = func() + | ^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 245, in + | lambda: runtest_hook(item=item, **kwds), + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/logging.py", line 850, in pytest_runtest_call + | yield + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/capture.py", line 900, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/skipping.py", line 268, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 179, in pytest_runtest_call + | item.runtest() + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 469, in runtest + | super().runtest() + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 1720, in runtest + | self.ihook.pytest_pyfunc_call(pyfuncitem=self) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper + | return result.get_result() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_result.py", line 103, in get_result + | raise exc.with_traceback(tb) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper + | res = yield + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 166, in pytest_pyfunc_call + | result = testfunction(**testargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 716, in inner + | runner.run(coro, context=context) + | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run + | return self._loop.run_until_complete(task) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete + | return future.result() + | ^^^^^^^^^^^^^^^ + | File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + | r = await client.get(url, follow_redirects=True) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + | return await self.request( + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + | return await self.send(request, auth=auth, follow_redirects=follow_redirects) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + | response = await self._send_handling_auth( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + | response = await self._send_handling_redirects( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + | response = await self._send_single_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + | response = await transport.handle_async_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + | await super().__call__(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + | await self.app(scope, receive, _send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + | with collapse_excgroups(): + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + | self.gen.throw(value) + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + | response = await self.dispatch_func(request, call_next) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/main.py", line 79, in add_request_context + | response = await call_next(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + | raise app_exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + | await self.app(scope, receive_or_disconnect, send_no_error) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + | await route.handle(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + | await wrap_app_handling_exceptions(app, request)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + | response = await f(request) + | ^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + | raw_response = await run_endpoint_function( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + | return await dependant.call(**values) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/routers/areas.py", line 58, in create_form + | sidebar = await get_sidebar_data(db) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/core/sidebar.py", line 14, in get_sidebar_data + | result = await db.execute(text(""" + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + | result = await greenlet_spawn( + | ^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + | result = context.throw(*sys.exc_info()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + | return self._execute_internal( + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + | conn = self._connection_for_bind(bind) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + | return trans._connection_for_bind(engine, execution_options) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "", line 2, in _connection_for_bind + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + | ret_value = fn(self, *arg, **kw) + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + | conn = bind.connect() + | ^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + | return self._connection_cls(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + | self._dbapi_connection = engine.raw_connection() + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + | return self.pool.connect() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + | return _ConnectionFairy._checkout(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + | with util.safe_reraise(): + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + | raise exc_value.with_traceback(exc_tb) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + | result = pool._dialect._do_ping_w_event( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + | return self.do_ping(dbapi_connection) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + | dbapi_connection.ping() + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + | self._handle_exception(error) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + | raise error + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + | _ = self.await_(self._async_ping()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + | value = await result + | ^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + | await tr.start() + | File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + | await self._connection.execute(query) + | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + | result = await self._protocol.query(query, timeout) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "asyncpg/protocol/protocol.pyx", line 375, in query + | RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +------------------------------------ + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + return await self.request( + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + response = await self._send_handling_auth( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + response = await self._send_handling_redirects( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + await self.app(scope, receive, _send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + self.gen.throw(value) + File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/main.py", line 79, in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + raise app_exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + await self.app(scope, receive_or_disconnect, send_no_error) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + await route.handle(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + response = await f(request) + ^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/routers/areas.py", line 58, in create_form + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/core/sidebar.py", line 14, in get_sidebar_data + result = await db.execute(text(""" + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + result = await greenlet_spawn( + ^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + return self._execute_internal( + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 2, in _connection_for_bind + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + raise exc_value.with_traceback(exc_tb) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + result = pool._dialect._do_ping_w_event( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + dbapi_connection.ping() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + self._handle_exception(error) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + raise error + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + await tr.start() + File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + await self._connection.execute(query) + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "asyncpg/protocol/protocol.pyx", line 375, in query +RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +During handling of the above exception, another exception occurred: +tests/test_smoke_dynamic.py:35: in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1768: in get + return await self.request( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1540: in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1629: in send + response = await self._send_handling_auth( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1657: in _send_handling_auth + response = await self._send_handling_redirects( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1694: in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1730: in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py:170: in handle_async_request + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/fastapi/applications.py:1054: in __call__ + await super().__call__(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/applications.py:113: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:187: in __call__ + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:165: in __call__ + await self.app(scope, receive, _send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:185: in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/contextlib.py:158: in __exit__ + self.gen.throw(value) +/usr/local/lib/python3.12/site-packages/starlette/_utils.py:82: in collapse_excgroups + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:187: in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +main.py:79: in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:163: in call_next + raise app_exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149: in coro + await self.app(scope, receive_or_disconnect, send_no_error) +/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py:62: in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:715: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:735: in app + await route.handle(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:288: in handle + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:76: in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:73: in app + response = await f(request) + ^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:301: in app + raw_response = await run_endpoint_function( +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:212: in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +routers/areas.py:58: in create_form + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +core/sidebar.py:14: in get_sidebar_data + result = await db.execute(text(""" +/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py:461: in execute + result = await greenlet_spawn( +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2362: in execute + return self._execute_internal( +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2237: in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2106: in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +:2: in _connection_for_bind + ??? +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py:139: in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:1189: in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3278: in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:146: in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3302: in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:449: in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1362: in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py:146: in __exit__ + raise exc_value.with_traceback(exc_tb) +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1300: in _checkout + result = pool._dialect._do_ping_w_event( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py:716: in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:1150: in do_ping + dbapi_connection.ping() +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:801: in ping + self._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:782: in _handle_exception + raise error +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:799: in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn + value = await result + ^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:808: in _async_ping + await tr.start() +/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py:146: in start + await self._connection.execute(query) +/usr/local/lib/python3.12/site-packages/asyncpg/connection.py:349: in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +asyncpg/protocol/protocol.pyx:375: in query + ??? +E RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +------------------------------ Captured log call ------------------------------- +ERROR sqlalchemy.pool.impl.AsyncAdaptedQueuePool:base.py:378 Exception terminating connection > +Traceback (most recent call last): + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection + self._dialect.do_terminate(connection) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1117, in do_terminate + dbapi_connection.terminate() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 895, in terminate + self.await_(self._connection.close(timeout=2)) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1504, in close + await self._protocol.close(timeout) + File "asyncpg/protocol/protocol.pyx", line 627, in close + File "asyncpg/protocol/protocol.pyx", line 660, in asyncpg.protocol.protocol.BaseProtocol._request_cancel + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1673, in _cancel_current_command + self._cancellations.add(self._loop.create_task(self._cancel(waiter))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 455, in create_task + self._check_closed() + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 545, in _check_closed + raise RuntimeError('Event loop is closed') +RuntimeError: Event loop is closed +_____________ test_get_no_params_returns_200[GET /projects/create] _____________ + + Exception Group Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 76, in collapse_excgroups + | yield + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 186, in __call__ + | async with anyio.create_task_group() as task_group: + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 783, in __aexit__ + | raise BaseExceptionGroup( + | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) + +-+---------------- 1 ---------------- + | Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 353, in from_call + | result: TResult | None = func() + | ^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 245, in + | lambda: runtest_hook(item=item, **kwds), + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/logging.py", line 850, in pytest_runtest_call + | yield + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/capture.py", line 900, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/skipping.py", line 268, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 179, in pytest_runtest_call + | item.runtest() + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 469, in runtest + | super().runtest() + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 1720, in runtest + | self.ihook.pytest_pyfunc_call(pyfuncitem=self) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper + | return result.get_result() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_result.py", line 103, in get_result + | raise exc.with_traceback(tb) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper + | res = yield + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 166, in pytest_pyfunc_call + | result = testfunction(**testargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 716, in inner + | runner.run(coro, context=context) + | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run + | return self._loop.run_until_complete(task) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete + | return future.result() + | ^^^^^^^^^^^^^^^ + | File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + | r = await client.get(url, follow_redirects=True) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + | return await self.request( + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + | return await self.send(request, auth=auth, follow_redirects=follow_redirects) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + | response = await self._send_handling_auth( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + | response = await self._send_handling_redirects( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + | response = await self._send_single_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + | response = await transport.handle_async_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + | await super().__call__(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + | await self.app(scope, receive, _send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + | with collapse_excgroups(): + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + | self.gen.throw(value) + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + | response = await self.dispatch_func(request, call_next) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/main.py", line 79, in add_request_context + | response = await call_next(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + | raise app_exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + | await self.app(scope, receive_or_disconnect, send_no_error) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + | await route.handle(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + | await wrap_app_handling_exceptions(app, request)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + | response = await f(request) + | ^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + | raw_response = await run_endpoint_function( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + | return await dependant.call(**values) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/routers/projects.py", line 78, in create_form + | sidebar = await get_sidebar_data(db) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/core/sidebar.py", line 14, in get_sidebar_data + | result = await db.execute(text(""" + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + | result = await greenlet_spawn( + | ^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + | result = context.throw(*sys.exc_info()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + | return self._execute_internal( + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + | conn = self._connection_for_bind(bind) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + | return trans._connection_for_bind(engine, execution_options) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "", line 2, in _connection_for_bind + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + | ret_value = fn(self, *arg, **kw) + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + | conn = bind.connect() + | ^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + | return self._connection_cls(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + | self._dbapi_connection = engine.raw_connection() + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + | return self.pool.connect() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + | return _ConnectionFairy._checkout(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + | with util.safe_reraise(): + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + | raise exc_value.with_traceback(exc_tb) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + | result = pool._dialect._do_ping_w_event( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + | return self.do_ping(dbapi_connection) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + | dbapi_connection.ping() + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + | self._handle_exception(error) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + | raise error + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + | _ = self.await_(self._async_ping()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + | value = await result + | ^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + | await tr.start() + | File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + | await self._connection.execute(query) + | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + | result = await self._protocol.query(query, timeout) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "asyncpg/protocol/protocol.pyx", line 375, in query + | RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +------------------------------------ + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + return await self.request( + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + response = await self._send_handling_auth( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + response = await self._send_handling_redirects( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + await self.app(scope, receive, _send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + self.gen.throw(value) + File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/main.py", line 79, in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + raise app_exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + await self.app(scope, receive_or_disconnect, send_no_error) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + await route.handle(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + response = await f(request) + ^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/routers/projects.py", line 78, in create_form + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/core/sidebar.py", line 14, in get_sidebar_data + result = await db.execute(text(""" + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + result = await greenlet_spawn( + ^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + return self._execute_internal( + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 2, in _connection_for_bind + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + raise exc_value.with_traceback(exc_tb) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + result = pool._dialect._do_ping_w_event( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + dbapi_connection.ping() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + self._handle_exception(error) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + raise error + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + await tr.start() + File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + await self._connection.execute(query) + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "asyncpg/protocol/protocol.pyx", line 375, in query +RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +During handling of the above exception, another exception occurred: +tests/test_smoke_dynamic.py:35: in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1768: in get + return await self.request( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1540: in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1629: in send + response = await self._send_handling_auth( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1657: in _send_handling_auth + response = await self._send_handling_redirects( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1694: in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1730: in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py:170: in handle_async_request + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/fastapi/applications.py:1054: in __call__ + await super().__call__(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/applications.py:113: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:187: in __call__ + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:165: in __call__ + await self.app(scope, receive, _send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:185: in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/contextlib.py:158: in __exit__ + self.gen.throw(value) +/usr/local/lib/python3.12/site-packages/starlette/_utils.py:82: in collapse_excgroups + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:187: in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +main.py:79: in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:163: in call_next + raise app_exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149: in coro + await self.app(scope, receive_or_disconnect, send_no_error) +/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py:62: in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:715: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:735: in app + await route.handle(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:288: in handle + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:76: in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:73: in app + response = await f(request) + ^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:301: in app + raw_response = await run_endpoint_function( +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:212: in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +routers/projects.py:78: in create_form + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +core/sidebar.py:14: in get_sidebar_data + result = await db.execute(text(""" +/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py:461: in execute + result = await greenlet_spawn( +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2362: in execute + return self._execute_internal( +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2237: in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2106: in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +:2: in _connection_for_bind + ??? +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py:139: in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:1189: in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3278: in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:146: in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3302: in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:449: in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1362: in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py:146: in __exit__ + raise exc_value.with_traceback(exc_tb) +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1300: in _checkout + result = pool._dialect._do_ping_w_event( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py:716: in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:1150: in do_ping + dbapi_connection.ping() +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:801: in ping + self._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:782: in _handle_exception + raise error +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:799: in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn + value = await result + ^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:808: in _async_ping + await tr.start() +/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py:146: in start + await self._connection.execute(query) +/usr/local/lib/python3.12/site-packages/asyncpg/connection.py:349: in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +asyncpg/protocol/protocol.pyx:375: in query + ??? +E RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +------------------------------ Captured log call ------------------------------- +ERROR sqlalchemy.pool.impl.AsyncAdaptedQueuePool:base.py:378 Exception terminating connection > +Traceback (most recent call last): + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection + self._dialect.do_terminate(connection) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1117, in do_terminate + dbapi_connection.terminate() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 895, in terminate + self.await_(self._connection.close(timeout=2)) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1504, in close + await self._protocol.close(timeout) + File "asyncpg/protocol/protocol.pyx", line 627, in close + File "asyncpg/protocol/protocol.pyx", line 660, in asyncpg.protocol.protocol.BaseProtocol._request_cancel + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1673, in _cancel_current_command + self._cancellations.add(self._loop.create_task(self._cancel(waiter))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 455, in create_task + self._check_closed() + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 545, in _check_closed + raise RuntimeError('Event loop is closed') +RuntimeError: Event loop is closed +______________ test_get_no_params_returns_200[GET /tasks/create] _______________ + + Exception Group Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 76, in collapse_excgroups + | yield + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 186, in __call__ + | async with anyio.create_task_group() as task_group: + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 783, in __aexit__ + | raise BaseExceptionGroup( + | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) + +-+---------------- 1 ---------------- + | Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 353, in from_call + | result: TResult | None = func() + | ^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 245, in + | lambda: runtest_hook(item=item, **kwds), + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/logging.py", line 850, in pytest_runtest_call + | yield + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/capture.py", line 900, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/skipping.py", line 268, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 179, in pytest_runtest_call + | item.runtest() + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 469, in runtest + | super().runtest() + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 1720, in runtest + | self.ihook.pytest_pyfunc_call(pyfuncitem=self) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper + | return result.get_result() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_result.py", line 103, in get_result + | raise exc.with_traceback(tb) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper + | res = yield + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 166, in pytest_pyfunc_call + | result = testfunction(**testargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 716, in inner + | runner.run(coro, context=context) + | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run + | return self._loop.run_until_complete(task) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete + | return future.result() + | ^^^^^^^^^^^^^^^ + | File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + | r = await client.get(url, follow_redirects=True) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + | return await self.request( + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + | return await self.send(request, auth=auth, follow_redirects=follow_redirects) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + | response = await self._send_handling_auth( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + | response = await self._send_handling_redirects( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + | response = await self._send_single_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + | response = await transport.handle_async_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + | await super().__call__(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + | await self.app(scope, receive, _send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + | with collapse_excgroups(): + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + | self.gen.throw(value) + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + | response = await self.dispatch_func(request, call_next) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/main.py", line 79, in add_request_context + | response = await call_next(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + | raise app_exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + | await self.app(scope, receive_or_disconnect, send_no_error) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + | await route.handle(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + | await wrap_app_handling_exceptions(app, request)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + | response = await f(request) + | ^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + | raw_response = await run_endpoint_function( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + | return await dependant.call(**values) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/routers/tasks.py", line 119, in create_form + | sidebar = await get_sidebar_data(db) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/core/sidebar.py", line 14, in get_sidebar_data + | result = await db.execute(text(""" + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + | result = await greenlet_spawn( + | ^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + | result = context.throw(*sys.exc_info()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + | return self._execute_internal( + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + | conn = self._connection_for_bind(bind) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + | return trans._connection_for_bind(engine, execution_options) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "", line 2, in _connection_for_bind + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + | ret_value = fn(self, *arg, **kw) + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + | conn = bind.connect() + | ^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + | return self._connection_cls(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + | self._dbapi_connection = engine.raw_connection() + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + | return self.pool.connect() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + | return _ConnectionFairy._checkout(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + | with util.safe_reraise(): + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + | raise exc_value.with_traceback(exc_tb) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + | result = pool._dialect._do_ping_w_event( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + | return self.do_ping(dbapi_connection) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + | dbapi_connection.ping() + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + | self._handle_exception(error) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + | raise error + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + | _ = self.await_(self._async_ping()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + | value = await result + | ^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + | await tr.start() + | File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + | await self._connection.execute(query) + | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + | result = await self._protocol.query(query, timeout) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "asyncpg/protocol/protocol.pyx", line 375, in query + | RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +------------------------------------ + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + return await self.request( + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + response = await self._send_handling_auth( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + response = await self._send_handling_redirects( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + await self.app(scope, receive, _send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + self.gen.throw(value) + File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/main.py", line 79, in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + raise app_exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + await self.app(scope, receive_or_disconnect, send_no_error) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + await route.handle(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + response = await f(request) + ^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/routers/tasks.py", line 119, in create_form + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/core/sidebar.py", line 14, in get_sidebar_data + result = await db.execute(text(""" + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + result = await greenlet_spawn( + ^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + return self._execute_internal( + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 2, in _connection_for_bind + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + raise exc_value.with_traceback(exc_tb) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + result = pool._dialect._do_ping_w_event( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + dbapi_connection.ping() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + self._handle_exception(error) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + raise error + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + await tr.start() + File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + await self._connection.execute(query) + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "asyncpg/protocol/protocol.pyx", line 375, in query +RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +During handling of the above exception, another exception occurred: +tests/test_smoke_dynamic.py:35: in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1768: in get + return await self.request( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1540: in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1629: in send + response = await self._send_handling_auth( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1657: in _send_handling_auth + response = await self._send_handling_redirects( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1694: in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1730: in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py:170: in handle_async_request + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/fastapi/applications.py:1054: in __call__ + await super().__call__(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/applications.py:113: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:187: in __call__ + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:165: in __call__ + await self.app(scope, receive, _send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:185: in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/contextlib.py:158: in __exit__ + self.gen.throw(value) +/usr/local/lib/python3.12/site-packages/starlette/_utils.py:82: in collapse_excgroups + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:187: in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +main.py:79: in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:163: in call_next + raise app_exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149: in coro + await self.app(scope, receive_or_disconnect, send_no_error) +/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py:62: in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:715: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:735: in app + await route.handle(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:288: in handle + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:76: in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:73: in app + response = await f(request) + ^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:301: in app + raw_response = await run_endpoint_function( +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:212: in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +routers/tasks.py:119: in create_form + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +core/sidebar.py:14: in get_sidebar_data + result = await db.execute(text(""" +/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py:461: in execute + result = await greenlet_spawn( +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2362: in execute + return self._execute_internal( +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2237: in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2106: in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +:2: in _connection_for_bind + ??? +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py:139: in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:1189: in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3278: in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:146: in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3302: in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:449: in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1362: in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py:146: in __exit__ + raise exc_value.with_traceback(exc_tb) +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1300: in _checkout + result = pool._dialect._do_ping_w_event( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py:716: in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:1150: in do_ping + dbapi_connection.ping() +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:801: in ping + self._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:782: in _handle_exception + raise error +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:799: in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn + value = await result + ^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:808: in _async_ping + await tr.start() +/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py:146: in start + await self._connection.execute(query) +/usr/local/lib/python3.12/site-packages/asyncpg/connection.py:349: in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +asyncpg/protocol/protocol.pyx:375: in query + ??? +E RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +------------------------------ Captured log call ------------------------------- +ERROR sqlalchemy.pool.impl.AsyncAdaptedQueuePool:base.py:378 Exception terminating connection > +Traceback (most recent call last): + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection + self._dialect.do_terminate(connection) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1117, in do_terminate + dbapi_connection.terminate() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 895, in terminate + self.await_(self._connection.close(timeout=2)) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1504, in close + await self._protocol.close(timeout) + File "asyncpg/protocol/protocol.pyx", line 627, in close + File "asyncpg/protocol/protocol.pyx", line 660, in asyncpg.protocol.protocol.BaseProtocol._request_cancel + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1673, in _cancel_current_command + self._cancellations.add(self._loop.create_task(self._cancel(waiter))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 455, in create_task + self._check_closed() + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 545, in _check_closed + raise RuntimeError('Event loop is closed') +RuntimeError: Event loop is closed +______________ test_get_no_params_returns_200[GET /notes/create] _______________ + + Exception Group Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 76, in collapse_excgroups + | yield + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 186, in __call__ + | async with anyio.create_task_group() as task_group: + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 783, in __aexit__ + | raise BaseExceptionGroup( + | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) + +-+---------------- 1 ---------------- + | Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 353, in from_call + | result: TResult | None = func() + | ^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 245, in + | lambda: runtest_hook(item=item, **kwds), + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/logging.py", line 850, in pytest_runtest_call + | yield + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/capture.py", line 900, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/skipping.py", line 268, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 179, in pytest_runtest_call + | item.runtest() + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 469, in runtest + | super().runtest() + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 1720, in runtest + | self.ihook.pytest_pyfunc_call(pyfuncitem=self) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper + | return result.get_result() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_result.py", line 103, in get_result + | raise exc.with_traceback(tb) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper + | res = yield + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 166, in pytest_pyfunc_call + | result = testfunction(**testargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 716, in inner + | runner.run(coro, context=context) + | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run + | return self._loop.run_until_complete(task) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete + | return future.result() + | ^^^^^^^^^^^^^^^ + | File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + | r = await client.get(url, follow_redirects=True) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + | return await self.request( + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + | return await self.send(request, auth=auth, follow_redirects=follow_redirects) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + | response = await self._send_handling_auth( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + | response = await self._send_handling_redirects( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + | response = await self._send_single_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + | response = await transport.handle_async_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + | await super().__call__(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + | await self.app(scope, receive, _send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + | with collapse_excgroups(): + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + | self.gen.throw(value) + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + | response = await self.dispatch_func(request, call_next) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/main.py", line 79, in add_request_context + | response = await call_next(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + | raise app_exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + | await self.app(scope, receive_or_disconnect, send_no_error) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + | await route.handle(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + | await wrap_app_handling_exceptions(app, request)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + | response = await f(request) + | ^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + | raw_response = await run_endpoint_function( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + | return await dependant.call(**values) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/routers/notes.py", line 66, in create_form + | sidebar = await get_sidebar_data(db) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/core/sidebar.py", line 14, in get_sidebar_data + | result = await db.execute(text(""" + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + | result = await greenlet_spawn( + | ^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + | result = context.throw(*sys.exc_info()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + | return self._execute_internal( + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + | conn = self._connection_for_bind(bind) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + | return trans._connection_for_bind(engine, execution_options) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "", line 2, in _connection_for_bind + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + | ret_value = fn(self, *arg, **kw) + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + | conn = bind.connect() + | ^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + | return self._connection_cls(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + | self._dbapi_connection = engine.raw_connection() + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + | return self.pool.connect() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + | return _ConnectionFairy._checkout(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + | with util.safe_reraise(): + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + | raise exc_value.with_traceback(exc_tb) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + | result = pool._dialect._do_ping_w_event( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + | return self.do_ping(dbapi_connection) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + | dbapi_connection.ping() + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + | self._handle_exception(error) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + | raise error + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + | _ = self.await_(self._async_ping()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + | value = await result + | ^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + | await tr.start() + | File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + | await self._connection.execute(query) + | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + | result = await self._protocol.query(query, timeout) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "asyncpg/protocol/protocol.pyx", line 375, in query + | RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +------------------------------------ + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + return await self.request( + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + response = await self._send_handling_auth( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + response = await self._send_handling_redirects( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + await self.app(scope, receive, _send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + self.gen.throw(value) + File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/main.py", line 79, in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + raise app_exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + await self.app(scope, receive_or_disconnect, send_no_error) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + await route.handle(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + response = await f(request) + ^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/routers/notes.py", line 66, in create_form + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/core/sidebar.py", line 14, in get_sidebar_data + result = await db.execute(text(""" + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + result = await greenlet_spawn( + ^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + return self._execute_internal( + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 2, in _connection_for_bind + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + raise exc_value.with_traceback(exc_tb) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + result = pool._dialect._do_ping_w_event( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + dbapi_connection.ping() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + self._handle_exception(error) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + raise error + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + await tr.start() + File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + await self._connection.execute(query) + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "asyncpg/protocol/protocol.pyx", line 375, in query +RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +During handling of the above exception, another exception occurred: +tests/test_smoke_dynamic.py:35: in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1768: in get + return await self.request( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1540: in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1629: in send + response = await self._send_handling_auth( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1657: in _send_handling_auth + response = await self._send_handling_redirects( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1694: in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1730: in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py:170: in handle_async_request + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/fastapi/applications.py:1054: in __call__ + await super().__call__(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/applications.py:113: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:187: in __call__ + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:165: in __call__ + await self.app(scope, receive, _send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:185: in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/contextlib.py:158: in __exit__ + self.gen.throw(value) +/usr/local/lib/python3.12/site-packages/starlette/_utils.py:82: in collapse_excgroups + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:187: in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +main.py:79: in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:163: in call_next + raise app_exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149: in coro + await self.app(scope, receive_or_disconnect, send_no_error) +/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py:62: in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:715: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:735: in app + await route.handle(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:288: in handle + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:76: in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:73: in app + response = await f(request) + ^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:301: in app + raw_response = await run_endpoint_function( +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:212: in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +routers/notes.py:66: in create_form + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +core/sidebar.py:14: in get_sidebar_data + result = await db.execute(text(""" +/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py:461: in execute + result = await greenlet_spawn( +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2362: in execute + return self._execute_internal( +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2237: in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2106: in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +:2: in _connection_for_bind + ??? +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py:139: in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:1189: in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3278: in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:146: in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3302: in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:449: in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1362: in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py:146: in __exit__ + raise exc_value.with_traceback(exc_tb) +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1300: in _checkout + result = pool._dialect._do_ping_w_event( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py:716: in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:1150: in do_ping + dbapi_connection.ping() +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:801: in ping + self._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:782: in _handle_exception + raise error +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:799: in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn + value = await result + ^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:808: in _async_ping + await tr.start() +/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py:146: in start + await self._connection.execute(query) +/usr/local/lib/python3.12/site-packages/asyncpg/connection.py:349: in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +asyncpg/protocol/protocol.pyx:375: in query + ??? +E RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +------------------------------ Captured log call ------------------------------- +ERROR sqlalchemy.pool.impl.AsyncAdaptedQueuePool:base.py:378 Exception terminating connection > +Traceback (most recent call last): + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection + self._dialect.do_terminate(connection) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1117, in do_terminate + dbapi_connection.terminate() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 895, in terminate + self.await_(self._connection.close(timeout=2)) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1504, in close + await self._protocol.close(timeout) + File "asyncpg/protocol/protocol.pyx", line 627, in close + File "asyncpg/protocol/protocol.pyx", line 660, in asyncpg.protocol.protocol.BaseProtocol._request_cancel + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1673, in _cancel_current_command + self._cancellations.add(self._loop.create_task(self._cancel(waiter))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 455, in create_task + self._check_closed() + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 545, in _check_closed + raise RuntimeError('Event loop is closed') +RuntimeError: Event loop is closed +______________ test_get_no_params_returns_200[GET /links/create] _______________ + + Exception Group Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 76, in collapse_excgroups + | yield + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 186, in __call__ + | async with anyio.create_task_group() as task_group: + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 783, in __aexit__ + | raise BaseExceptionGroup( + | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) + +-+---------------- 1 ---------------- + | Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 353, in from_call + | result: TResult | None = func() + | ^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 245, in + | lambda: runtest_hook(item=item, **kwds), + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/logging.py", line 850, in pytest_runtest_call + | yield + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/capture.py", line 900, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/skipping.py", line 268, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 179, in pytest_runtest_call + | item.runtest() + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 469, in runtest + | super().runtest() + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 1720, in runtest + | self.ihook.pytest_pyfunc_call(pyfuncitem=self) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper + | return result.get_result() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_result.py", line 103, in get_result + | raise exc.with_traceback(tb) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper + | res = yield + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 166, in pytest_pyfunc_call + | result = testfunction(**testargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 716, in inner + | runner.run(coro, context=context) + | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run + | return self._loop.run_until_complete(task) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete + | return future.result() + | ^^^^^^^^^^^^^^^ + | File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + | r = await client.get(url, follow_redirects=True) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + | return await self.request( + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + | return await self.send(request, auth=auth, follow_redirects=follow_redirects) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + | response = await self._send_handling_auth( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + | response = await self._send_handling_redirects( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + | response = await self._send_single_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + | response = await transport.handle_async_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + | await super().__call__(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + | await self.app(scope, receive, _send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + | with collapse_excgroups(): + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + | self.gen.throw(value) + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + | response = await self.dispatch_func(request, call_next) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/main.py", line 79, in add_request_context + | response = await call_next(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + | raise app_exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + | await self.app(scope, receive_or_disconnect, send_no_error) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + | await route.handle(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + | await wrap_app_handling_exceptions(app, request)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + | response = await f(request) + | ^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + | raw_response = await run_endpoint_function( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + | return await dependant.call(**values) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/routers/links.py", line 49, in create_form + | sidebar = await get_sidebar_data(db) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/core/sidebar.py", line 14, in get_sidebar_data + | result = await db.execute(text(""" + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + | result = await greenlet_spawn( + | ^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + | result = context.throw(*sys.exc_info()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + | return self._execute_internal( + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + | conn = self._connection_for_bind(bind) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + | return trans._connection_for_bind(engine, execution_options) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "", line 2, in _connection_for_bind + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + | ret_value = fn(self, *arg, **kw) + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + | conn = bind.connect() + | ^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + | return self._connection_cls(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + | self._dbapi_connection = engine.raw_connection() + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + | return self.pool.connect() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + | return _ConnectionFairy._checkout(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + | with util.safe_reraise(): + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + | raise exc_value.with_traceback(exc_tb) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + | result = pool._dialect._do_ping_w_event( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + | return self.do_ping(dbapi_connection) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + | dbapi_connection.ping() + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + | self._handle_exception(error) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + | raise error + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + | _ = self.await_(self._async_ping()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + | value = await result + | ^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + | await tr.start() + | File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + | await self._connection.execute(query) + | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + | result = await self._protocol.query(query, timeout) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "asyncpg/protocol/protocol.pyx", line 375, in query + | RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +------------------------------------ + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + return await self.request( + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + response = await self._send_handling_auth( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + response = await self._send_handling_redirects( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + await self.app(scope, receive, _send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + self.gen.throw(value) + File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/main.py", line 79, in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + raise app_exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + await self.app(scope, receive_or_disconnect, send_no_error) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + await route.handle(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + response = await f(request) + ^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/routers/links.py", line 49, in create_form + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/core/sidebar.py", line 14, in get_sidebar_data + result = await db.execute(text(""" + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + result = await greenlet_spawn( + ^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + return self._execute_internal( + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 2, in _connection_for_bind + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + raise exc_value.with_traceback(exc_tb) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + result = pool._dialect._do_ping_w_event( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + dbapi_connection.ping() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + self._handle_exception(error) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + raise error + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + await tr.start() + File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + await self._connection.execute(query) + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "asyncpg/protocol/protocol.pyx", line 375, in query +RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +During handling of the above exception, another exception occurred: +tests/test_smoke_dynamic.py:35: in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1768: in get + return await self.request( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1540: in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1629: in send + response = await self._send_handling_auth( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1657: in _send_handling_auth + response = await self._send_handling_redirects( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1694: in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1730: in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py:170: in handle_async_request + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/fastapi/applications.py:1054: in __call__ + await super().__call__(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/applications.py:113: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:187: in __call__ + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:165: in __call__ + await self.app(scope, receive, _send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:185: in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/contextlib.py:158: in __exit__ + self.gen.throw(value) +/usr/local/lib/python3.12/site-packages/starlette/_utils.py:82: in collapse_excgroups + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:187: in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +main.py:79: in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:163: in call_next + raise app_exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149: in coro + await self.app(scope, receive_or_disconnect, send_no_error) +/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py:62: in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:715: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:735: in app + await route.handle(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:288: in handle + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:76: in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:73: in app + response = await f(request) + ^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:301: in app + raw_response = await run_endpoint_function( +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:212: in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +routers/links.py:49: in create_form + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +core/sidebar.py:14: in get_sidebar_data + result = await db.execute(text(""" +/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py:461: in execute + result = await greenlet_spawn( +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2362: in execute + return self._execute_internal( +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2237: in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2106: in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +:2: in _connection_for_bind + ??? +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py:139: in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:1189: in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3278: in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:146: in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3302: in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:449: in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1362: in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py:146: in __exit__ + raise exc_value.with_traceback(exc_tb) +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1300: in _checkout + result = pool._dialect._do_ping_w_event( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py:716: in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:1150: in do_ping + dbapi_connection.ping() +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:801: in ping + self._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:782: in _handle_exception + raise error +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:799: in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn + value = await result + ^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:808: in _async_ping + await tr.start() +/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py:146: in start + await self._connection.execute(query) +/usr/local/lib/python3.12/site-packages/asyncpg/connection.py:349: in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +asyncpg/protocol/protocol.pyx:375: in query + ??? +E RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +------------------------------ Captured log call ------------------------------- +ERROR sqlalchemy.pool.impl.AsyncAdaptedQueuePool:base.py:378 Exception terminating connection > +Traceback (most recent call last): + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection + self._dialect.do_terminate(connection) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1117, in do_terminate + dbapi_connection.terminate() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 895, in terminate + self.await_(self._connection.close(timeout=2)) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1504, in close + await self._protocol.close(timeout) + File "asyncpg/protocol/protocol.pyx", line 627, in close + File "asyncpg/protocol/protocol.pyx", line 660, in asyncpg.protocol.protocol.BaseProtocol._request_cancel + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1673, in _cancel_current_command + self._cancellations.add(self._loop.create_task(self._cancel(waiter))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 455, in create_task + self._check_closed() + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 545, in _check_closed + raise RuntimeError('Event loop is closed') +RuntimeError: Event loop is closed +_________________ test_get_no_params_returns_200[GET /focus/] __________________ +asyncpg/protocol/prepared_stmt.pyx:175: in asyncpg.protocol.protocol.PreparedStatementState._encode_bind_msg + ??? +asyncpg/protocol/codecs/base.pyx:227: in asyncpg.protocol.protocol.Codec.encode + ??? +asyncpg/protocol/codecs/base.pyx:129: in asyncpg.protocol.protocol.Codec.encode_scalar + ??? +asyncpg/pgproto/./codecs/datetime.pyx:97: in asyncpg.pgproto.pgproto.date_encode + ??? +E AttributeError: 'str' object has no attribute 'toordinal' + +The above exception was the direct cause of the following exception: +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:534: in _prepare_and_execute + self._rows = deque(await prepared_stmt.fetch(*parameters)) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/asyncpg/prepared_stmt.py:176: in fetch + data = await self.__bind_execute(args, 0, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/asyncpg/prepared_stmt.py:267: in __bind_execute + data, status, _ = await self.__do_execute( +/usr/local/lib/python3.12/site-packages/asyncpg/prepared_stmt.py:256: in __do_execute + return await executor(protocol) + ^^^^^^^^^^^^^^^^^^^^^^^^ +asyncpg/protocol/protocol.pyx:185: in bind_execute + ??? +asyncpg/protocol/prepared_stmt.pyx:204: in asyncpg.protocol.protocol.PreparedStatementState._encode_bind_msg + ??? +E asyncpg.exceptions.DataError: invalid input for query argument $1: '2026-03-01' ('str' object has no attribute 'toordinal') + +The above exception was the direct cause of the following exception: +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context + self.dialect.do_execute( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py:941: in do_execute + cursor.execute(statement, parameters) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:568: in execute + self._adapt_connection.await_( +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn + value = await result + ^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:546: in _prepare_and_execute + self._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:497: in _handle_exception + self._adapt_connection._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:780: in _handle_exception + raise translated_error from error +E sqlalchemy.dialects.postgresql.asyncpg.AsyncAdapt_asyncpg_dbapi.Error: : invalid input for query argument $1: '2026-03-01' ('str' object has no attribute 'toordinal') + +The above exception was the direct cause of the following exception: +tests/test_smoke_dynamic.py:35: in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1768: in get + return await self.request( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1540: in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1629: in send + response = await self._send_handling_auth( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1657: in _send_handling_auth + response = await self._send_handling_redirects( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1694: in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1730: in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py:170: in handle_async_request + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/fastapi/applications.py:1054: in __call__ + await super().__call__(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/applications.py:113: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:187: in __call__ + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:165: in __call__ + await self.app(scope, receive, _send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:185: in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/contextlib.py:158: in __exit__ + self.gen.throw(value) +/usr/local/lib/python3.12/site-packages/starlette/_utils.py:82: in collapse_excgroups + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:187: in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +main.py:79: in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:163: in call_next + raise app_exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149: in coro + await self.app(scope, receive_or_disconnect, send_no_error) +/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py:62: in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:715: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:735: in app + await route.handle(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:288: in handle + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:76: in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:73: in app + response = await f(request) + ^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:301: in app + raw_response = await run_endpoint_function( +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:212: in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +routers/focus.py:24: in focus_view + result = await db.execute(text(""" +/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py:461: in execute + result = await greenlet_spawn( +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2362: in execute + return self._execute_internal( +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2256: in _execute_internal + result = conn.execute( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1418: in execute + return meth( +/usr/local/lib/python3.12/site-packages/sqlalchemy/sql/elements.py:515: in _execute_on_connection + return connection._execute_clauseelement( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1640: in _execute_clauseelement + ret = self._execute_context( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1846: in _execute_context + return self._exec_single_context( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1986: in _exec_single_context + self._handle_dbapi_exception( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:2355: in _handle_dbapi_exception + raise sqlalchemy_exception.with_traceback(exc_info[2]) from e +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:1967: in _exec_single_context + self.dialect.do_execute( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py:941: in do_execute + cursor.execute(statement, parameters) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:568: in execute + self._adapt_connection.await_( +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn + value = await result + ^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:546: in _prepare_and_execute + self._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:497: in _handle_exception + self._adapt_connection._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:780: in _handle_exception + raise translated_error from error +E sqlalchemy.exc.DBAPIError: (sqlalchemy.dialects.postgresql.asyncpg.Error) : invalid input for query argument $1: '2026-03-01' ('str' object has no attribute 'toordinal') +E [SQL: +E SELECT df.*, t.title, t.priority, t.status as task_status, +E t.project_id, t.due_date, t.estimated_minutes, +E p.name as project_name, +E d.name as domain_name, d.color as domain_color +E FROM daily_focus df +E JOIN tasks t ON df.task_id = t.id +E LEFT JOIN projects p ON t.project_id = p.id +E LEFT JOIN domains d ON t.domain_id = d.id +E WHERE df.focus_date = $1 AND df.is_deleted = false +E ORDER BY df.sort_order, df.created_at +E ] +E [parameters: ('2026-03-01',)] +E (Background on this error at: https://sqlalche.me/e/20/dbapi) +----------------------------- Captured stdout call ----------------------------- +2026-03-01 14:01:28,608 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-01 14:01:28,608 INFO sqlalchemy.engine.Engine + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:28,608 INFO sqlalchemy.engine.Engine [cached since 2.994s ago] () +2026-03-01 14:01:28,615 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:28,615 INFO sqlalchemy.engine.Engine [cached since 2.994s ago] () +2026-03-01 14:01:28,617 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +2026-03-01 14:01:28,617 INFO sqlalchemy.engine.Engine [cached since 2.994s ago] () +2026-03-01 14:01:28,621 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +2026-03-01 14:01:28,621 INFO sqlalchemy.engine.Engine [cached since 2.995s ago] () +2026-03-01 14:01:28,624 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +2026-03-01 14:01:28,625 INFO sqlalchemy.engine.Engine [cached since 2.995s ago] () +2026-03-01 14:01:28,628 INFO sqlalchemy.engine.Engine + SELECT df.*, t.title, t.priority, t.status as task_status, + t.project_id, t.due_date, t.estimated_minutes, + p.name as project_name, + d.name as domain_name, d.color as domain_color + FROM daily_focus df + JOIN tasks t ON df.task_id = t.id + LEFT JOIN projects p ON t.project_id = p.id + LEFT JOIN domains d ON t.domain_id = d.id + WHERE df.focus_date = $1 AND df.is_deleted = false + ORDER BY df.sort_order, df.created_at + +2026-03-01 14:01:28,628 INFO sqlalchemy.engine.Engine [generated in 0.00011s] ('2026-03-01',) +2026-03-01 14:01:28,631 INFO sqlalchemy.engine.Engine ROLLBACK +------------------------------ Captured log call ------------------------------- +INFO sqlalchemy.engine.Engine:base.py:2701 BEGIN (implicit) +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 2.994s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 2.994s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 2.994s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 2.995s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 2.995s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT df.*, t.title, t.priority, t.status as task_status, + t.project_id, t.due_date, t.estimated_minutes, + p.name as project_name, + d.name as domain_name, d.color as domain_color + FROM daily_focus df + JOIN tasks t ON df.task_id = t.id + LEFT JOIN projects p ON t.project_id = p.id + LEFT JOIN domains d ON t.domain_id = d.id + WHERE df.focus_date = $1 AND df.is_deleted = false + ORDER BY df.sort_order, df.created_at + +INFO sqlalchemy.engine.Engine:base.py:1846 [generated in 0.00011s] ('2026-03-01',) +INFO sqlalchemy.engine.Engine:base.py:2704 ROLLBACK +________________ test_get_no_params_returns_200[GET /capture/] _________________ + + Exception Group Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 76, in collapse_excgroups + | yield + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 186, in __call__ + | async with anyio.create_task_group() as task_group: + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 783, in __aexit__ + | raise BaseExceptionGroup( + | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) + +-+---------------- 1 ---------------- + | Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 353, in from_call + | result: TResult | None = func() + | ^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 245, in + | lambda: runtest_hook(item=item, **kwds), + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/logging.py", line 850, in pytest_runtest_call + | yield + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/capture.py", line 900, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/skipping.py", line 268, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 179, in pytest_runtest_call + | item.runtest() + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 469, in runtest + | super().runtest() + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 1720, in runtest + | self.ihook.pytest_pyfunc_call(pyfuncitem=self) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper + | return result.get_result() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_result.py", line 103, in get_result + | raise exc.with_traceback(tb) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper + | res = yield + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 166, in pytest_pyfunc_call + | result = testfunction(**testargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 716, in inner + | runner.run(coro, context=context) + | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run + | return self._loop.run_until_complete(task) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete + | return future.result() + | ^^^^^^^^^^^^^^^ + | File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + | r = await client.get(url, follow_redirects=True) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + | return await self.request( + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + | return await self.send(request, auth=auth, follow_redirects=follow_redirects) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + | response = await self._send_handling_auth( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + | response = await self._send_handling_redirects( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + | response = await self._send_single_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + | response = await transport.handle_async_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + | await super().__call__(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + | await self.app(scope, receive, _send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + | with collapse_excgroups(): + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + | self.gen.throw(value) + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + | response = await self.dispatch_func(request, call_next) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/main.py", line 79, in add_request_context + | response = await call_next(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + | raise app_exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + | await self.app(scope, receive_or_disconnect, send_no_error) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + | await route.handle(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + | await wrap_app_handling_exceptions(app, request)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + | response = await f(request) + | ^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + | raw_response = await run_endpoint_function( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + | return await dependant.call(**values) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/routers/capture.py", line 20, in list_capture + | sidebar = await get_sidebar_data(db) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/core/sidebar.py", line 14, in get_sidebar_data + | result = await db.execute(text(""" + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + | result = await greenlet_spawn( + | ^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + | result = context.throw(*sys.exc_info()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + | return self._execute_internal( + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + | conn = self._connection_for_bind(bind) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + | return trans._connection_for_bind(engine, execution_options) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "", line 2, in _connection_for_bind + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + | ret_value = fn(self, *arg, **kw) + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + | conn = bind.connect() + | ^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + | return self._connection_cls(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + | self._dbapi_connection = engine.raw_connection() + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + | return self.pool.connect() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + | return _ConnectionFairy._checkout(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + | with util.safe_reraise(): + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + | raise exc_value.with_traceback(exc_tb) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + | result = pool._dialect._do_ping_w_event( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + | return self.do_ping(dbapi_connection) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + | dbapi_connection.ping() + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + | self._handle_exception(error) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + | raise error + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + | _ = self.await_(self._async_ping()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + | value = await result + | ^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + | await tr.start() + | File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + | await self._connection.execute(query) + | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + | result = await self._protocol.query(query, timeout) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "asyncpg/protocol/protocol.pyx", line 375, in query + | RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +------------------------------------ + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + return await self.request( + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + response = await self._send_handling_auth( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + response = await self._send_handling_redirects( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + await self.app(scope, receive, _send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + self.gen.throw(value) + File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/main.py", line 79, in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + raise app_exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + await self.app(scope, receive_or_disconnect, send_no_error) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + await route.handle(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + response = await f(request) + ^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/routers/capture.py", line 20, in list_capture + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/core/sidebar.py", line 14, in get_sidebar_data + result = await db.execute(text(""" + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + result = await greenlet_spawn( + ^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + return self._execute_internal( + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 2, in _connection_for_bind + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + raise exc_value.with_traceback(exc_tb) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + result = pool._dialect._do_ping_w_event( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + dbapi_connection.ping() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + self._handle_exception(error) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + raise error + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + await tr.start() + File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + await self._connection.execute(query) + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "asyncpg/protocol/protocol.pyx", line 375, in query +RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +During handling of the above exception, another exception occurred: +tests/test_smoke_dynamic.py:35: in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1768: in get + return await self.request( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1540: in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1629: in send + response = await self._send_handling_auth( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1657: in _send_handling_auth + response = await self._send_handling_redirects( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1694: in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1730: in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py:170: in handle_async_request + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/fastapi/applications.py:1054: in __call__ + await super().__call__(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/applications.py:113: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:187: in __call__ + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:165: in __call__ + await self.app(scope, receive, _send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:185: in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/contextlib.py:158: in __exit__ + self.gen.throw(value) +/usr/local/lib/python3.12/site-packages/starlette/_utils.py:82: in collapse_excgroups + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:187: in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +main.py:79: in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:163: in call_next + raise app_exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149: in coro + await self.app(scope, receive_or_disconnect, send_no_error) +/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py:62: in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:715: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:735: in app + await route.handle(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:288: in handle + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:76: in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:73: in app + response = await f(request) + ^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:301: in app + raw_response = await run_endpoint_function( +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:212: in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +routers/capture.py:20: in list_capture + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +core/sidebar.py:14: in get_sidebar_data + result = await db.execute(text(""" +/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py:461: in execute + result = await greenlet_spawn( +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2362: in execute + return self._execute_internal( +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2237: in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2106: in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +:2: in _connection_for_bind + ??? +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py:139: in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:1189: in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3278: in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:146: in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3302: in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:449: in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1362: in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py:146: in __exit__ + raise exc_value.with_traceback(exc_tb) +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1300: in _checkout + result = pool._dialect._do_ping_w_event( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py:716: in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:1150: in do_ping + dbapi_connection.ping() +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:801: in ping + self._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:782: in _handle_exception + raise error +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:799: in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn + value = await result + ^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:808: in _async_ping + await tr.start() +/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py:146: in start + await self._connection.execute(query) +/usr/local/lib/python3.12/site-packages/asyncpg/connection.py:349: in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +asyncpg/protocol/protocol.pyx:375: in query + ??? +E RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +------------------------------ Captured log call ------------------------------- +ERROR sqlalchemy.pool.impl.AsyncAdaptedQueuePool:base.py:378 Exception terminating connection > +Traceback (most recent call last): + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection + self._dialect.do_terminate(connection) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1117, in do_terminate + dbapi_connection.terminate() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 895, in terminate + self.await_(self._connection.close(timeout=2)) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1504, in close + await self._protocol.close(timeout) + File "asyncpg/protocol/protocol.pyx", line 627, in close + File "asyncpg/protocol/protocol.pyx", line 660, in asyncpg.protocol.protocol.BaseProtocol._request_cancel + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1673, in _cancel_current_command + self._cancellations.add(self._loop.create_task(self._cancel(waiter))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 455, in create_task + self._check_closed() + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 545, in _check_closed + raise RuntimeError('Event loop is closed') +RuntimeError: Event loop is closed +_____________ test_get_no_params_returns_200[GET /contacts/create] _____________ + + Exception Group Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 76, in collapse_excgroups + | yield + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 186, in __call__ + | async with anyio.create_task_group() as task_group: + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 783, in __aexit__ + | raise BaseExceptionGroup( + | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) + +-+---------------- 1 ---------------- + | Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 353, in from_call + | result: TResult | None = func() + | ^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 245, in + | lambda: runtest_hook(item=item, **kwds), + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/logging.py", line 850, in pytest_runtest_call + | yield + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/capture.py", line 900, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/skipping.py", line 268, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 179, in pytest_runtest_call + | item.runtest() + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 469, in runtest + | super().runtest() + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 1720, in runtest + | self.ihook.pytest_pyfunc_call(pyfuncitem=self) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper + | return result.get_result() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_result.py", line 103, in get_result + | raise exc.with_traceback(tb) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper + | res = yield + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 166, in pytest_pyfunc_call + | result = testfunction(**testargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 716, in inner + | runner.run(coro, context=context) + | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run + | return self._loop.run_until_complete(task) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete + | return future.result() + | ^^^^^^^^^^^^^^^ + | File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + | r = await client.get(url, follow_redirects=True) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + | return await self.request( + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + | return await self.send(request, auth=auth, follow_redirects=follow_redirects) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + | response = await self._send_handling_auth( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + | response = await self._send_handling_redirects( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + | response = await self._send_single_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + | response = await transport.handle_async_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + | await super().__call__(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + | await self.app(scope, receive, _send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + | with collapse_excgroups(): + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + | self.gen.throw(value) + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + | response = await self.dispatch_func(request, call_next) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/main.py", line 79, in add_request_context + | response = await call_next(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + | raise app_exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + | await self.app(scope, receive_or_disconnect, send_no_error) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + | await route.handle(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + | await wrap_app_handling_exceptions(app, request)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + | response = await f(request) + | ^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + | raw_response = await run_endpoint_function( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + | return await dependant.call(**values) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/routers/contacts.py", line 34, in create_form + | sidebar = await get_sidebar_data(db) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/core/sidebar.py", line 14, in get_sidebar_data + | result = await db.execute(text(""" + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + | result = await greenlet_spawn( + | ^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + | result = context.throw(*sys.exc_info()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + | return self._execute_internal( + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + | conn = self._connection_for_bind(bind) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + | return trans._connection_for_bind(engine, execution_options) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "", line 2, in _connection_for_bind + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + | ret_value = fn(self, *arg, **kw) + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + | conn = bind.connect() + | ^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + | return self._connection_cls(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + | self._dbapi_connection = engine.raw_connection() + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + | return self.pool.connect() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + | return _ConnectionFairy._checkout(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + | with util.safe_reraise(): + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + | raise exc_value.with_traceback(exc_tb) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + | result = pool._dialect._do_ping_w_event( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + | return self.do_ping(dbapi_connection) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + | dbapi_connection.ping() + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + | self._handle_exception(error) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + | raise error + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + | _ = self.await_(self._async_ping()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + | value = await result + | ^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + | await tr.start() + | File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + | await self._connection.execute(query) + | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + | result = await self._protocol.query(query, timeout) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "asyncpg/protocol/protocol.pyx", line 375, in query + | RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +------------------------------------ + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + return await self.request( + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + response = await self._send_handling_auth( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + response = await self._send_handling_redirects( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + await self.app(scope, receive, _send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + self.gen.throw(value) + File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/main.py", line 79, in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + raise app_exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + await self.app(scope, receive_or_disconnect, send_no_error) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + await route.handle(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + response = await f(request) + ^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/routers/contacts.py", line 34, in create_form + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/core/sidebar.py", line 14, in get_sidebar_data + result = await db.execute(text(""" + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + result = await greenlet_spawn( + ^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + return self._execute_internal( + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 2, in _connection_for_bind + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + raise exc_value.with_traceback(exc_tb) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + result = pool._dialect._do_ping_w_event( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + dbapi_connection.ping() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + self._handle_exception(error) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + raise error + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + await tr.start() + File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + await self._connection.execute(query) + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "asyncpg/protocol/protocol.pyx", line 375, in query +RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +During handling of the above exception, another exception occurred: +tests/test_smoke_dynamic.py:35: in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1768: in get + return await self.request( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1540: in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1629: in send + response = await self._send_handling_auth( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1657: in _send_handling_auth + response = await self._send_handling_redirects( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1694: in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1730: in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py:170: in handle_async_request + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/fastapi/applications.py:1054: in __call__ + await super().__call__(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/applications.py:113: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:187: in __call__ + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:165: in __call__ + await self.app(scope, receive, _send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:185: in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/contextlib.py:158: in __exit__ + self.gen.throw(value) +/usr/local/lib/python3.12/site-packages/starlette/_utils.py:82: in collapse_excgroups + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:187: in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +main.py:79: in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:163: in call_next + raise app_exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149: in coro + await self.app(scope, receive_or_disconnect, send_no_error) +/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py:62: in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:715: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:735: in app + await route.handle(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:288: in handle + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:76: in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:73: in app + response = await f(request) + ^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:301: in app + raw_response = await run_endpoint_function( +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:212: in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +routers/contacts.py:34: in create_form + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +core/sidebar.py:14: in get_sidebar_data + result = await db.execute(text(""" +/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py:461: in execute + result = await greenlet_spawn( +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2362: in execute + return self._execute_internal( +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2237: in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2106: in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +:2: in _connection_for_bind + ??? +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py:139: in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:1189: in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3278: in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:146: in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3302: in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:449: in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1362: in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py:146: in __exit__ + raise exc_value.with_traceback(exc_tb) +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1300: in _checkout + result = pool._dialect._do_ping_w_event( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py:716: in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:1150: in do_ping + dbapi_connection.ping() +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:801: in ping + self._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:782: in _handle_exception + raise error +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:799: in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn + value = await result + ^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:808: in _async_ping + await tr.start() +/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py:146: in start + await self._connection.execute(query) +/usr/local/lib/python3.12/site-packages/asyncpg/connection.py:349: in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +asyncpg/protocol/protocol.pyx:375: in query + ??? +E RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +------------------------------ Captured log call ------------------------------- +ERROR sqlalchemy.pool.impl.AsyncAdaptedQueuePool:base.py:378 Exception terminating connection > +Traceback (most recent call last): + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection + self._dialect.do_terminate(connection) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1117, in do_terminate + dbapi_connection.terminate() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 895, in terminate + self.await_(self._connection.close(timeout=2)) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1504, in close + await self._protocol.close(timeout) + File "asyncpg/protocol/protocol.pyx", line 627, in close + File "asyncpg/protocol/protocol.pyx", line 660, in asyncpg.protocol.protocol.BaseProtocol._request_cancel + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1673, in _cancel_current_command + self._cancellations.add(self._loop.create_task(self._cancel(waiter))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 455, in create_task + self._check_closed() + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 545, in _check_closed + raise RuntimeError('Event loop is closed') +RuntimeError: Event loop is closed +_________________ test_get_no_params_returns_200[GET /search/] _________________ + + Exception Group Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 76, in collapse_excgroups + | yield + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 186, in __call__ + | async with anyio.create_task_group() as task_group: + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 783, in __aexit__ + | raise BaseExceptionGroup( + | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) + +-+---------------- 1 ---------------- + | Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 353, in from_call + | result: TResult | None = func() + | ^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 245, in + | lambda: runtest_hook(item=item, **kwds), + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/logging.py", line 850, in pytest_runtest_call + | yield + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/capture.py", line 900, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/skipping.py", line 268, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 179, in pytest_runtest_call + | item.runtest() + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 469, in runtest + | super().runtest() + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 1720, in runtest + | self.ihook.pytest_pyfunc_call(pyfuncitem=self) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper + | return result.get_result() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_result.py", line 103, in get_result + | raise exc.with_traceback(tb) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper + | res = yield + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 166, in pytest_pyfunc_call + | result = testfunction(**testargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 716, in inner + | runner.run(coro, context=context) + | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run + | return self._loop.run_until_complete(task) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete + | return future.result() + | ^^^^^^^^^^^^^^^ + | File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + | r = await client.get(url, follow_redirects=True) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + | return await self.request( + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + | return await self.send(request, auth=auth, follow_redirects=follow_redirects) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + | response = await self._send_handling_auth( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + | response = await self._send_handling_redirects( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + | response = await self._send_single_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + | response = await transport.handle_async_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + | await super().__call__(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + | await self.app(scope, receive, _send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + | with collapse_excgroups(): + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + | self.gen.throw(value) + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + | response = await self.dispatch_func(request, call_next) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/main.py", line 79, in add_request_context + | response = await call_next(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + | raise app_exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + | await self.app(scope, receive_or_disconnect, send_no_error) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + | await route.handle(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + | await wrap_app_handling_exceptions(app, request)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + | response = await f(request) + | ^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + | raw_response = await run_endpoint_function( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + | return await dependant.call(**values) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/routers/search.py", line 220, in search_page + | sidebar = await get_sidebar_data(db) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/core/sidebar.py", line 14, in get_sidebar_data + | result = await db.execute(text(""" + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + | result = await greenlet_spawn( + | ^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + | result = context.throw(*sys.exc_info()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + | return self._execute_internal( + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + | conn = self._connection_for_bind(bind) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + | return trans._connection_for_bind(engine, execution_options) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "", line 2, in _connection_for_bind + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + | ret_value = fn(self, *arg, **kw) + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + | conn = bind.connect() + | ^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + | return self._connection_cls(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + | self._dbapi_connection = engine.raw_connection() + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + | return self.pool.connect() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + | return _ConnectionFairy._checkout(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + | with util.safe_reraise(): + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + | raise exc_value.with_traceback(exc_tb) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + | result = pool._dialect._do_ping_w_event( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + | return self.do_ping(dbapi_connection) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + | dbapi_connection.ping() + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + | self._handle_exception(error) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + | raise error + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + | _ = self.await_(self._async_ping()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + | value = await result + | ^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + | await tr.start() + | File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + | await self._connection.execute(query) + | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + | result = await self._protocol.query(query, timeout) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "asyncpg/protocol/protocol.pyx", line 375, in query + | RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +------------------------------------ + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + return await self.request( + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + response = await self._send_handling_auth( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + response = await self._send_handling_redirects( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + await self.app(scope, receive, _send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + self.gen.throw(value) + File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/main.py", line 79, in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + raise app_exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + await self.app(scope, receive_or_disconnect, send_no_error) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + await route.handle(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + response = await f(request) + ^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/routers/search.py", line 220, in search_page + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/core/sidebar.py", line 14, in get_sidebar_data + result = await db.execute(text(""" + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + result = await greenlet_spawn( + ^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + return self._execute_internal( + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 2, in _connection_for_bind + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + raise exc_value.with_traceback(exc_tb) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + result = pool._dialect._do_ping_w_event( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + dbapi_connection.ping() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + self._handle_exception(error) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + raise error + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + await tr.start() + File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + await self._connection.execute(query) + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "asyncpg/protocol/protocol.pyx", line 375, in query +RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +During handling of the above exception, another exception occurred: +tests/test_smoke_dynamic.py:35: in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1768: in get + return await self.request( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1540: in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1629: in send + response = await self._send_handling_auth( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1657: in _send_handling_auth + response = await self._send_handling_redirects( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1694: in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1730: in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py:170: in handle_async_request + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/fastapi/applications.py:1054: in __call__ + await super().__call__(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/applications.py:113: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:187: in __call__ + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:165: in __call__ + await self.app(scope, receive, _send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:185: in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/contextlib.py:158: in __exit__ + self.gen.throw(value) +/usr/local/lib/python3.12/site-packages/starlette/_utils.py:82: in collapse_excgroups + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:187: in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +main.py:79: in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:163: in call_next + raise app_exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149: in coro + await self.app(scope, receive_or_disconnect, send_no_error) +/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py:62: in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:715: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:735: in app + await route.handle(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:288: in handle + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:76: in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:73: in app + response = await f(request) + ^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:301: in app + raw_response = await run_endpoint_function( +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:212: in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +routers/search.py:220: in search_page + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +core/sidebar.py:14: in get_sidebar_data + result = await db.execute(text(""" +/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py:461: in execute + result = await greenlet_spawn( +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2362: in execute + return self._execute_internal( +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2237: in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2106: in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +:2: in _connection_for_bind + ??? +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py:139: in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:1189: in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3278: in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:146: in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3302: in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:449: in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1362: in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py:146: in __exit__ + raise exc_value.with_traceback(exc_tb) +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1300: in _checkout + result = pool._dialect._do_ping_w_event( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py:716: in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:1150: in do_ping + dbapi_connection.ping() +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:801: in ping + self._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:782: in _handle_exception + raise error +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:799: in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn + value = await result + ^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:808: in _async_ping + await tr.start() +/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py:146: in start + await self._connection.execute(query) +/usr/local/lib/python3.12/site-packages/asyncpg/connection.py:349: in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +asyncpg/protocol/protocol.pyx:375: in query + ??? +E RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +------------------------------ Captured log call ------------------------------- +ERROR sqlalchemy.pool.impl.AsyncAdaptedQueuePool:base.py:378 Exception terminating connection > +Traceback (most recent call last): + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection + self._dialect.do_terminate(connection) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1117, in do_terminate + dbapi_connection.terminate() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 895, in terminate + self.await_(self._connection.close(timeout=2)) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1504, in close + await self._protocol.close(timeout) + File "asyncpg/protocol/protocol.pyx", line 627, in close + File "asyncpg/protocol/protocol.pyx", line 660, in asyncpg.protocol.protocol.BaseProtocol._request_cancel + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1673, in _cancel_current_command + self._cancellations.add(self._loop.create_task(self._cancel(waiter))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 455, in create_task + self._check_closed() + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 545, in _check_closed + raise RuntimeError('Event loop is closed') +RuntimeError: Event loop is closed +_________________ test_get_no_params_returns_200[GET /lists/] __________________ + + Exception Group Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 76, in collapse_excgroups + | yield + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 186, in __call__ + | async with anyio.create_task_group() as task_group: + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 783, in __aexit__ + | raise BaseExceptionGroup( + | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) + +-+---------------- 1 ---------------- + | Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 353, in from_call + | result: TResult | None = func() + | ^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 245, in + | lambda: runtest_hook(item=item, **kwds), + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/logging.py", line 850, in pytest_runtest_call + | yield + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/capture.py", line 900, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/skipping.py", line 268, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 179, in pytest_runtest_call + | item.runtest() + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 469, in runtest + | super().runtest() + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 1720, in runtest + | self.ihook.pytest_pyfunc_call(pyfuncitem=self) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper + | return result.get_result() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_result.py", line 103, in get_result + | raise exc.with_traceback(tb) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper + | res = yield + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 166, in pytest_pyfunc_call + | result = testfunction(**testargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 716, in inner + | runner.run(coro, context=context) + | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run + | return self._loop.run_until_complete(task) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete + | return future.result() + | ^^^^^^^^^^^^^^^ + | File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + | r = await client.get(url, follow_redirects=True) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + | return await self.request( + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + | return await self.send(request, auth=auth, follow_redirects=follow_redirects) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + | response = await self._send_handling_auth( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + | response = await self._send_handling_redirects( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + | response = await self._send_single_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + | response = await transport.handle_async_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + | await super().__call__(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + | await self.app(scope, receive, _send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + | with collapse_excgroups(): + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + | self.gen.throw(value) + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + | response = await self.dispatch_func(request, call_next) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/main.py", line 79, in add_request_context + | response = await call_next(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + | raise app_exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + | await self.app(scope, receive_or_disconnect, send_no_error) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + | await route.handle(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + | await wrap_app_handling_exceptions(app, request)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + | response = await f(request) + | ^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + | raw_response = await run_endpoint_function( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + | return await dependant.call(**values) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/routers/lists.py", line 26, in list_lists + | sidebar = await get_sidebar_data(db) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/core/sidebar.py", line 14, in get_sidebar_data + | result = await db.execute(text(""" + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + | result = await greenlet_spawn( + | ^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + | result = context.throw(*sys.exc_info()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + | return self._execute_internal( + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + | conn = self._connection_for_bind(bind) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + | return trans._connection_for_bind(engine, execution_options) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "", line 2, in _connection_for_bind + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + | ret_value = fn(self, *arg, **kw) + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + | conn = bind.connect() + | ^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + | return self._connection_cls(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + | self._dbapi_connection = engine.raw_connection() + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + | return self.pool.connect() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + | return _ConnectionFairy._checkout(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + | with util.safe_reraise(): + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + | raise exc_value.with_traceback(exc_tb) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + | result = pool._dialect._do_ping_w_event( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + | return self.do_ping(dbapi_connection) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + | dbapi_connection.ping() + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + | self._handle_exception(error) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + | raise error + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + | _ = self.await_(self._async_ping()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + | value = await result + | ^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + | await tr.start() + | File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + | await self._connection.execute(query) + | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + | result = await self._protocol.query(query, timeout) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "asyncpg/protocol/protocol.pyx", line 375, in query + | RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +------------------------------------ + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + return await self.request( + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + response = await self._send_handling_auth( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + response = await self._send_handling_redirects( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + await self.app(scope, receive, _send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + self.gen.throw(value) + File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/main.py", line 79, in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + raise app_exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + await self.app(scope, receive_or_disconnect, send_no_error) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + await route.handle(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + response = await f(request) + ^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/routers/lists.py", line 26, in list_lists + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/core/sidebar.py", line 14, in get_sidebar_data + result = await db.execute(text(""" + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + result = await greenlet_spawn( + ^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + return self._execute_internal( + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 2, in _connection_for_bind + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + raise exc_value.with_traceback(exc_tb) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + result = pool._dialect._do_ping_w_event( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + dbapi_connection.ping() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + self._handle_exception(error) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + raise error + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + await tr.start() + File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + await self._connection.execute(query) + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "asyncpg/protocol/protocol.pyx", line 375, in query +RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +During handling of the above exception, another exception occurred: +tests/test_smoke_dynamic.py:35: in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1768: in get + return await self.request( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1540: in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1629: in send + response = await self._send_handling_auth( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1657: in _send_handling_auth + response = await self._send_handling_redirects( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1694: in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1730: in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py:170: in handle_async_request + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/fastapi/applications.py:1054: in __call__ + await super().__call__(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/applications.py:113: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:187: in __call__ + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:165: in __call__ + await self.app(scope, receive, _send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:185: in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/contextlib.py:158: in __exit__ + self.gen.throw(value) +/usr/local/lib/python3.12/site-packages/starlette/_utils.py:82: in collapse_excgroups + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:187: in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +main.py:79: in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:163: in call_next + raise app_exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149: in coro + await self.app(scope, receive_or_disconnect, send_no_error) +/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py:62: in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:715: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:735: in app + await route.handle(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:288: in handle + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:76: in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:73: in app + response = await f(request) + ^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:301: in app + raw_response = await run_endpoint_function( +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:212: in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +routers/lists.py:26: in list_lists + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +core/sidebar.py:14: in get_sidebar_data + result = await db.execute(text(""" +/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py:461: in execute + result = await greenlet_spawn( +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2362: in execute + return self._execute_internal( +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2237: in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2106: in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +:2: in _connection_for_bind + ??? +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py:139: in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:1189: in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3278: in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:146: in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3302: in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:449: in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1362: in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py:146: in __exit__ + raise exc_value.with_traceback(exc_tb) +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1300: in _checkout + result = pool._dialect._do_ping_w_event( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py:716: in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:1150: in do_ping + dbapi_connection.ping() +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:801: in ping + self._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:782: in _handle_exception + raise error +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:799: in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn + value = await result + ^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:808: in _async_ping + await tr.start() +/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py:146: in start + await self._connection.execute(query) +/usr/local/lib/python3.12/site-packages/asyncpg/connection.py:349: in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +asyncpg/protocol/protocol.pyx:375: in query + ??? +E RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +------------------------------ Captured log call ------------------------------- +ERROR sqlalchemy.pool.impl.AsyncAdaptedQueuePool:base.py:378 Exception terminating connection > +Traceback (most recent call last): + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection + self._dialect.do_terminate(connection) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1117, in do_terminate + dbapi_connection.terminate() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 895, in terminate + self.await_(self._connection.close(timeout=2)) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1504, in close + await self._protocol.close(timeout) + File "asyncpg/protocol/protocol.pyx", line 627, in close + File "asyncpg/protocol/protocol.pyx", line 660, in asyncpg.protocol.protocol.BaseProtocol._request_cancel + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1673, in _cancel_current_command + self._cancellations.add(self._loop.create_task(self._cancel(waiter))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 455, in create_task + self._check_closed() + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 545, in _check_closed + raise RuntimeError('Event loop is closed') +RuntimeError: Event loop is closed +_________________ test_get_no_params_returns_200[GET /files/] __________________ + + Exception Group Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 76, in collapse_excgroups + | yield + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 186, in __call__ + | async with anyio.create_task_group() as task_group: + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 783, in __aexit__ + | raise BaseExceptionGroup( + | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) + +-+---------------- 1 ---------------- + | Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 353, in from_call + | result: TResult | None = func() + | ^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 245, in + | lambda: runtest_hook(item=item, **kwds), + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/logging.py", line 850, in pytest_runtest_call + | yield + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/capture.py", line 900, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/skipping.py", line 268, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 179, in pytest_runtest_call + | item.runtest() + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 469, in runtest + | super().runtest() + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 1720, in runtest + | self.ihook.pytest_pyfunc_call(pyfuncitem=self) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper + | return result.get_result() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_result.py", line 103, in get_result + | raise exc.with_traceback(tb) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper + | res = yield + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 166, in pytest_pyfunc_call + | result = testfunction(**testargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 716, in inner + | runner.run(coro, context=context) + | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run + | return self._loop.run_until_complete(task) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete + | return future.result() + | ^^^^^^^^^^^^^^^ + | File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + | r = await client.get(url, follow_redirects=True) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + | return await self.request( + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + | return await self.send(request, auth=auth, follow_redirects=follow_redirects) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + | response = await self._send_handling_auth( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + | response = await self._send_handling_redirects( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + | response = await self._send_single_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + | response = await transport.handle_async_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + | await super().__call__(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + | await self.app(scope, receive, _send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + | with collapse_excgroups(): + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + | self.gen.throw(value) + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + | response = await self.dispatch_func(request, call_next) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/main.py", line 79, in add_request_context + | response = await call_next(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + | raise app_exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + | await self.app(scope, receive_or_disconnect, send_no_error) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + | await route.handle(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + | await wrap_app_handling_exceptions(app, request)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + | response = await f(request) + | ^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + | raw_response = await run_endpoint_function( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + | return await dependant.call(**values) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/routers/files.py", line 40, in list_files + | sidebar = await get_sidebar_data(db) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/core/sidebar.py", line 14, in get_sidebar_data + | result = await db.execute(text(""" + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + | result = await greenlet_spawn( + | ^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + | result = context.throw(*sys.exc_info()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + | return self._execute_internal( + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + | conn = self._connection_for_bind(bind) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + | return trans._connection_for_bind(engine, execution_options) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "", line 2, in _connection_for_bind + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + | ret_value = fn(self, *arg, **kw) + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + | conn = bind.connect() + | ^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + | return self._connection_cls(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + | self._dbapi_connection = engine.raw_connection() + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + | return self.pool.connect() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + | return _ConnectionFairy._checkout(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + | with util.safe_reraise(): + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + | raise exc_value.with_traceback(exc_tb) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + | result = pool._dialect._do_ping_w_event( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + | return self.do_ping(dbapi_connection) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + | dbapi_connection.ping() + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + | self._handle_exception(error) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + | raise error + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + | _ = self.await_(self._async_ping()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + | value = await result + | ^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + | await tr.start() + | File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + | await self._connection.execute(query) + | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + | result = await self._protocol.query(query, timeout) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "asyncpg/protocol/protocol.pyx", line 375, in query + | RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +------------------------------------ + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + return await self.request( + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + response = await self._send_handling_auth( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + response = await self._send_handling_redirects( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + await self.app(scope, receive, _send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + self.gen.throw(value) + File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/main.py", line 79, in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + raise app_exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + await self.app(scope, receive_or_disconnect, send_no_error) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + await route.handle(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + response = await f(request) + ^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/routers/files.py", line 40, in list_files + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/core/sidebar.py", line 14, in get_sidebar_data + result = await db.execute(text(""" + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + result = await greenlet_spawn( + ^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + return self._execute_internal( + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 2, in _connection_for_bind + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + raise exc_value.with_traceback(exc_tb) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + result = pool._dialect._do_ping_w_event( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + dbapi_connection.ping() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + self._handle_exception(error) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + raise error + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + await tr.start() + File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + await self._connection.execute(query) + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "asyncpg/protocol/protocol.pyx", line 375, in query +RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +During handling of the above exception, another exception occurred: +tests/test_smoke_dynamic.py:35: in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1768: in get + return await self.request( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1540: in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1629: in send + response = await self._send_handling_auth( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1657: in _send_handling_auth + response = await self._send_handling_redirects( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1694: in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1730: in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py:170: in handle_async_request + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/fastapi/applications.py:1054: in __call__ + await super().__call__(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/applications.py:113: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:187: in __call__ + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:165: in __call__ + await self.app(scope, receive, _send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:185: in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/contextlib.py:158: in __exit__ + self.gen.throw(value) +/usr/local/lib/python3.12/site-packages/starlette/_utils.py:82: in collapse_excgroups + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:187: in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +main.py:79: in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:163: in call_next + raise app_exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149: in coro + await self.app(scope, receive_or_disconnect, send_no_error) +/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py:62: in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:715: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:735: in app + await route.handle(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:288: in handle + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:76: in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:73: in app + response = await f(request) + ^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:301: in app + raw_response = await run_endpoint_function( +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:212: in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +routers/files.py:40: in list_files + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +core/sidebar.py:14: in get_sidebar_data + result = await db.execute(text(""" +/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py:461: in execute + result = await greenlet_spawn( +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2362: in execute + return self._execute_internal( +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2237: in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2106: in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +:2: in _connection_for_bind + ??? +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py:139: in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:1189: in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3278: in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:146: in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3302: in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:449: in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1362: in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py:146: in __exit__ + raise exc_value.with_traceback(exc_tb) +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1300: in _checkout + result = pool._dialect._do_ping_w_event( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py:716: in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:1150: in do_ping + dbapi_connection.ping() +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:801: in ping + self._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:782: in _handle_exception + raise error +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:799: in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn + value = await result + ^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:808: in _async_ping + await tr.start() +/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py:146: in start + await self._connection.execute(query) +/usr/local/lib/python3.12/site-packages/asyncpg/connection.py:349: in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +asyncpg/protocol/protocol.pyx:375: in query + ??? +E RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +------------------------------ Captured log call ------------------------------- +ERROR sqlalchemy.pool.impl.AsyncAdaptedQueuePool:base.py:378 Exception terminating connection > +Traceback (most recent call last): + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection + self._dialect.do_terminate(connection) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1117, in do_terminate + dbapi_connection.terminate() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 895, in terminate + self.await_(self._connection.close(timeout=2)) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1504, in close + await self._protocol.close(timeout) + File "asyncpg/protocol/protocol.pyx", line 627, in close + File "asyncpg/protocol/protocol.pyx", line 660, in asyncpg.protocol.protocol.BaseProtocol._request_cancel + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1673, in _cancel_current_command + self._cancellations.add(self._loop.create_task(self._cancel(waiter))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 455, in create_task + self._check_closed() + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 545, in _check_closed + raise RuntimeError('Event loop is closed') +RuntimeError: Event loop is closed +________________ test_get_no_params_returns_200[GET /meetings/] ________________ + + Exception Group Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 76, in collapse_excgroups + | yield + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 186, in __call__ + | async with anyio.create_task_group() as task_group: + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 783, in __aexit__ + | raise BaseExceptionGroup( + | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) + +-+---------------- 1 ---------------- + | Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 353, in from_call + | result: TResult | None = func() + | ^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 245, in + | lambda: runtest_hook(item=item, **kwds), + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/logging.py", line 850, in pytest_runtest_call + | yield + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/capture.py", line 900, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/skipping.py", line 268, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 179, in pytest_runtest_call + | item.runtest() + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 469, in runtest + | super().runtest() + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 1720, in runtest + | self.ihook.pytest_pyfunc_call(pyfuncitem=self) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper + | return result.get_result() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_result.py", line 103, in get_result + | raise exc.with_traceback(tb) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper + | res = yield + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 166, in pytest_pyfunc_call + | result = testfunction(**testargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 716, in inner + | runner.run(coro, context=context) + | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run + | return self._loop.run_until_complete(task) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete + | return future.result() + | ^^^^^^^^^^^^^^^ + | File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + | r = await client.get(url, follow_redirects=True) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + | return await self.request( + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + | return await self.send(request, auth=auth, follow_redirects=follow_redirects) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + | response = await self._send_handling_auth( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + | response = await self._send_handling_redirects( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + | response = await self._send_single_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + | response = await transport.handle_async_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + | await super().__call__(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + | await self.app(scope, receive, _send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + | with collapse_excgroups(): + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + | self.gen.throw(value) + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + | response = await self.dispatch_func(request, call_next) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/main.py", line 79, in add_request_context + | response = await call_next(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + | raise app_exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + | await self.app(scope, receive_or_disconnect, send_no_error) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + | await route.handle(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + | await wrap_app_handling_exceptions(app, request)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + | response = await f(request) + | ^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + | raw_response = await run_endpoint_function( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + | return await dependant.call(**values) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/routers/meetings.py", line 25, in list_meetings + | sidebar = await get_sidebar_data(db) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/core/sidebar.py", line 14, in get_sidebar_data + | result = await db.execute(text(""" + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + | result = await greenlet_spawn( + | ^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + | result = context.throw(*sys.exc_info()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + | return self._execute_internal( + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + | conn = self._connection_for_bind(bind) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + | return trans._connection_for_bind(engine, execution_options) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "", line 2, in _connection_for_bind + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + | ret_value = fn(self, *arg, **kw) + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + | conn = bind.connect() + | ^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + | return self._connection_cls(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + | self._dbapi_connection = engine.raw_connection() + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + | return self.pool.connect() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + | return _ConnectionFairy._checkout(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + | with util.safe_reraise(): + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + | raise exc_value.with_traceback(exc_tb) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + | result = pool._dialect._do_ping_w_event( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + | return self.do_ping(dbapi_connection) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + | dbapi_connection.ping() + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + | self._handle_exception(error) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + | raise error + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + | _ = self.await_(self._async_ping()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + | value = await result + | ^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + | await tr.start() + | File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + | await self._connection.execute(query) + | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + | result = await self._protocol.query(query, timeout) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "asyncpg/protocol/protocol.pyx", line 375, in query + | RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +------------------------------------ + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + return await self.request( + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + response = await self._send_handling_auth( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + response = await self._send_handling_redirects( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + await self.app(scope, receive, _send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + self.gen.throw(value) + File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/main.py", line 79, in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + raise app_exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + await self.app(scope, receive_or_disconnect, send_no_error) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + await route.handle(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + response = await f(request) + ^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/routers/meetings.py", line 25, in list_meetings + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/core/sidebar.py", line 14, in get_sidebar_data + result = await db.execute(text(""" + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + result = await greenlet_spawn( + ^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + return self._execute_internal( + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 2, in _connection_for_bind + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + raise exc_value.with_traceback(exc_tb) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + result = pool._dialect._do_ping_w_event( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + dbapi_connection.ping() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + self._handle_exception(error) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + raise error + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + await tr.start() + File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + await self._connection.execute(query) + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "asyncpg/protocol/protocol.pyx", line 375, in query +RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +During handling of the above exception, another exception occurred: +tests/test_smoke_dynamic.py:35: in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1768: in get + return await self.request( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1540: in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1629: in send + response = await self._send_handling_auth( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1657: in _send_handling_auth + response = await self._send_handling_redirects( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1694: in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1730: in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py:170: in handle_async_request + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/fastapi/applications.py:1054: in __call__ + await super().__call__(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/applications.py:113: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:187: in __call__ + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:165: in __call__ + await self.app(scope, receive, _send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:185: in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/contextlib.py:158: in __exit__ + self.gen.throw(value) +/usr/local/lib/python3.12/site-packages/starlette/_utils.py:82: in collapse_excgroups + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:187: in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +main.py:79: in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:163: in call_next + raise app_exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149: in coro + await self.app(scope, receive_or_disconnect, send_no_error) +/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py:62: in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:715: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:735: in app + await route.handle(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:288: in handle + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:76: in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:73: in app + response = await f(request) + ^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:301: in app + raw_response = await run_endpoint_function( +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:212: in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +routers/meetings.py:25: in list_meetings + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +core/sidebar.py:14: in get_sidebar_data + result = await db.execute(text(""" +/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py:461: in execute + result = await greenlet_spawn( +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2362: in execute + return self._execute_internal( +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2237: in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2106: in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +:2: in _connection_for_bind + ??? +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py:139: in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:1189: in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3278: in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:146: in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3302: in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:449: in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1362: in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py:146: in __exit__ + raise exc_value.with_traceback(exc_tb) +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1300: in _checkout + result = pool._dialect._do_ping_w_event( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py:716: in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:1150: in do_ping + dbapi_connection.ping() +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:801: in ping + self._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:782: in _handle_exception + raise error +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:799: in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn + value = await result + ^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:808: in _async_ping + await tr.start() +/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py:146: in start + await self._connection.execute(query) +/usr/local/lib/python3.12/site-packages/asyncpg/connection.py:349: in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +asyncpg/protocol/protocol.pyx:375: in query + ??? +E RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +------------------------------ Captured log call ------------------------------- +ERROR sqlalchemy.pool.impl.AsyncAdaptedQueuePool:base.py:378 Exception terminating connection > +Traceback (most recent call last): + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection + self._dialect.do_terminate(connection) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1117, in do_terminate + dbapi_connection.terminate() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 895, in terminate + self.await_(self._connection.close(timeout=2)) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1504, in close + await self._protocol.close(timeout) + File "asyncpg/protocol/protocol.pyx", line 627, in close + File "asyncpg/protocol/protocol.pyx", line 660, in asyncpg.protocol.protocol.BaseProtocol._request_cancel + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1673, in _cancel_current_command + self._cancellations.add(self._loop.create_task(self._cancel(waiter))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 455, in create_task + self._check_closed() + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 545, in _check_closed + raise RuntimeError('Event loop is closed') +RuntimeError: Event loop is closed +_______________ test_get_no_params_returns_200[GET /decisions/] ________________ + + Exception Group Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 76, in collapse_excgroups + | yield + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 186, in __call__ + | async with anyio.create_task_group() as task_group: + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 783, in __aexit__ + | raise BaseExceptionGroup( + | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) + +-+---------------- 1 ---------------- + | Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 353, in from_call + | result: TResult | None = func() + | ^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 245, in + | lambda: runtest_hook(item=item, **kwds), + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/logging.py", line 850, in pytest_runtest_call + | yield + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/capture.py", line 900, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/skipping.py", line 268, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 179, in pytest_runtest_call + | item.runtest() + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 469, in runtest + | super().runtest() + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 1720, in runtest + | self.ihook.pytest_pyfunc_call(pyfuncitem=self) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper + | return result.get_result() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_result.py", line 103, in get_result + | raise exc.with_traceback(tb) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper + | res = yield + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 166, in pytest_pyfunc_call + | result = testfunction(**testargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 716, in inner + | runner.run(coro, context=context) + | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run + | return self._loop.run_until_complete(task) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete + | return future.result() + | ^^^^^^^^^^^^^^^ + | File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + | r = await client.get(url, follow_redirects=True) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + | return await self.request( + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + | return await self.send(request, auth=auth, follow_redirects=follow_redirects) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + | response = await self._send_handling_auth( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + | response = await self._send_handling_redirects( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + | response = await self._send_single_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + | response = await transport.handle_async_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + | await super().__call__(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + | await self.app(scope, receive, _send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + | with collapse_excgroups(): + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + | self.gen.throw(value) + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + | response = await self.dispatch_func(request, call_next) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/main.py", line 79, in add_request_context + | response = await call_next(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + | raise app_exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + | await self.app(scope, receive_or_disconnect, send_no_error) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + | await route.handle(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + | await wrap_app_handling_exceptions(app, request)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + | response = await f(request) + | ^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + | raw_response = await run_endpoint_function( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + | return await dependant.call(**values) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/routers/decisions.py", line 25, in list_decisions + | sidebar = await get_sidebar_data(db) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/core/sidebar.py", line 14, in get_sidebar_data + | result = await db.execute(text(""" + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + | result = await greenlet_spawn( + | ^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + | result = context.throw(*sys.exc_info()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + | return self._execute_internal( + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + | conn = self._connection_for_bind(bind) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + | return trans._connection_for_bind(engine, execution_options) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "", line 2, in _connection_for_bind + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + | ret_value = fn(self, *arg, **kw) + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + | conn = bind.connect() + | ^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + | return self._connection_cls(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + | self._dbapi_connection = engine.raw_connection() + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + | return self.pool.connect() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + | return _ConnectionFairy._checkout(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + | with util.safe_reraise(): + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + | raise exc_value.with_traceback(exc_tb) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + | result = pool._dialect._do_ping_w_event( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + | return self.do_ping(dbapi_connection) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + | dbapi_connection.ping() + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + | self._handle_exception(error) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + | raise error + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + | _ = self.await_(self._async_ping()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + | value = await result + | ^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + | await tr.start() + | File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + | await self._connection.execute(query) + | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + | result = await self._protocol.query(query, timeout) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "asyncpg/protocol/protocol.pyx", line 375, in query + | RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +------------------------------------ + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + return await self.request( + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + response = await self._send_handling_auth( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + response = await self._send_handling_redirects( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + await self.app(scope, receive, _send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + self.gen.throw(value) + File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/main.py", line 79, in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + raise app_exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + await self.app(scope, receive_or_disconnect, send_no_error) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + await route.handle(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + response = await f(request) + ^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/routers/decisions.py", line 25, in list_decisions + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/core/sidebar.py", line 14, in get_sidebar_data + result = await db.execute(text(""" + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + result = await greenlet_spawn( + ^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + return self._execute_internal( + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 2, in _connection_for_bind + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + raise exc_value.with_traceback(exc_tb) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + result = pool._dialect._do_ping_w_event( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + dbapi_connection.ping() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + self._handle_exception(error) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + raise error + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + await tr.start() + File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + await self._connection.execute(query) + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "asyncpg/protocol/protocol.pyx", line 375, in query +RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +During handling of the above exception, another exception occurred: +tests/test_smoke_dynamic.py:35: in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1768: in get + return await self.request( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1540: in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1629: in send + response = await self._send_handling_auth( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1657: in _send_handling_auth + response = await self._send_handling_redirects( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1694: in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1730: in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py:170: in handle_async_request + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/fastapi/applications.py:1054: in __call__ + await super().__call__(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/applications.py:113: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:187: in __call__ + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:165: in __call__ + await self.app(scope, receive, _send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:185: in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/contextlib.py:158: in __exit__ + self.gen.throw(value) +/usr/local/lib/python3.12/site-packages/starlette/_utils.py:82: in collapse_excgroups + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:187: in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +main.py:79: in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:163: in call_next + raise app_exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149: in coro + await self.app(scope, receive_or_disconnect, send_no_error) +/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py:62: in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:715: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:735: in app + await route.handle(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:288: in handle + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:76: in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:73: in app + response = await f(request) + ^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:301: in app + raw_response = await run_endpoint_function( +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:212: in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +routers/decisions.py:25: in list_decisions + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +core/sidebar.py:14: in get_sidebar_data + result = await db.execute(text(""" +/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py:461: in execute + result = await greenlet_spawn( +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2362: in execute + return self._execute_internal( +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2237: in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2106: in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +:2: in _connection_for_bind + ??? +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py:139: in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:1189: in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3278: in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:146: in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3302: in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:449: in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1362: in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py:146: in __exit__ + raise exc_value.with_traceback(exc_tb) +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1300: in _checkout + result = pool._dialect._do_ping_w_event( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py:716: in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:1150: in do_ping + dbapi_connection.ping() +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:801: in ping + self._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:782: in _handle_exception + raise error +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:799: in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn + value = await result + ^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:808: in _async_ping + await tr.start() +/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py:146: in start + await self._connection.execute(query) +/usr/local/lib/python3.12/site-packages/asyncpg/connection.py:349: in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +asyncpg/protocol/protocol.pyx:375: in query + ??? +E RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +------------------------------ Captured log call ------------------------------- +ERROR sqlalchemy.pool.impl.AsyncAdaptedQueuePool:base.py:378 Exception terminating connection > +Traceback (most recent call last): + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection + self._dialect.do_terminate(connection) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1117, in do_terminate + dbapi_connection.terminate() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 895, in terminate + self.await_(self._connection.close(timeout=2)) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1504, in close + await self._protocol.close(timeout) + File "asyncpg/protocol/protocol.pyx", line 627, in close + File "asyncpg/protocol/protocol.pyx", line 660, in asyncpg.protocol.protocol.BaseProtocol._request_cancel + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1673, in _cancel_current_command + self._cancellations.add(self._loop.create_task(self._cancel(waiter))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 455, in create_task + self._check_closed() + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 545, in _check_closed + raise RuntimeError('Event loop is closed') +RuntimeError: Event loop is closed +________________ test_get_no_params_returns_200[GET /weblinks/] ________________ + + Exception Group Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 76, in collapse_excgroups + | yield + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 186, in __call__ + | async with anyio.create_task_group() as task_group: + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 783, in __aexit__ + | raise BaseExceptionGroup( + | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) + +-+---------------- 1 ---------------- + | Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 353, in from_call + | result: TResult | None = func() + | ^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 245, in + | lambda: runtest_hook(item=item, **kwds), + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/logging.py", line 850, in pytest_runtest_call + | yield + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/capture.py", line 900, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/skipping.py", line 268, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 179, in pytest_runtest_call + | item.runtest() + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 469, in runtest + | super().runtest() + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 1720, in runtest + | self.ihook.pytest_pyfunc_call(pyfuncitem=self) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper + | return result.get_result() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_result.py", line 103, in get_result + | raise exc.with_traceback(tb) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper + | res = yield + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 166, in pytest_pyfunc_call + | result = testfunction(**testargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 716, in inner + | runner.run(coro, context=context) + | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run + | return self._loop.run_until_complete(task) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete + | return future.result() + | ^^^^^^^^^^^^^^^ + | File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + | r = await client.get(url, follow_redirects=True) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + | return await self.request( + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + | return await self.send(request, auth=auth, follow_redirects=follow_redirects) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + | response = await self._send_handling_auth( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + | response = await self._send_handling_redirects( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + | response = await self._send_single_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + | response = await transport.handle_async_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + | await super().__call__(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + | await self.app(scope, receive, _send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + | with collapse_excgroups(): + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + | self.gen.throw(value) + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + | response = await self.dispatch_func(request, call_next) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/main.py", line 79, in add_request_context + | response = await call_next(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + | raise app_exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + | await self.app(scope, receive_or_disconnect, send_no_error) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + | await route.handle(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + | await wrap_app_handling_exceptions(app, request)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + | response = await f(request) + | ^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + | raw_response = await run_endpoint_function( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + | return await dependant.call(**values) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/routers/weblinks.py", line 24, in list_weblinks + | sidebar = await get_sidebar_data(db) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/core/sidebar.py", line 14, in get_sidebar_data + | result = await db.execute(text(""" + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + | result = await greenlet_spawn( + | ^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + | result = context.throw(*sys.exc_info()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + | return self._execute_internal( + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + | conn = self._connection_for_bind(bind) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + | return trans._connection_for_bind(engine, execution_options) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "", line 2, in _connection_for_bind + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + | ret_value = fn(self, *arg, **kw) + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + | conn = bind.connect() + | ^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + | return self._connection_cls(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + | self._dbapi_connection = engine.raw_connection() + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + | return self.pool.connect() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + | return _ConnectionFairy._checkout(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + | with util.safe_reraise(): + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + | raise exc_value.with_traceback(exc_tb) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + | result = pool._dialect._do_ping_w_event( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + | return self.do_ping(dbapi_connection) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + | dbapi_connection.ping() + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + | self._handle_exception(error) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + | raise error + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + | _ = self.await_(self._async_ping()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + | value = await result + | ^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + | await tr.start() + | File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + | await self._connection.execute(query) + | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + | result = await self._protocol.query(query, timeout) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "asyncpg/protocol/protocol.pyx", line 375, in query + | RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +------------------------------------ + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + return await self.request( + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + response = await self._send_handling_auth( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + response = await self._send_handling_redirects( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + await self.app(scope, receive, _send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + self.gen.throw(value) + File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/main.py", line 79, in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + raise app_exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + await self.app(scope, receive_or_disconnect, send_no_error) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + await route.handle(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + response = await f(request) + ^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/routers/weblinks.py", line 24, in list_weblinks + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/core/sidebar.py", line 14, in get_sidebar_data + result = await db.execute(text(""" + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + result = await greenlet_spawn( + ^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + return self._execute_internal( + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 2, in _connection_for_bind + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + raise exc_value.with_traceback(exc_tb) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + result = pool._dialect._do_ping_w_event( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + dbapi_connection.ping() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + self._handle_exception(error) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + raise error + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + await tr.start() + File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + await self._connection.execute(query) + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "asyncpg/protocol/protocol.pyx", line 375, in query +RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +During handling of the above exception, another exception occurred: +tests/test_smoke_dynamic.py:35: in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1768: in get + return await self.request( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1540: in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1629: in send + response = await self._send_handling_auth( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1657: in _send_handling_auth + response = await self._send_handling_redirects( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1694: in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1730: in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py:170: in handle_async_request + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/fastapi/applications.py:1054: in __call__ + await super().__call__(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/applications.py:113: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:187: in __call__ + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:165: in __call__ + await self.app(scope, receive, _send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:185: in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/contextlib.py:158: in __exit__ + self.gen.throw(value) +/usr/local/lib/python3.12/site-packages/starlette/_utils.py:82: in collapse_excgroups + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:187: in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +main.py:79: in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:163: in call_next + raise app_exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149: in coro + await self.app(scope, receive_or_disconnect, send_no_error) +/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py:62: in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:715: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:735: in app + await route.handle(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:288: in handle + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:76: in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:73: in app + response = await f(request) + ^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:301: in app + raw_response = await run_endpoint_function( +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:212: in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +routers/weblinks.py:24: in list_weblinks + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +core/sidebar.py:14: in get_sidebar_data + result = await db.execute(text(""" +/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py:461: in execute + result = await greenlet_spawn( +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2362: in execute + return self._execute_internal( +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2237: in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2106: in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +:2: in _connection_for_bind + ??? +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py:139: in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:1189: in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3278: in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:146: in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3302: in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:449: in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1362: in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py:146: in __exit__ + raise exc_value.with_traceback(exc_tb) +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1300: in _checkout + result = pool._dialect._do_ping_w_event( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py:716: in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:1150: in do_ping + dbapi_connection.ping() +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:801: in ping + self._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:782: in _handle_exception + raise error +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:799: in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn + value = await result + ^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:808: in _async_ping + await tr.start() +/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py:146: in start + await self._connection.execute(query) +/usr/local/lib/python3.12/site-packages/asyncpg/connection.py:349: in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +asyncpg/protocol/protocol.pyx:375: in query + ??? +E RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +------------------------------ Captured log call ------------------------------- +ERROR sqlalchemy.pool.impl.AsyncAdaptedQueuePool:base.py:378 Exception terminating connection > +Traceback (most recent call last): + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection + self._dialect.do_terminate(connection) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1117, in do_terminate + dbapi_connection.terminate() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 895, in terminate + self.await_(self._connection.close(timeout=2)) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1504, in close + await self._protocol.close(timeout) + File "asyncpg/protocol/protocol.pyx", line 627, in close + File "asyncpg/protocol/protocol.pyx", line 660, in asyncpg.protocol.protocol.BaseProtocol._request_cancel + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1673, in _cancel_current_command + self._cancellations.add(self._loop.create_task(self._cancel(waiter))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 455, in create_task + self._check_closed() + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 545, in _check_closed + raise RuntimeError('Event loop is closed') +RuntimeError: Event loop is closed +_________ test_get_no_params_returns_200[GET /weblinks/folders/create] _________ + + Exception Group Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 76, in collapse_excgroups + | yield + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 186, in __call__ + | async with anyio.create_task_group() as task_group: + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 783, in __aexit__ + | raise BaseExceptionGroup( + | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) + +-+---------------- 1 ---------------- + | Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 353, in from_call + | result: TResult | None = func() + | ^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 245, in + | lambda: runtest_hook(item=item, **kwds), + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/logging.py", line 850, in pytest_runtest_call + | yield + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/capture.py", line 900, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/skipping.py", line 268, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 179, in pytest_runtest_call + | item.runtest() + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 469, in runtest + | super().runtest() + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 1720, in runtest + | self.ihook.pytest_pyfunc_call(pyfuncitem=self) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper + | return result.get_result() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_result.py", line 103, in get_result + | raise exc.with_traceback(tb) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper + | res = yield + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 166, in pytest_pyfunc_call + | result = testfunction(**testargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 716, in inner + | runner.run(coro, context=context) + | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run + | return self._loop.run_until_complete(task) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete + | return future.result() + | ^^^^^^^^^^^^^^^ + | File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + | r = await client.get(url, follow_redirects=True) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + | return await self.request( + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + | return await self.send(request, auth=auth, follow_redirects=follow_redirects) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + | response = await self._send_handling_auth( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + | response = await self._send_handling_redirects( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + | response = await self._send_single_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + | response = await transport.handle_async_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + | await super().__call__(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + | await self.app(scope, receive, _send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + | with collapse_excgroups(): + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + | self.gen.throw(value) + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + | response = await self.dispatch_func(request, call_next) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/main.py", line 79, in add_request_context + | response = await call_next(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + | raise app_exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + | await self.app(scope, receive_or_disconnect, send_no_error) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + | await route.handle(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + | await wrap_app_handling_exceptions(app, request)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + | response = await f(request) + | ^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + | raw_response = await run_endpoint_function( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + | return await dependant.call(**values) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/routers/weblinks.py", line 200, in create_folder_form + | sidebar = await get_sidebar_data(db) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/core/sidebar.py", line 14, in get_sidebar_data + | result = await db.execute(text(""" + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + | result = await greenlet_spawn( + | ^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + | result = context.throw(*sys.exc_info()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + | return self._execute_internal( + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + | conn = self._connection_for_bind(bind) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + | return trans._connection_for_bind(engine, execution_options) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "", line 2, in _connection_for_bind + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + | ret_value = fn(self, *arg, **kw) + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + | conn = bind.connect() + | ^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + | return self._connection_cls(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + | self._dbapi_connection = engine.raw_connection() + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + | return self.pool.connect() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + | return _ConnectionFairy._checkout(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + | with util.safe_reraise(): + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + | raise exc_value.with_traceback(exc_tb) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + | result = pool._dialect._do_ping_w_event( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + | return self.do_ping(dbapi_connection) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + | dbapi_connection.ping() + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + | self._handle_exception(error) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + | raise error + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + | _ = self.await_(self._async_ping()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + | value = await result + | ^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + | await tr.start() + | File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + | await self._connection.execute(query) + | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + | result = await self._protocol.query(query, timeout) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "asyncpg/protocol/protocol.pyx", line 375, in query + | RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +------------------------------------ + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + return await self.request( + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + response = await self._send_handling_auth( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + response = await self._send_handling_redirects( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + await self.app(scope, receive, _send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + self.gen.throw(value) + File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/main.py", line 79, in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + raise app_exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + await self.app(scope, receive_or_disconnect, send_no_error) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + await route.handle(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + response = await f(request) + ^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/routers/weblinks.py", line 200, in create_folder_form + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/core/sidebar.py", line 14, in get_sidebar_data + result = await db.execute(text(""" + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + result = await greenlet_spawn( + ^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + return self._execute_internal( + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 2, in _connection_for_bind + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + raise exc_value.with_traceback(exc_tb) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + result = pool._dialect._do_ping_w_event( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + dbapi_connection.ping() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + self._handle_exception(error) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + raise error + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + await tr.start() + File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + await self._connection.execute(query) + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "asyncpg/protocol/protocol.pyx", line 375, in query +RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +During handling of the above exception, another exception occurred: +tests/test_smoke_dynamic.py:35: in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1768: in get + return await self.request( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1540: in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1629: in send + response = await self._send_handling_auth( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1657: in _send_handling_auth + response = await self._send_handling_redirects( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1694: in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1730: in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py:170: in handle_async_request + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/fastapi/applications.py:1054: in __call__ + await super().__call__(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/applications.py:113: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:187: in __call__ + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:165: in __call__ + await self.app(scope, receive, _send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:185: in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/contextlib.py:158: in __exit__ + self.gen.throw(value) +/usr/local/lib/python3.12/site-packages/starlette/_utils.py:82: in collapse_excgroups + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:187: in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +main.py:79: in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:163: in call_next + raise app_exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149: in coro + await self.app(scope, receive_or_disconnect, send_no_error) +/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py:62: in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:715: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:735: in app + await route.handle(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:288: in handle + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:76: in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:73: in app + response = await f(request) + ^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:301: in app + raw_response = await run_endpoint_function( +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:212: in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +routers/weblinks.py:200: in create_folder_form + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +core/sidebar.py:14: in get_sidebar_data + result = await db.execute(text(""" +/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py:461: in execute + result = await greenlet_spawn( +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2362: in execute + return self._execute_internal( +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2237: in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2106: in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +:2: in _connection_for_bind + ??? +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py:139: in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:1189: in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3278: in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:146: in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3302: in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:449: in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1362: in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py:146: in __exit__ + raise exc_value.with_traceback(exc_tb) +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1300: in _checkout + result = pool._dialect._do_ping_w_event( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py:716: in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:1150: in do_ping + dbapi_connection.ping() +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:801: in ping + self._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:782: in _handle_exception + raise error +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:799: in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn + value = await result + ^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:808: in _async_ping + await tr.start() +/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py:146: in start + await self._connection.execute(query) +/usr/local/lib/python3.12/site-packages/asyncpg/connection.py:349: in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +asyncpg/protocol/protocol.pyx:375: in query + ??? +E RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +------------------------------ Captured log call ------------------------------- +ERROR sqlalchemy.pool.impl.AsyncAdaptedQueuePool:base.py:378 Exception terminating connection > +Traceback (most recent call last): + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection + self._dialect.do_terminate(connection) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1117, in do_terminate + dbapi_connection.terminate() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 895, in terminate + self.await_(self._connection.close(timeout=2)) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1504, in close + await self._protocol.close(timeout) + File "asyncpg/protocol/protocol.pyx", line 627, in close + File "asyncpg/protocol/protocol.pyx", line 660, in asyncpg.protocol.protocol.BaseProtocol._request_cancel + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1673, in _cancel_current_command + self._cancellations.add(self._loop.create_task(self._cancel(waiter))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 455, in create_task + self._check_closed() + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 545, in _check_closed + raise RuntimeError('Event loop is closed') +RuntimeError: Event loop is closed +____________ test_get_no_params_returns_200[GET /appointments/new] _____________ + + Exception Group Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 76, in collapse_excgroups + | yield + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 186, in __call__ + | async with anyio.create_task_group() as task_group: + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 783, in __aexit__ + | raise BaseExceptionGroup( + | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) + +-+---------------- 1 ---------------- + | Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 353, in from_call + | result: TResult | None = func() + | ^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 245, in + | lambda: runtest_hook(item=item, **kwds), + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/logging.py", line 850, in pytest_runtest_call + | yield + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/capture.py", line 900, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/skipping.py", line 268, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 179, in pytest_runtest_call + | item.runtest() + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 469, in runtest + | super().runtest() + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 1720, in runtest + | self.ihook.pytest_pyfunc_call(pyfuncitem=self) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper + | return result.get_result() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_result.py", line 103, in get_result + | raise exc.with_traceback(tb) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper + | res = yield + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 166, in pytest_pyfunc_call + | result = testfunction(**testargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 716, in inner + | runner.run(coro, context=context) + | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run + | return self._loop.run_until_complete(task) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete + | return future.result() + | ^^^^^^^^^^^^^^^ + | File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + | r = await client.get(url, follow_redirects=True) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + | return await self.request( + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + | return await self.send(request, auth=auth, follow_redirects=follow_redirects) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + | response = await self._send_handling_auth( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + | response = await self._send_handling_redirects( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + | response = await self._send_single_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + | response = await transport.handle_async_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + | await super().__call__(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + | await self.app(scope, receive, _send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + | with collapse_excgroups(): + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + | self.gen.throw(value) + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + | response = await self.dispatch_func(request, call_next) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/main.py", line 79, in add_request_context + | response = await call_next(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + | raise app_exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + | await self.app(scope, receive_or_disconnect, send_no_error) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + | await route.handle(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + | await wrap_app_handling_exceptions(app, request)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + | response = await f(request) + | ^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + | raw_response = await run_endpoint_function( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + | return await dependant.call(**values) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/routers/appointments.py", line 84, in new_appointment + | sidebar = await get_sidebar_data(db) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/core/sidebar.py", line 14, in get_sidebar_data + | result = await db.execute(text(""" + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + | result = await greenlet_spawn( + | ^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + | result = context.throw(*sys.exc_info()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + | return self._execute_internal( + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + | conn = self._connection_for_bind(bind) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + | return trans._connection_for_bind(engine, execution_options) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "", line 2, in _connection_for_bind + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + | ret_value = fn(self, *arg, **kw) + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + | conn = bind.connect() + | ^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + | return self._connection_cls(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + | self._dbapi_connection = engine.raw_connection() + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + | return self.pool.connect() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + | return _ConnectionFairy._checkout(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + | with util.safe_reraise(): + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + | raise exc_value.with_traceback(exc_tb) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + | result = pool._dialect._do_ping_w_event( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + | return self.do_ping(dbapi_connection) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + | dbapi_connection.ping() + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + | self._handle_exception(error) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + | raise error + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + | _ = self.await_(self._async_ping()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + | value = await result + | ^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + | await tr.start() + | File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + | await self._connection.execute(query) + | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + | result = await self._protocol.query(query, timeout) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "asyncpg/protocol/protocol.pyx", line 375, in query + | RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +------------------------------------ + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + return await self.request( + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + response = await self._send_handling_auth( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + response = await self._send_handling_redirects( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + await self.app(scope, receive, _send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + self.gen.throw(value) + File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/main.py", line 79, in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + raise app_exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + await self.app(scope, receive_or_disconnect, send_no_error) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + await route.handle(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + response = await f(request) + ^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/routers/appointments.py", line 84, in new_appointment + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/core/sidebar.py", line 14, in get_sidebar_data + result = await db.execute(text(""" + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + result = await greenlet_spawn( + ^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + return self._execute_internal( + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 2, in _connection_for_bind + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + raise exc_value.with_traceback(exc_tb) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + result = pool._dialect._do_ping_w_event( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + dbapi_connection.ping() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + self._handle_exception(error) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + raise error + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + await tr.start() + File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + await self._connection.execute(query) + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "asyncpg/protocol/protocol.pyx", line 375, in query +RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +During handling of the above exception, another exception occurred: +tests/test_smoke_dynamic.py:35: in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1768: in get + return await self.request( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1540: in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1629: in send + response = await self._send_handling_auth( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1657: in _send_handling_auth + response = await self._send_handling_redirects( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1694: in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1730: in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py:170: in handle_async_request + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/fastapi/applications.py:1054: in __call__ + await super().__call__(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/applications.py:113: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:187: in __call__ + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:165: in __call__ + await self.app(scope, receive, _send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:185: in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/contextlib.py:158: in __exit__ + self.gen.throw(value) +/usr/local/lib/python3.12/site-packages/starlette/_utils.py:82: in collapse_excgroups + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:187: in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +main.py:79: in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:163: in call_next + raise app_exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149: in coro + await self.app(scope, receive_or_disconnect, send_no_error) +/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py:62: in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:715: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:735: in app + await route.handle(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:288: in handle + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:76: in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:73: in app + response = await f(request) + ^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:301: in app + raw_response = await run_endpoint_function( +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:212: in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +routers/appointments.py:84: in new_appointment + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +core/sidebar.py:14: in get_sidebar_data + result = await db.execute(text(""" +/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py:461: in execute + result = await greenlet_spawn( +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2362: in execute + return self._execute_internal( +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2237: in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2106: in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +:2: in _connection_for_bind + ??? +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py:139: in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:1189: in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3278: in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:146: in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3302: in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:449: in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1362: in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py:146: in __exit__ + raise exc_value.with_traceback(exc_tb) +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1300: in _checkout + result = pool._dialect._do_ping_w_event( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py:716: in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:1150: in do_ping + dbapi_connection.ping() +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:801: in ping + self._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:782: in _handle_exception + raise error +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:799: in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn + value = await result + ^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:808: in _async_ping + await tr.start() +/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py:146: in start + await self._connection.execute(query) +/usr/local/lib/python3.12/site-packages/asyncpg/connection.py:349: in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +asyncpg/protocol/protocol.pyx:375: in query + ??? +E RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +------------------------------ Captured log call ------------------------------- +ERROR sqlalchemy.pool.impl.AsyncAdaptedQueuePool:base.py:378 Exception terminating connection > +Traceback (most recent call last): + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection + self._dialect.do_terminate(connection) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1117, in do_terminate + dbapi_connection.terminate() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 895, in terminate + self.await_(self._connection.close(timeout=2)) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1504, in close + await self._protocol.close(timeout) + File "asyncpg/protocol/protocol.pyx", line 627, in close + File "asyncpg/protocol/protocol.pyx", line 660, in asyncpg.protocol.protocol.BaseProtocol._request_cancel + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1673, in _cancel_current_command + self._cancellations.add(self._loop.create_task(self._cancel(waiter))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 455, in create_task + self._check_closed() + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 545, in _check_closed + raise RuntimeError('Event loop is closed') +RuntimeError: Event loop is closed +______________ test_get_no_params_returns_200[GET /time/running] _______________ + + Exception Group Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 76, in collapse_excgroups + | yield + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 186, in __call__ + | async with anyio.create_task_group() as task_group: + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 783, in __aexit__ + | raise BaseExceptionGroup( + | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) + +-+---------------- 1 ---------------- + | Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 353, in from_call + | result: TResult | None = func() + | ^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 245, in + | lambda: runtest_hook(item=item, **kwds), + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/logging.py", line 850, in pytest_runtest_call + | yield + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/capture.py", line 900, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/skipping.py", line 268, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 179, in pytest_runtest_call + | item.runtest() + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 469, in runtest + | super().runtest() + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 1720, in runtest + | self.ihook.pytest_pyfunc_call(pyfuncitem=self) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper + | return result.get_result() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_result.py", line 103, in get_result + | raise exc.with_traceback(tb) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper + | res = yield + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 166, in pytest_pyfunc_call + | result = testfunction(**testargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 716, in inner + | runner.run(coro, context=context) + | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run + | return self._loop.run_until_complete(task) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete + | return future.result() + | ^^^^^^^^^^^^^^^ + | File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + | r = await client.get(url, follow_redirects=True) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + | return await self.request( + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + | return await self.send(request, auth=auth, follow_redirects=follow_redirects) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + | response = await self._send_handling_auth( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + | response = await self._send_handling_redirects( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + | response = await self._send_single_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + | response = await transport.handle_async_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + | await super().__call__(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + | await self.app(scope, receive, _send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + | with collapse_excgroups(): + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + | self.gen.throw(value) + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + | response = await self.dispatch_func(request, call_next) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/main.py", line 79, in add_request_context + | response = await call_next(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + | raise app_exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + | await self.app(scope, receive_or_disconnect, send_no_error) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + | await route.handle(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + | await wrap_app_handling_exceptions(app, request)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + | response = await f(request) + | ^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + | raw_response = await run_endpoint_function( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + | return await dependant.call(**values) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/routers/time_tracking.py", line 157, in running_timer_api + | running = await get_running_timer(db) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/routers/time_tracking.py", line 20, in get_running_timer + | result = await db.execute(text(""" + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + | result = await greenlet_spawn( + | ^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + | result = context.throw(*sys.exc_info()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + | return self._execute_internal( + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + | conn = self._connection_for_bind(bind) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + | return trans._connection_for_bind(engine, execution_options) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "", line 2, in _connection_for_bind + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + | ret_value = fn(self, *arg, **kw) + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + | conn = bind.connect() + | ^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + | return self._connection_cls(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + | self._dbapi_connection = engine.raw_connection() + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + | return self.pool.connect() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + | return _ConnectionFairy._checkout(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + | with util.safe_reraise(): + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + | raise exc_value.with_traceback(exc_tb) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + | result = pool._dialect._do_ping_w_event( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + | return self.do_ping(dbapi_connection) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + | dbapi_connection.ping() + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + | self._handle_exception(error) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + | raise error + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + | _ = self.await_(self._async_ping()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + | value = await result + | ^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + | await tr.start() + | File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + | await self._connection.execute(query) + | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + | result = await self._protocol.query(query, timeout) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "asyncpg/protocol/protocol.pyx", line 375, in query + | RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +------------------------------------ + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/app/tests/test_smoke_dynamic.py", line 35, in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + return await self.request( + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + response = await self._send_handling_auth( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + response = await self._send_handling_redirects( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + await self.app(scope, receive, _send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + self.gen.throw(value) + File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/main.py", line 79, in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + raise app_exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + await self.app(scope, receive_or_disconnect, send_no_error) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + await route.handle(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + response = await f(request) + ^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/routers/time_tracking.py", line 157, in running_timer_api + running = await get_running_timer(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/routers/time_tracking.py", line 20, in get_running_timer + result = await db.execute(text(""" + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + result = await greenlet_spawn( + ^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + return self._execute_internal( + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 2, in _connection_for_bind + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + raise exc_value.with_traceback(exc_tb) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + result = pool._dialect._do_ping_w_event( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + dbapi_connection.ping() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + self._handle_exception(error) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + raise error + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + await tr.start() + File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + await self._connection.execute(query) + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "asyncpg/protocol/protocol.pyx", line 375, in query +RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +During handling of the above exception, another exception occurred: +tests/test_smoke_dynamic.py:35: in test_get_no_params_returns_200 + r = await client.get(url, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1768: in get + return await self.request( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1540: in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1629: in send + response = await self._send_handling_auth( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1657: in _send_handling_auth + response = await self._send_handling_redirects( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1694: in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1730: in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py:170: in handle_async_request + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/fastapi/applications.py:1054: in __call__ + await super().__call__(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/applications.py:113: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:187: in __call__ + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:165: in __call__ + await self.app(scope, receive, _send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:185: in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/contextlib.py:158: in __exit__ + self.gen.throw(value) +/usr/local/lib/python3.12/site-packages/starlette/_utils.py:82: in collapse_excgroups + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:187: in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +main.py:79: in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:163: in call_next + raise app_exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149: in coro + await self.app(scope, receive_or_disconnect, send_no_error) +/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py:62: in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:715: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:735: in app + await route.handle(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:288: in handle + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:76: in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:73: in app + response = await f(request) + ^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:301: in app + raw_response = await run_endpoint_function( +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:212: in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +routers/time_tracking.py:157: in running_timer_api + running = await get_running_timer(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ +routers/time_tracking.py:20: in get_running_timer + result = await db.execute(text(""" +/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py:461: in execute + result = await greenlet_spawn( +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2362: in execute + return self._execute_internal( +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2237: in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2106: in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +:2: in _connection_for_bind + ??? +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py:139: in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:1189: in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3278: in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:146: in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3302: in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:449: in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1362: in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py:146: in __exit__ + raise exc_value.with_traceback(exc_tb) +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1300: in _checkout + result = pool._dialect._do_ping_w_event( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py:716: in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:1150: in do_ping + dbapi_connection.ping() +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:801: in ping + self._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:782: in _handle_exception + raise error +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:799: in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn + value = await result + ^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:808: in _async_ping + await tr.start() +/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py:146: in start + await self._connection.execute(query) +/usr/local/lib/python3.12/site-packages/asyncpg/connection.py:349: in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +asyncpg/protocol/protocol.pyx:375: in query + ??? +E RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +------------------------------ Captured log call ------------------------------- +ERROR sqlalchemy.pool.impl.AsyncAdaptedQueuePool:base.py:378 Exception terminating connection > +Traceback (most recent call last): + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection + self._dialect.do_terminate(connection) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1117, in do_terminate + dbapi_connection.terminate() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 895, in terminate + self.await_(self._connection.close(timeout=2)) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1504, in close + await self._protocol.close(timeout) + File "asyncpg/protocol/protocol.pyx", line 627, in close + File "asyncpg/protocol/protocol.pyx", line 660, in asyncpg.protocol.protocol.BaseProtocol._request_cancel + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1673, in _cancel_current_command + self._cancellations.add(self._loop.create_task(self._cancel(waiter))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 455, in create_task + self._check_closed() + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 545, in _check_closed + raise RuntimeError('Event loop is closed') +RuntimeError: Event loop is closed +_______ test_get_with_fake_id_returns_404[404 /domains/{domain_id}/edit] _______ +tests/test_smoke_dynamic.py:75: in test_get_with_fake_id_returns_404 + assert r.status_code in (404, 302, 303), \ +E AssertionError: GET /domains/00000000-0000-0000-0000-000000000000/edit returned 200, expected 404 or redirect +E assert 200 in (404, 302, 303) +E + where 200 = .status_code +----------------------------- Captured stdout call ----------------------------- +2026-03-01 14:01:35,136 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-01 14:01:35,136 INFO sqlalchemy.engine.Engine + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:35,136 INFO sqlalchemy.engine.Engine [cached since 9.523s ago] () +2026-03-01 14:01:35,143 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:35,143 INFO sqlalchemy.engine.Engine [cached since 9.523s ago] () +2026-03-01 14:01:35,146 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +2026-03-01 14:01:35,146 INFO sqlalchemy.engine.Engine [cached since 9.523s ago] () +2026-03-01 14:01:35,150 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +2026-03-01 14:01:35,150 INFO sqlalchemy.engine.Engine [cached since 9.523s ago] () +2026-03-01 14:01:35,153 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +2026-03-01 14:01:35,153 INFO sqlalchemy.engine.Engine [cached since 9.523s ago] () +2026-03-01 14:01:35,155 INFO sqlalchemy.engine.Engine SELECT * FROM domains WHERE id = $1 +2026-03-01 14:01:35,155 INFO sqlalchemy.engine.Engine [generated in 0.00009s] ('00000000-0000-0000-0000-000000000000',) +2026-03-01 14:01:35,157 INFO sqlalchemy.engine.Engine COMMIT +2026-03-01 14:01:35,159 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-01 14:01:35,159 INFO sqlalchemy.engine.Engine + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:35,159 INFO sqlalchemy.engine.Engine [cached since 9.546s ago] () +2026-03-01 14:01:35,160 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:35,160 INFO sqlalchemy.engine.Engine [cached since 9.539s ago] () +2026-03-01 14:01:35,160 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +2026-03-01 14:01:35,160 INFO sqlalchemy.engine.Engine [cached since 9.538s ago] () +2026-03-01 14:01:35,161 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +2026-03-01 14:01:35,161 INFO sqlalchemy.engine.Engine [cached since 9.534s ago] () +2026-03-01 14:01:35,161 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +2026-03-01 14:01:35,161 INFO sqlalchemy.engine.Engine [cached since 9.532s ago] () +2026-03-01 14:01:35,162 INFO sqlalchemy.engine.Engine + SELECT * FROM domains + WHERE is_deleted = false + ORDER BY sort_order ASC + LIMIT $1 OFFSET $2 + +2026-03-01 14:01:35,162 INFO sqlalchemy.engine.Engine [cached since 9.455s ago] (50, 0) +2026-03-01 14:01:35,163 INFO sqlalchemy.engine.Engine COMMIT +------------------------------ Captured log call ------------------------------- +INFO sqlalchemy.engine.Engine:base.py:2701 BEGIN (implicit) +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 9.523s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 9.523s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 9.523s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 9.523s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 9.523s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 SELECT * FROM domains WHERE id = $1 +INFO sqlalchemy.engine.Engine:base.py:1846 [generated in 0.00009s] ('00000000-0000-0000-0000-000000000000',) +INFO sqlalchemy.engine.Engine:base.py:2707 COMMIT +INFO sqlalchemy.engine.Engine:base.py:2701 BEGIN (implicit) +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 9.546s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 9.539s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 9.538s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 9.534s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 9.532s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT * FROM domains + WHERE is_deleted = false + ORDER BY sort_order ASC + LIMIT $1 OFFSET $2 + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 9.455s ago] (50, 0) +INFO sqlalchemy.engine.Engine:base.py:2707 COMMIT +_________ test_get_with_fake_id_returns_404[404 /areas/{area_id}/edit] _________ + + Exception Group Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 76, in collapse_excgroups + | yield + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 186, in __call__ + | async with anyio.create_task_group() as task_group: + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 783, in __aexit__ + | raise BaseExceptionGroup( + | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) + +-+---------------- 1 ---------------- + | Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 353, in from_call + | result: TResult | None = func() + | ^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 245, in + | lambda: runtest_hook(item=item, **kwds), + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/logging.py", line 850, in pytest_runtest_call + | yield + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/capture.py", line 900, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/skipping.py", line 268, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 179, in pytest_runtest_call + | item.runtest() + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 469, in runtest + | super().runtest() + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 1720, in runtest + | self.ihook.pytest_pyfunc_call(pyfuncitem=self) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper + | return result.get_result() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_result.py", line 103, in get_result + | raise exc.with_traceback(tb) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper + | res = yield + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 166, in pytest_pyfunc_call + | result = testfunction(**testargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 716, in inner + | runner.run(coro, context=context) + | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run + | return self._loop.run_until_complete(task) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete + | return future.result() + | ^^^^^^^^^^^^^^^ + | File "/app/tests/test_smoke_dynamic.py", line 74, in test_get_with_fake_id_returns_404 + | r = await client.get(path, follow_redirects=True) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + | return await self.request( + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + | return await self.send(request, auth=auth, follow_redirects=follow_redirects) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + | response = await self._send_handling_auth( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + | response = await self._send_handling_redirects( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + | response = await self._send_single_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + | response = await transport.handle_async_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + | await super().__call__(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + | await self.app(scope, receive, _send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + | with collapse_excgroups(): + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + | self.gen.throw(value) + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + | response = await self.dispatch_func(request, call_next) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/main.py", line 79, in add_request_context + | response = await call_next(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + | raise app_exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + | await self.app(scope, receive_or_disconnect, send_no_error) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + | await route.handle(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + | await wrap_app_handling_exceptions(app, request)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + | response = await f(request) + | ^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + | raw_response = await run_endpoint_function( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + | return await dependant.call(**values) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/routers/areas.py", line 88, in edit_form + | sidebar = await get_sidebar_data(db) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/core/sidebar.py", line 14, in get_sidebar_data + | result = await db.execute(text(""" + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + | result = await greenlet_spawn( + | ^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + | result = context.throw(*sys.exc_info()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + | return self._execute_internal( + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + | conn = self._connection_for_bind(bind) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + | return trans._connection_for_bind(engine, execution_options) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "", line 2, in _connection_for_bind + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + | ret_value = fn(self, *arg, **kw) + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + | conn = bind.connect() + | ^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + | return self._connection_cls(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + | self._dbapi_connection = engine.raw_connection() + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + | return self.pool.connect() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + | return _ConnectionFairy._checkout(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + | with util.safe_reraise(): + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + | raise exc_value.with_traceback(exc_tb) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + | result = pool._dialect._do_ping_w_event( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + | return self.do_ping(dbapi_connection) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + | dbapi_connection.ping() + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + | self._handle_exception(error) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + | raise error + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + | _ = self.await_(self._async_ping()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + | value = await result + | ^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + | await tr.start() + | File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + | await self._connection.execute(query) + | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + | result = await self._protocol.query(query, timeout) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "asyncpg/protocol/protocol.pyx", line 375, in query + | RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +------------------------------------ + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/app/tests/test_smoke_dynamic.py", line 74, in test_get_with_fake_id_returns_404 + r = await client.get(path, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + return await self.request( + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + response = await self._send_handling_auth( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + response = await self._send_handling_redirects( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + await self.app(scope, receive, _send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + self.gen.throw(value) + File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/main.py", line 79, in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + raise app_exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + await self.app(scope, receive_or_disconnect, send_no_error) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + await route.handle(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + response = await f(request) + ^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/routers/areas.py", line 88, in edit_form + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/core/sidebar.py", line 14, in get_sidebar_data + result = await db.execute(text(""" + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + result = await greenlet_spawn( + ^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + return self._execute_internal( + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 2, in _connection_for_bind + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + raise exc_value.with_traceback(exc_tb) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + result = pool._dialect._do_ping_w_event( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + dbapi_connection.ping() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + self._handle_exception(error) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + raise error + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + await tr.start() + File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + await self._connection.execute(query) + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "asyncpg/protocol/protocol.pyx", line 375, in query +RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +During handling of the above exception, another exception occurred: +tests/test_smoke_dynamic.py:74: in test_get_with_fake_id_returns_404 + r = await client.get(path, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1768: in get + return await self.request( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1540: in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1629: in send + response = await self._send_handling_auth( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1657: in _send_handling_auth + response = await self._send_handling_redirects( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1694: in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1730: in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py:170: in handle_async_request + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/fastapi/applications.py:1054: in __call__ + await super().__call__(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/applications.py:113: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:187: in __call__ + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:165: in __call__ + await self.app(scope, receive, _send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:185: in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/contextlib.py:158: in __exit__ + self.gen.throw(value) +/usr/local/lib/python3.12/site-packages/starlette/_utils.py:82: in collapse_excgroups + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:187: in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +main.py:79: in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:163: in call_next + raise app_exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149: in coro + await self.app(scope, receive_or_disconnect, send_no_error) +/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py:62: in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:715: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:735: in app + await route.handle(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:288: in handle + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:76: in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:73: in app + response = await f(request) + ^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:301: in app + raw_response = await run_endpoint_function( +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:212: in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +routers/areas.py:88: in edit_form + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +core/sidebar.py:14: in get_sidebar_data + result = await db.execute(text(""" +/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py:461: in execute + result = await greenlet_spawn( +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2362: in execute + return self._execute_internal( +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2237: in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2106: in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +:2: in _connection_for_bind + ??? +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py:139: in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:1189: in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3278: in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:146: in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3302: in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:449: in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1362: in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py:146: in __exit__ + raise exc_value.with_traceback(exc_tb) +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1300: in _checkout + result = pool._dialect._do_ping_w_event( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py:716: in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:1150: in do_ping + dbapi_connection.ping() +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:801: in ping + self._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:782: in _handle_exception + raise error +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:799: in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn + value = await result + ^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:808: in _async_ping + await tr.start() +/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py:146: in start + await self._connection.execute(query) +/usr/local/lib/python3.12/site-packages/asyncpg/connection.py:349: in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +asyncpg/protocol/protocol.pyx:375: in query + ??? +E RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +------------------------------ Captured log call ------------------------------- +ERROR sqlalchemy.pool.impl.AsyncAdaptedQueuePool:base.py:378 Exception terminating connection > +Traceback (most recent call last): + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection + self._dialect.do_terminate(connection) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1117, in do_terminate + dbapi_connection.terminate() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 895, in terminate + self.await_(self._connection.close(timeout=2)) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1504, in close + await self._protocol.close(timeout) + File "asyncpg/protocol/protocol.pyx", line 627, in close + File "asyncpg/protocol/protocol.pyx", line 660, in asyncpg.protocol.protocol.BaseProtocol._request_cancel + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1673, in _cancel_current_command + self._cancellations.add(self._loop.create_task(self._cancel(waiter))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 455, in create_task + self._check_closed() + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 545, in _check_closed + raise RuntimeError('Event loop is closed') +RuntimeError: Event loop is closed +________ test_get_with_fake_id_returns_404[404 /projects/{project_id}] _________ +tests/test_smoke_dynamic.py:75: in test_get_with_fake_id_returns_404 + assert r.status_code in (404, 302, 303), \ +E AssertionError: GET /projects/00000000-0000-0000-0000-000000000000 returned 200, expected 404 or redirect +E assert 200 in (404, 302, 303) +E + where 200 = .status_code +----------------------------- Captured stdout call ----------------------------- +2026-03-01 14:01:35,572 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-01 14:01:35,572 INFO sqlalchemy.engine.Engine + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:35,572 INFO sqlalchemy.engine.Engine [cached since 9.959s ago] () +2026-03-01 14:01:35,582 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:35,582 INFO sqlalchemy.engine.Engine [cached since 9.961s ago] () +2026-03-01 14:01:35,585 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +2026-03-01 14:01:35,585 INFO sqlalchemy.engine.Engine [cached since 9.962s ago] () +2026-03-01 14:01:35,591 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +2026-03-01 14:01:35,591 INFO sqlalchemy.engine.Engine [cached since 9.964s ago] () +2026-03-01 14:01:35,594 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +2026-03-01 14:01:35,594 INFO sqlalchemy.engine.Engine [cached since 9.965s ago] () +2026-03-01 14:01:35,598 INFO sqlalchemy.engine.Engine SELECT * FROM projects WHERE id = $1 +2026-03-01 14:01:35,598 INFO sqlalchemy.engine.Engine [generated in 0.00011s] ('00000000-0000-0000-0000-000000000000',) +2026-03-01 14:01:35,600 INFO sqlalchemy.engine.Engine COMMIT +2026-03-01 14:01:35,603 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-01 14:01:35,603 INFO sqlalchemy.engine.Engine + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:35,603 INFO sqlalchemy.engine.Engine [cached since 9.99s ago] () +2026-03-01 14:01:35,604 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:35,604 INFO sqlalchemy.engine.Engine [cached since 9.983s ago] () +2026-03-01 14:01:35,604 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +2026-03-01 14:01:35,604 INFO sqlalchemy.engine.Engine [cached since 9.981s ago] () +2026-03-01 14:01:35,605 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +2026-03-01 14:01:35,605 INFO sqlalchemy.engine.Engine [cached since 9.978s ago] () +2026-03-01 14:01:35,605 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +2026-03-01 14:01:35,605 INFO sqlalchemy.engine.Engine [cached since 9.976s ago] () +2026-03-01 14:01:35,606 INFO sqlalchemy.engine.Engine + SELECT p.*, + d.name as domain_name, d.color as domain_color, + a.name as area_name, + (SELECT count(*) FROM tasks t WHERE t.project_id = p.id AND t.is_deleted = false) as task_count, + (SELECT count(*) FROM tasks t WHERE t.project_id = p.id AND t.is_deleted = false AND t.status = 'done') as done_count + FROM projects p + JOIN domains d ON p.domain_id = d.id + LEFT JOIN areas a ON p.area_id = a.id + WHERE p.is_deleted = false + ORDER BY d.sort_order, d.name, a.sort_order, a.name, p.sort_order, p.name + +2026-03-01 14:01:35,606 INFO sqlalchemy.engine.Engine [cached since 8.946s ago] () +2026-03-01 14:01:35,617 INFO sqlalchemy.engine.Engine + SELECT * FROM domains + WHERE is_deleted = false + ORDER BY sort_order ASC + LIMIT $1 OFFSET $2 + +2026-03-01 14:01:35,617 INFO sqlalchemy.engine.Engine [cached since 9.91s ago] (50, 0) +2026-03-01 14:01:35,618 INFO sqlalchemy.engine.Engine COMMIT +------------------------------ Captured log call ------------------------------- +INFO sqlalchemy.engine.Engine:base.py:2701 BEGIN (implicit) +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 9.959s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 9.961s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 9.962s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 9.964s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 9.965s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 SELECT * FROM projects WHERE id = $1 +INFO sqlalchemy.engine.Engine:base.py:1846 [generated in 0.00011s] ('00000000-0000-0000-0000-000000000000',) +INFO sqlalchemy.engine.Engine:base.py:2707 COMMIT +INFO sqlalchemy.engine.Engine:base.py:2701 BEGIN (implicit) +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 9.99s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 9.983s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 9.981s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 9.978s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 9.976s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT p.*, + d.name as domain_name, d.color as domain_color, + a.name as area_name, + (SELECT count(*) FROM tasks t WHERE t.project_id = p.id AND t.is_deleted = false) as task_count, + (SELECT count(*) FROM tasks t WHERE t.project_id = p.id AND t.is_deleted = false AND t.status = 'done') as done_count + FROM projects p + JOIN domains d ON p.domain_id = d.id + LEFT JOIN areas a ON p.area_id = a.id + WHERE p.is_deleted = false + ORDER BY d.sort_order, d.name, a.sort_order, a.name, p.sort_order, p.name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 8.946s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT * FROM domains + WHERE is_deleted = false + ORDER BY sort_order ASC + LIMIT $1 OFFSET $2 + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 9.91s ago] (50, 0) +INFO sqlalchemy.engine.Engine:base.py:2707 COMMIT +______ test_get_with_fake_id_returns_404[404 /projects/{project_id}/edit] ______ + + Exception Group Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 76, in collapse_excgroups + | yield + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 186, in __call__ + | async with anyio.create_task_group() as task_group: + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 783, in __aexit__ + | raise BaseExceptionGroup( + | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) + +-+---------------- 1 ---------------- + | Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 353, in from_call + | result: TResult | None = func() + | ^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 245, in + | lambda: runtest_hook(item=item, **kwds), + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/logging.py", line 850, in pytest_runtest_call + | yield + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/capture.py", line 900, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/skipping.py", line 268, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 179, in pytest_runtest_call + | item.runtest() + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 469, in runtest + | super().runtest() + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 1720, in runtest + | self.ihook.pytest_pyfunc_call(pyfuncitem=self) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper + | return result.get_result() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_result.py", line 103, in get_result + | raise exc.with_traceback(tb) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper + | res = yield + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 166, in pytest_pyfunc_call + | result = testfunction(**testargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 716, in inner + | runner.run(coro, context=context) + | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run + | return self._loop.run_until_complete(task) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete + | return future.result() + | ^^^^^^^^^^^^^^^ + | File "/app/tests/test_smoke_dynamic.py", line 74, in test_get_with_fake_id_returns_404 + | r = await client.get(path, follow_redirects=True) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + | return await self.request( + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + | return await self.send(request, auth=auth, follow_redirects=follow_redirects) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + | response = await self._send_handling_auth( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + | response = await self._send_handling_redirects( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + | response = await self._send_single_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + | response = await transport.handle_async_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + | await super().__call__(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + | await self.app(scope, receive, _send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + | with collapse_excgroups(): + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + | self.gen.throw(value) + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + | response = await self.dispatch_func(request, call_next) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/main.py", line 79, in add_request_context + | response = await call_next(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + | raise app_exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + | await self.app(scope, receive_or_disconnect, send_no_error) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + | await route.handle(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + | await wrap_app_handling_exceptions(app, request)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + | response = await f(request) + | ^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + | raw_response = await run_endpoint_function( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + | return await dependant.call(**values) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/routers/projects.py", line 196, in edit_form + | sidebar = await get_sidebar_data(db) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/core/sidebar.py", line 14, in get_sidebar_data + | result = await db.execute(text(""" + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + | result = await greenlet_spawn( + | ^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + | result = context.throw(*sys.exc_info()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + | return self._execute_internal( + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + | conn = self._connection_for_bind(bind) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + | return trans._connection_for_bind(engine, execution_options) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "", line 2, in _connection_for_bind + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + | ret_value = fn(self, *arg, **kw) + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + | conn = bind.connect() + | ^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + | return self._connection_cls(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + | self._dbapi_connection = engine.raw_connection() + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + | return self.pool.connect() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + | return _ConnectionFairy._checkout(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + | with util.safe_reraise(): + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + | raise exc_value.with_traceback(exc_tb) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + | result = pool._dialect._do_ping_w_event( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + | return self.do_ping(dbapi_connection) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + | dbapi_connection.ping() + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + | self._handle_exception(error) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + | raise error + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + | _ = self.await_(self._async_ping()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + | value = await result + | ^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + | await tr.start() + | File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + | await self._connection.execute(query) + | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + | result = await self._protocol.query(query, timeout) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "asyncpg/protocol/protocol.pyx", line 375, in query + | RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +------------------------------------ + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/app/tests/test_smoke_dynamic.py", line 74, in test_get_with_fake_id_returns_404 + r = await client.get(path, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + return await self.request( + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + response = await self._send_handling_auth( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + response = await self._send_handling_redirects( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + await self.app(scope, receive, _send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + self.gen.throw(value) + File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/main.py", line 79, in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + raise app_exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + await self.app(scope, receive_or_disconnect, send_no_error) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + await route.handle(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + response = await f(request) + ^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/routers/projects.py", line 196, in edit_form + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/core/sidebar.py", line 14, in get_sidebar_data + result = await db.execute(text(""" + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + result = await greenlet_spawn( + ^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + return self._execute_internal( + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 2, in _connection_for_bind + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + raise exc_value.with_traceback(exc_tb) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + result = pool._dialect._do_ping_w_event( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + dbapi_connection.ping() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + self._handle_exception(error) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + raise error + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + await tr.start() + File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + await self._connection.execute(query) + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "asyncpg/protocol/protocol.pyx", line 375, in query +RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +During handling of the above exception, another exception occurred: +tests/test_smoke_dynamic.py:74: in test_get_with_fake_id_returns_404 + r = await client.get(path, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1768: in get + return await self.request( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1540: in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1629: in send + response = await self._send_handling_auth( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1657: in _send_handling_auth + response = await self._send_handling_redirects( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1694: in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1730: in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py:170: in handle_async_request + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/fastapi/applications.py:1054: in __call__ + await super().__call__(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/applications.py:113: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:187: in __call__ + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:165: in __call__ + await self.app(scope, receive, _send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:185: in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/contextlib.py:158: in __exit__ + self.gen.throw(value) +/usr/local/lib/python3.12/site-packages/starlette/_utils.py:82: in collapse_excgroups + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:187: in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +main.py:79: in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:163: in call_next + raise app_exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149: in coro + await self.app(scope, receive_or_disconnect, send_no_error) +/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py:62: in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:715: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:735: in app + await route.handle(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:288: in handle + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:76: in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:73: in app + response = await f(request) + ^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:301: in app + raw_response = await run_endpoint_function( +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:212: in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +routers/projects.py:196: in edit_form + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +core/sidebar.py:14: in get_sidebar_data + result = await db.execute(text(""" +/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py:461: in execute + result = await greenlet_spawn( +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2362: in execute + return self._execute_internal( +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2237: in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2106: in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +:2: in _connection_for_bind + ??? +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py:139: in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:1189: in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3278: in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:146: in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3302: in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:449: in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1362: in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py:146: in __exit__ + raise exc_value.with_traceback(exc_tb) +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1300: in _checkout + result = pool._dialect._do_ping_w_event( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py:716: in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:1150: in do_ping + dbapi_connection.ping() +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:801: in ping + self._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:782: in _handle_exception + raise error +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:799: in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn + value = await result + ^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:808: in _async_ping + await tr.start() +/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py:146: in start + await self._connection.execute(query) +/usr/local/lib/python3.12/site-packages/asyncpg/connection.py:349: in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +asyncpg/protocol/protocol.pyx:375: in query + ??? +E RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +------------------------------ Captured log call ------------------------------- +ERROR sqlalchemy.pool.impl.AsyncAdaptedQueuePool:base.py:378 Exception terminating connection > +Traceback (most recent call last): + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection + self._dialect.do_terminate(connection) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1117, in do_terminate + dbapi_connection.terminate() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 895, in terminate + self.await_(self._connection.close(timeout=2)) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1504, in close + await self._protocol.close(timeout) + File "asyncpg/protocol/protocol.pyx", line 627, in close + File "asyncpg/protocol/protocol.pyx", line 660, in asyncpg.protocol.protocol.BaseProtocol._request_cancel + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1673, in _cancel_current_command + self._cancellations.add(self._loop.create_task(self._cancel(waiter))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 455, in create_task + self._check_closed() + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 545, in _check_closed + raise RuntimeError('Event loop is closed') +RuntimeError: Event loop is closed +___________ test_get_with_fake_id_returns_404[404 /tasks/{task_id}] ____________ +tests/test_smoke_dynamic.py:75: in test_get_with_fake_id_returns_404 + assert r.status_code in (404, 302, 303), \ +E AssertionError: GET /tasks/00000000-0000-0000-0000-000000000000 returned 200, expected 404 or redirect +E assert 200 in (404, 302, 303) +E + where 200 = .status_code +----------------------------- Captured stdout call ----------------------------- +2026-03-01 14:01:36,040 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-01 14:01:36,040 INFO sqlalchemy.engine.Engine + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:36,040 INFO sqlalchemy.engine.Engine [cached since 10.43s ago] () +2026-03-01 14:01:36,046 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:36,046 INFO sqlalchemy.engine.Engine [cached since 10.43s ago] () +2026-03-01 14:01:36,049 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +2026-03-01 14:01:36,049 INFO sqlalchemy.engine.Engine [cached since 10.43s ago] () +2026-03-01 14:01:36,052 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +2026-03-01 14:01:36,052 INFO sqlalchemy.engine.Engine [cached since 10.43s ago] () +2026-03-01 14:01:36,055 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +2026-03-01 14:01:36,055 INFO sqlalchemy.engine.Engine [cached since 10.43s ago] () +2026-03-01 14:01:36,058 INFO sqlalchemy.engine.Engine SELECT * FROM tasks WHERE id = $1 +2026-03-01 14:01:36,058 INFO sqlalchemy.engine.Engine [generated in 0.00014s] ('00000000-0000-0000-0000-000000000000',) +2026-03-01 14:01:36,063 INFO sqlalchemy.engine.Engine COMMIT +2026-03-01 14:01:36,065 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-01 14:01:36,066 INFO sqlalchemy.engine.Engine + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:36,066 INFO sqlalchemy.engine.Engine [cached since 10.45s ago] () +2026-03-01 14:01:36,066 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:36,066 INFO sqlalchemy.engine.Engine [cached since 10.45s ago] () +2026-03-01 14:01:36,067 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +2026-03-01 14:01:36,067 INFO sqlalchemy.engine.Engine [cached since 10.44s ago] () +2026-03-01 14:01:36,067 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +2026-03-01 14:01:36,067 INFO sqlalchemy.engine.Engine [cached since 10.44s ago] () +2026-03-01 14:01:36,067 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +2026-03-01 14:01:36,067 INFO sqlalchemy.engine.Engine [cached since 10.44s ago] () +2026-03-01 14:01:36,068 INFO sqlalchemy.engine.Engine + SELECT t.*, + d.name as domain_name, d.color as domain_color, + p.name as project_name + FROM tasks t + LEFT JOIN domains d ON t.domain_id = d.id + LEFT JOIN projects p ON t.project_id = p.id + WHERE t.is_deleted = false + ORDER BY + CASE WHEN t.status = 'done' THEN 1 WHEN t.status = 'cancelled' THEN 2 ELSE 0 END, + t.sort_order, t.created_at + +2026-03-01 14:01:36,068 INFO sqlalchemy.engine.Engine [cached since 8.826s ago] () +2026-03-01 14:01:36,075 INFO sqlalchemy.engine.Engine + SELECT * FROM domains + WHERE is_deleted = false + ORDER BY sort_order ASC + LIMIT $1 OFFSET $2 + +2026-03-01 14:01:36,075 INFO sqlalchemy.engine.Engine [cached since 10.37s ago] (50, 0) +2026-03-01 14:01:36,076 INFO sqlalchemy.engine.Engine + SELECT * FROM projects + WHERE is_deleted = false + ORDER BY sort_order ASC + LIMIT $1 OFFSET $2 + +2026-03-01 14:01:36,076 INFO sqlalchemy.engine.Engine [cached since 8.829s ago] (50, 0) +2026-03-01 14:01:36,077 INFO sqlalchemy.engine.Engine SELECT value, label FROM context_types WHERE is_deleted = false ORDER BY sort_order +2026-03-01 14:01:36,077 INFO sqlalchemy.engine.Engine [cached since 8.829s ago] () +2026-03-01 14:01:36,079 INFO sqlalchemy.engine.Engine SELECT task_id FROM time_entries WHERE end_at IS NULL AND is_deleted = false LIMIT 1 +2026-03-01 14:01:36,079 INFO sqlalchemy.engine.Engine [cached since 8.83s ago] () +2026-03-01 14:01:36,081 INFO sqlalchemy.engine.Engine COMMIT +------------------------------ Captured log call ------------------------------- +INFO sqlalchemy.engine.Engine:base.py:2701 BEGIN (implicit) +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 10.43s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 10.43s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 10.43s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 10.43s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 10.43s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 SELECT * FROM tasks WHERE id = $1 +INFO sqlalchemy.engine.Engine:base.py:1846 [generated in 0.00014s] ('00000000-0000-0000-0000-000000000000',) +INFO sqlalchemy.engine.Engine:base.py:2707 COMMIT +INFO sqlalchemy.engine.Engine:base.py:2701 BEGIN (implicit) +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 10.45s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 10.45s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 10.44s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 10.44s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 10.44s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT t.*, + d.name as domain_name, d.color as domain_color, + p.name as project_name + FROM tasks t + LEFT JOIN domains d ON t.domain_id = d.id + LEFT JOIN projects p ON t.project_id = p.id + WHERE t.is_deleted = false + ORDER BY + CASE WHEN t.status = 'done' THEN 1 WHEN t.status = 'cancelled' THEN 2 ELSE 0 END, + t.sort_order, t.created_at + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 8.826s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT * FROM domains + WHERE is_deleted = false + ORDER BY sort_order ASC + LIMIT $1 OFFSET $2 + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 10.37s ago] (50, 0) +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT * FROM projects + WHERE is_deleted = false + ORDER BY sort_order ASC + LIMIT $1 OFFSET $2 + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 8.829s ago] (50, 0) +INFO sqlalchemy.engine.Engine:base.py:1846 SELECT value, label FROM context_types WHERE is_deleted = false ORDER BY sort_order +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 8.829s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 SELECT task_id FROM time_entries WHERE end_at IS NULL AND is_deleted = false LIMIT 1 +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 8.83s ago] () +INFO sqlalchemy.engine.Engine:base.py:2707 COMMIT +_________ test_get_with_fake_id_returns_404[404 /tasks/{task_id}/edit] _________ + + Exception Group Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 76, in collapse_excgroups + | yield + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 186, in __call__ + | async with anyio.create_task_group() as task_group: + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 783, in __aexit__ + | raise BaseExceptionGroup( + | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) + +-+---------------- 1 ---------------- + | Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 353, in from_call + | result: TResult | None = func() + | ^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 245, in + | lambda: runtest_hook(item=item, **kwds), + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/logging.py", line 850, in pytest_runtest_call + | yield + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/capture.py", line 900, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/skipping.py", line 268, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 179, in pytest_runtest_call + | item.runtest() + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 469, in runtest + | super().runtest() + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 1720, in runtest + | self.ihook.pytest_pyfunc_call(pyfuncitem=self) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper + | return result.get_result() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_result.py", line 103, in get_result + | raise exc.with_traceback(tb) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper + | res = yield + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 166, in pytest_pyfunc_call + | result = testfunction(**testargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 716, in inner + | runner.run(coro, context=context) + | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run + | return self._loop.run_until_complete(task) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete + | return future.result() + | ^^^^^^^^^^^^^^^ + | File "/app/tests/test_smoke_dynamic.py", line 74, in test_get_with_fake_id_returns_404 + | r = await client.get(path, follow_redirects=True) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + | return await self.request( + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + | return await self.send(request, auth=auth, follow_redirects=follow_redirects) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + | response = await self._send_handling_auth( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + | response = await self._send_handling_redirects( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + | response = await self._send_single_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + | response = await transport.handle_async_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + | await super().__call__(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + | await self.app(scope, receive, _send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + | with collapse_excgroups(): + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + | self.gen.throw(value) + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + | response = await self.dispatch_func(request, call_next) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/main.py", line 79, in add_request_context + | response = await call_next(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + | raise app_exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + | await self.app(scope, receive_or_disconnect, send_no_error) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + | await route.handle(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + | await wrap_app_handling_exceptions(app, request)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + | response = await f(request) + | ^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + | raw_response = await run_endpoint_function( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + | return await dependant.call(**values) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/routers/tasks.py", line 236, in edit_form + | sidebar = await get_sidebar_data(db) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/core/sidebar.py", line 14, in get_sidebar_data + | result = await db.execute(text(""" + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + | result = await greenlet_spawn( + | ^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + | result = context.throw(*sys.exc_info()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + | return self._execute_internal( + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + | conn = self._connection_for_bind(bind) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + | return trans._connection_for_bind(engine, execution_options) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "", line 2, in _connection_for_bind + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + | ret_value = fn(self, *arg, **kw) + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + | conn = bind.connect() + | ^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + | return self._connection_cls(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + | self._dbapi_connection = engine.raw_connection() + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + | return self.pool.connect() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + | return _ConnectionFairy._checkout(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + | with util.safe_reraise(): + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + | raise exc_value.with_traceback(exc_tb) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + | result = pool._dialect._do_ping_w_event( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + | return self.do_ping(dbapi_connection) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + | dbapi_connection.ping() + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + | self._handle_exception(error) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + | raise error + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + | _ = self.await_(self._async_ping()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + | value = await result + | ^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + | await tr.start() + | File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + | await self._connection.execute(query) + | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + | result = await self._protocol.query(query, timeout) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "asyncpg/protocol/protocol.pyx", line 375, in query + | RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +------------------------------------ + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/app/tests/test_smoke_dynamic.py", line 74, in test_get_with_fake_id_returns_404 + r = await client.get(path, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + return await self.request( + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + response = await self._send_handling_auth( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + response = await self._send_handling_redirects( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + await self.app(scope, receive, _send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + self.gen.throw(value) + File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/main.py", line 79, in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + raise app_exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + await self.app(scope, receive_or_disconnect, send_no_error) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + await route.handle(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + response = await f(request) + ^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/routers/tasks.py", line 236, in edit_form + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/core/sidebar.py", line 14, in get_sidebar_data + result = await db.execute(text(""" + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + result = await greenlet_spawn( + ^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + return self._execute_internal( + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 2, in _connection_for_bind + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + raise exc_value.with_traceback(exc_tb) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + result = pool._dialect._do_ping_w_event( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + dbapi_connection.ping() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + self._handle_exception(error) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + raise error + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + await tr.start() + File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + await self._connection.execute(query) + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "asyncpg/protocol/protocol.pyx", line 375, in query +RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +During handling of the above exception, another exception occurred: +tests/test_smoke_dynamic.py:74: in test_get_with_fake_id_returns_404 + r = await client.get(path, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1768: in get + return await self.request( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1540: in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1629: in send + response = await self._send_handling_auth( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1657: in _send_handling_auth + response = await self._send_handling_redirects( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1694: in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1730: in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py:170: in handle_async_request + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/fastapi/applications.py:1054: in __call__ + await super().__call__(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/applications.py:113: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:187: in __call__ + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:165: in __call__ + await self.app(scope, receive, _send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:185: in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/contextlib.py:158: in __exit__ + self.gen.throw(value) +/usr/local/lib/python3.12/site-packages/starlette/_utils.py:82: in collapse_excgroups + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:187: in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +main.py:79: in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:163: in call_next + raise app_exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149: in coro + await self.app(scope, receive_or_disconnect, send_no_error) +/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py:62: in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:715: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:735: in app + await route.handle(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:288: in handle + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:76: in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:73: in app + response = await f(request) + ^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:301: in app + raw_response = await run_endpoint_function( +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:212: in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +routers/tasks.py:236: in edit_form + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +core/sidebar.py:14: in get_sidebar_data + result = await db.execute(text(""" +/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py:461: in execute + result = await greenlet_spawn( +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2362: in execute + return self._execute_internal( +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2237: in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2106: in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +:2: in _connection_for_bind + ??? +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py:139: in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:1189: in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3278: in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:146: in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3302: in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:449: in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1362: in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py:146: in __exit__ + raise exc_value.with_traceback(exc_tb) +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1300: in _checkout + result = pool._dialect._do_ping_w_event( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py:716: in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:1150: in do_ping + dbapi_connection.ping() +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:801: in ping + self._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:782: in _handle_exception + raise error +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:799: in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn + value = await result + ^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:808: in _async_ping + await tr.start() +/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py:146: in start + await self._connection.execute(query) +/usr/local/lib/python3.12/site-packages/asyncpg/connection.py:349: in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +asyncpg/protocol/protocol.pyx:375: in query + ??? +E RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +------------------------------ Captured log call ------------------------------- +ERROR sqlalchemy.pool.impl.AsyncAdaptedQueuePool:base.py:378 Exception terminating connection > +Traceback (most recent call last): + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection + self._dialect.do_terminate(connection) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1117, in do_terminate + dbapi_connection.terminate() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 895, in terminate + self.await_(self._connection.close(timeout=2)) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1504, in close + await self._protocol.close(timeout) + File "asyncpg/protocol/protocol.pyx", line 627, in close + File "asyncpg/protocol/protocol.pyx", line 660, in asyncpg.protocol.protocol.BaseProtocol._request_cancel + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1673, in _cancel_current_command + self._cancellations.add(self._loop.create_task(self._cancel(waiter))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 455, in create_task + self._check_closed() + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 545, in _check_closed + raise RuntimeError('Event loop is closed') +RuntimeError: Event loop is closed +___________ test_get_with_fake_id_returns_404[404 /notes/{note_id}] ____________ +tests/test_smoke_dynamic.py:75: in test_get_with_fake_id_returns_404 + assert r.status_code in (404, 302, 303), \ +E AssertionError: GET /notes/00000000-0000-0000-0000-000000000000 returned 200, expected 404 or redirect +E assert 200 in (404, 302, 303) +E + where 200 = .status_code +----------------------------- Captured stdout call ----------------------------- +2026-03-01 14:01:36,699 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-01 14:01:36,699 INFO sqlalchemy.engine.Engine + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:36,699 INFO sqlalchemy.engine.Engine [cached since 11.09s ago] () +2026-03-01 14:01:36,706 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:36,707 INFO sqlalchemy.engine.Engine [cached since 11.09s ago] () +2026-03-01 14:01:36,709 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +2026-03-01 14:01:36,709 INFO sqlalchemy.engine.Engine [cached since 11.09s ago] () +2026-03-01 14:01:36,713 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +2026-03-01 14:01:36,714 INFO sqlalchemy.engine.Engine [cached since 11.09s ago] () +2026-03-01 14:01:36,716 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +2026-03-01 14:01:36,717 INFO sqlalchemy.engine.Engine [cached since 11.09s ago] () +2026-03-01 14:01:36,719 INFO sqlalchemy.engine.Engine SELECT * FROM notes WHERE id = $1 +2026-03-01 14:01:36,719 INFO sqlalchemy.engine.Engine [generated in 0.00011s] ('00000000-0000-0000-0000-000000000000',) +2026-03-01 14:01:36,722 INFO sqlalchemy.engine.Engine COMMIT +2026-03-01 14:01:36,725 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-01 14:01:36,725 INFO sqlalchemy.engine.Engine + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:36,725 INFO sqlalchemy.engine.Engine [cached since 11.11s ago] () +2026-03-01 14:01:36,726 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:36,726 INFO sqlalchemy.engine.Engine [cached since 11.11s ago] () +2026-03-01 14:01:36,726 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +2026-03-01 14:01:36,727 INFO sqlalchemy.engine.Engine [cached since 11.1s ago] () +2026-03-01 14:01:36,727 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +2026-03-01 14:01:36,727 INFO sqlalchemy.engine.Engine [cached since 11.1s ago] () +2026-03-01 14:01:36,727 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +2026-03-01 14:01:36,727 INFO sqlalchemy.engine.Engine [cached since 11.1s ago] () +2026-03-01 14:01:36,728 INFO sqlalchemy.engine.Engine + SELECT n.*, d.name as domain_name, d.color as domain_color, + p.name as project_name + FROM notes n + LEFT JOIN domains d ON n.domain_id = d.id + LEFT JOIN projects p ON n.project_id = p.id + WHERE n.is_deleted = false + ORDER BY n.updated_at DESC + +2026-03-01 14:01:36,728 INFO sqlalchemy.engine.Engine [cached since 9.044s ago] () +2026-03-01 14:01:36,735 INFO sqlalchemy.engine.Engine + SELECT * FROM domains + WHERE is_deleted = false + ORDER BY sort_order ASC + LIMIT $1 OFFSET $2 + +2026-03-01 14:01:36,735 INFO sqlalchemy.engine.Engine [cached since 11.03s ago] (50, 0) +2026-03-01 14:01:36,736 INFO sqlalchemy.engine.Engine COMMIT +------------------------------ Captured log call ------------------------------- +INFO sqlalchemy.engine.Engine:base.py:2701 BEGIN (implicit) +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 11.09s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 11.09s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 11.09s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 11.09s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 11.09s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 SELECT * FROM notes WHERE id = $1 +INFO sqlalchemy.engine.Engine:base.py:1846 [generated in 0.00011s] ('00000000-0000-0000-0000-000000000000',) +INFO sqlalchemy.engine.Engine:base.py:2707 COMMIT +INFO sqlalchemy.engine.Engine:base.py:2701 BEGIN (implicit) +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 11.11s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 11.11s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 11.1s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 11.1s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 11.1s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT n.*, d.name as domain_name, d.color as domain_color, + p.name as project_name + FROM notes n + LEFT JOIN domains d ON n.domain_id = d.id + LEFT JOIN projects p ON n.project_id = p.id + WHERE n.is_deleted = false + ORDER BY n.updated_at DESC + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 9.044s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT * FROM domains + WHERE is_deleted = false + ORDER BY sort_order ASC + LIMIT $1 OFFSET $2 + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 11.03s ago] (50, 0) +INFO sqlalchemy.engine.Engine:base.py:2707 COMMIT +_________ test_get_with_fake_id_returns_404[404 /notes/{note_id}/edit] _________ + + Exception Group Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 76, in collapse_excgroups + | yield + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 186, in __call__ + | async with anyio.create_task_group() as task_group: + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 783, in __aexit__ + | raise BaseExceptionGroup( + | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) + +-+---------------- 1 ---------------- + | Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 353, in from_call + | result: TResult | None = func() + | ^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 245, in + | lambda: runtest_hook(item=item, **kwds), + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/logging.py", line 850, in pytest_runtest_call + | yield + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/capture.py", line 900, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/skipping.py", line 268, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 179, in pytest_runtest_call + | item.runtest() + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 469, in runtest + | super().runtest() + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 1720, in runtest + | self.ihook.pytest_pyfunc_call(pyfuncitem=self) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper + | return result.get_result() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_result.py", line 103, in get_result + | raise exc.with_traceback(tb) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper + | res = yield + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 166, in pytest_pyfunc_call + | result = testfunction(**testargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 716, in inner + | runner.run(coro, context=context) + | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run + | return self._loop.run_until_complete(task) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete + | return future.result() + | ^^^^^^^^^^^^^^^ + | File "/app/tests/test_smoke_dynamic.py", line 74, in test_get_with_fake_id_returns_404 + | r = await client.get(path, follow_redirects=True) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + | return await self.request( + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + | return await self.send(request, auth=auth, follow_redirects=follow_redirects) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + | response = await self._send_handling_auth( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + | response = await self._send_handling_redirects( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + | response = await self._send_single_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + | response = await transport.handle_async_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + | await super().__call__(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + | await self.app(scope, receive, _send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + | with collapse_excgroups(): + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + | self.gen.throw(value) + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + | response = await self.dispatch_func(request, call_next) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/main.py", line 79, in add_request_context + | response = await call_next(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + | raise app_exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + | await self.app(scope, receive_or_disconnect, send_no_error) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + | await route.handle(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + | await wrap_app_handling_exceptions(app, request)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + | response = await f(request) + | ^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + | raw_response = await run_endpoint_function( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + | return await dependant.call(**values) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/routers/notes.py", line 135, in edit_form + | sidebar = await get_sidebar_data(db) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/core/sidebar.py", line 14, in get_sidebar_data + | result = await db.execute(text(""" + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + | result = await greenlet_spawn( + | ^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + | result = context.throw(*sys.exc_info()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + | return self._execute_internal( + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + | conn = self._connection_for_bind(bind) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + | return trans._connection_for_bind(engine, execution_options) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "", line 2, in _connection_for_bind + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + | ret_value = fn(self, *arg, **kw) + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + | conn = bind.connect() + | ^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + | return self._connection_cls(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + | self._dbapi_connection = engine.raw_connection() + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + | return self.pool.connect() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + | return _ConnectionFairy._checkout(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + | with util.safe_reraise(): + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + | raise exc_value.with_traceback(exc_tb) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + | result = pool._dialect._do_ping_w_event( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + | return self.do_ping(dbapi_connection) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + | dbapi_connection.ping() + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + | self._handle_exception(error) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + | raise error + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + | _ = self.await_(self._async_ping()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + | value = await result + | ^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + | await tr.start() + | File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + | await self._connection.execute(query) + | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + | result = await self._protocol.query(query, timeout) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "asyncpg/protocol/protocol.pyx", line 375, in query + | RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +------------------------------------ + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/app/tests/test_smoke_dynamic.py", line 74, in test_get_with_fake_id_returns_404 + r = await client.get(path, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + return await self.request( + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + response = await self._send_handling_auth( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + response = await self._send_handling_redirects( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + await self.app(scope, receive, _send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + self.gen.throw(value) + File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/main.py", line 79, in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + raise app_exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + await self.app(scope, receive_or_disconnect, send_no_error) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + await route.handle(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + response = await f(request) + ^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/routers/notes.py", line 135, in edit_form + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/core/sidebar.py", line 14, in get_sidebar_data + result = await db.execute(text(""" + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + result = await greenlet_spawn( + ^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + return self._execute_internal( + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 2, in _connection_for_bind + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + raise exc_value.with_traceback(exc_tb) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + result = pool._dialect._do_ping_w_event( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + dbapi_connection.ping() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + self._handle_exception(error) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + raise error + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + await tr.start() + File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + await self._connection.execute(query) + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "asyncpg/protocol/protocol.pyx", line 375, in query +RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +During handling of the above exception, another exception occurred: +tests/test_smoke_dynamic.py:74: in test_get_with_fake_id_returns_404 + r = await client.get(path, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1768: in get + return await self.request( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1540: in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1629: in send + response = await self._send_handling_auth( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1657: in _send_handling_auth + response = await self._send_handling_redirects( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1694: in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1730: in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py:170: in handle_async_request + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/fastapi/applications.py:1054: in __call__ + await super().__call__(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/applications.py:113: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:187: in __call__ + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:165: in __call__ + await self.app(scope, receive, _send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:185: in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/contextlib.py:158: in __exit__ + self.gen.throw(value) +/usr/local/lib/python3.12/site-packages/starlette/_utils.py:82: in collapse_excgroups + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:187: in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +main.py:79: in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:163: in call_next + raise app_exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149: in coro + await self.app(scope, receive_or_disconnect, send_no_error) +/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py:62: in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:715: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:735: in app + await route.handle(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:288: in handle + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:76: in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:73: in app + response = await f(request) + ^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:301: in app + raw_response = await run_endpoint_function( +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:212: in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +routers/notes.py:135: in edit_form + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +core/sidebar.py:14: in get_sidebar_data + result = await db.execute(text(""" +/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py:461: in execute + result = await greenlet_spawn( +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2362: in execute + return self._execute_internal( +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2237: in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2106: in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +:2: in _connection_for_bind + ??? +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py:139: in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:1189: in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3278: in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:146: in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3302: in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:449: in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1362: in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py:146: in __exit__ + raise exc_value.with_traceback(exc_tb) +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1300: in _checkout + result = pool._dialect._do_ping_w_event( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py:716: in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:1150: in do_ping + dbapi_connection.ping() +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:801: in ping + self._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:782: in _handle_exception + raise error +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:799: in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn + value = await result + ^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:808: in _async_ping + await tr.start() +/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py:146: in start + await self._connection.execute(query) +/usr/local/lib/python3.12/site-packages/asyncpg/connection.py:349: in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +asyncpg/protocol/protocol.pyx:375: in query + ??? +E RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +------------------------------ Captured log call ------------------------------- +ERROR sqlalchemy.pool.impl.AsyncAdaptedQueuePool:base.py:378 Exception terminating connection > +Traceback (most recent call last): + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection + self._dialect.do_terminate(connection) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1117, in do_terminate + dbapi_connection.terminate() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 895, in terminate + self.await_(self._connection.close(timeout=2)) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1504, in close + await self._protocol.close(timeout) + File "asyncpg/protocol/protocol.pyx", line 627, in close + File "asyncpg/protocol/protocol.pyx", line 660, in asyncpg.protocol.protocol.BaseProtocol._request_cancel + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1673, in _cancel_current_command + self._cancellations.add(self._loop.create_task(self._cancel(waiter))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 455, in create_task + self._check_closed() + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 545, in _check_closed + raise RuntimeError('Event loop is closed') +RuntimeError: Event loop is closed +_________ test_get_with_fake_id_returns_404[404 /links/{link_id}/edit] _________ +tests/test_smoke_dynamic.py:75: in test_get_with_fake_id_returns_404 + assert r.status_code in (404, 302, 303), \ +E AssertionError: GET /links/00000000-0000-0000-0000-000000000000/edit returned 200, expected 404 or redirect +E assert 200 in (404, 302, 303) +E + where 200 = .status_code +----------------------------- Captured stdout call ----------------------------- +2026-03-01 14:01:37,238 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-01 14:01:37,238 INFO sqlalchemy.engine.Engine + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:37,239 INFO sqlalchemy.engine.Engine [cached since 11.63s ago] () +2026-03-01 14:01:37,246 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:37,246 INFO sqlalchemy.engine.Engine [cached since 11.63s ago] () +2026-03-01 14:01:37,249 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +2026-03-01 14:01:37,249 INFO sqlalchemy.engine.Engine [cached since 11.63s ago] () +2026-03-01 14:01:37,253 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +2026-03-01 14:01:37,253 INFO sqlalchemy.engine.Engine [cached since 11.63s ago] () +2026-03-01 14:01:37,256 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +2026-03-01 14:01:37,256 INFO sqlalchemy.engine.Engine [cached since 11.63s ago] () +2026-03-01 14:01:37,259 INFO sqlalchemy.engine.Engine SELECT * FROM links WHERE id = $1 +2026-03-01 14:01:37,259 INFO sqlalchemy.engine.Engine [generated in 0.00021s] ('00000000-0000-0000-0000-000000000000',) +2026-03-01 14:01:37,263 INFO sqlalchemy.engine.Engine COMMIT +2026-03-01 14:01:37,268 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-01 14:01:37,268 INFO sqlalchemy.engine.Engine + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:37,268 INFO sqlalchemy.engine.Engine [cached since 11.65s ago] () +2026-03-01 14:01:37,269 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:37,269 INFO sqlalchemy.engine.Engine [cached since 11.65s ago] () +2026-03-01 14:01:37,270 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +2026-03-01 14:01:37,270 INFO sqlalchemy.engine.Engine [cached since 11.65s ago] () +2026-03-01 14:01:37,271 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +2026-03-01 14:01:37,271 INFO sqlalchemy.engine.Engine [cached since 11.64s ago] () +2026-03-01 14:01:37,272 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +2026-03-01 14:01:37,272 INFO sqlalchemy.engine.Engine [cached since 11.64s ago] () +2026-03-01 14:01:37,273 INFO sqlalchemy.engine.Engine + SELECT l.*, d.name as domain_name, d.color as domain_color, p.name as project_name + FROM links l + LEFT JOIN domains d ON l.domain_id = d.id + LEFT JOIN projects p ON l.project_id = p.id + WHERE l.is_deleted = false ORDER BY l.sort_order, l.created_at + +2026-03-01 14:01:37,273 INFO sqlalchemy.engine.Engine [cached since 9.14s ago] () +2026-03-01 14:01:37,279 INFO sqlalchemy.engine.Engine + SELECT * FROM domains + WHERE is_deleted = false + ORDER BY sort_order ASC + LIMIT $1 OFFSET $2 + +2026-03-01 14:01:37,279 INFO sqlalchemy.engine.Engine [cached since 11.57s ago] (50, 0) +2026-03-01 14:01:37,281 INFO sqlalchemy.engine.Engine COMMIT +------------------------------ Captured log call ------------------------------- +INFO sqlalchemy.engine.Engine:base.py:2701 BEGIN (implicit) +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 11.63s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 11.63s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 11.63s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 11.63s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 11.63s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 SELECT * FROM links WHERE id = $1 +INFO sqlalchemy.engine.Engine:base.py:1846 [generated in 0.00021s] ('00000000-0000-0000-0000-000000000000',) +INFO sqlalchemy.engine.Engine:base.py:2707 COMMIT +INFO sqlalchemy.engine.Engine:base.py:2701 BEGIN (implicit) +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 11.65s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 11.65s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 11.65s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 11.64s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 11.64s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT l.*, d.name as domain_name, d.color as domain_color, p.name as project_name + FROM links l + LEFT JOIN domains d ON l.domain_id = d.id + LEFT JOIN projects p ON l.project_id = p.id + WHERE l.is_deleted = false ORDER BY l.sort_order, l.created_at + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 9.14s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT * FROM domains + WHERE is_deleted = false + ORDER BY sort_order ASC + LIMIT $1 OFFSET $2 + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 11.57s ago] (50, 0) +INFO sqlalchemy.engine.Engine:base.py:2707 COMMIT +________ test_get_with_fake_id_returns_404[404 /contacts/{contact_id}] _________ + + Exception Group Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 76, in collapse_excgroups + | yield + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 186, in __call__ + | async with anyio.create_task_group() as task_group: + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 783, in __aexit__ + | raise BaseExceptionGroup( + | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) + +-+---------------- 1 ---------------- + | Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 353, in from_call + | result: TResult | None = func() + | ^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 245, in + | lambda: runtest_hook(item=item, **kwds), + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/logging.py", line 850, in pytest_runtest_call + | yield + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/capture.py", line 900, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/skipping.py", line 268, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 179, in pytest_runtest_call + | item.runtest() + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 469, in runtest + | super().runtest() + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 1720, in runtest + | self.ihook.pytest_pyfunc_call(pyfuncitem=self) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper + | return result.get_result() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_result.py", line 103, in get_result + | raise exc.with_traceback(tb) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper + | res = yield + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 166, in pytest_pyfunc_call + | result = testfunction(**testargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 716, in inner + | runner.run(coro, context=context) + | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run + | return self._loop.run_until_complete(task) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete + | return future.result() + | ^^^^^^^^^^^^^^^ + | File "/app/tests/test_smoke_dynamic.py", line 74, in test_get_with_fake_id_returns_404 + | r = await client.get(path, follow_redirects=True) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + | return await self.request( + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + | return await self.send(request, auth=auth, follow_redirects=follow_redirects) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + | response = await self._send_handling_auth( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + | response = await self._send_handling_redirects( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + | response = await self._send_single_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + | response = await transport.handle_async_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + | await super().__call__(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + | await self.app(scope, receive, _send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + | with collapse_excgroups(): + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + | self.gen.throw(value) + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + | response = await self.dispatch_func(request, call_next) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/main.py", line 79, in add_request_context + | response = await call_next(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + | raise app_exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + | await self.app(scope, receive_or_disconnect, send_no_error) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + | await route.handle(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + | await wrap_app_handling_exceptions(app, request)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + | response = await f(request) + | ^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + | raw_response = await run_endpoint_function( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + | return await dependant.call(**values) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/routers/contacts.py", line 70, in contact_detail + | sidebar = await get_sidebar_data(db) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/core/sidebar.py", line 14, in get_sidebar_data + | result = await db.execute(text(""" + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + | result = await greenlet_spawn( + | ^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + | result = context.throw(*sys.exc_info()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + | return self._execute_internal( + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + | conn = self._connection_for_bind(bind) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + | return trans._connection_for_bind(engine, execution_options) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "", line 2, in _connection_for_bind + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + | ret_value = fn(self, *arg, **kw) + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + | conn = bind.connect() + | ^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + | return self._connection_cls(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + | self._dbapi_connection = engine.raw_connection() + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + | return self.pool.connect() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + | return _ConnectionFairy._checkout(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + | with util.safe_reraise(): + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + | raise exc_value.with_traceback(exc_tb) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + | result = pool._dialect._do_ping_w_event( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + | return self.do_ping(dbapi_connection) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + | dbapi_connection.ping() + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + | self._handle_exception(error) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + | raise error + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + | _ = self.await_(self._async_ping()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + | value = await result + | ^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + | await tr.start() + | File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + | await self._connection.execute(query) + | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + | result = await self._protocol.query(query, timeout) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "asyncpg/protocol/protocol.pyx", line 375, in query + | RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +------------------------------------ + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/app/tests/test_smoke_dynamic.py", line 74, in test_get_with_fake_id_returns_404 + r = await client.get(path, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + return await self.request( + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + response = await self._send_handling_auth( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + response = await self._send_handling_redirects( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + await self.app(scope, receive, _send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + self.gen.throw(value) + File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/main.py", line 79, in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + raise app_exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + await self.app(scope, receive_or_disconnect, send_no_error) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + await route.handle(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + response = await f(request) + ^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/routers/contacts.py", line 70, in contact_detail + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/core/sidebar.py", line 14, in get_sidebar_data + result = await db.execute(text(""" + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + result = await greenlet_spawn( + ^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + return self._execute_internal( + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 2, in _connection_for_bind + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + raise exc_value.with_traceback(exc_tb) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + result = pool._dialect._do_ping_w_event( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + dbapi_connection.ping() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + self._handle_exception(error) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + raise error + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + await tr.start() + File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + await self._connection.execute(query) + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "asyncpg/protocol/protocol.pyx", line 375, in query +RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +During handling of the above exception, another exception occurred: +tests/test_smoke_dynamic.py:74: in test_get_with_fake_id_returns_404 + r = await client.get(path, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1768: in get + return await self.request( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1540: in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1629: in send + response = await self._send_handling_auth( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1657: in _send_handling_auth + response = await self._send_handling_redirects( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1694: in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1730: in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py:170: in handle_async_request + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/fastapi/applications.py:1054: in __call__ + await super().__call__(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/applications.py:113: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:187: in __call__ + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:165: in __call__ + await self.app(scope, receive, _send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:185: in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/contextlib.py:158: in __exit__ + self.gen.throw(value) +/usr/local/lib/python3.12/site-packages/starlette/_utils.py:82: in collapse_excgroups + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:187: in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +main.py:79: in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:163: in call_next + raise app_exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149: in coro + await self.app(scope, receive_or_disconnect, send_no_error) +/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py:62: in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:715: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:735: in app + await route.handle(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:288: in handle + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:76: in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:73: in app + response = await f(request) + ^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:301: in app + raw_response = await run_endpoint_function( +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:212: in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +routers/contacts.py:70: in contact_detail + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +core/sidebar.py:14: in get_sidebar_data + result = await db.execute(text(""" +/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py:461: in execute + result = await greenlet_spawn( +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2362: in execute + return self._execute_internal( +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2237: in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2106: in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +:2: in _connection_for_bind + ??? +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py:139: in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:1189: in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3278: in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:146: in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3302: in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:449: in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1362: in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py:146: in __exit__ + raise exc_value.with_traceback(exc_tb) +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1300: in _checkout + result = pool._dialect._do_ping_w_event( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py:716: in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:1150: in do_ping + dbapi_connection.ping() +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:801: in ping + self._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:782: in _handle_exception + raise error +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:799: in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn + value = await result + ^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:808: in _async_ping + await tr.start() +/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py:146: in start + await self._connection.execute(query) +/usr/local/lib/python3.12/site-packages/asyncpg/connection.py:349: in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +asyncpg/protocol/protocol.pyx:375: in query + ??? +E RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +------------------------------ Captured log call ------------------------------- +ERROR sqlalchemy.pool.impl.AsyncAdaptedQueuePool:base.py:378 Exception terminating connection > +Traceback (most recent call last): + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection + self._dialect.do_terminate(connection) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1117, in do_terminate + dbapi_connection.terminate() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 895, in terminate + self.await_(self._connection.close(timeout=2)) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1504, in close + await self._protocol.close(timeout) + File "asyncpg/protocol/protocol.pyx", line 627, in close + File "asyncpg/protocol/protocol.pyx", line 660, in asyncpg.protocol.protocol.BaseProtocol._request_cancel + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1673, in _cancel_current_command + self._cancellations.add(self._loop.create_task(self._cancel(waiter))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 455, in create_task + self._check_closed() + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 545, in _check_closed + raise RuntimeError('Event loop is closed') +RuntimeError: Event loop is closed +______ test_get_with_fake_id_returns_404[404 /contacts/{contact_id}/edit] ______ +tests/test_smoke_dynamic.py:75: in test_get_with_fake_id_returns_404 + assert r.status_code in (404, 302, 303), \ +E AssertionError: GET /contacts/00000000-0000-0000-0000-000000000000/edit returned 200, expected 404 or redirect +E assert 200 in (404, 302, 303) +E + where 200 = .status_code +----------------------------- Captured stdout call ----------------------------- +2026-03-01 14:01:37,760 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-01 14:01:37,760 INFO sqlalchemy.engine.Engine + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:37,760 INFO sqlalchemy.engine.Engine [cached since 12.15s ago] () +2026-03-01 14:01:37,768 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:37,768 INFO sqlalchemy.engine.Engine [cached since 12.15s ago] () +2026-03-01 14:01:37,771 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +2026-03-01 14:01:37,771 INFO sqlalchemy.engine.Engine [cached since 12.15s ago] () +2026-03-01 14:01:37,775 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +2026-03-01 14:01:37,775 INFO sqlalchemy.engine.Engine [cached since 12.15s ago] () +2026-03-01 14:01:37,778 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +2026-03-01 14:01:37,778 INFO sqlalchemy.engine.Engine [cached since 12.15s ago] () +2026-03-01 14:01:37,781 INFO sqlalchemy.engine.Engine SELECT * FROM contacts WHERE id = $1 +2026-03-01 14:01:37,782 INFO sqlalchemy.engine.Engine [generated in 0.00022s] ('00000000-0000-0000-0000-000000000000',) +2026-03-01 14:01:37,786 INFO sqlalchemy.engine.Engine COMMIT +2026-03-01 14:01:37,791 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-01 14:01:37,791 INFO sqlalchemy.engine.Engine + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:37,791 INFO sqlalchemy.engine.Engine [cached since 12.18s ago] () +2026-03-01 14:01:37,792 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:37,792 INFO sqlalchemy.engine.Engine [cached since 12.17s ago] () +2026-03-01 14:01:37,793 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +2026-03-01 14:01:37,793 INFO sqlalchemy.engine.Engine [cached since 12.17s ago] () +2026-03-01 14:01:37,794 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +2026-03-01 14:01:37,794 INFO sqlalchemy.engine.Engine [cached since 12.17s ago] () +2026-03-01 14:01:37,795 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +2026-03-01 14:01:37,795 INFO sqlalchemy.engine.Engine [cached since 12.17s ago] () +2026-03-01 14:01:37,797 INFO sqlalchemy.engine.Engine + SELECT * FROM contacts WHERE is_deleted = false + ORDER BY sort_order, first_name, last_name + +2026-03-01 14:01:37,798 INFO sqlalchemy.engine.Engine [cached since 8.273s ago] () +2026-03-01 14:01:37,800 INFO sqlalchemy.engine.Engine COMMIT +------------------------------ Captured log call ------------------------------- +INFO sqlalchemy.engine.Engine:base.py:2701 BEGIN (implicit) +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 12.15s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 12.15s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 12.15s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 12.15s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 12.15s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 SELECT * FROM contacts WHERE id = $1 +INFO sqlalchemy.engine.Engine:base.py:1846 [generated in 0.00022s] ('00000000-0000-0000-0000-000000000000',) +INFO sqlalchemy.engine.Engine:base.py:2707 COMMIT +INFO sqlalchemy.engine.Engine:base.py:2701 BEGIN (implicit) +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 12.18s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 12.17s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 12.17s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 12.17s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 12.17s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT * FROM contacts WHERE is_deleted = false + ORDER BY sort_order, first_name, last_name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 8.273s ago] () +INFO sqlalchemy.engine.Engine:base.py:2707 COMMIT +___________ test_get_with_fake_id_returns_404[404 /lists/{list_id}] ____________ + + Exception Group Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 76, in collapse_excgroups + | yield + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 186, in __call__ + | async with anyio.create_task_group() as task_group: + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 783, in __aexit__ + | raise BaseExceptionGroup( + | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) + +-+---------------- 1 ---------------- + | Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 353, in from_call + | result: TResult | None = func() + | ^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 245, in + | lambda: runtest_hook(item=item, **kwds), + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/logging.py", line 850, in pytest_runtest_call + | yield + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/capture.py", line 900, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/skipping.py", line 268, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 179, in pytest_runtest_call + | item.runtest() + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 469, in runtest + | super().runtest() + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 1720, in runtest + | self.ihook.pytest_pyfunc_call(pyfuncitem=self) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper + | return result.get_result() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_result.py", line 103, in get_result + | raise exc.with_traceback(tb) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper + | res = yield + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 166, in pytest_pyfunc_call + | result = testfunction(**testargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 716, in inner + | runner.run(coro, context=context) + | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run + | return self._loop.run_until_complete(task) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete + | return future.result() + | ^^^^^^^^^^^^^^^ + | File "/app/tests/test_smoke_dynamic.py", line 74, in test_get_with_fake_id_returns_404 + | r = await client.get(path, follow_redirects=True) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + | return await self.request( + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + | return await self.send(request, auth=auth, follow_redirects=follow_redirects) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + | response = await self._send_handling_auth( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + | response = await self._send_handling_redirects( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + | response = await self._send_single_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + | response = await transport.handle_async_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + | await super().__call__(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + | await self.app(scope, receive, _send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + | with collapse_excgroups(): + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + | self.gen.throw(value) + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + | response = await self.dispatch_func(request, call_next) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/main.py", line 79, in add_request_context + | response = await call_next(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + | raise app_exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + | await self.app(scope, receive_or_disconnect, send_no_error) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + | await route.handle(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + | await wrap_app_handling_exceptions(app, request)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + | response = await f(request) + | ^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + | raw_response = await run_endpoint_function( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + | return await dependant.call(**values) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/routers/lists.py", line 125, in list_detail + | sidebar = await get_sidebar_data(db) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/core/sidebar.py", line 14, in get_sidebar_data + | result = await db.execute(text(""" + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + | result = await greenlet_spawn( + | ^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + | result = context.throw(*sys.exc_info()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + | return self._execute_internal( + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + | conn = self._connection_for_bind(bind) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + | return trans._connection_for_bind(engine, execution_options) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "", line 2, in _connection_for_bind + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + | ret_value = fn(self, *arg, **kw) + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + | conn = bind.connect() + | ^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + | return self._connection_cls(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + | self._dbapi_connection = engine.raw_connection() + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + | return self.pool.connect() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + | return _ConnectionFairy._checkout(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + | with util.safe_reraise(): + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + | raise exc_value.with_traceback(exc_tb) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + | result = pool._dialect._do_ping_w_event( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + | return self.do_ping(dbapi_connection) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + | dbapi_connection.ping() + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + | self._handle_exception(error) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + | raise error + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + | _ = self.await_(self._async_ping()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + | value = await result + | ^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + | await tr.start() + | File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + | await self._connection.execute(query) + | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + | result = await self._protocol.query(query, timeout) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "asyncpg/protocol/protocol.pyx", line 375, in query + | RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +------------------------------------ + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/app/tests/test_smoke_dynamic.py", line 74, in test_get_with_fake_id_returns_404 + r = await client.get(path, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + return await self.request( + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + response = await self._send_handling_auth( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + response = await self._send_handling_redirects( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + await self.app(scope, receive, _send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + self.gen.throw(value) + File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/main.py", line 79, in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + raise app_exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + await self.app(scope, receive_or_disconnect, send_no_error) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + await route.handle(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + response = await f(request) + ^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/routers/lists.py", line 125, in list_detail + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/core/sidebar.py", line 14, in get_sidebar_data + result = await db.execute(text(""" + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + result = await greenlet_spawn( + ^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + return self._execute_internal( + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 2, in _connection_for_bind + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + raise exc_value.with_traceback(exc_tb) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + result = pool._dialect._do_ping_w_event( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + dbapi_connection.ping() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + self._handle_exception(error) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + raise error + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + await tr.start() + File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + await self._connection.execute(query) + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "asyncpg/protocol/protocol.pyx", line 375, in query +RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +During handling of the above exception, another exception occurred: +tests/test_smoke_dynamic.py:74: in test_get_with_fake_id_returns_404 + r = await client.get(path, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1768: in get + return await self.request( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1540: in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1629: in send + response = await self._send_handling_auth( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1657: in _send_handling_auth + response = await self._send_handling_redirects( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1694: in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1730: in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py:170: in handle_async_request + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/fastapi/applications.py:1054: in __call__ + await super().__call__(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/applications.py:113: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:187: in __call__ + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:165: in __call__ + await self.app(scope, receive, _send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:185: in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/contextlib.py:158: in __exit__ + self.gen.throw(value) +/usr/local/lib/python3.12/site-packages/starlette/_utils.py:82: in collapse_excgroups + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:187: in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +main.py:79: in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:163: in call_next + raise app_exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149: in coro + await self.app(scope, receive_or_disconnect, send_no_error) +/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py:62: in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:715: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:735: in app + await route.handle(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:288: in handle + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:76: in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:73: in app + response = await f(request) + ^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:301: in app + raw_response = await run_endpoint_function( +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:212: in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +routers/lists.py:125: in list_detail + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +core/sidebar.py:14: in get_sidebar_data + result = await db.execute(text(""" +/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py:461: in execute + result = await greenlet_spawn( +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2362: in execute + return self._execute_internal( +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2237: in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2106: in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +:2: in _connection_for_bind + ??? +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py:139: in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:1189: in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3278: in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:146: in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3302: in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:449: in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1362: in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py:146: in __exit__ + raise exc_value.with_traceback(exc_tb) +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1300: in _checkout + result = pool._dialect._do_ping_w_event( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py:716: in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:1150: in do_ping + dbapi_connection.ping() +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:801: in ping + self._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:782: in _handle_exception + raise error +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:799: in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn + value = await result + ^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:808: in _async_ping + await tr.start() +/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py:146: in start + await self._connection.execute(query) +/usr/local/lib/python3.12/site-packages/asyncpg/connection.py:349: in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +asyncpg/protocol/protocol.pyx:375: in query + ??? +E RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +------------------------------ Captured log call ------------------------------- +ERROR sqlalchemy.pool.impl.AsyncAdaptedQueuePool:base.py:378 Exception terminating connection > +Traceback (most recent call last): + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection + self._dialect.do_terminate(connection) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1117, in do_terminate + dbapi_connection.terminate() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 895, in terminate + self.await_(self._connection.close(timeout=2)) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1504, in close + await self._protocol.close(timeout) + File "asyncpg/protocol/protocol.pyx", line 627, in close + File "asyncpg/protocol/protocol.pyx", line 660, in asyncpg.protocol.protocol.BaseProtocol._request_cancel + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1673, in _cancel_current_command + self._cancellations.add(self._loop.create_task(self._cancel(waiter))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 455, in create_task + self._check_closed() + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 545, in _check_closed + raise RuntimeError('Event loop is closed') +RuntimeError: Event loop is closed +_________ test_get_with_fake_id_returns_404[404 /lists/{list_id}/edit] _________ +tests/test_smoke_dynamic.py:75: in test_get_with_fake_id_returns_404 + assert r.status_code in (404, 302, 303), \ +E AssertionError: GET /lists/00000000-0000-0000-0000-000000000000/edit returned 200, expected 404 or redirect +E assert 200 in (404, 302, 303) +E + where 200 = .status_code +----------------------------- Captured stdout call ----------------------------- +2026-03-01 14:01:38,267 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-01 14:01:38,267 INFO sqlalchemy.engine.Engine + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:38,267 INFO sqlalchemy.engine.Engine [cached since 12.65s ago] () +2026-03-01 14:01:38,273 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:38,273 INFO sqlalchemy.engine.Engine [cached since 12.65s ago] () +2026-03-01 14:01:38,276 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +2026-03-01 14:01:38,276 INFO sqlalchemy.engine.Engine [cached since 12.65s ago] () +2026-03-01 14:01:38,279 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +2026-03-01 14:01:38,279 INFO sqlalchemy.engine.Engine [cached since 12.65s ago] () +2026-03-01 14:01:38,282 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +2026-03-01 14:01:38,283 INFO sqlalchemy.engine.Engine [cached since 12.65s ago] () +2026-03-01 14:01:38,285 INFO sqlalchemy.engine.Engine SELECT * FROM lists WHERE id = $1 +2026-03-01 14:01:38,286 INFO sqlalchemy.engine.Engine [generated in 0.00010s] ('00000000-0000-0000-0000-000000000000',) +2026-03-01 14:01:38,288 INFO sqlalchemy.engine.Engine COMMIT +2026-03-01 14:01:38,291 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-01 14:01:38,291 INFO sqlalchemy.engine.Engine + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:38,291 INFO sqlalchemy.engine.Engine [cached since 12.68s ago] () +2026-03-01 14:01:38,292 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:38,292 INFO sqlalchemy.engine.Engine [cached since 12.67s ago] () +2026-03-01 14:01:38,292 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +2026-03-01 14:01:38,292 INFO sqlalchemy.engine.Engine [cached since 12.67s ago] () +2026-03-01 14:01:38,293 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +2026-03-01 14:01:38,293 INFO sqlalchemy.engine.Engine [cached since 12.67s ago] () +2026-03-01 14:01:38,293 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +2026-03-01 14:01:38,293 INFO sqlalchemy.engine.Engine [cached since 12.66s ago] () +2026-03-01 14:01:38,294 INFO sqlalchemy.engine.Engine + SELECT l.*, + d.name as domain_name, d.color as domain_color, + p.name as project_name, + (SELECT count(*) FROM list_items li WHERE li.list_id = l.id AND li.is_deleted = false) as item_count, + (SELECT count(*) FROM list_items li WHERE li.list_id = l.id AND li.is_deleted = false AND li.completed = true) as completed_count + FROM lists l + LEFT JOIN domains d ON l.domain_id = d.id + LEFT JOIN projects p ON l.project_id = p.id + WHERE l.is_deleted = false + ORDER BY l.sort_order, l.created_at DESC + +2026-03-01 14:01:38,294 INFO sqlalchemy.engine.Engine [generated in 0.00007s] () +2026-03-01 14:01:38,297 INFO sqlalchemy.engine.Engine + SELECT * FROM domains + WHERE is_deleted = false + ORDER BY sort_order ASC + LIMIT $1 OFFSET $2 + +2026-03-01 14:01:38,297 INFO sqlalchemy.engine.Engine [cached since 12.59s ago] (50, 0) +2026-03-01 14:01:38,298 INFO sqlalchemy.engine.Engine + SELECT * FROM projects + WHERE is_deleted = false + ORDER BY sort_order ASC + LIMIT $1 OFFSET $2 + +2026-03-01 14:01:38,298 INFO sqlalchemy.engine.Engine [cached since 11.05s ago] (50, 0) +2026-03-01 14:01:38,304 INFO sqlalchemy.engine.Engine COMMIT +------------------------------ Captured log call ------------------------------- +INFO sqlalchemy.engine.Engine:base.py:2701 BEGIN (implicit) +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 12.65s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 12.65s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 12.65s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 12.65s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 12.65s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 SELECT * FROM lists WHERE id = $1 +INFO sqlalchemy.engine.Engine:base.py:1846 [generated in 0.00010s] ('00000000-0000-0000-0000-000000000000',) +INFO sqlalchemy.engine.Engine:base.py:2707 COMMIT +INFO sqlalchemy.engine.Engine:base.py:2701 BEGIN (implicit) +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 12.68s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 12.67s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 12.67s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 12.67s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 12.66s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT l.*, + d.name as domain_name, d.color as domain_color, + p.name as project_name, + (SELECT count(*) FROM list_items li WHERE li.list_id = l.id AND li.is_deleted = false) as item_count, + (SELECT count(*) FROM list_items li WHERE li.list_id = l.id AND li.is_deleted = false AND li.completed = true) as completed_count + FROM lists l + LEFT JOIN domains d ON l.domain_id = d.id + LEFT JOIN projects p ON l.project_id = p.id + WHERE l.is_deleted = false + ORDER BY l.sort_order, l.created_at DESC + +INFO sqlalchemy.engine.Engine:base.py:1846 [generated in 0.00007s] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT * FROM domains + WHERE is_deleted = false + ORDER BY sort_order ASC + LIMIT $1 OFFSET $2 + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 12.59s ago] (50, 0) +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT * FROM projects + WHERE is_deleted = false + ORDER BY sort_order ASC + LIMIT $1 OFFSET $2 + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 11.05s ago] (50, 0) +INFO sqlalchemy.engine.Engine:base.py:2707 COMMIT +_______ test_get_with_fake_id_returns_404[404 /files/{file_id}/download] _______ + + Exception Group Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 76, in collapse_excgroups + | yield + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 186, in __call__ + | async with anyio.create_task_group() as task_group: + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 783, in __aexit__ + | raise BaseExceptionGroup( + | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) + +-+---------------- 1 ---------------- + | Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 353, in from_call + | result: TResult | None = func() + | ^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 245, in + | lambda: runtest_hook(item=item, **kwds), + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/logging.py", line 850, in pytest_runtest_call + | yield + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/capture.py", line 900, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/skipping.py", line 268, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 179, in pytest_runtest_call + | item.runtest() + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 469, in runtest + | super().runtest() + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 1720, in runtest + | self.ihook.pytest_pyfunc_call(pyfuncitem=self) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper + | return result.get_result() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_result.py", line 103, in get_result + | raise exc.with_traceback(tb) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper + | res = yield + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 166, in pytest_pyfunc_call + | result = testfunction(**testargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 716, in inner + | runner.run(coro, context=context) + | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run + | return self._loop.run_until_complete(task) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete + | return future.result() + | ^^^^^^^^^^^^^^^ + | File "/app/tests/test_smoke_dynamic.py", line 74, in test_get_with_fake_id_returns_404 + | r = await client.get(path, follow_redirects=True) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + | return await self.request( + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + | return await self.send(request, auth=auth, follow_redirects=follow_redirects) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + | response = await self._send_handling_auth( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + | response = await self._send_handling_redirects( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + | response = await self._send_single_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + | response = await transport.handle_async_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + | await super().__call__(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + | await self.app(scope, receive, _send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + | with collapse_excgroups(): + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + | self.gen.throw(value) + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + | response = await self.dispatch_func(request, call_next) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/main.py", line 79, in add_request_context + | response = await call_next(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + | raise app_exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + | await self.app(scope, receive_or_disconnect, send_no_error) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + | await route.handle(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + | await wrap_app_handling_exceptions(app, request)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + | response = await f(request) + | ^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + | raw_response = await run_endpoint_function( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + | return await dependant.call(**values) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/routers/files.py", line 145, in download_file + | item = await repo.get(file_id) + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/core/base_repository.py", line 91, in get + | result = await self.db.execute(query, {"id": str(id)}) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + | result = await greenlet_spawn( + | ^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + | result = context.throw(*sys.exc_info()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + | return self._execute_internal( + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + | conn = self._connection_for_bind(bind) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + | return trans._connection_for_bind(engine, execution_options) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "", line 2, in _connection_for_bind + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + | ret_value = fn(self, *arg, **kw) + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + | conn = bind.connect() + | ^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + | return self._connection_cls(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + | self._dbapi_connection = engine.raw_connection() + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + | return self.pool.connect() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + | return _ConnectionFairy._checkout(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + | with util.safe_reraise(): + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + | raise exc_value.with_traceback(exc_tb) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + | result = pool._dialect._do_ping_w_event( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + | return self.do_ping(dbapi_connection) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + | dbapi_connection.ping() + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + | self._handle_exception(error) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + | raise error + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + | _ = self.await_(self._async_ping()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + | value = await result + | ^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + | await tr.start() + | File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + | await self._connection.execute(query) + | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + | result = await self._protocol.query(query, timeout) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "asyncpg/protocol/protocol.pyx", line 375, in query + | RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +------------------------------------ + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/app/tests/test_smoke_dynamic.py", line 74, in test_get_with_fake_id_returns_404 + r = await client.get(path, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + return await self.request( + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + response = await self._send_handling_auth( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + response = await self._send_handling_redirects( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + await self.app(scope, receive, _send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + self.gen.throw(value) + File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/main.py", line 79, in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + raise app_exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + await self.app(scope, receive_or_disconnect, send_no_error) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + await route.handle(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + response = await f(request) + ^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/routers/files.py", line 145, in download_file + item = await repo.get(file_id) + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/core/base_repository.py", line 91, in get + result = await self.db.execute(query, {"id": str(id)}) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + result = await greenlet_spawn( + ^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + return self._execute_internal( + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 2, in _connection_for_bind + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + raise exc_value.with_traceback(exc_tb) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + result = pool._dialect._do_ping_w_event( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + dbapi_connection.ping() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + self._handle_exception(error) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + raise error + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + await tr.start() + File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + await self._connection.execute(query) + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "asyncpg/protocol/protocol.pyx", line 375, in query +RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +During handling of the above exception, another exception occurred: +tests/test_smoke_dynamic.py:74: in test_get_with_fake_id_returns_404 + r = await client.get(path, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1768: in get + return await self.request( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1540: in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1629: in send + response = await self._send_handling_auth( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1657: in _send_handling_auth + response = await self._send_handling_redirects( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1694: in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1730: in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py:170: in handle_async_request + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/fastapi/applications.py:1054: in __call__ + await super().__call__(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/applications.py:113: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:187: in __call__ + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:165: in __call__ + await self.app(scope, receive, _send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:185: in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/contextlib.py:158: in __exit__ + self.gen.throw(value) +/usr/local/lib/python3.12/site-packages/starlette/_utils.py:82: in collapse_excgroups + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:187: in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +main.py:79: in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:163: in call_next + raise app_exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149: in coro + await self.app(scope, receive_or_disconnect, send_no_error) +/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py:62: in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:715: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:735: in app + await route.handle(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:288: in handle + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:76: in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:73: in app + response = await f(request) + ^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:301: in app + raw_response = await run_endpoint_function( +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:212: in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +routers/files.py:145: in download_file + item = await repo.get(file_id) + ^^^^^^^^^^^^^^^^^^^^^^^ +core/base_repository.py:91: in get + result = await self.db.execute(query, {"id": str(id)}) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py:461: in execute + result = await greenlet_spawn( +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2362: in execute + return self._execute_internal( +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2237: in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2106: in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +:2: in _connection_for_bind + ??? +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py:139: in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:1189: in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3278: in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:146: in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3302: in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:449: in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1362: in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py:146: in __exit__ + raise exc_value.with_traceback(exc_tb) +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1300: in _checkout + result = pool._dialect._do_ping_w_event( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py:716: in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:1150: in do_ping + dbapi_connection.ping() +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:801: in ping + self._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:782: in _handle_exception + raise error +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:799: in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn + value = await result + ^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:808: in _async_ping + await tr.start() +/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py:146: in start + await self._connection.execute(query) +/usr/local/lib/python3.12/site-packages/asyncpg/connection.py:349: in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +asyncpg/protocol/protocol.pyx:375: in query + ??? +E RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +------------------------------ Captured log call ------------------------------- +ERROR sqlalchemy.pool.impl.AsyncAdaptedQueuePool:base.py:378 Exception terminating connection > +Traceback (most recent call last): + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection + self._dialect.do_terminate(connection) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1117, in do_terminate + dbapi_connection.terminate() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 895, in terminate + self.await_(self._connection.close(timeout=2)) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1504, in close + await self._protocol.close(timeout) + File "asyncpg/protocol/protocol.pyx", line 627, in close + File "asyncpg/protocol/protocol.pyx", line 660, in asyncpg.protocol.protocol.BaseProtocol._request_cancel + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1673, in _cancel_current_command + self._cancellations.add(self._loop.create_task(self._cancel(waiter))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 455, in create_task + self._check_closed() + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 545, in _check_closed + raise RuntimeError('Event loop is closed') +RuntimeError: Event loop is closed +_______ test_get_with_fake_id_returns_404[404 /files/{file_id}/preview] ________ +tests/test_smoke_dynamic.py:75: in test_get_with_fake_id_returns_404 + assert r.status_code in (404, 302, 303), \ +E AssertionError: GET /files/00000000-0000-0000-0000-000000000000/preview returned 200, expected 404 or redirect +E assert 200 in (404, 302, 303) +E + where 200 = .status_code +----------------------------- Captured stdout call ----------------------------- +2026-03-01 14:01:38,727 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-01 14:01:38,727 INFO sqlalchemy.engine.Engine + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:38,727 INFO sqlalchemy.engine.Engine [cached since 13.11s ago] () +2026-03-01 14:01:38,734 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:38,734 INFO sqlalchemy.engine.Engine [cached since 13.11s ago] () +2026-03-01 14:01:38,736 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +2026-03-01 14:01:38,736 INFO sqlalchemy.engine.Engine [cached since 13.11s ago] () +2026-03-01 14:01:38,740 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +2026-03-01 14:01:38,740 INFO sqlalchemy.engine.Engine [cached since 13.11s ago] () +2026-03-01 14:01:38,742 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +2026-03-01 14:01:38,743 INFO sqlalchemy.engine.Engine [cached since 13.11s ago] () +2026-03-01 14:01:38,745 INFO sqlalchemy.engine.Engine SELECT * FROM files WHERE id = $1 +2026-03-01 14:01:38,745 INFO sqlalchemy.engine.Engine [generated in 0.00010s] ('00000000-0000-0000-0000-000000000000',) +2026-03-01 14:01:38,747 INFO sqlalchemy.engine.Engine COMMIT +2026-03-01 14:01:38,750 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-01 14:01:38,751 INFO sqlalchemy.engine.Engine + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:38,751 INFO sqlalchemy.engine.Engine [cached since 13.14s ago] () +2026-03-01 14:01:38,751 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:38,751 INFO sqlalchemy.engine.Engine [cached since 13.13s ago] () +2026-03-01 14:01:38,752 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +2026-03-01 14:01:38,752 INFO sqlalchemy.engine.Engine [cached since 13.13s ago] () +2026-03-01 14:01:38,752 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +2026-03-01 14:01:38,752 INFO sqlalchemy.engine.Engine [cached since 13.13s ago] () +2026-03-01 14:01:38,753 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +2026-03-01 14:01:38,753 INFO sqlalchemy.engine.Engine [cached since 13.12s ago] () +2026-03-01 14:01:38,753 INFO sqlalchemy.engine.Engine + SELECT f.* FROM files f + WHERE f.is_deleted = false + ORDER BY f.created_at DESC + LIMIT 100 + +2026-03-01 14:01:38,753 INFO sqlalchemy.engine.Engine [generated in 0.00007s] () +2026-03-01 14:01:38,759 INFO sqlalchemy.engine.Engine COMMIT +------------------------------ Captured log call ------------------------------- +INFO sqlalchemy.engine.Engine:base.py:2701 BEGIN (implicit) +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 13.11s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 13.11s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 13.11s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 13.11s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 13.11s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 SELECT * FROM files WHERE id = $1 +INFO sqlalchemy.engine.Engine:base.py:1846 [generated in 0.00010s] ('00000000-0000-0000-0000-000000000000',) +INFO sqlalchemy.engine.Engine:base.py:2707 COMMIT +INFO sqlalchemy.engine.Engine:base.py:2701 BEGIN (implicit) +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 13.14s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 13.13s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 13.13s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 13.13s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 13.12s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT f.* FROM files f + WHERE f.is_deleted = false + ORDER BY f.created_at DESC + LIMIT 100 + +INFO sqlalchemy.engine.Engine:base.py:1846 [generated in 0.00007s] () +INFO sqlalchemy.engine.Engine:base.py:2707 COMMIT +________ test_get_with_fake_id_returns_404[404 /files/{file_id}/serve] _________ + + Exception Group Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 76, in collapse_excgroups + | yield + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 186, in __call__ + | async with anyio.create_task_group() as task_group: + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 783, in __aexit__ + | raise BaseExceptionGroup( + | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) + +-+---------------- 1 ---------------- + | Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 353, in from_call + | result: TResult | None = func() + | ^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 245, in + | lambda: runtest_hook(item=item, **kwds), + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/logging.py", line 850, in pytest_runtest_call + | yield + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/capture.py", line 900, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/skipping.py", line 268, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 179, in pytest_runtest_call + | item.runtest() + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 469, in runtest + | super().runtest() + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 1720, in runtest + | self.ihook.pytest_pyfunc_call(pyfuncitem=self) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper + | return result.get_result() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_result.py", line 103, in get_result + | raise exc.with_traceback(tb) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper + | res = yield + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 166, in pytest_pyfunc_call + | result = testfunction(**testargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 716, in inner + | runner.run(coro, context=context) + | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run + | return self._loop.run_until_complete(task) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete + | return future.result() + | ^^^^^^^^^^^^^^^ + | File "/app/tests/test_smoke_dynamic.py", line 74, in test_get_with_fake_id_returns_404 + | r = await client.get(path, follow_redirects=True) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + | return await self.request( + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + | return await self.send(request, auth=auth, follow_redirects=follow_redirects) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + | response = await self._send_handling_auth( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + | response = await self._send_handling_redirects( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + | response = await self._send_single_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + | response = await transport.handle_async_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + | await super().__call__(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + | await self.app(scope, receive, _send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + | with collapse_excgroups(): + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + | self.gen.throw(value) + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + | response = await self.dispatch_func(request, call_next) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/main.py", line 79, in add_request_context + | response = await call_next(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + | raise app_exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + | await self.app(scope, receive_or_disconnect, send_no_error) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + | await route.handle(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + | await wrap_app_handling_exceptions(app, request)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + | response = await f(request) + | ^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + | raw_response = await run_endpoint_function( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + | return await dependant.call(**values) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/routers/files.py", line 178, in serve_file + | item = await repo.get(file_id) + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/core/base_repository.py", line 91, in get + | result = await self.db.execute(query, {"id": str(id)}) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + | result = await greenlet_spawn( + | ^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + | result = context.throw(*sys.exc_info()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + | return self._execute_internal( + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + | conn = self._connection_for_bind(bind) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + | return trans._connection_for_bind(engine, execution_options) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "", line 2, in _connection_for_bind + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + | ret_value = fn(self, *arg, **kw) + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + | conn = bind.connect() + | ^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + | return self._connection_cls(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + | self._dbapi_connection = engine.raw_connection() + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + | return self.pool.connect() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + | return _ConnectionFairy._checkout(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + | with util.safe_reraise(): + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + | raise exc_value.with_traceback(exc_tb) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + | result = pool._dialect._do_ping_w_event( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + | return self.do_ping(dbapi_connection) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + | dbapi_connection.ping() + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + | self._handle_exception(error) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + | raise error + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + | _ = self.await_(self._async_ping()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + | value = await result + | ^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + | await tr.start() + | File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + | await self._connection.execute(query) + | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + | result = await self._protocol.query(query, timeout) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "asyncpg/protocol/protocol.pyx", line 375, in query + | RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +------------------------------------ + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/app/tests/test_smoke_dynamic.py", line 74, in test_get_with_fake_id_returns_404 + r = await client.get(path, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + return await self.request( + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + response = await self._send_handling_auth( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + response = await self._send_handling_redirects( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + await self.app(scope, receive, _send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + self.gen.throw(value) + File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/main.py", line 79, in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + raise app_exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + await self.app(scope, receive_or_disconnect, send_no_error) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + await route.handle(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + response = await f(request) + ^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/routers/files.py", line 178, in serve_file + item = await repo.get(file_id) + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/core/base_repository.py", line 91, in get + result = await self.db.execute(query, {"id": str(id)}) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + result = await greenlet_spawn( + ^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + return self._execute_internal( + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 2, in _connection_for_bind + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + raise exc_value.with_traceback(exc_tb) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + result = pool._dialect._do_ping_w_event( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + dbapi_connection.ping() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + self._handle_exception(error) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + raise error + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + await tr.start() + File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + await self._connection.execute(query) + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "asyncpg/protocol/protocol.pyx", line 375, in query +RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +During handling of the above exception, another exception occurred: +tests/test_smoke_dynamic.py:74: in test_get_with_fake_id_returns_404 + r = await client.get(path, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1768: in get + return await self.request( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1540: in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1629: in send + response = await self._send_handling_auth( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1657: in _send_handling_auth + response = await self._send_handling_redirects( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1694: in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1730: in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py:170: in handle_async_request + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/fastapi/applications.py:1054: in __call__ + await super().__call__(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/applications.py:113: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:187: in __call__ + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:165: in __call__ + await self.app(scope, receive, _send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:185: in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/contextlib.py:158: in __exit__ + self.gen.throw(value) +/usr/local/lib/python3.12/site-packages/starlette/_utils.py:82: in collapse_excgroups + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:187: in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +main.py:79: in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:163: in call_next + raise app_exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149: in coro + await self.app(scope, receive_or_disconnect, send_no_error) +/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py:62: in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:715: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:735: in app + await route.handle(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:288: in handle + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:76: in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:73: in app + response = await f(request) + ^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:301: in app + raw_response = await run_endpoint_function( +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:212: in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +routers/files.py:178: in serve_file + item = await repo.get(file_id) + ^^^^^^^^^^^^^^^^^^^^^^^ +core/base_repository.py:91: in get + result = await self.db.execute(query, {"id": str(id)}) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py:461: in execute + result = await greenlet_spawn( +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2362: in execute + return self._execute_internal( +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2237: in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2106: in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +:2: in _connection_for_bind + ??? +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py:139: in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:1189: in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3278: in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:146: in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3302: in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:449: in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1362: in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py:146: in __exit__ + raise exc_value.with_traceback(exc_tb) +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1300: in _checkout + result = pool._dialect._do_ping_w_event( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py:716: in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:1150: in do_ping + dbapi_connection.ping() +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:801: in ping + self._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:782: in _handle_exception + raise error +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:799: in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn + value = await result + ^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:808: in _async_ping + await tr.start() +/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py:146: in start + await self._connection.execute(query) +/usr/local/lib/python3.12/site-packages/asyncpg/connection.py:349: in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +asyncpg/protocol/protocol.pyx:375: in query + ??? +E RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +------------------------------ Captured log call ------------------------------- +ERROR sqlalchemy.pool.impl.AsyncAdaptedQueuePool:base.py:378 Exception terminating connection > +Traceback (most recent call last): + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection + self._dialect.do_terminate(connection) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1117, in do_terminate + dbapi_connection.terminate() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 895, in terminate + self.await_(self._connection.close(timeout=2)) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1504, in close + await self._protocol.close(timeout) + File "asyncpg/protocol/protocol.pyx", line 627, in close + File "asyncpg/protocol/protocol.pyx", line 660, in asyncpg.protocol.protocol.BaseProtocol._request_cancel + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1673, in _cancel_current_command + self._cancellations.add(self._loop.create_task(self._cancel(waiter))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 455, in create_task + self._check_closed() + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 545, in _check_closed + raise RuntimeError('Event loop is closed') +RuntimeError: Event loop is closed +________ test_get_with_fake_id_returns_404[404 /meetings/{meeting_id}] _________ +tests/test_smoke_dynamic.py:75: in test_get_with_fake_id_returns_404 + assert r.status_code in (404, 302, 303), \ +E AssertionError: GET /meetings/00000000-0000-0000-0000-000000000000 returned 200, expected 404 or redirect +E assert 200 in (404, 302, 303) +E + where 200 = .status_code +----------------------------- Captured stdout call ----------------------------- +2026-03-01 14:01:39,332 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-01 14:01:39,332 INFO sqlalchemy.engine.Engine + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:39,332 INFO sqlalchemy.engine.Engine [cached since 13.72s ago] () +2026-03-01 14:01:39,339 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:39,339 INFO sqlalchemy.engine.Engine [cached since 13.72s ago] () +2026-03-01 14:01:39,342 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +2026-03-01 14:01:39,342 INFO sqlalchemy.engine.Engine [cached since 13.72s ago] () +2026-03-01 14:01:39,345 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +2026-03-01 14:01:39,345 INFO sqlalchemy.engine.Engine [cached since 13.72s ago] () +2026-03-01 14:01:39,349 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +2026-03-01 14:01:39,349 INFO sqlalchemy.engine.Engine [cached since 13.72s ago] () +2026-03-01 14:01:39,351 INFO sqlalchemy.engine.Engine SELECT * FROM meetings WHERE id = $1 +2026-03-01 14:01:39,351 INFO sqlalchemy.engine.Engine [generated in 0.00011s] ('00000000-0000-0000-0000-000000000000',) +2026-03-01 14:01:39,355 INFO sqlalchemy.engine.Engine COMMIT +2026-03-01 14:01:39,358 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-01 14:01:39,358 INFO sqlalchemy.engine.Engine + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:39,358 INFO sqlalchemy.engine.Engine [cached since 13.74s ago] () +2026-03-01 14:01:39,358 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:39,359 INFO sqlalchemy.engine.Engine [cached since 13.74s ago] () +2026-03-01 14:01:39,359 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +2026-03-01 14:01:39,359 INFO sqlalchemy.engine.Engine [cached since 13.74s ago] () +2026-03-01 14:01:39,359 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +2026-03-01 14:01:39,360 INFO sqlalchemy.engine.Engine [cached since 13.73s ago] () +2026-03-01 14:01:39,360 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +2026-03-01 14:01:39,360 INFO sqlalchemy.engine.Engine [cached since 13.73s ago] () +2026-03-01 14:01:39,360 INFO sqlalchemy.engine.Engine + SELECT m.*, + (SELECT count(*) FROM meeting_tasks mt + JOIN tasks t ON mt.task_id = t.id + WHERE mt.meeting_id = m.id AND t.is_deleted = false) as action_count + FROM meetings m + WHERE m.is_deleted = false + ORDER BY m.meeting_date DESC, m.start_at DESC NULLS LAST + +2026-03-01 14:01:39,360 INFO sqlalchemy.engine.Engine [generated in 0.00008s] () +2026-03-01 14:01:39,375 INFO sqlalchemy.engine.Engine COMMIT +------------------------------ Captured log call ------------------------------- +INFO sqlalchemy.engine.Engine:base.py:2701 BEGIN (implicit) +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 13.72s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 13.72s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 13.72s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 13.72s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 13.72s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 SELECT * FROM meetings WHERE id = $1 +INFO sqlalchemy.engine.Engine:base.py:1846 [generated in 0.00011s] ('00000000-0000-0000-0000-000000000000',) +INFO sqlalchemy.engine.Engine:base.py:2707 COMMIT +INFO sqlalchemy.engine.Engine:base.py:2701 BEGIN (implicit) +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 13.74s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 13.74s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 13.74s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 13.73s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 13.73s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT m.*, + (SELECT count(*) FROM meeting_tasks mt + JOIN tasks t ON mt.task_id = t.id + WHERE mt.meeting_id = m.id AND t.is_deleted = false) as action_count + FROM meetings m + WHERE m.is_deleted = false + ORDER BY m.meeting_date DESC, m.start_at DESC NULLS LAST + +INFO sqlalchemy.engine.Engine:base.py:1846 [generated in 0.00008s] () +INFO sqlalchemy.engine.Engine:base.py:2707 COMMIT +______ test_get_with_fake_id_returns_404[404 /meetings/{meeting_id}/edit] ______ + + Exception Group Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 76, in collapse_excgroups + | yield + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 186, in __call__ + | async with anyio.create_task_group() as task_group: + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 783, in __aexit__ + | raise BaseExceptionGroup( + | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) + +-+---------------- 1 ---------------- + | Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 353, in from_call + | result: TResult | None = func() + | ^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 245, in + | lambda: runtest_hook(item=item, **kwds), + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/logging.py", line 850, in pytest_runtest_call + | yield + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/capture.py", line 900, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/skipping.py", line 268, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 179, in pytest_runtest_call + | item.runtest() + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 469, in runtest + | super().runtest() + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 1720, in runtest + | self.ihook.pytest_pyfunc_call(pyfuncitem=self) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper + | return result.get_result() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_result.py", line 103, in get_result + | raise exc.with_traceback(tb) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper + | res = yield + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 166, in pytest_pyfunc_call + | result = testfunction(**testargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 716, in inner + | runner.run(coro, context=context) + | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run + | return self._loop.run_until_complete(task) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete + | return future.result() + | ^^^^^^^^^^^^^^^ + | File "/app/tests/test_smoke_dynamic.py", line 74, in test_get_with_fake_id_returns_404 + | r = await client.get(path, follow_redirects=True) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + | return await self.request( + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + | return await self.send(request, auth=auth, follow_redirects=follow_redirects) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + | response = await self._send_handling_auth( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + | response = await self._send_handling_redirects( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + | response = await self._send_single_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + | response = await transport.handle_async_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + | await super().__call__(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + | await self.app(scope, receive, _send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + | with collapse_excgroups(): + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + | self.gen.throw(value) + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + | response = await self.dispatch_func(request, call_next) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/main.py", line 79, in add_request_context + | response = await call_next(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + | raise app_exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + | await self.app(scope, receive_or_disconnect, send_no_error) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + | await route.handle(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + | await wrap_app_handling_exceptions(app, request)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + | response = await f(request) + | ^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + | raw_response = await run_endpoint_function( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + | return await dependant.call(**values) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/routers/meetings.py", line 172, in edit_form + | sidebar = await get_sidebar_data(db) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/core/sidebar.py", line 14, in get_sidebar_data + | result = await db.execute(text(""" + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + | result = await greenlet_spawn( + | ^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + | result = context.throw(*sys.exc_info()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + | return self._execute_internal( + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + | conn = self._connection_for_bind(bind) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + | return trans._connection_for_bind(engine, execution_options) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "", line 2, in _connection_for_bind + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + | ret_value = fn(self, *arg, **kw) + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + | conn = bind.connect() + | ^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + | return self._connection_cls(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + | self._dbapi_connection = engine.raw_connection() + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + | return self.pool.connect() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + | return _ConnectionFairy._checkout(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + | with util.safe_reraise(): + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + | raise exc_value.with_traceback(exc_tb) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + | result = pool._dialect._do_ping_w_event( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + | return self.do_ping(dbapi_connection) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + | dbapi_connection.ping() + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + | self._handle_exception(error) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + | raise error + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + | _ = self.await_(self._async_ping()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + | value = await result + | ^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + | await tr.start() + | File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + | await self._connection.execute(query) + | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + | result = await self._protocol.query(query, timeout) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "asyncpg/protocol/protocol.pyx", line 375, in query + | RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +------------------------------------ + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/app/tests/test_smoke_dynamic.py", line 74, in test_get_with_fake_id_returns_404 + r = await client.get(path, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + return await self.request( + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + response = await self._send_handling_auth( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + response = await self._send_handling_redirects( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + await self.app(scope, receive, _send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + self.gen.throw(value) + File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/main.py", line 79, in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + raise app_exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + await self.app(scope, receive_or_disconnect, send_no_error) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + await route.handle(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + response = await f(request) + ^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/routers/meetings.py", line 172, in edit_form + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/core/sidebar.py", line 14, in get_sidebar_data + result = await db.execute(text(""" + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + result = await greenlet_spawn( + ^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + return self._execute_internal( + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 2, in _connection_for_bind + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + raise exc_value.with_traceback(exc_tb) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + result = pool._dialect._do_ping_w_event( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + dbapi_connection.ping() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + self._handle_exception(error) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + raise error + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + await tr.start() + File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + await self._connection.execute(query) + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "asyncpg/protocol/protocol.pyx", line 375, in query +RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +During handling of the above exception, another exception occurred: +tests/test_smoke_dynamic.py:74: in test_get_with_fake_id_returns_404 + r = await client.get(path, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1768: in get + return await self.request( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1540: in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1629: in send + response = await self._send_handling_auth( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1657: in _send_handling_auth + response = await self._send_handling_redirects( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1694: in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1730: in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py:170: in handle_async_request + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/fastapi/applications.py:1054: in __call__ + await super().__call__(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/applications.py:113: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:187: in __call__ + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:165: in __call__ + await self.app(scope, receive, _send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:185: in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/contextlib.py:158: in __exit__ + self.gen.throw(value) +/usr/local/lib/python3.12/site-packages/starlette/_utils.py:82: in collapse_excgroups + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:187: in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +main.py:79: in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:163: in call_next + raise app_exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149: in coro + await self.app(scope, receive_or_disconnect, send_no_error) +/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py:62: in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:715: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:735: in app + await route.handle(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:288: in handle + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:76: in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:73: in app + response = await f(request) + ^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:301: in app + raw_response = await run_endpoint_function( +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:212: in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +routers/meetings.py:172: in edit_form + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +core/sidebar.py:14: in get_sidebar_data + result = await db.execute(text(""" +/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py:461: in execute + result = await greenlet_spawn( +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2362: in execute + return self._execute_internal( +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2237: in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2106: in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +:2: in _connection_for_bind + ??? +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py:139: in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:1189: in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3278: in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:146: in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3302: in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:449: in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1362: in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py:146: in __exit__ + raise exc_value.with_traceback(exc_tb) +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1300: in _checkout + result = pool._dialect._do_ping_w_event( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py:716: in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:1150: in do_ping + dbapi_connection.ping() +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:801: in ping + self._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:782: in _handle_exception + raise error +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:799: in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn + value = await result + ^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:808: in _async_ping + await tr.start() +/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py:146: in start + await self._connection.execute(query) +/usr/local/lib/python3.12/site-packages/asyncpg/connection.py:349: in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +asyncpg/protocol/protocol.pyx:375: in query + ??? +E RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +------------------------------ Captured log call ------------------------------- +ERROR sqlalchemy.pool.impl.AsyncAdaptedQueuePool:base.py:378 Exception terminating connection > +Traceback (most recent call last): + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection + self._dialect.do_terminate(connection) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1117, in do_terminate + dbapi_connection.terminate() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 895, in terminate + self.await_(self._connection.close(timeout=2)) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1504, in close + await self._protocol.close(timeout) + File "asyncpg/protocol/protocol.pyx", line 627, in close + File "asyncpg/protocol/protocol.pyx", line 660, in asyncpg.protocol.protocol.BaseProtocol._request_cancel + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1673, in _cancel_current_command + self._cancellations.add(self._loop.create_task(self._cancel(waiter))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 455, in create_task + self._check_closed() + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 545, in _check_closed + raise RuntimeError('Event loop is closed') +RuntimeError: Event loop is closed +_______ test_get_with_fake_id_returns_404[404 /decisions/{decision_id}] ________ +tests/test_smoke_dynamic.py:75: in test_get_with_fake_id_returns_404 + assert r.status_code in (404, 302, 303), \ +E AssertionError: GET /decisions/00000000-0000-0000-0000-000000000000 returned 200, expected 404 or redirect +E assert 200 in (404, 302, 303) +E + where 200 = .status_code +----------------------------- Captured stdout call ----------------------------- +2026-03-01 14:01:39,816 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-01 14:01:39,816 INFO sqlalchemy.engine.Engine + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:39,816 INFO sqlalchemy.engine.Engine [cached since 14.2s ago] () +2026-03-01 14:01:39,823 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:39,823 INFO sqlalchemy.engine.Engine [cached since 14.2s ago] () +2026-03-01 14:01:39,826 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +2026-03-01 14:01:39,826 INFO sqlalchemy.engine.Engine [cached since 14.2s ago] () +2026-03-01 14:01:39,829 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +2026-03-01 14:01:39,830 INFO sqlalchemy.engine.Engine [cached since 14.2s ago] () +2026-03-01 14:01:39,832 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +2026-03-01 14:01:39,832 INFO sqlalchemy.engine.Engine [cached since 14.2s ago] () +2026-03-01 14:01:39,835 INFO sqlalchemy.engine.Engine SELECT * FROM decisions WHERE id = $1 +2026-03-01 14:01:39,835 INFO sqlalchemy.engine.Engine [generated in 0.00011s] ('00000000-0000-0000-0000-000000000000',) +2026-03-01 14:01:39,837 INFO sqlalchemy.engine.Engine COMMIT +2026-03-01 14:01:39,841 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-01 14:01:39,841 INFO sqlalchemy.engine.Engine + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:39,841 INFO sqlalchemy.engine.Engine [cached since 14.23s ago] () +2026-03-01 14:01:39,842 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:39,842 INFO sqlalchemy.engine.Engine [cached since 14.22s ago] () +2026-03-01 14:01:39,843 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +2026-03-01 14:01:39,843 INFO sqlalchemy.engine.Engine [cached since 14.22s ago] () +2026-03-01 14:01:39,843 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +2026-03-01 14:01:39,843 INFO sqlalchemy.engine.Engine [cached since 14.22s ago] () +2026-03-01 14:01:39,843 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +2026-03-01 14:01:39,843 INFO sqlalchemy.engine.Engine [cached since 14.21s ago] () +2026-03-01 14:01:39,844 INFO sqlalchemy.engine.Engine + SELECT d.*, m.title as meeting_title + FROM decisions d + LEFT JOIN meetings m ON d.meeting_id = m.id + WHERE d.is_deleted = false + ORDER BY d.created_at DESC + +2026-03-01 14:01:39,844 INFO sqlalchemy.engine.Engine [generated in 0.00010s] () +2026-03-01 14:01:39,855 INFO sqlalchemy.engine.Engine COMMIT +------------------------------ Captured log call ------------------------------- +INFO sqlalchemy.engine.Engine:base.py:2701 BEGIN (implicit) +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 14.2s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 14.2s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 14.2s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 14.2s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 14.2s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 SELECT * FROM decisions WHERE id = $1 +INFO sqlalchemy.engine.Engine:base.py:1846 [generated in 0.00011s] ('00000000-0000-0000-0000-000000000000',) +INFO sqlalchemy.engine.Engine:base.py:2707 COMMIT +INFO sqlalchemy.engine.Engine:base.py:2701 BEGIN (implicit) +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 14.23s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 14.22s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 14.22s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 14.22s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 14.21s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT d.*, m.title as meeting_title + FROM decisions d + LEFT JOIN meetings m ON d.meeting_id = m.id + WHERE d.is_deleted = false + ORDER BY d.created_at DESC + +INFO sqlalchemy.engine.Engine:base.py:1846 [generated in 0.00010s] () +INFO sqlalchemy.engine.Engine:base.py:2707 COMMIT +_____ test_get_with_fake_id_returns_404[404 /decisions/{decision_id}/edit] _____ + + Exception Group Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 76, in collapse_excgroups + | yield + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 186, in __call__ + | async with anyio.create_task_group() as task_group: + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 783, in __aexit__ + | raise BaseExceptionGroup( + | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) + +-+---------------- 1 ---------------- + | Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 353, in from_call + | result: TResult | None = func() + | ^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 245, in + | lambda: runtest_hook(item=item, **kwds), + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/logging.py", line 850, in pytest_runtest_call + | yield + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/capture.py", line 900, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/skipping.py", line 268, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 179, in pytest_runtest_call + | item.runtest() + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 469, in runtest + | super().runtest() + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 1720, in runtest + | self.ihook.pytest_pyfunc_call(pyfuncitem=self) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper + | return result.get_result() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_result.py", line 103, in get_result + | raise exc.with_traceback(tb) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper + | res = yield + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 166, in pytest_pyfunc_call + | result = testfunction(**testargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 716, in inner + | runner.run(coro, context=context) + | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run + | return self._loop.run_until_complete(task) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete + | return future.result() + | ^^^^^^^^^^^^^^^ + | File "/app/tests/test_smoke_dynamic.py", line 74, in test_get_with_fake_id_returns_404 + | r = await client.get(path, follow_redirects=True) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + | return await self.request( + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + | return await self.send(request, auth=auth, follow_redirects=follow_redirects) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + | response = await self._send_handling_auth( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + | response = await self._send_handling_redirects( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + | response = await self._send_single_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + | response = await transport.handle_async_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + | await super().__call__(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + | await self.app(scope, receive, _send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + | with collapse_excgroups(): + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + | self.gen.throw(value) + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + | response = await self.dispatch_func(request, call_next) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/main.py", line 79, in add_request_context + | response = await call_next(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + | raise app_exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + | await self.app(scope, receive_or_disconnect, send_no_error) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + | await route.handle(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + | await wrap_app_handling_exceptions(app, request)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + | response = await f(request) + | ^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + | raw_response = await run_endpoint_function( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + | return await dependant.call(**values) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/routers/decisions.py", line 150, in edit_form + | sidebar = await get_sidebar_data(db) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/core/sidebar.py", line 14, in get_sidebar_data + | result = await db.execute(text(""" + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + | result = await greenlet_spawn( + | ^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + | result = context.throw(*sys.exc_info()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + | return self._execute_internal( + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + | conn = self._connection_for_bind(bind) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + | return trans._connection_for_bind(engine, execution_options) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "", line 2, in _connection_for_bind + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + | ret_value = fn(self, *arg, **kw) + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + | conn = bind.connect() + | ^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + | return self._connection_cls(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + | self._dbapi_connection = engine.raw_connection() + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + | return self.pool.connect() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + | return _ConnectionFairy._checkout(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + | with util.safe_reraise(): + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + | raise exc_value.with_traceback(exc_tb) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + | result = pool._dialect._do_ping_w_event( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + | return self.do_ping(dbapi_connection) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + | dbapi_connection.ping() + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + | self._handle_exception(error) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + | raise error + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + | _ = self.await_(self._async_ping()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + | value = await result + | ^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + | await tr.start() + | File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + | await self._connection.execute(query) + | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + | result = await self._protocol.query(query, timeout) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "asyncpg/protocol/protocol.pyx", line 375, in query + | RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +------------------------------------ + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/app/tests/test_smoke_dynamic.py", line 74, in test_get_with_fake_id_returns_404 + r = await client.get(path, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + return await self.request( + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + response = await self._send_handling_auth( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + response = await self._send_handling_redirects( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + await self.app(scope, receive, _send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + self.gen.throw(value) + File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/main.py", line 79, in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + raise app_exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + await self.app(scope, receive_or_disconnect, send_no_error) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + await route.handle(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + response = await f(request) + ^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/routers/decisions.py", line 150, in edit_form + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/core/sidebar.py", line 14, in get_sidebar_data + result = await db.execute(text(""" + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + result = await greenlet_spawn( + ^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + return self._execute_internal( + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 2, in _connection_for_bind + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + raise exc_value.with_traceback(exc_tb) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + result = pool._dialect._do_ping_w_event( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + dbapi_connection.ping() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + self._handle_exception(error) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + raise error + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + await tr.start() + File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + await self._connection.execute(query) + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "asyncpg/protocol/protocol.pyx", line 375, in query +RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +During handling of the above exception, another exception occurred: +tests/test_smoke_dynamic.py:74: in test_get_with_fake_id_returns_404 + r = await client.get(path, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1768: in get + return await self.request( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1540: in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1629: in send + response = await self._send_handling_auth( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1657: in _send_handling_auth + response = await self._send_handling_redirects( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1694: in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1730: in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py:170: in handle_async_request + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/fastapi/applications.py:1054: in __call__ + await super().__call__(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/applications.py:113: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:187: in __call__ + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:165: in __call__ + await self.app(scope, receive, _send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:185: in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/contextlib.py:158: in __exit__ + self.gen.throw(value) +/usr/local/lib/python3.12/site-packages/starlette/_utils.py:82: in collapse_excgroups + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:187: in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +main.py:79: in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:163: in call_next + raise app_exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149: in coro + await self.app(scope, receive_or_disconnect, send_no_error) +/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py:62: in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:715: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:735: in app + await route.handle(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:288: in handle + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:76: in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:73: in app + response = await f(request) + ^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:301: in app + raw_response = await run_endpoint_function( +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:212: in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +routers/decisions.py:150: in edit_form + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +core/sidebar.py:14: in get_sidebar_data + result = await db.execute(text(""" +/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py:461: in execute + result = await greenlet_spawn( +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2362: in execute + return self._execute_internal( +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2237: in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2106: in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +:2: in _connection_for_bind + ??? +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py:139: in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:1189: in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3278: in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:146: in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3302: in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:449: in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1362: in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py:146: in __exit__ + raise exc_value.with_traceback(exc_tb) +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1300: in _checkout + result = pool._dialect._do_ping_w_event( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py:716: in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:1150: in do_ping + dbapi_connection.ping() +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:801: in ping + self._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:782: in _handle_exception + raise error +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:799: in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn + value = await result + ^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:808: in _async_ping + await tr.start() +/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py:146: in start + await self._connection.execute(query) +/usr/local/lib/python3.12/site-packages/asyncpg/connection.py:349: in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +asyncpg/protocol/protocol.pyx:375: in query + ??? +E RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +------------------------------ Captured log call ------------------------------- +ERROR sqlalchemy.pool.impl.AsyncAdaptedQueuePool:base.py:378 Exception terminating connection > +Traceback (most recent call last): + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection + self._dialect.do_terminate(connection) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1117, in do_terminate + dbapi_connection.terminate() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 895, in terminate + self.await_(self._connection.close(timeout=2)) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1504, in close + await self._protocol.close(timeout) + File "asyncpg/protocol/protocol.pyx", line 627, in close + File "asyncpg/protocol/protocol.pyx", line 660, in asyncpg.protocol.protocol.BaseProtocol._request_cancel + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1673, in _cancel_current_command + self._cancellations.add(self._loop.create_task(self._cancel(waiter))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 455, in create_task + self._check_closed() + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 545, in _check_closed + raise RuntimeError('Event loop is closed') +RuntimeError: Event loop is closed +______ test_get_with_fake_id_returns_404[404 /weblinks/{weblink_id}/edit] ______ +tests/test_smoke_dynamic.py:75: in test_get_with_fake_id_returns_404 + assert r.status_code in (404, 302, 303), \ +E AssertionError: GET /weblinks/00000000-0000-0000-0000-000000000000/edit returned 200, expected 404 or redirect +E assert 200 in (404, 302, 303) +E + where 200 = .status_code +----------------------------- Captured stdout call ----------------------------- +2026-03-01 14:01:40,324 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-01 14:01:40,324 INFO sqlalchemy.engine.Engine + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:40,324 INFO sqlalchemy.engine.Engine [cached since 14.71s ago] () +2026-03-01 14:01:40,331 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:40,331 INFO sqlalchemy.engine.Engine [cached since 14.71s ago] () +2026-03-01 14:01:40,333 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +2026-03-01 14:01:40,333 INFO sqlalchemy.engine.Engine [cached since 14.71s ago] () +2026-03-01 14:01:40,337 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +2026-03-01 14:01:40,337 INFO sqlalchemy.engine.Engine [cached since 14.71s ago] () +2026-03-01 14:01:40,340 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +2026-03-01 14:01:40,340 INFO sqlalchemy.engine.Engine [cached since 14.71s ago] () +2026-03-01 14:01:40,343 INFO sqlalchemy.engine.Engine SELECT * FROM weblinks WHERE id = $1 +2026-03-01 14:01:40,343 INFO sqlalchemy.engine.Engine [generated in 0.00013s] ('00000000-0000-0000-0000-000000000000',) +2026-03-01 14:01:40,345 INFO sqlalchemy.engine.Engine COMMIT +2026-03-01 14:01:40,348 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-01 14:01:40,348 INFO sqlalchemy.engine.Engine + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:40,348 INFO sqlalchemy.engine.Engine [cached since 14.74s ago] () +2026-03-01 14:01:40,349 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:40,349 INFO sqlalchemy.engine.Engine [cached since 14.73s ago] () +2026-03-01 14:01:40,349 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +2026-03-01 14:01:40,350 INFO sqlalchemy.engine.Engine [cached since 14.73s ago] () +2026-03-01 14:01:40,350 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +2026-03-01 14:01:40,350 INFO sqlalchemy.engine.Engine [cached since 14.72s ago] () +2026-03-01 14:01:40,350 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +2026-03-01 14:01:40,350 INFO sqlalchemy.engine.Engine [cached since 14.72s ago] () +2026-03-01 14:01:40,351 INFO sqlalchemy.engine.Engine + SELECT wf.*, (SELECT count(*) FROM folder_weblinks fw WHERE fw.folder_id = wf.id) as link_count + FROM weblink_folders wf + WHERE wf.is_deleted = false + ORDER BY wf.sort_order, wf.name + +2026-03-01 14:01:40,351 INFO sqlalchemy.engine.Engine [generated in 0.00008s] () +2026-03-01 14:01:40,354 INFO sqlalchemy.engine.Engine + SELECT w.* FROM weblinks w + WHERE w.is_deleted = false + ORDER BY w.sort_order, w.label + +2026-03-01 14:01:40,354 INFO sqlalchemy.engine.Engine [generated in 0.00008s] () +2026-03-01 14:01:40,361 INFO sqlalchemy.engine.Engine COMMIT +------------------------------ Captured log call ------------------------------- +INFO sqlalchemy.engine.Engine:base.py:2701 BEGIN (implicit) +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 14.71s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 14.71s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 14.71s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 14.71s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 14.71s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 SELECT * FROM weblinks WHERE id = $1 +INFO sqlalchemy.engine.Engine:base.py:1846 [generated in 0.00013s] ('00000000-0000-0000-0000-000000000000',) +INFO sqlalchemy.engine.Engine:base.py:2707 COMMIT +INFO sqlalchemy.engine.Engine:base.py:2701 BEGIN (implicit) +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 14.74s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 14.73s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 14.73s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 14.72s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 14.72s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT wf.*, (SELECT count(*) FROM folder_weblinks fw WHERE fw.folder_id = wf.id) as link_count + FROM weblink_folders wf + WHERE wf.is_deleted = false + ORDER BY wf.sort_order, wf.name + +INFO sqlalchemy.engine.Engine:base.py:1846 [generated in 0.00008s] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT w.* FROM weblinks w + WHERE w.is_deleted = false + ORDER BY w.sort_order, w.label + +INFO sqlalchemy.engine.Engine:base.py:1846 [generated in 0.00008s] () +INFO sqlalchemy.engine.Engine:base.py:2707 COMMIT +____ test_get_with_fake_id_returns_404[404 /appointments/{appointment_id}] _____ + + Exception Group Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 76, in collapse_excgroups + | yield + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 186, in __call__ + | async with anyio.create_task_group() as task_group: + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 783, in __aexit__ + | raise BaseExceptionGroup( + | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception) + +-+---------------- 1 ---------------- + | Traceback (most recent call last): + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 353, in from_call + | result: TResult | None = func() + | ^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 245, in + | lambda: runtest_hook(item=item, **kwds), + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/logging.py", line 850, in pytest_runtest_call + | yield + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/capture.py", line 900, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/_pytest/skipping.py", line 268, in pytest_runtest_call + | return (yield) + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/runner.py", line 179, in pytest_runtest_call + | item.runtest() + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 469, in runtest + | super().runtest() + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 1720, in runtest + | self.ihook.pytest_pyfunc_call(pyfuncitem=self) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_hooks.py", line 512, in __call__ + | return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec + | return self._inner_hookexec(hook_name, methods, kwargs, firstresult) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall + | raise exception + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall + | teardown.throw(exception) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 53, in run_old_style_hookwrapper + | return result.get_result() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_result.py", line 103, in get_result + | raise exc.with_traceback(tb) + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 38, in run_old_style_hookwrapper + | res = yield + | ^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pluggy/_callers.py", line 121, in _multicall + | res = hook_impl.function(*args) + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/_pytest/python.py", line 166, in pytest_pyfunc_call + | result = testfunction(**testargs) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/pytest_asyncio/plugin.py", line 716, in inner + | runner.run(coro, context=context) + | File "/usr/local/lib/python3.12/asyncio/runners.py", line 118, in run + | return self._loop.run_until_complete(task) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/asyncio/base_events.py", line 691, in run_until_complete + | return future.result() + | ^^^^^^^^^^^^^^^ + | File "/app/tests/test_smoke_dynamic.py", line 74, in test_get_with_fake_id_returns_404 + | r = await client.get(path, follow_redirects=True) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + | return await self.request( + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + | return await self.send(request, auth=auth, follow_redirects=follow_redirects) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + | response = await self._send_handling_auth( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + | response = await self._send_handling_redirects( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + | response = await self._send_single_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + | response = await transport.handle_async_request(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + | await super().__call__(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + | await self.app(scope, receive, _send) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + | with collapse_excgroups(): + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + | self.gen.throw(value) + | File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + | response = await self.dispatch_func(request, call_next) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/main.py", line 79, in add_request_context + | response = await call_next(request) + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + | raise app_exc + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + | await self.app(scope, receive_or_disconnect, send_no_error) + | File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + | await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + | await self.middleware_stack(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + | await route.handle(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + | await self.app(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + | await wrap_app_handling_exceptions(app, request)(scope, receive, send) + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + | raise exc + | File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + | await app(scope, receive, sender) + | File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + | response = await f(request) + | ^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + | raw_response = await run_endpoint_function( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + | return await dependant.call(**values) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/routers/appointments.py", line 170, in appointment_detail + | sidebar = await get_sidebar_data(db) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/app/core/sidebar.py", line 14, in get_sidebar_data + | result = await db.execute(text(""" + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + | result = await greenlet_spawn( + | ^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + | result = context.throw(*sys.exc_info()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + | return self._execute_internal( + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + | conn = self._connection_for_bind(bind) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + | return trans._connection_for_bind(engine, execution_options) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "", line 2, in _connection_for_bind + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + | ret_value = fn(self, *arg, **kw) + | ^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + | conn = bind.connect() + | ^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + | return self._connection_cls(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + | self._dbapi_connection = engine.raw_connection() + | ^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + | return self.pool.connect() + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + | return _ConnectionFairy._checkout(self) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + | with util.safe_reraise(): + | ^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + | raise exc_value.with_traceback(exc_tb) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + | result = pool._dialect._do_ping_w_event( + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + | return self.do_ping(dbapi_connection) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + | dbapi_connection.ping() + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + | self._handle_exception(error) + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + | raise error + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + | _ = self.await_(self._async_ping()) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + | return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + | value = await result + | ^^^^^^^^^^^^ + | File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + | await tr.start() + | File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + | await self._connection.execute(query) + | File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + | result = await self._protocol.query(query, timeout) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | File "asyncpg/protocol/protocol.pyx", line 375, in query + | RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +------------------------------------ + +During handling of the above exception, another exception occurred: + +Traceback (most recent call last): + File "/app/tests/test_smoke_dynamic.py", line 74, in test_get_with_fake_id_returns_404 + r = await client.get(path, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get + return await self.request( + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send + response = await self._send_handling_auth( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth + response = await self._send_handling_redirects( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py", line 170, in handle_async_request + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/fastapi/applications.py", line 1054, in __call__ + await super().__call__(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/applications.py", line 113, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 187, in __call__ + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py", line 165, in __call__ + await self.app(scope, receive, _send) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 185, in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__ + self.gen.throw(value) + File "/usr/local/lib/python3.12/site-packages/starlette/_utils.py", line 82, in collapse_excgroups + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 187, in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/main.py", line 79, in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 163, in call_next + raise app_exc + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py", line 149, in coro + await self.app(scope, receive_or_disconnect, send_no_error) + File "/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py", line 62, in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 715, in __call__ + await self.middleware_stack(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 735, in app + await route.handle(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 288, in handle + await self.app(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 76, in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app + raise exc + File "/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app + await app(scope, receive, sender) + File "/usr/local/lib/python3.12/site-packages/starlette/routing.py", line 73, in app + response = await f(request) + ^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 301, in app + raw_response = await run_endpoint_function( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/fastapi/routing.py", line 212, in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/routers/appointments.py", line 170, in appointment_detail + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/app/core/sidebar.py", line 14, in get_sidebar_data + result = await db.execute(text(""" + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py", line 461, in execute + result = await greenlet_spawn( + ^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 201, in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2362, in execute + return self._execute_internal( + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2237, in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 2106, in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "", line 2, in _connection_for_bind + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3278, in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 146, in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py", line 3302, in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 449, in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1362, in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ + raise exc_value.with_traceback(exc_tb) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 1300, in _checkout + result = pool._dialect._do_ping_w_event( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py", line 716, in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1150, in do_ping + dbapi_connection.ping() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 801, in ping + self._handle_exception(error) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 782, in _handle_exception + raise error + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 799, in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 808, in _async_ping + await tr.start() + File "/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py", line 146, in start + await self._connection.execute(query) + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 349, in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "asyncpg/protocol/protocol.pyx", line 375, in query +RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop + +During handling of the above exception, another exception occurred: +tests/test_smoke_dynamic.py:74: in test_get_with_fake_id_returns_404 + r = await client.get(path, follow_redirects=True) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1768: in get + return await self.request( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1540: in request + return await self.send(request, auth=auth, follow_redirects=follow_redirects) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1629: in send + response = await self._send_handling_auth( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1657: in _send_handling_auth + response = await self._send_handling_redirects( +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1694: in _send_handling_redirects + response = await self._send_single_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_client.py:1730: in _send_single_request + response = await transport.handle_async_request(request) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/httpx/_transports/asgi.py:170: in handle_async_request + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/fastapi/applications.py:1054: in __call__ + await super().__call__(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/applications.py:113: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:187: in __call__ + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/errors.py:165: in __call__ + await self.app(scope, receive, _send) +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:185: in __call__ + with collapse_excgroups(): + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/contextlib.py:158: in __exit__ + self.gen.throw(value) +/usr/local/lib/python3.12/site-packages/starlette/_utils.py:82: in collapse_excgroups + raise exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:187: in __call__ + response = await self.dispatch_func(request, call_next) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +main.py:79: in add_request_context + response = await call_next(request) + ^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:163: in call_next + raise app_exc +/usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149: in coro + await self.app(scope, receive_or_disconnect, send_no_error) +/usr/local/lib/python3.12/site-packages/starlette/middleware/exceptions.py:62: in __call__ + await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:715: in __call__ + await self.middleware_stack(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:735: in app + await route.handle(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:288: in handle + await self.app(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:76: in app + await wrap_app_handling_exceptions(app, request)(scope, receive, send) +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:53: in wrapped_app + raise exc +/usr/local/lib/python3.12/site-packages/starlette/_exception_handler.py:42: in wrapped_app + await app(scope, receive, sender) +/usr/local/lib/python3.12/site-packages/starlette/routing.py:73: in app + response = await f(request) + ^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:301: in app + raw_response = await run_endpoint_function( +/usr/local/lib/python3.12/site-packages/fastapi/routing.py:212: in run_endpoint_function + return await dependant.call(**values) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +routers/appointments.py:170: in appointment_detail + sidebar = await get_sidebar_data(db) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +core/sidebar.py:14: in get_sidebar_data + result = await db.execute(text(""" +/usr/local/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py:461: in execute + result = await greenlet_spawn( +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:201: in greenlet_spawn + result = context.throw(*sys.exc_info()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2362: in execute + return self._execute_internal( +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2237: in _execute_internal + conn = self._connection_for_bind(bind) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:2106: in _connection_for_bind + return trans._connection_for_bind(engine, execution_options) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +:2: in _connection_for_bind + ??? +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py:139: in _go + ret_value = fn(self, *arg, **kw) + ^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/orm/session.py:1189: in _connection_for_bind + conn = bind.connect() + ^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3278: in connect + return self._connection_cls(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:146: in __init__ + self._dbapi_connection = engine.raw_connection() + ^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/base.py:3302: in raw_connection + return self.pool.connect() + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:449: in connect + return _ConnectionFairy._checkout(self) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1362: in _checkout + with util.safe_reraise(): + ^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py:146: in __exit__ + raise exc_value.with_traceback(exc_tb) +/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py:1300: in _checkout + result = pool._dialect._do_ping_w_event( +/usr/local/lib/python3.12/site-packages/sqlalchemy/engine/default.py:716: in _do_ping_w_event + return self.do_ping(dbapi_connection) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:1150: in do_ping + dbapi_connection.ping() +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:801: in ping + self._handle_exception(error) +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:782: in _handle_exception + raise error +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:799: in ping + _ = self.await_(self._async_ping()) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:132: in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py:196: in greenlet_spawn + value = await result + ^^^^^^^^^^^^ +/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py:808: in _async_ping + await tr.start() +/usr/local/lib/python3.12/site-packages/asyncpg/transaction.py:146: in start + await self._connection.execute(query) +/usr/local/lib/python3.12/site-packages/asyncpg/connection.py:349: in execute + result = await self._protocol.query(query, timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +asyncpg/protocol/protocol.pyx:375: in query + ??? +E RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +------------------------------ Captured log call ------------------------------- +ERROR sqlalchemy.pool.impl.AsyncAdaptedQueuePool:base.py:378 Exception terminating connection > +Traceback (most recent call last): + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/pool/base.py", line 374, in _close_connection + self._dialect.do_terminate(connection) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 1117, in do_terminate + dbapi_connection.terminate() + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py", line 895, in terminate + self.await_(self._connection.close(timeout=2)) + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 132, in await_only + return current.parent.switch(awaitable) # type: ignore[no-any-return,attr-defined] # noqa: E501 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py", line 196, in greenlet_spawn + value = await result + ^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1504, in close + await self._protocol.close(timeout) + File "asyncpg/protocol/protocol.pyx", line 627, in close + File "asyncpg/protocol/protocol.pyx", line 660, in asyncpg.protocol.protocol.BaseProtocol._request_cancel + File "/usr/local/lib/python3.12/site-packages/asyncpg/connection.py", line 1673, in _cancel_current_command + self._cancellations.add(self._loop.create_task(self._cancel(waiter))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 455, in create_task + self._check_closed() + File "/usr/local/lib/python3.12/asyncio/base_events.py", line 545, in _check_closed + raise RuntimeError('Event loop is closed') +RuntimeError: Event loop is closed +__ test_get_with_fake_id_returns_404[404 /appointments/{appointment_id}/edit] __ +tests/test_smoke_dynamic.py:75: in test_get_with_fake_id_returns_404 + assert r.status_code in (404, 302, 303), \ +E AssertionError: GET /appointments/00000000-0000-0000-0000-000000000000/edit returned 200, expected 404 or redirect +E assert 200 in (404, 302, 303) +E + where 200 = .status_code +----------------------------- Captured stdout call ----------------------------- +2026-03-01 14:01:40,818 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-01 14:01:40,818 INFO sqlalchemy.engine.Engine + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:40,818 INFO sqlalchemy.engine.Engine [cached since 15.2s ago] () +2026-03-01 14:01:40,825 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:40,825 INFO sqlalchemy.engine.Engine [cached since 15.2s ago] () +2026-03-01 14:01:40,827 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +2026-03-01 14:01:40,827 INFO sqlalchemy.engine.Engine [cached since 15.2s ago] () +2026-03-01 14:01:40,831 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +2026-03-01 14:01:40,831 INFO sqlalchemy.engine.Engine [cached since 15.2s ago] () +2026-03-01 14:01:40,834 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +2026-03-01 14:01:40,834 INFO sqlalchemy.engine.Engine [cached since 15.2s ago] () +2026-03-01 14:01:40,836 INFO sqlalchemy.engine.Engine SELECT * FROM appointments WHERE id = $1 +2026-03-01 14:01:40,836 INFO sqlalchemy.engine.Engine [generated in 0.00011s] ('00000000-0000-0000-0000-000000000000',) +2026-03-01 14:01:40,839 INFO sqlalchemy.engine.Engine COMMIT +2026-03-01 14:01:40,842 INFO sqlalchemy.engine.Engine BEGIN (implicit) +2026-03-01 14:01:40,842 INFO sqlalchemy.engine.Engine + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:40,842 INFO sqlalchemy.engine.Engine [cached since 15.23s ago] () +2026-03-01 14:01:40,843 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +2026-03-01 14:01:40,843 INFO sqlalchemy.engine.Engine [cached since 15.22s ago] () +2026-03-01 14:01:40,843 INFO sqlalchemy.engine.Engine + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +2026-03-01 14:01:40,843 INFO sqlalchemy.engine.Engine [cached since 15.22s ago] () +2026-03-01 14:01:40,844 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +2026-03-01 14:01:40,844 INFO sqlalchemy.engine.Engine [cached since 15.22s ago] () +2026-03-01 14:01:40,844 INFO sqlalchemy.engine.Engine + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +2026-03-01 14:01:40,844 INFO sqlalchemy.engine.Engine [cached since 15.22s ago] () +2026-03-01 14:01:40,845 INFO sqlalchemy.engine.Engine + SELECT * FROM appointments + WHERE is_deleted = false AND start_at >= CURRENT_DATE + ORDER BY start_at ASC + LIMIT 100 + +2026-03-01 14:01:40,845 INFO sqlalchemy.engine.Engine [cached since 7.18s ago] () +2026-03-01 14:01:40,848 INFO sqlalchemy.engine.Engine COMMIT +------------------------------ Captured log call ------------------------------- +INFO sqlalchemy.engine.Engine:base.py:2701 BEGIN (implicit) +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 15.2s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 15.2s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 15.2s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 15.2s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 15.2s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 SELECT * FROM appointments WHERE id = $1 +INFO sqlalchemy.engine.Engine:base.py:1846 [generated in 0.00011s] ('00000000-0000-0000-0000-000000000000',) +INFO sqlalchemy.engine.Engine:base.py:2707 COMMIT +INFO sqlalchemy.engine.Engine:base.py:2701 BEGIN (implicit) +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, name, color FROM domains + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 15.23s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, name FROM areas + WHERE is_deleted = false ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 15.22s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT id, domain_id, area_id, name, status FROM projects + WHERE is_deleted = false AND status != 'archived' + ORDER BY sort_order, name + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 15.22s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM capture WHERE is_deleted = false AND processed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 15.22s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT count(*) FROM daily_focus + WHERE is_deleted = false AND focus_date = CURRENT_DATE AND completed = false + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 15.22s ago] () +INFO sqlalchemy.engine.Engine:base.py:1846 + SELECT * FROM appointments + WHERE is_deleted = false AND start_at >= CURRENT_DATE + ORDER BY start_at ASC + LIMIT 100 + +INFO sqlalchemy.engine.Engine:base.py:1846 [cached since 7.18s ago] () +INFO sqlalchemy.engine.Engine:base.py:2707 COMMIT +=============================== warnings summary =============================== +tests/test_smoke_dynamic.py: 28 warnings + /usr/local/lib/python3.12/site-packages/starlette/templating.py:161: DeprecationWarning: The `name` is not the first parameter anymore. The first parameter should be the `Request` instance. + Replace `TemplateResponse(name, {"request": request})` by `TemplateResponse(request, name)`. + warnings.warn( + +tests/test_smoke_dynamic.py: 29 warnings + /usr/local/lib/python3.12/site-packages/_pytest/stash.py:108: RuntimeWarning: coroutine 'Connection._cancel' was never awaited + del self._storage[key] + Enable tracemalloc to get traceback where the object was allocated. + See https://docs.pytest.org/en/stable/how-to/capture-warnings.html#resource-warnings for more info. + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +=========================== short test summary info ============================ +FAILED tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /domains/create] - RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +FAILED tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /areas/create] - RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +FAILED tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /projects/create] - RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +FAILED tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /tasks/create] - RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +FAILED tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /notes/create] - RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +FAILED tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /links/create] - RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +FAILED tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /focus/] - sqlalchemy.exc.DBAPIError: (sqlalchemy.dialects.postgresql.asyncpg.Error) : invalid input for query argument $1: '2026-03-01' ('str' object has no attribute 'toordinal') +[SQL: + SELECT df.*, t.title, t.priority, t.status as task_status, + t.project_id, t.due_date, t.estimated_minutes, + p.name as project_name, + d.name as domain_name, d.color as domain_color + FROM daily_focus df + JOIN tasks t ON df.task_id = t.id + LEFT JOIN projects p ON t.project_id = p.id + LEFT JOIN domains d ON t.domain_id = d.id + WHERE df.focus_date = $1 AND df.is_deleted = false + ORDER BY df.sort_order, df.created_at + ] +[parameters: ('2026-03-01',)] +(Background on this error at: https://sqlalche.me/e/20/dbapi) +FAILED tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /capture/] - RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +FAILED tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /contacts/create] - RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +FAILED tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /search/] - RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +FAILED tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /lists/] - RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +FAILED tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /files/] - RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +FAILED tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /meetings/] - RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +FAILED tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /decisions/] - RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +FAILED tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /weblinks/] - RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +FAILED tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /weblinks/folders/create] - RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +FAILED tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /appointments/new] - RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +FAILED tests/test_smoke_dynamic.py::test_get_no_params_returns_200[GET /time/running] - RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +FAILED tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /domains/{domain_id}/edit] - AssertionError: GET /domains/00000000-0000-0000-0000-000000000000/edit returned 200, expected 404 or redirect +assert 200 in (404, 302, 303) + + where 200 = .status_code +FAILED tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /areas/{area_id}/edit] - RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +FAILED tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /projects/{project_id}] - AssertionError: GET /projects/00000000-0000-0000-0000-000000000000 returned 200, expected 404 or redirect +assert 200 in (404, 302, 303) + + where 200 = .status_code +FAILED tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /projects/{project_id}/edit] - RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +FAILED tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /tasks/{task_id}] - AssertionError: GET /tasks/00000000-0000-0000-0000-000000000000 returned 200, expected 404 or redirect +assert 200 in (404, 302, 303) + + where 200 = .status_code +FAILED tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /tasks/{task_id}/edit] - RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +FAILED tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /notes/{note_id}] - AssertionError: GET /notes/00000000-0000-0000-0000-000000000000 returned 200, expected 404 or redirect +assert 200 in (404, 302, 303) + + where 200 = .status_code +FAILED tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /notes/{note_id}/edit] - RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +FAILED tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /links/{link_id}/edit] - AssertionError: GET /links/00000000-0000-0000-0000-000000000000/edit returned 200, expected 404 or redirect +assert 200 in (404, 302, 303) + + where 200 = .status_code +FAILED tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /contacts/{contact_id}] - RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +FAILED tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /contacts/{contact_id}/edit] - AssertionError: GET /contacts/00000000-0000-0000-0000-000000000000/edit returned 200, expected 404 or redirect +assert 200 in (404, 302, 303) + + where 200 = .status_code +FAILED tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /lists/{list_id}] - RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +FAILED tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /lists/{list_id}/edit] - AssertionError: GET /lists/00000000-0000-0000-0000-000000000000/edit returned 200, expected 404 or redirect +assert 200 in (404, 302, 303) + + where 200 = .status_code +FAILED tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /files/{file_id}/download] - RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +FAILED tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /files/{file_id}/preview] - AssertionError: GET /files/00000000-0000-0000-0000-000000000000/preview returned 200, expected 404 or redirect +assert 200 in (404, 302, 303) + + where 200 = .status_code +FAILED tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /files/{file_id}/serve] - RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +FAILED tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /meetings/{meeting_id}] - AssertionError: GET /meetings/00000000-0000-0000-0000-000000000000 returned 200, expected 404 or redirect +assert 200 in (404, 302, 303) + + where 200 = .status_code +FAILED tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /meetings/{meeting_id}/edit] - RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +FAILED tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /decisions/{decision_id}] - AssertionError: GET /decisions/00000000-0000-0000-0000-000000000000 returned 200, expected 404 or redirect +assert 200 in (404, 302, 303) + + where 200 = .status_code +FAILED tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /decisions/{decision_id}/edit] - RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +FAILED tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /weblinks/{weblink_id}/edit] - AssertionError: GET /weblinks/00000000-0000-0000-0000-000000000000/edit returned 200, expected 404 or redirect +assert 200 in (404, 302, 303) + + where 200 = .status_code +FAILED tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /appointments/{appointment_id}] - RuntimeError: Task .call_next..coro() running at /usr/local/lib/python3.12/site-packages/starlette/middleware/base.py:149> cb=[TaskGroup._spawn..task_done() at /usr/local/lib/python3.12/site-packages/anyio/_backends/_asyncio.py:805]> got Future attached to a different loop +FAILED tests/test_smoke_dynamic.py::test_get_with_fake_id_returns_404[404 /appointments/{appointment_id}/edit] - AssertionError: GET /appointments/00000000-0000-0000-0000-000000000000/edit returned 200, expected 404 or redirect +assert 200 in (404, 302, 303) + + where 200 = .status_code +ERROR tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /domains/{domain_id}/edit] - RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... + ^ +ERROR tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /areas/{area_id}/edit] - RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... + ^ +ERROR tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /projects/{project_id}] - RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... + ^ +ERROR tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /projects/{project_id}/edit] - RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... + ^ +ERROR tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /tasks/{task_id}] - RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... + ^ +ERROR tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /tasks/{task_id}/edit] - RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... + ^ +ERROR tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /notes/{note_id}] - RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... + ^ +ERROR tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /notes/{note_id}/edit] - RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... + ^ +ERROR tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /links/{link_id}/edit] - RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... + ^ +ERROR tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /contacts/{contact_id}] - RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... + ^ +ERROR tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /contacts/{contact_id}/edit] - RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... + ^ +ERROR tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /lists/{list_id}] - RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... + ^ +ERROR tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /lists/{list_id}/edit] - RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... + ^ +ERROR tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /files/{file_id}/download] - RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... + ^ +ERROR tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /files/{file_id}/preview] - RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... + ^ +ERROR tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /files/{file_id}/serve] - RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... + ^ +ERROR tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /meetings/{meeting_id}] - RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... + ^ +ERROR tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /meetings/{meeting_id}/edit] - RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... + ^ +ERROR tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /decisions/{decision_id}] - RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... + ^ +ERROR tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /decisions/{decision_id}/edit] - RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... + ^ +ERROR tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /weblinks/{weblink_id}/edit] - RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... + ^ +ERROR tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /appointments/{appointment_id}] - RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... + ^ +ERROR tests/test_smoke_dynamic.py::test_get_with_valid_id_returns_200[GET /appointments/{appointment_id}/edit] - RuntimeError: Seed data insertion failed: column "folder_id" of relation "weblinks" does not exist +LINE 2: INSERT INTO weblinks (id, label, url, folder_id,... + ^ +============ 41 failed, 18 passed, 57 warnings, 23 errors in 15.30s ============ diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..33a9d7e --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,202 @@ +""" +Test fixtures - uses psycopg2 (sync) for seed data to avoid event loop conflicts. +Seeds are session-scoped and committed so the app can see them via its own engine. +""" +import asyncio +import uuid +import pytest +import psycopg2 +from httpx import AsyncClient, ASGITransport + +from tests.registry import app + +TEST_DB_DSN = "host=lifeos-db port=5432 dbname=lifeos_test user=postgres password=UCTOQDZiUhN8U" + +# ── Fixed seed UUIDs (stable across test runs) ────────────── +SEED_IDS = { + "domain": "a0000000-0000-0000-0000-000000000001", + "area": "a0000000-0000-0000-0000-000000000002", + "project": "a0000000-0000-0000-0000-000000000003", + "task": "a0000000-0000-0000-0000-000000000004", + "contact": "a0000000-0000-0000-0000-000000000005", + "note": "a0000000-0000-0000-0000-000000000006", + "meeting": "a0000000-0000-0000-0000-000000000007", + "decision": "a0000000-0000-0000-0000-000000000008", + "appointment": "a0000000-0000-0000-0000-000000000009", + "weblink_folder": "a0000000-0000-0000-0000-00000000000a", + "list": "a0000000-0000-0000-0000-00000000000b", + "link": "a0000000-0000-0000-0000-00000000000c", + "weblink": "a0000000-0000-0000-0000-00000000000d", + "capture": "a0000000-0000-0000-0000-00000000000e", + "focus": "a0000000-0000-0000-0000-00000000000f", +} + + +# ── Session-scoped event loop ─────────────────────────────── +# All async tests share one loop so the app's engine pool stays valid. +@pytest.fixture(scope="session") +def event_loop(): + loop = asyncio.new_event_loop() + yield loop + loop.close() + + +# ── Sync DB connection for seed management ────────────────── +@pytest.fixture(scope="session") +def sync_conn(): + conn = psycopg2.connect(TEST_DB_DSN) + conn.autocommit = False + yield conn + conn.close() + + +# ── Seed data (session-scoped, committed) ─────────────────── +@pytest.fixture(scope="session") +def all_seeds(sync_conn): + """Insert all seed data once. Committed so the app's engine can see it.""" + cur = sync_conn.cursor() + d = SEED_IDS + + try: + # Domain + cur.execute(""" + INSERT INTO domains (id, name, color, description, sort_order, is_deleted, created_at, updated_at) + VALUES (%s, 'Test Domain', '#FF5733', 'Auto test domain', 0, false, now(), now()) + ON CONFLICT (id) DO NOTHING + """, (d["domain"],)) + + # Area + cur.execute(""" + INSERT INTO areas (id, name, domain_id, description, status, sort_order, is_deleted, created_at, updated_at) + VALUES (%s, 'Test Area', %s, 'Auto test area', 'active', 0, false, now(), now()) + ON CONFLICT (id) DO NOTHING + """, (d["area"], d["domain"])) + + # Project + cur.execute(""" + INSERT INTO projects (id, name, domain_id, area_id, description, status, priority, sort_order, is_deleted, created_at, updated_at) + VALUES (%s, 'Test Project', %s, %s, 'Auto test project', 'active', 2, 0, false, now(), now()) + ON CONFLICT (id) DO NOTHING + """, (d["project"], d["domain"], d["area"])) + + # Task + cur.execute(""" + INSERT INTO tasks (id, title, domain_id, project_id, description, priority, status, sort_order, is_deleted, created_at, updated_at) + VALUES (%s, 'Test Task', %s, %s, 'Auto test task', 2, 'todo', 0, false, now(), now()) + ON CONFLICT (id) DO NOTHING + """, (d["task"], d["domain"], d["project"])) + + # Contact + cur.execute(""" + INSERT INTO contacts (id, first_name, last_name, company, email, is_deleted, created_at, updated_at) + VALUES (%s, 'Test', 'Contact', 'TestCorp', 'test@example.com', false, now(), now()) + ON CONFLICT (id) DO NOTHING + """, (d["contact"],)) + + # Note + cur.execute(""" + INSERT INTO notes (id, title, domain_id, body, content_format, is_deleted, created_at, updated_at) + VALUES (%s, 'Test Note', %s, 'Test body content', 'markdown', false, now(), now()) + ON CONFLICT (id) DO NOTHING + """, (d["note"], d["domain"])) + + # Meeting + cur.execute(""" + INSERT INTO meetings (id, title, meeting_date, status, is_deleted, created_at, updated_at) + VALUES (%s, 'Test Meeting', '2025-06-15', 'scheduled', false, now(), now()) + ON CONFLICT (id) DO NOTHING + """, (d["meeting"],)) + + # Decision + cur.execute(""" + INSERT INTO decisions (id, title, status, impact, is_deleted, created_at, updated_at) + VALUES (%s, 'Test Decision', 'decided', 'high', false, now(), now()) + ON CONFLICT (id) DO NOTHING + """, (d["decision"],)) + + # Appointment + cur.execute(""" + INSERT INTO appointments (id, title, start_at, end_at, all_day, is_deleted, created_at, updated_at) + VALUES (%s, 'Test Appointment', '2025-06-15 10:00:00', '2025-06-15 11:00:00', false, false, now(), now()) + ON CONFLICT (id) DO NOTHING + """, (d["appointment"],)) + + # Weblink folder + cur.execute(""" + INSERT INTO weblink_folders (id, name, is_deleted, created_at, updated_at) + VALUES (%s, 'Test Folder', false, now(), now()) + ON CONFLICT (id) DO NOTHING + """, (d["weblink_folder"],)) + + # List + cur.execute(""" + INSERT INTO lists (id, name, domain_id, project_id, list_type, is_deleted, created_at, updated_at) + VALUES (%s, 'Test List', %s, %s, 'checklist', false, now(), now()) + ON CONFLICT (id) DO NOTHING + """, (d["list"], d["domain"], d["project"])) + + # Link + cur.execute(""" + INSERT INTO links (id, label, url, domain_id, is_deleted, created_at, updated_at) + VALUES (%s, 'Test Link', 'https://example.com', %s, false, now(), now()) + ON CONFLICT (id) DO NOTHING + """, (d["link"], d["domain"])) + + # Weblink + cur.execute(""" + INSERT INTO weblinks (id, label, url, folder_id, is_deleted, created_at, updated_at) + VALUES (%s, 'Test Weblink', 'https://example.com/wl', %s, false, now(), now()) + ON CONFLICT (id) DO NOTHING + """, (d["weblink"], d["weblink_folder"])) + + # Capture + cur.execute(""" + INSERT INTO capture (id, raw_text, status, is_deleted, created_at, updated_at) + VALUES (%s, 'Test capture item', 'pending', false, now(), now()) + ON CONFLICT (id) DO NOTHING + """, (d["capture"],)) + + # Daily focus + cur.execute(""" + INSERT INTO daily_focus (id, task_id, focus_date, is_completed, created_at) + VALUES (%s, %s, CURRENT_DATE, false, now()) + ON CONFLICT (id) DO NOTHING + """, (d["focus"], d["task"])) + + sync_conn.commit() + except Exception as e: + sync_conn.rollback() + raise RuntimeError(f"Seed data insertion failed: {e}") from e + + yield d + + # Cleanup: delete all seed data (reverse dependency order) + try: + cur.execute("DELETE FROM daily_focus WHERE id = %s", (d["focus"],)) + cur.execute("DELETE FROM capture WHERE id = %s", (d["capture"],)) + cur.execute("DELETE FROM weblinks WHERE id = %s", (d["weblink"],)) + cur.execute("DELETE FROM links WHERE id = %s", (d["link"],)) + cur.execute("DELETE FROM lists WHERE id = %s", (d["list"],)) + cur.execute("DELETE FROM weblink_folders WHERE id = %s", (d["weblink_folder"],)) + cur.execute("DELETE FROM appointments WHERE id = %s", (d["appointment"],)) + cur.execute("DELETE FROM decisions WHERE id = %s", (d["decision"],)) + cur.execute("DELETE FROM meetings WHERE id = %s", (d["meeting"],)) + cur.execute("DELETE FROM notes WHERE id = %s", (d["note"],)) + cur.execute("DELETE FROM contacts WHERE id = %s", (d["contact"],)) + cur.execute("DELETE FROM tasks WHERE id = %s", (d["task"],)) + cur.execute("DELETE FROM projects WHERE id = %s", (d["project"],)) + cur.execute("DELETE FROM areas WHERE id = %s", (d["area"],)) + cur.execute("DELETE FROM domains WHERE id = %s", (d["domain"],)) + sync_conn.commit() + except Exception: + sync_conn.rollback() + finally: + cur.close() + + +# ── HTTP client (function-scoped) ─────────────────────────── +@pytest.fixture +async def client(): + transport = ASGITransport(app=app) + async with AsyncClient(transport=transport, base_url="http://test") as c: + yield c diff --git a/tests/form_factory.py b/tests/form_factory.py new file mode 100644 index 0000000..883c982 --- /dev/null +++ b/tests/form_factory.py @@ -0,0 +1,195 @@ +""" +Form Data Factory +================= +Generates valid POST form data for any route, using: + 1. Introspected Form field names/types from the route + 2. Seed data UUIDs for FK references (domain_id, project_id, etc.) + 3. Heuristic value generation based on field name patterns + +This eliminates hardcoded form data in tests. When a route's +form fields change, tests automatically adapt. +""" +from __future__ import annotations + +from datetime import date, datetime, timezone +from typing import Any + +from tests.introspect import FormField + + +# --------------------------------------------------------------------------- +# Field name -> value resolution rules +# --------------------------------------------------------------------------- + +# FK fields map to seed fixture keys +FK_FIELD_MAP = { + "domain_id": "domain", + "area_id": "area", + "project_id": "project", + "task_id": "task", + "folder_id": "weblink_folder", + "parent_id": None, # Usually optional, skip + "meeting_id": None, + "contact_id": "contact", + "release_id": None, + "note_id": "note", + "list_id": "list", +} + +# Field name pattern -> static test value +NAME_PATTERNS: list[tuple[str, Any]] = [ + # Exact matches first + ("title", "Test Title Auto"), + ("name", "Test Name Auto"), + ("first_name", "TestFirst"), + ("last_name", "TestLast"), + ("description", "Auto-generated test description"), + ("body", "Auto-generated test body content"), + ("raw_text", "Auto capture line 1\nAuto capture line 2"), + ("url", "https://test.example.com"), + ("email", "autotest@example.com"), + ("phone", "555-0199"), + ("company", "Test Corp"), + ("role", "Tester"), + ("color", "#AA55CC"), + ("icon", "star"), + ("status", "active"), + ("priority", "3"), + ("content_format", "rich"), + ("meeting_date", None), # Resolved dynamically + ("start_date", None), + ("end_date", None), + ("start_time", None), + ("end_time", None), + ("due_date", None), + ("start_at", None), + ("end_at", None), + ("focus_date", None), + ("sort_order", "0"), + ("estimated_minutes", "30"), + ("energy_required", "medium"), + ("context", ""), + ("recurrence", ""), + ("version_label", "v1.0"), + ("agenda", "Test agenda"), + ("notes_body", "Test notes"), + ("location", "Test Location"), + ("tags", ""), + ("notes", "Test notes field"), +] + + +def _resolve_date_field(field_name: str) -> str: + """Generate appropriate date/time string based on field name.""" + now = datetime.now(timezone.utc) + if "time" in field_name and "date" not in field_name: + return now.strftime("%H:%M") + if "date" in field_name: + return date.today().isoformat() + if field_name in ("start_at", "end_at"): + return now.isoformat() + return date.today().isoformat() + + +def build_form_data( + form_fields: list[FormField], + seed_data: dict[str, dict] | None = None, +) -> dict[str, str]: + """ + Build a valid form data dict for a POST request. + + Args: + form_fields: List of FormField from route introspection. + seed_data: Dict mapping entity type to seed fixture dict. + e.g. {"domain": {"id": "abc-123", ...}, "project": {"id": "def-456", ...}} + + Returns: + Dict of field_name -> string value, ready for httpx POST data. + """ + seed_data = seed_data or {} + data: dict[str, str] = {} + + for field in form_fields: + if field.is_file: + continue # Skip file uploads in form data + + value = _resolve_field_value(field, seed_data) + if value is not None: + data[field.name] = str(value) + + return data + + +def _resolve_field_value( + field: FormField, + seed_data: dict[str, dict], +) -> Any | None: + """Resolve a single field's test value.""" + name = field.name + + # 1. FK fields -> look up seed data UUID + if name in FK_FIELD_MAP: + entity_type = FK_FIELD_MAP[name] + if entity_type is None: + # Optional FK with no mapping, return None (skip) + return "" if not field.required else None + if entity_type in seed_data and "id" in seed_data[entity_type]: + return seed_data[entity_type]["id"] + # Required FK but no seed data available + return None if not field.required else "" + + # 2. Date/time fields + if any(kw in name for kw in ("date", "time", "_at")): + return _resolve_date_field(name) + + # 3. Pattern matching on field name + for pattern_name, pattern_value in NAME_PATTERNS: + if name == pattern_name: + if pattern_value is None: + return _resolve_date_field(name) + return pattern_value + + # 4. Partial name matching for common patterns + if "title" in name: + return "Test Title Auto" + if "name" in name: + return "Test Name Auto" + if "description" in name or "desc" in name: + return "Auto test description" + if "url" in name: + return "https://test.example.com" + if "email" in name: + return "auto@test.com" + + # 5. Type-based fallback + if "int" in field.annotation.lower(): + return "0" + if "bool" in field.annotation.lower(): + return "false" + + # 6. If field has a default, use it + if field.default is not None: + return str(field.default) + + # 7. Last resort for required string fields + if field.required: + return f"test_{name}" + + return "" + + +def build_edit_data( + form_fields: list[FormField], + seed_data: dict[str, dict] | None = None, +) -> dict[str, str]: + """ + Build form data for an edit/update request. + Same as build_form_data but prefixes string values with "Updated " + so tests can verify the edit took effect. + """ + data = build_form_data(form_fields, seed_data) + for key, value in data.items(): + # Only modify display-name fields, not IDs/dates/status + if key in ("title", "name", "first_name", "last_name", "description", "body"): + data[key] = f"Updated {value}" + return data diff --git a/tests/introspect.py b/tests/introspect.py new file mode 100644 index 0000000..791f021 --- /dev/null +++ b/tests/introspect.py @@ -0,0 +1,357 @@ +""" +Route Introspection Engine +========================== +Imports the live FastAPI app and extracts a complete route registry: + - All paths, methods, endpoint names + - Path parameters (e.g. {id}) + - Form fields with types and defaults (from function signatures) + - Route classification (list, detail, create, edit, delete, etc.) + +This is the single source of truth for all dynamic tests. +No hardcoded routes anywhere in the test suite. +""" +from __future__ import annotations + +import inspect +import json +import re +from dataclasses import dataclass, field, asdict +from enum import Enum +from typing import Any, Optional + +from fastapi import Form, UploadFile +from fastapi.params import Depends +from fastapi.routing import APIRoute + + +class RouteKind(str, Enum): + """Classification of route purpose based on path pattern + method.""" + LIST = "list" # GET /entities/ + DETAIL = "detail" # GET /entities/{id} + CREATE_FORM = "create_form" # GET /entities/create + EDIT_FORM = "edit_form" # GET /entities/{id}/edit + CREATE = "create" # POST /entities/create + EDIT = "edit" # POST /entities/{id}/edit + DELETE = "delete" # POST /entities/{id}/delete + TOGGLE = "toggle" # POST /entities/{id}/toggle + ACTION = "action" # POST with other patterns + JSON_ENDPOINT = "json" # GET returning JSON (e.g. /time/running) + PAGE = "page" # GET catch-all (dashboard, search, etc.) + OTHER = "other" + + +@dataclass +class FormField: + """A form field extracted from a route endpoint's signature.""" + name: str + annotation: str # str, int, Optional[str], etc. + required: bool + default: Any = None # Default value if not required + is_file: bool = False # True for UploadFile params + + +@dataclass +class RouteInfo: + """Complete metadata for a single route.""" + path: str + methods: list[str] + endpoint_name: str + kind: RouteKind + path_params: list[str] # e.g. ["id"] from /tasks/{id} + form_fields: list[FormField] # Form() params from signature + query_params: list[str] # Non-Form, non-Depends, non-Request params + has_file_upload: bool = False + prefix: str = "" # Router prefix, e.g. "/tasks" + + @property + def needs_seed_data(self) -> bool: + """True if this route needs an entity ID to test.""" + return bool(self.path_params) + + @property + def entity_prefix(self) -> str: + """Extract the entity prefix, e.g. '/tasks' from '/tasks/{id}/edit'.""" + if self.prefix: + return self.prefix + parts = self.path.strip("/").split("/") + return f"/{parts[0]}" if parts else "" + + +def _classify_route(path: str, methods: set[str]) -> RouteKind: + """Determine route purpose from path pattern and HTTP method.""" + is_get = "GET" in methods + is_post = "POST" in methods + + if is_get: + if path.endswith("/create"): + return RouteKind.CREATE_FORM + if path.endswith("/edit"): + return RouteKind.EDIT_FORM + if "{" in path: + return RouteKind.DETAIL + # Heuristic: paths ending in known JSON endpoints + if any(path.endswith(p) for p in ["/running"]): + return RouteKind.JSON_ENDPOINT + if re.match(r"^/[^/]+/?$", path) or path == "/": + return RouteKind.LIST if path != "/" else RouteKind.PAGE + return RouteKind.PAGE + + if is_post: + if path.endswith("/create"): + return RouteKind.CREATE + if path.endswith("/edit"): + return RouteKind.EDIT + if path.endswith("/delete"): + return RouteKind.DELETE + if path.endswith("/toggle"): + return RouteKind.TOGGLE + return RouteKind.ACTION + + return RouteKind.OTHER + + +def _extract_path_params(path: str) -> list[str]: + """Pull {param_name} from path template.""" + return re.findall(r"\{(\w+)\}", path) + + +def _extract_form_fields(endpoint) -> list[FormField]: + """ + Inspect the endpoint function signature to find Form() parameters. + Returns list of FormField with name, type, required status, and defaults. + """ + fields = [] + try: + sig = inspect.signature(endpoint) + except (ValueError, TypeError): + return fields + + for name, param in sig.parameters.items(): + # Skip non-form params + if name in ("request", "self", "cls"): + continue + + default = param.default + + # Check if it's a Depends() - skip those + if isinstance(default, Depends): + continue + + # Check for UploadFile annotation + annotation = param.annotation + ann_str = _annotation_to_str(annotation) + + if annotation is UploadFile or (hasattr(annotation, "__origin__") and UploadFile in getattr(annotation, "__args__", ())): + fields.append(FormField( + name=name, + annotation=ann_str, + required=True, + is_file=True, + )) + continue + + # Check if default is a Form() instance + is_form = False + form_default = inspect.Parameter.empty + + if hasattr(default, "__class__") and default.__class__.__name__ in ("Form", "FieldInfo"): + is_form = True + # Extract the actual default from the Form() wrapper + if hasattr(default, "default"): + form_default = default.default + + if not is_form: + # Could also be Form via Annotated types (FastAPI 0.95+) + if hasattr(annotation, "__metadata__"): + for meta in annotation.__metadata__: + if hasattr(meta, "__class__") and meta.__class__.__name__ in ("Form", "FieldInfo"): + is_form = True + if hasattr(meta, "default"): + form_default = meta.default + break + + if is_form: + # Determine if required + required = form_default is inspect.Parameter.empty or form_default is Ellipsis or form_default is None and "Optional" not in ann_str + actual_default = None if form_default in (inspect.Parameter.empty, Ellipsis) else form_default + + fields.append(FormField( + name=name, + annotation=ann_str, + required=required, + default=actual_default, + )) + + return fields + + +def _extract_query_params(endpoint, path_params: list[str]) -> list[str]: + """Extract query parameters (non-Form, non-Depends, non-special params).""" + params = [] + skip = {"request", "self", "cls", "db"} | set(path_params) + + try: + sig = inspect.signature(endpoint) + except (ValueError, TypeError): + return params + + for name, param in sig.parameters.items(): + if name in skip: + continue + default = param.default + if isinstance(default, Depends): + continue + # If it has a Form() default, skip (handled by form_fields) + if hasattr(default, "__class__") and default.__class__.__name__ in ("Form", "FieldInfo"): + continue + # Check Annotated metadata + annotation = param.annotation + if hasattr(annotation, "__metadata__"): + has_form = any( + hasattr(m, "__class__") and m.__class__.__name__ in ("Form", "FieldInfo") + for m in annotation.__metadata__ + ) + if has_form: + continue + # Remaining non-special params are likely query params + if param.annotation is not UploadFile: + params.append(name) + + return params + + +def _annotation_to_str(annotation) -> str: + """Convert a type annotation to readable string.""" + if annotation is inspect.Parameter.empty: + return "Any" + if hasattr(annotation, "__name__"): + return annotation.__name__ + return str(annotation).replace("typing.", "") + + +def _extract_prefix(path: str) -> str: + """Get the router prefix from a path.""" + # /tasks/{id}/edit -> /tasks + # /admin/trash/ -> /admin/trash + # /weblinks/folders/create -> /weblinks + parts = path.strip("/").split("/") + if not parts: + return "/" + # Walk until we hit a {param} or known action word + prefix_parts = [] + for part in parts: + if part.startswith("{"): + break + if part in ("create", "edit", "delete", "toggle"): + break + prefix_parts.append(part) + return "/" + "/".join(prefix_parts) if prefix_parts else "/" + + +def introspect_app(app) -> list[RouteInfo]: + """ + Walk all registered routes on the FastAPI app. + Returns a complete RouteInfo list - the single source of truth for tests. + """ + routes = [] + + for route in app.routes: + if not isinstance(route, APIRoute): + continue + + path = route.path + methods = route.methods or set() + endpoint = route.endpoint + endpoint_name = endpoint.__name__ if hasattr(endpoint, "__name__") else str(endpoint) + + path_params = _extract_path_params(path) + form_fields = _extract_form_fields(endpoint) + query_params = _extract_query_params(endpoint, path_params) + has_file = any(f.is_file for f in form_fields) + + # Classify each method separately if route has both GET and POST + for method in methods: + kind = _classify_route(path, {method}) + prefix = _extract_prefix(path) + + routes.append(RouteInfo( + path=path, + methods=[method], + endpoint_name=endpoint_name, + kind=kind, + path_params=path_params, + form_fields=form_fields if method == "POST" else [], + query_params=query_params if method == "GET" else [], + has_file_upload=has_file, + prefix=prefix, + )) + + return routes + + +def get_route_registry(app) -> dict: + """ + Build a structured registry keyed by route kind. + Convenience wrapper for test parametrization. + """ + all_routes = introspect_app(app) + + registry = { + "all": all_routes, + "get_no_params": [r for r in all_routes if "GET" in r.methods and not r.path_params], + "get_with_params": [r for r in all_routes if "GET" in r.methods and r.path_params], + "post_create": [r for r in all_routes if r.kind == RouteKind.CREATE], + "post_edit": [r for r in all_routes if r.kind == RouteKind.EDIT], + "post_delete": [r for r in all_routes if r.kind == RouteKind.DELETE], + "post_action": [r for r in all_routes if r.kind in (RouteKind.ACTION, RouteKind.TOGGLE)], + "lists": [r for r in all_routes if r.kind == RouteKind.LIST], + "details": [r for r in all_routes if r.kind == RouteKind.DETAIL], + "create_forms": [r for r in all_routes if r.kind == RouteKind.CREATE_FORM], + "edit_forms": [r for r in all_routes if r.kind == RouteKind.EDIT_FORM], + } + + # Group by prefix for entity-level operations + by_prefix: dict[str, list[RouteInfo]] = {} + for r in all_routes: + by_prefix.setdefault(r.prefix, []).append(r) + registry["by_prefix"] = by_prefix + + return registry + + +def dump_registry_report(app) -> str: + """ + Generate a human-readable report of all discovered routes. + Useful for debugging / verifying introspection output. + """ + routes = introspect_app(app) + lines = [ + "=" * 70, + "LIFE OS ROUTE REGISTRY", + f"Total routes discovered: {len(routes)}", + "=" * 70, + "", + ] + + # Group by prefix + by_prefix: dict[str, list[RouteInfo]] = {} + for r in routes: + by_prefix.setdefault(r.prefix, []).append(r) + + for prefix in sorted(by_prefix.keys()): + prefix_routes = by_prefix[prefix] + lines.append(f" {prefix}") + lines.append(f" {'─' * 60}") + for r in sorted(prefix_routes, key=lambda x: (x.path, x.methods)): + method = r.methods[0] if r.methods else "?" + form_str = "" + if r.form_fields: + field_names = [f.name + ("*" if f.required else "") for f in r.form_fields] + form_str = f" fields=[{', '.join(field_names)}]" + query_str = "" + if r.query_params: + query_str = f" query=[{', '.join(r.query_params)}]" + lines.append(f" {method:6s} {r.path:40s} {r.kind.value:15s}{form_str}{query_str}") + lines.append("") + + return "\n".join(lines) diff --git a/tests/registry.py b/tests/registry.py new file mode 100644 index 0000000..550a39e --- /dev/null +++ b/tests/registry.py @@ -0,0 +1,69 @@ +""" +Route registry - imports app, runs introspection once, exposes route data. +Disposes the async engine after introspection to avoid event loop conflicts. +""" +import os +import asyncio + +# Point the app at the test database BEFORE importing +os.environ["DATABASE_URL"] = "postgresql+asyncpg://postgres:UCTOQDZiUhN8U@lifeos-db:5432/lifeos_test" + +from main import app +from tests.introspect import introspect_app + +# Build route registry from live app +ROUTE_REGISTRY = introspect_app(app) + +# Classify routes into buckets for parametrized tests +GET_NO_PARAMS = [r for r in ROUTE_REGISTRY if "GET" in r.methods and not r.path_params] +GET_WITH_PARAMS = [r for r in ROUTE_REGISTRY if "GET" in r.methods and r.path_params] +POST_CREATE = [r for r in ROUTE_REGISTRY if "POST" in r.methods and r.kind == "create"] +POST_EDIT = [r for r in ROUTE_REGISTRY if "POST" in r.methods and r.kind == "edit"] +POST_DELETE = [r for r in ROUTE_REGISTRY if "POST" in r.methods and r.kind == "delete"] +POST_ACTION = [r for r in ROUTE_REGISTRY if "POST" in r.methods and r.kind in ("action", "toggle")] + +# Map route prefixes to seed fixture keys +PREFIX_TO_SEED = { + "/domains": "domain", + "/areas": "area", + "/projects": "project", + "/tasks": "task", + "/notes": "note", + "/links": "link", + "/contacts": "contact", + "/lists": "list", + "/meetings": "meeting", + "/decisions": "decision", + "/weblinks": "weblink", + "/weblinks/folders": "weblink_folder", + "/appointments": "appointment", + "/focus": "focus", + "/capture": "capture", + "/time": "task", + "/files": None, + "/admin/trash": None, +} + +def resolve_path(path_template, seeds): + """Replace {id} placeholders with real seed UUIDs.""" + import re + result = path_template + for param in re.findall(r"\{(\w+)\}", path_template): + # Find prefix for this route + for prefix, seed_key in sorted(PREFIX_TO_SEED.items(), key=lambda x: -len(x[0])): + if path_template.startswith(prefix) and seed_key and seed_key in seeds: + result = result.replace(f"{{{param}}}", str(seeds[seed_key])) + break + return result + +# CRITICAL: Dispose the async engine created at import time. +# It was bound to whatever event loop existed during collection. +# When tests run, pytest-asyncio creates a NEW event loop. +# The engine will lazily recreate its connection pool on that new loop. +try: + from core.database import engine + loop = asyncio.new_event_loop() + loop.run_until_complete(engine.dispose()) + loop.close() +except Exception: + pass # If disposal fails, tests will still try to proceed diff --git a/tests/route_report.py b/tests/route_report.py new file mode 100644 index 0000000..5781ee5 --- /dev/null +++ b/tests/route_report.py @@ -0,0 +1,65 @@ +""" +Route Registry Report +===================== +Run inside the container to see exactly what the introspection engine +discovers from the live app. Use this to verify before running tests. + +Usage: + docker exec lifeos-dev python -m tests.route_report +""" +from __future__ import annotations + +import sys +sys.path.insert(0, "/app") + +from tests.registry import ALL_ROUTES, ROUTE_REGISTRY, PREFIX_TO_SEED # noqa: E402 +from tests.introspect import dump_registry_report, RouteKind # noqa: E402 +from main import app # noqa: E402 + + +def main(): + print(dump_registry_report(app)) + + reg = ROUTE_REGISTRY + print("\n" + "=" * 70) + print("SUMMARY") + print("=" * 70) + print(f" Total routes: {len(reg['all'])}") + print(f" GET (no params): {len(reg['get_no_params'])}") + print(f" GET (with params): {len(reg['get_with_params'])}") + print(f" POST create: {len(reg['post_create'])}") + print(f" POST edit: {len(reg['post_edit'])}") + print(f" POST delete: {len(reg['post_delete'])}") + print(f" POST action/toggle: {len(reg['post_action'])}") + print(f" Entity prefixes: {len(reg['by_prefix'])}") + print() + + # Warn about POST routes with no discovered form fields + for r in reg["post_create"]: + if not r.form_fields: + print(f" WARNING: {r.path} has no discovered Form() fields") + for r in reg["post_edit"]: + if not r.form_fields: + print(f" WARNING: {r.path} has no discovered Form() fields") + + # Show seed mapping coverage + print() + print("PREFIX_TO_SEED coverage:") + print("-" * 70) + for prefix in sorted(reg["by_prefix"].keys()): + has_seed = prefix in PREFIX_TO_SEED and PREFIX_TO_SEED[prefix] is not None + marker = "OK" if has_seed else "SKIP (no seed)" + print(f" {prefix:30s} {marker}") + + print() + print("Form field details for create routes:") + print("-" * 70) + for r in reg["post_create"]: + if r.form_fields: + fields = [f" {f.name}: {f.annotation}{'*' if f.required else ''}" for f in r.form_fields] + print(f"\n {r.path}") + print("\n".join(fields)) + + +if __name__ == "__main__": + main() diff --git a/tests/run_tests.sh b/tests/run_tests.sh new file mode 100755 index 0000000..59d99b6 --- /dev/null +++ b/tests/run_tests.sh @@ -0,0 +1,22 @@ +#!/bin/bash +set -e +cd /app +pip install pytest pytest-asyncio httpx --break-system-packages -q 2>/dev/null + +echo "=============================================" +echo " Life OS Dynamic Test Suite" +echo "=============================================" +echo "" + +case "${1}" in + smoke) echo ">> Smoke tests"; python -m pytest tests/test_smoke_dynamic.py -v --tb=short ;; + crud) echo ">> CRUD tests"; python -m pytest tests/test_crud_dynamic.py -v --tb=short ;; + logic) echo ">> Business logic"; python -m pytest tests/test_business_logic.py -v --tb=short ;; + report) echo ">> Route report"; python -m tests.route_report ;; + fast) echo ">> Smoke, stop on fail"; python -m pytest tests/test_smoke_dynamic.py -v --tb=short -x ;; + "") echo ">> Full suite"; python -m pytest tests/ -v --tb=short ;; + *) echo ">> Custom: $@"; python -m pytest tests/ "$@" ;; +esac + +echo "" +echo "Done" diff --git a/tests/test_business_logic.py b/tests/test_business_logic.py new file mode 100644 index 0000000..86ff886 --- /dev/null +++ b/tests/test_business_logic.py @@ -0,0 +1,212 @@ +""" +Business Logic Tests +==================== +Hand-written tests for specific behavioral contracts. +These test LOGIC, not routes, so they stay manual. + +When to add tests here: + - New constraint (e.g. "only one timer running at a time") + - State transitions (e.g. "completing a task sets completed_at") + - Cross-entity effects (e.g. "deleting a project hides its tasks") + - Search behavior + - Sidebar data integrity +""" +from __future__ import annotations + +import uuid +from datetime import date, datetime, timezone + +import pytest +from httpx import AsyncClient +from sqlalchemy import text +from sqlalchemy.ext.asyncio import AsyncSession + + +# =========================================================================== +# Time Tracking +# =========================================================================== +class TestTimerConstraints: + """Only one timer can run at a time. Starting a new one auto-stops the old.""" + + @pytest.mark.asyncio + async def test_single_timer_constraint( + self, client: AsyncClient, db_session: AsyncSession, + seed_domain: dict, seed_project: dict, + ): + t1 = await _create_task(db_session, seed_domain["id"], seed_project["id"], "Timer1") + t2 = await _create_task(db_session, seed_domain["id"], seed_project["id"], "Timer2") + + await client.post("/time/start", data={"task_id": t1}, follow_redirects=False) + await client.post("/time/start", data={"task_id": t2}, follow_redirects=False) + + result = await db_session.execute( + text("SELECT count(*) FROM time_entries WHERE end_at IS NULL") + ) + assert result.scalar() <= 1 + + @pytest.mark.asyncio + async def test_stop_sets_end_at( + self, client: AsyncClient, db_session: AsyncSession, seed_task: dict, + ): + await client.post("/time/start", data={"task_id": seed_task["id"]}, follow_redirects=False) + await client.post("/time/stop", follow_redirects=False) + + result = await db_session.execute( + text("SELECT count(*) FROM time_entries WHERE end_at IS NULL AND task_id = :tid"), + {"tid": seed_task["id"]}, + ) + assert result.scalar() == 0 + + @pytest.mark.asyncio + async def test_running_endpoint_returns_json( + self, client: AsyncClient, seed_task: dict, + ): + await client.post("/time/start", data={"task_id": seed_task["id"]}, follow_redirects=False) + r = await client.get("/time/running") + assert r.status_code == 200 + # Should be valid JSON + data = r.json() + assert data is not None + + +# =========================================================================== +# Soft Delete & Restore +# =========================================================================== +class TestSoftDeleteBehavior: + """Soft-deleted items should vanish from lists and reappear after restore.""" + + @pytest.mark.asyncio + async def test_deleted_task_hidden_from_list( + self, client: AsyncClient, seed_task: dict, + ): + await client.post(f"/tasks/{seed_task['id']}/delete", follow_redirects=False) + r = await client.get("/tasks/") + assert seed_task["title"] not in r.text + + @pytest.mark.asyncio + async def test_restore_task_reappears( + self, client: AsyncClient, seed_task: dict, + ): + await client.post(f"/tasks/{seed_task['id']}/delete", follow_redirects=False) + await client.post( + f"/admin/trash/restore/tasks/{seed_task['id']}", + follow_redirects=False, + ) + r = await client.get("/tasks/") + assert seed_task["title"] in r.text + + @pytest.mark.asyncio + async def test_deleted_project_hidden( + self, client: AsyncClient, seed_project: dict, + ): + await client.post(f"/projects/{seed_project['id']}/delete", follow_redirects=False) + r = await client.get("/projects/") + assert seed_project["name"] not in r.text + + +# =========================================================================== +# Search +# =========================================================================== +class TestSearchBehavior: + @pytest.mark.asyncio + async def test_search_does_not_crash_on_sql_injection(self, client: AsyncClient): + r = await client.get("/search/?q='; DROP TABLE tasks; --") + assert r.status_code == 200 + + @pytest.mark.asyncio + async def test_search_empty_query(self, client: AsyncClient): + r = await client.get("/search/?q=") + assert r.status_code == 200 + + @pytest.mark.asyncio + async def test_search_special_unicode(self, client: AsyncClient): + r = await client.get("/search/?q=日本語テスト") + assert r.status_code == 200 + + +# =========================================================================== +# Sidebar +# =========================================================================== +class TestSidebarIntegrity: + @pytest.mark.asyncio + async def test_sidebar_shows_domain_on_every_page( + self, client: AsyncClient, seed_domain: dict, + ): + """Domain should appear in sidebar across all pages.""" + # Sample a few different page types + for path in ("/", "/tasks/", "/notes/", "/projects/"): + r = await client.get(path) + assert seed_domain["name"] in r.text, f"Domain missing from sidebar on {path}" + + @pytest.mark.asyncio + async def test_sidebar_shows_project_hierarchy( + self, client: AsyncClient, seed_domain: dict, seed_area: dict, seed_project: dict, + ): + r = await client.get("/") + assert seed_project["name"] in r.text + + +# =========================================================================== +# Focus & Capture Workflows +# =========================================================================== +class TestFocusWorkflow: + @pytest.mark.asyncio + async def test_add_and_remove_from_focus( + self, client: AsyncClient, db_session: AsyncSession, seed_task: dict, + ): + # Add to focus + r = await client.post("/focus/add", data={"task_id": seed_task["id"]}, follow_redirects=False) + assert r.status_code in (303, 302) + + @pytest.mark.asyncio + async def test_capture_multi_line_creates_multiple( + self, client: AsyncClient, db_session: AsyncSession, + ): + await client.post( + "/capture/add", + data={"raw_text": "Line one\nLine two\nLine three"}, + follow_redirects=False, + ) + result = await db_session.execute( + text("SELECT count(*) FROM capture WHERE is_deleted = false") + ) + count = result.scalar() + # Should have created at least 2 items (3 lines) + assert count >= 2, f"Expected multiple capture items, got {count}" + + +# =========================================================================== +# Edge Cases +# =========================================================================== +class TestEdgeCases: + @pytest.mark.asyncio + async def test_invalid_uuid_in_path(self, client: AsyncClient): + r = await client.get("/tasks/not-a-valid-uuid") + assert r.status_code in (404, 422, 400) + + @pytest.mark.asyncio + async def test_timer_start_without_task_id(self, client: AsyncClient): + r = await client.post("/time/start", data={}, follow_redirects=False) + assert r.status_code != 200 # Should error, not silently succeed + + @pytest.mark.asyncio + async def test_double_delete_doesnt_crash( + self, client: AsyncClient, seed_task: dict, + ): + await client.post(f"/tasks/{seed_task['id']}/delete", follow_redirects=False) + r = await client.post(f"/tasks/{seed_task['id']}/delete", follow_redirects=False) + assert r.status_code in (303, 302, 404) + + +# =========================================================================== +# Helpers +# =========================================================================== +async def _create_task(db: AsyncSession, domain_id: str, project_id: str, title: str) -> str: + _id = str(uuid.uuid4()) + await db.execute( + text("INSERT INTO tasks (id, domain_id, project_id, title, status, priority, sort_order, is_deleted, created_at, updated_at) " + "VALUES (:id, :did, :pid, :title, 'open', 3, 0, false, now(), now())"), + {"id": _id, "did": domain_id, "pid": project_id, "title": title}, + ) + await db.flush() + return _id diff --git a/tests/test_crud_dynamic.py b/tests/test_crud_dynamic.py new file mode 100644 index 0000000..7d822d0 --- /dev/null +++ b/tests/test_crud_dynamic.py @@ -0,0 +1,161 @@ +""" +Dynamic CRUD Tests +================== +Auto-discovers all POST routes and generates valid form data from +introspected Form() field signatures. No hardcoded form payloads. + +When you add a new entity router with standard CRUD, these tests +automatically cover create/edit/delete on next run. + +Tests: + - All POST /create routes accept valid form data and redirect 303 + - All POST /{id}/edit routes accept valid form data and redirect 303 + - All POST /{id}/delete routes redirect 303 + - All POST action routes don't crash (303 or other non-500) +""" +from __future__ import annotations + +import re +import uuid + +import pytest +from httpx import AsyncClient + +from tests.registry import ALL_ROUTES, resolve_path +from tests.introspect import RouteKind +from tests.form_factory import build_form_data, build_edit_data + + +# --------------------------------------------------------------------------- +# Collect POST routes by kind +# --------------------------------------------------------------------------- +_CREATE_ROUTES = [r for r in ALL_ROUTES if r.kind == RouteKind.CREATE and not r.has_file_upload] +_EDIT_ROUTES = [r for r in ALL_ROUTES if r.kind == RouteKind.EDIT and not r.has_file_upload] +_DELETE_ROUTES = [r for r in ALL_ROUTES if r.kind == RouteKind.DELETE] +_ACTION_ROUTES = [r for r in ALL_ROUTES if r.kind in (RouteKind.ACTION, RouteKind.TOGGLE)] + + +# --------------------------------------------------------------------------- +# Create: POST /entity/create with auto-generated form data -> 303 +# --------------------------------------------------------------------------- +@pytest.mark.asyncio +@pytest.mark.parametrize( + "route", + _CREATE_ROUTES, + ids=[f"CREATE {r.path}" for r in _CREATE_ROUTES], +) +async def test_create_redirects(client: AsyncClient, all_seeds: dict, route): + """POST to create routes with valid form data should redirect 303.""" + form_data = build_form_data(route.form_fields, all_seeds) + if not form_data: + pytest.skip(f"No form fields discovered for {route.path}") + + r = await client.post(route.path, data=form_data, follow_redirects=False) + assert r.status_code in (303, 302, 307), ( + f"POST {route.path} returned {r.status_code} with data {form_data}" + ) + + +# --------------------------------------------------------------------------- +# Edit: POST /entity/{id}/edit with auto-generated form data -> 303 +# --------------------------------------------------------------------------- +@pytest.mark.asyncio +@pytest.mark.parametrize( + "route", + _EDIT_ROUTES, + ids=[f"EDIT {r.path}" for r in _EDIT_ROUTES], +) +async def test_edit_redirects(client: AsyncClient, all_seeds: dict, route): + """POST to edit routes with valid form data should redirect 303.""" + resolved = resolve_path(route.path, all_seeds) + if resolved is None: + pytest.skip(f"No seed data mapping for {route.path}") + + form_data = build_edit_data(route.form_fields, all_seeds) + if not form_data: + pytest.skip(f"No form fields discovered for {route.path}") + + r = await client.post(resolved, data=form_data, follow_redirects=False) + assert r.status_code in (303, 302, 307), ( + f"POST {resolved} returned {r.status_code} with data {form_data}" + ) + + +# --------------------------------------------------------------------------- +# Delete: POST /entity/{id}/delete -> 303 +# --------------------------------------------------------------------------- +@pytest.mark.asyncio +@pytest.mark.parametrize( + "route", + _DELETE_ROUTES, + ids=[f"DELETE {r.path}" for r in _DELETE_ROUTES], +) +async def test_delete_redirects(client: AsyncClient, all_seeds: dict, route): + """POST to delete routes should redirect 303.""" + resolved = resolve_path(route.path, all_seeds) + if resolved is None: + pytest.skip(f"No seed data mapping for {route.path}") + + r = await client.post(resolved, follow_redirects=False) + assert r.status_code in (303, 302, 307, 404), ( + f"POST {resolved} returned {r.status_code}" + ) + + +# --------------------------------------------------------------------------- +# Action routes: POST /entity/{id}/toggle, etc. -> non-500 +# --------------------------------------------------------------------------- +@pytest.mark.asyncio +@pytest.mark.parametrize( + "route", + _ACTION_ROUTES, + ids=[f"ACTION {r.path}" for r in _ACTION_ROUTES], +) +async def test_action_does_not_crash(client: AsyncClient, all_seeds: dict, route): + """POST action routes should not return 500.""" + resolved = resolve_path(route.path, all_seeds) + if resolved is None: + # Try building form data for actions that need it (e.g. /focus/add) + form_data = build_form_data(route.form_fields, all_seeds) if route.form_fields else {} + r = await client.post(route.path, data=form_data, follow_redirects=False) + else: + form_data = build_form_data(route.form_fields, all_seeds) if route.form_fields else {} + r = await client.post(resolved, data=form_data, follow_redirects=False) + + assert r.status_code != 500, ( + f"POST {resolved or route.path} returned 500 (server error)" + ) + + +# --------------------------------------------------------------------------- +# Verify create actually persists: create then check list page +# --------------------------------------------------------------------------- +@pytest.mark.asyncio +@pytest.mark.parametrize( + "route", + [r for r in _CREATE_ROUTES if r.prefix in ("/domains", "/contacts", "/meetings")], + ids=[f"PERSIST {r.path}" for r in _CREATE_ROUTES if r.prefix in ("/domains", "/contacts", "/meetings")], +) +async def test_create_persists_in_list(client: AsyncClient, all_seeds: dict, route): + """Items created via POST should appear on the list page.""" + form_data = build_form_data(route.form_fields, all_seeds) + if not form_data: + pytest.skip(f"No form fields for {route.path}") + + # Use a unique name to search for + marker = f"AutoTest_{uuid.uuid4().hex[:8]}" + for key in ("name", "title", "first_name"): + if key in form_data: + form_data[key] = marker + break + else: + pytest.skip(f"No name/title field found for {route.path}") + + await client.post(route.path, data=form_data, follow_redirects=False) + + # Check the list page + list_path = route.prefix + "/" + r = await client.get(list_path) + assert marker in r.text, ( + f"Created item '{marker}' not found on {list_path}" + ) diff --git a/tests/test_smoke_dynamic.py b/tests/test_smoke_dynamic.py new file mode 100644 index 0000000..ce2bc04 --- /dev/null +++ b/tests/test_smoke_dynamic.py @@ -0,0 +1,76 @@ +""" +Dynamic smoke tests - auto-parametrized from introspected routes. +Tests that all GET endpoints return 200 (or acceptable alternatives). +""" +import pytest +from tests.registry import ( + GET_NO_PARAMS, GET_WITH_PARAMS, + resolve_path, PREFIX_TO_SEED, ROUTE_REGISTRY, +) + +# Routes that require query params to avoid 422 +ROUTES_NEEDING_QUERY = { + "/search/api": "?q=test", +} + +# Routes that may legitimately return non-200 without full context +ACCEPTABLE_CODES = {200, 307, 308} + + +# ── Test 1: All GET endpoints without path params ─────────── +@pytest.mark.parametrize( + "path", + [r.path for r in GET_NO_PARAMS], + ids=[f"GET {r.path}" for r in GET_NO_PARAMS], +) +async def test_get_no_params_returns_200(client, path): + """Every GET endpoint without path params should return 200.""" + url = path + # Append required query params if needed + for route_prefix, query_string in ROUTES_NEEDING_QUERY.items(): + if path == route_prefix or path.rstrip("/") == route_prefix.rstrip("/"): + url = path + query_string + break + + r = await client.get(url, follow_redirects=True) + assert r.status_code in ACCEPTABLE_CODES or r.status_code == 200, \ + f"GET {url} returned {r.status_code}" + + +# ── Test 2: All GET endpoints with valid seed IDs ─────────── +@pytest.mark.parametrize( + "path_template", + [r.path for r in GET_WITH_PARAMS], + ids=[f"GET {r.path}" for r in GET_WITH_PARAMS], +) +async def test_get_with_valid_id_returns_200(client, all_seeds, path_template): + """GET endpoints with a valid seed UUID should return 200.""" + path = resolve_path(path_template, all_seeds) + # Skip if we couldn't resolve (no seed for this prefix) + if "{" in path: + pytest.skip(f"No seed mapping for {path_template}") + + r = await client.get(path, follow_redirects=True) + assert r.status_code == 200, f"GET {path} returned {r.status_code}" + + +# ── Test 3: GET with fake UUID returns 404 ────────────────── +FAKE_UUID = "00000000-0000-0000-0000-000000000000" + +# Build fake-ID test cases from routes that have path params +_fake_id_cases = [] +for r in GET_WITH_PARAMS: + import re + fake_path = re.sub(r"\{[^}]+\}", FAKE_UUID, r.path) + _fake_id_cases.append((fake_path, r.path)) + +@pytest.mark.parametrize( + "path,template", + _fake_id_cases if _fake_id_cases else [pytest.param("", "", marks=pytest.mark.skip)], + ids=[f"404 {c[1]}" for c in _fake_id_cases] if _fake_id_cases else ["NOTSET"], +) +async def test_get_with_fake_id_returns_404(client, path, template): + """GET endpoints with a nonexistent UUID should return 404.""" + r = await client.get(path, follow_redirects=True) + assert r.status_code in (404, 302, 303), \ + f"GET {path} returned {r.status_code}, expected 404 or redirect"