Tests / test (==2.12.2) (push) Canceled after 0s
Tests / test (==2.14.3) (push) Canceled after 0s
Tests / test (>=3.3,<4) (push) Canceled after 0s
Tests / test (>=4,<5) (push) Canceled after 0s
Tests / test-postgres (==2.12.2) (push) Canceled after 0s
Tests / test-postgres (>=4,<5) (push) Canceled after 0s
Tests / canary (push) Canceled after 0s
The sink ships with a JSONB variant and is documented for asyncpg, but the suite only ever exercised SQLite. The embeddings work will need pgvector, so this adds a local Postgres stack and a way to run the database tests on it, here and in CI. - docker-compose.yml: ffb-postgres (pgvector/pgvector:pg16) on a private network, published on 127.0.0.1 only, with an init script that adds the vector extension to the test database and template1 - Makefile: pg-up/pg-down/pg-reset/pg-logs/pg-psql, test, test-pg, test-all, lint; .env is generated from .env.example with a random password, and FFB_TEST_DATABASE_URL from the environment wins over it - tests: a db_url fixture parametrized over sqlite and postgres. The postgres leg skips unless FFB_TEST_DATABASE_URL is set, and creates a uniquely named database per test (with vector) that is dropped after. The DatabaseSink factories in the events, retention, correlation, soft-error and instrumentation tests now use it, so their 38 database tests run on both. The missing-events-table test accepts either backend's error. New tests check isolation and that vector works. - asyncpg and pgvector added to the dev and test extras - CI: a test-postgres job on FastMCP 2.12.2 and 4.x with a pgvector service container, failing if the Postgres cases skip - CONTRIBUTING: how to run the suite against Postgres
119 lines
3.5 KiB
YAML
119 lines
3.5 KiB
YAML
name: Tests
|
|
|
|
# fastmcp-feedback declares fastmcp>=2.12.2,<5, so every version family in
|
|
# that range gets the full suite. A user on PyPI gets the newest FastMCP the
|
|
# range allows, not what uv.lock pins, which is how 2026.01.12.1 shipped with
|
|
# composition broken on 2.14 and 4.x without anyone noticing.
|
|
|
|
on:
|
|
push:
|
|
pull_request:
|
|
workflow_dispatch:
|
|
schedule:
|
|
# Weekly, so a new FastMCP release is caught even when nobody pushes
|
|
- cron: '17 9 * * 1'
|
|
|
|
jobs:
|
|
test:
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 15
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
fastmcp: ['==2.12.2', '==2.14.3', '>=3.3,<4', '>=4,<5']
|
|
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- uses: astral-sh/setup-uv@v6
|
|
with:
|
|
python-version: '3.13'
|
|
|
|
- name: Install against fastmcp${{ matrix.fastmcp }}
|
|
run: |
|
|
uv venv
|
|
uv pip install -e ".[dev]" "fastmcp${{ matrix.fastmcp }}"
|
|
uv pip show fastmcp | grep -i '^version'
|
|
|
|
- name: Lint
|
|
run: uv run --no-sync ruff check src/ examples/ tests/_compat.py tests/_databases.py tests/unit/test_test_databases.py tests/unit/test_instrumentation.py
|
|
|
|
- name: Test
|
|
run: uv run --no-sync pytest -q --no-cov
|
|
|
|
# The DatabaseSink tests again, on Postgres + pgvector instead of SQLite.
|
|
# Oldest and newest supported FastMCP; the SQLite legs above cover the rest.
|
|
# act_runner runs the job in a container, so the service is reached by name.
|
|
test-postgres:
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 15
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
fastmcp: ['==2.12.2', '>=4,<5']
|
|
|
|
services:
|
|
ffb-postgres:
|
|
image: pgvector/pgvector:pg16
|
|
env:
|
|
POSTGRES_USER: ffb
|
|
POSTGRES_PASSWORD: ffb-ci
|
|
POSTGRES_DB: ffb_test
|
|
options: >-
|
|
--health-cmd "pg_isready -U ffb -d ffb_test"
|
|
--health-interval 2s
|
|
--health-timeout 3s
|
|
--health-retries 30
|
|
|
|
env:
|
|
FFB_TEST_DATABASE_URL: postgresql+asyncpg://ffb:ffb-ci@ffb-postgres:5432/ffb_test
|
|
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- uses: astral-sh/setup-uv@v6
|
|
with:
|
|
python-version: '3.13'
|
|
|
|
- name: Install against fastmcp${{ matrix.fastmcp }}
|
|
run: |
|
|
uv venv
|
|
uv pip install -e ".[dev]" "fastmcp${{ matrix.fastmcp }}"
|
|
uv pip show fastmcp | grep -i '^version'
|
|
|
|
- name: Test with the Postgres cases enabled
|
|
run: make test-pg
|
|
|
|
- name: Postgres cases ran rather than skipped
|
|
run: |
|
|
out=$(uv run --no-sync pytest -q --no-cov -m postgres -rs)
|
|
echo "$out" | tail -3
|
|
if echo "$out" | grep -q 'SKIPPED'; then
|
|
echo "Postgres cases skipped; is the service reachable?"; exit 1
|
|
fi
|
|
|
|
# Newest FastMCP with no ceiling. Allowed to fail: it exists to say
|
|
# "a new major version is out and here is what breaks" before users do.
|
|
canary:
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 15
|
|
continue-on-error: true
|
|
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- uses: astral-sh/setup-uv@v6
|
|
with:
|
|
python-version: '3.13'
|
|
|
|
- name: Install newest FastMCP, ignoring our ceiling
|
|
run: |
|
|
uv venv
|
|
uv pip install fastmcp "sqlalchemy[asyncio]" aiosqlite pydantic \
|
|
pytest pytest-asyncio pytest-cov pytest-mock pytest-html
|
|
uv pip install --no-deps -e .
|
|
uv pip show fastmcp | grep -i '^version'
|
|
|
|
- name: Test
|
|
run: uv run --no-sync pytest -q --no-cov
|