New tests.yml workflow: runs the Python test suites on every PR and push to main.
How
One step, one source of truth: CI calls make test — exactly what runs locally. No duplicated pytest commands to drift out of sync.
astral-sh/setup-uv installs uv, picks Python from .python-version (3.12), caches on uv.lock
Concurrency group cancels superseded runs on the same ref
No infra services needed: all four suites are mocked/self-contained (verified locally with unreachable DATABASE_URL/REDIS_URL/NEO4J_URI_BOLT — 458 tests pass)
Also
make test now includes flowsint-api — its test suite (6 tests) existed but was never wired into the target.
Verification
make test locally: 44 + 396 + 12 + 6 = 458 passed, exit 0.
This PR's checks are the live proof.
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.
## 📋 Pull Request Information
**Original PR:** https://github.com/reconurge/flowsint/pull/176
**Author:** [@dextmorgn](https://github.com/dextmorgn)
**Created:** 6/5/2026
**Status:** ✅ Merged
**Merged:** 6/5/2026
**Merged by:** [@dextmorgn](https://github.com/dextmorgn)
**Base:** `main` ← **Head:** `ci/python-tests`
---
### 📝 Commits (7)
- [`07584eb`](https://github.com/reconurge/flowsint/commit/07584ebc4a4029f720b8c7286043cc963ff8f912) ci: run python tests on pull requests and main
- [`17e36c9`](https://github.com/reconurge/flowsint/commit/17e36c916279e9ed81e59ff5ff12892645b1005f) ci: provide AUTH_SECRET required at flowsint_core import
- [`a24551e`](https://github.com/reconurge/flowsint/commit/a24551ed550829a37db145734c0c3c2f5ed46d7f) ci: provide REDIS_URL, also import-time required by flowsint_core
- [`71e3a68`](https://github.com/reconurge/flowsint/commit/71e3a68830af161e2784c8d5e11d282377d6d76a) fix(core): declare pyyaml dependency
- [`22c6908`](https://github.com/reconurge/flowsint/commit/22c6908a0efb389bb6028af724848164c1d12426) test(core): stop relying on env credentials in no-connection test
- [`dc36ef6`](https://github.com/reconurge/flowsint/commit/dc36ef633e32e088e63e5e2cd51ed2dfbd644e1e) test(core): factor out env-independent no-connection repo setup
- [`612d39e`](https://github.com/reconurge/flowsint/commit/612d39eadf72dc3161126d514f806cc1bfb52041) test: provide dummy Neo4j credentials in conftest
### 📊 Changes
**7 files changed** (+89 additions, -36 deletions)
<details>
<summary>View changed files</summary>
➕ `.github/workflows/tests.yml` (+37 -0)
📝 `Makefile` (+1 -0)
📝 `flowsint-core/pyproject.toml` (+1 -0)
📝 `flowsint-core/tests/conftest.py` (+6 -0)
📝 `flowsint-core/tests/core/graph/test_graph_repository.py` (+29 -36)
📝 `flowsint-enrichers/tests/conftest.py` (+13 -0)
📝 `uv.lock` (+2 -0)
</details>
### 📄 Description
## What
New `tests.yml` workflow: runs the Python test suites on every PR and push to `main`.
## How
One step, one source of truth: CI calls **`make test`** — exactly what runs locally. No duplicated pytest commands to drift out of sync.
- `astral-sh/setup-uv` installs uv, picks Python from `.python-version` (3.12), caches on `uv.lock`
- Concurrency group cancels superseded runs on the same ref
- No infra services needed: all four suites are mocked/self-contained (verified locally with unreachable `DATABASE_URL`/`REDIS_URL`/`NEO4J_URI_BOLT` — 458 tests pass)
## Also
`make test` now includes `flowsint-api` — its test suite (6 tests) existed but was never wired into the target.
## Verification
`make test` locally: 44 + 396 + 12 + 6 = 458 passed, exit 0.
This PR's checks are the live proof.
---
<sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
📋 Pull Request Information
Original PR: https://github.com/reconurge/flowsint/pull/176
Author: @dextmorgn
Created: 6/5/2026
Status: ✅ Merged
Merged: 6/5/2026
Merged by: @dextmorgn
Base:
main← Head:ci/python-tests📝 Commits (7)
07584ebci: run python tests on pull requests and main17e36c9ci: provide AUTH_SECRET required at flowsint_core importa24551eci: provide REDIS_URL, also import-time required by flowsint_core71e3a68fix(core): declare pyyaml dependency22c6908test(core): stop relying on env credentials in no-connection testdc36ef6test(core): factor out env-independent no-connection repo setup612d39etest: provide dummy Neo4j credentials in conftest📊 Changes
7 files changed (+89 additions, -36 deletions)
View changed files
➕
.github/workflows/tests.yml(+37 -0)📝
Makefile(+1 -0)📝
flowsint-core/pyproject.toml(+1 -0)📝
flowsint-core/tests/conftest.py(+6 -0)📝
flowsint-core/tests/core/graph/test_graph_repository.py(+29 -36)📝
flowsint-enrichers/tests/conftest.py(+13 -0)📝
uv.lock(+2 -0)📄 Description
What
New
tests.ymlworkflow: runs the Python test suites on every PR and push tomain.How
One step, one source of truth: CI calls
make test— exactly what runs locally. No duplicated pytest commands to drift out of sync.astral-sh/setup-uvinstalls uv, picks Python from.python-version(3.12), caches onuv.lockDATABASE_URL/REDIS_URL/NEO4J_URI_BOLT— 458 tests pass)Also
make testnow includesflowsint-api— its test suite (6 tests) existed but was never wired into the target.Verification
make testlocally: 44 + 396 + 12 + 6 = 458 passed, exit 0.This PR's checks are the live proof.
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.