<!-- .github/pull_request_template.md -->
This PR restructures the end-to-end tests for the multi-database search
layer to improve maintainability, consistency, and coverage across
supported Python versions and database settings.
Key Changes
-Migrates the existing E2E tests to pytest for a more standard and
extensible testing framework.
-Introduces pytest fixtures to centralize and reuse test setup logic.
-Implements proper event loop management to support multiple
asynchronous pytest tests reliably.
-Improves SQLAlchemy handling in tests, ensuring clean setup and
teardown of database state.
-Extends multi-database E2E test coverage across all supported Python
versions.
Benefits
-Cleaner and more modular test structure.
-Reduced duplication and clearer test intent through fixtures.
-More reliable async test execution.
-Better alignment with our supported Python version matrix.
## Type of Change
<!-- Please check the relevant option -->
- [ ] Bug fix (non-breaking change that fixes an issue)
- [x] New feature (non-breaking change that adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality to change)
- [ ] Documentation update
- [x] Code refactoring
- [ ] Performance improvement
- [ ] Other (please specify):
## Screenshots/Videos (if applicable)
<!-- Add screenshots or videos to help explain your changes -->
## Pre-submission Checklist
<!-- Please check all boxes that apply before submitting your PR -->
- [x] **I have tested my changes thoroughly before submitting this PR**
- [x] **This PR contains minimal changes necessary to address the
issue/feature**
- [x] My code follows the project's coding standards and style
guidelines
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] I have added necessary documentation (if applicable)
- [x] All new and existing tests pass
- [x] I have searched existing PRs to ensure this change hasn't been
submitted already
- [x] I have linked any relevant issues in the description
- [x] My commits have clear and descriptive messages
## DCO Affirmation
I affirm that all code in every commit of this pull request conforms to
the terms of the Topoteretes Developer Certificate of Origin.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Tests**
* Expanded end-to-end test suite for the search database with
comprehensive setup/teardown, new session-scoped fixtures, and multiple
tests validating graph/vector consistency, retriever contexts, triplet
metadata, search result shapes, side effects, and feedback-weight
behavior.
* **Chores**
* CI updated to run matrixed test jobs across multiple Python versions
and standardize test execution for more consistent, parallelized runs.
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
228 lines
8.1 KiB
YAML
228 lines
8.1 KiB
YAML
name: Reusable Search DB Tests
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
on:
|
|
workflow_call:
|
|
inputs:
|
|
databases:
|
|
required: false
|
|
type: string
|
|
default: "all"
|
|
description: "Which vector databases to test (comma-separated list or 'all')"
|
|
python-versions:
|
|
required: false
|
|
type: string
|
|
default: '["3.10", "3.11", "3.12", "3.13"]'
|
|
description: "Python versions to test (JSON array)"
|
|
|
|
jobs:
|
|
run-kuzu-lance-sqlite-search-tests:
|
|
name: Search test for Kuzu/LanceDB/Sqlite (Python ${{ matrix.python-version }})
|
|
runs-on: ubuntu-22.04
|
|
if: ${{ inputs.databases == 'all' || contains(inputs.databases, 'kuzu/lance/sqlite') }}
|
|
strategy:
|
|
matrix:
|
|
python-version: ${{ fromJSON(inputs.python-versions) }}
|
|
fail-fast: false
|
|
steps:
|
|
- name: Check out
|
|
uses: actions/checkout@v4
|
|
with:
|
|
fetch-depth: 0
|
|
|
|
- name: Cognee Setup
|
|
uses: ./.github/actions/cognee_setup
|
|
with:
|
|
python-version: ${{ matrix.python-version }}
|
|
|
|
- name: Dependencies already installed
|
|
run: echo "Dependencies already installed in setup"
|
|
|
|
- name: Run Kuzu search Tests
|
|
env:
|
|
ENV: 'dev'
|
|
LLM_MODEL: ${{ secrets.LLM_MODEL }}
|
|
LLM_ENDPOINT: ${{ secrets.LLM_ENDPOINT }}
|
|
LLM_API_KEY: ${{ secrets.LLM_API_KEY }}
|
|
LLM_API_VERSION: ${{ secrets.LLM_API_VERSION }}
|
|
EMBEDDING_MODEL: ${{ secrets.EMBEDDING_MODEL }}
|
|
EMBEDDING_ENDPOINT: ${{ secrets.EMBEDDING_ENDPOINT }}
|
|
EMBEDDING_API_KEY: ${{ secrets.EMBEDDING_API_KEY }}
|
|
EMBEDDING_API_VERSION: ${{ secrets.EMBEDDING_API_VERSION }}
|
|
GRAPH_DATABASE_PROVIDER: 'kuzu'
|
|
VECTOR_DB_PROVIDER: 'lancedb'
|
|
DB_PROVIDER: 'sqlite'
|
|
run: uv run pytest cognee/tests/test_search_db.py -v --log-level=INFO
|
|
|
|
run-neo4j-lance-sqlite-search-tests:
|
|
name: Search test for Neo4j/LanceDB/Sqlite (Python ${{ matrix.python-version }})
|
|
runs-on: ubuntu-22.04
|
|
if: ${{ inputs.databases == 'all' || contains(inputs.databases, 'neo4j/lance/sqlite') }}
|
|
strategy:
|
|
matrix:
|
|
python-version: ${{ fromJSON(inputs.python-versions) }}
|
|
fail-fast: false
|
|
steps:
|
|
- name: Check out
|
|
uses: actions/checkout@v4
|
|
with:
|
|
fetch-depth: 0
|
|
|
|
- name: Cognee Setup
|
|
uses: ./.github/actions/cognee_setup
|
|
with:
|
|
python-version: ${{ matrix.python-version }}
|
|
|
|
- name: Setup Neo4j with GDS
|
|
uses: ./.github/actions/setup_neo4j
|
|
id: neo4j
|
|
|
|
- name: Dependencies already installed
|
|
run: echo "Dependencies already installed in setup"
|
|
|
|
- name: Run Neo4j search Tests
|
|
env:
|
|
ENV: 'dev'
|
|
LLM_MODEL: ${{ secrets.LLM_MODEL }}
|
|
LLM_ENDPOINT: ${{ secrets.LLM_ENDPOINT }}
|
|
LLM_API_KEY: ${{ secrets.LLM_API_KEY }}
|
|
LLM_API_VERSION: ${{ secrets.LLM_API_VERSION }}
|
|
EMBEDDING_MODEL: ${{ secrets.EMBEDDING_MODEL }}
|
|
EMBEDDING_ENDPOINT: ${{ secrets.EMBEDDING_ENDPOINT }}
|
|
EMBEDDING_API_KEY: ${{ secrets.EMBEDDING_API_KEY }}
|
|
EMBEDDING_API_VERSION: ${{ secrets.EMBEDDING_API_VERSION }}
|
|
GRAPH_DATABASE_PROVIDER: 'neo4j'
|
|
VECTOR_DB_PROVIDER: 'lancedb'
|
|
DB_PROVIDER: 'sqlite'
|
|
ENABLE_BACKEND_ACCESS_CONTROL: 'false'
|
|
GRAPH_DATABASE_URL: ${{ steps.neo4j.outputs.neo4j-url }}
|
|
GRAPH_DATABASE_USERNAME: ${{ steps.neo4j.outputs.neo4j-username }}
|
|
GRAPH_DATABASE_PASSWORD: ${{ steps.neo4j.outputs.neo4j-password }}
|
|
run: uv run pytest cognee/tests/test_search_db.py -v --log-level=INFO
|
|
|
|
run-kuzu-pgvector-postgres-search-tests:
|
|
name: Search test for Kuzu/PGVector/Postgres (Python ${{ matrix.python-version }})
|
|
runs-on: ubuntu-22.04
|
|
if: ${{ inputs.databases == 'all' || contains(inputs.databases, 'kuzu/pgvector/postgres') }}
|
|
strategy:
|
|
matrix:
|
|
python-version: ${{ fromJSON(inputs.python-versions) }}
|
|
fail-fast: false
|
|
services:
|
|
postgres:
|
|
image: pgvector/pgvector:pg17
|
|
env:
|
|
POSTGRES_USER: cognee
|
|
POSTGRES_PASSWORD: cognee
|
|
POSTGRES_DB: cognee_db
|
|
options: >-
|
|
--health-cmd pg_isready
|
|
--health-interval 10s
|
|
--health-timeout 5s
|
|
--health-retries 5
|
|
ports:
|
|
- 5432:5432
|
|
steps:
|
|
- name: Check out
|
|
uses: actions/checkout@v4
|
|
with:
|
|
fetch-depth: 0
|
|
|
|
- name: Cognee Setup
|
|
uses: ./.github/actions/cognee_setup
|
|
with:
|
|
python-version: ${{ matrix.python-version }}
|
|
extra-dependencies: "postgres"
|
|
|
|
- name: Dependencies already installed
|
|
run: echo "Dependencies already installed in setup"
|
|
|
|
- name: Run Kuzu/PGVector/Postgres Tests
|
|
env:
|
|
ENV: dev
|
|
LLM_MODEL: ${{ secrets.LLM_MODEL }}
|
|
LLM_ENDPOINT: ${{ secrets.LLM_ENDPOINT }}
|
|
LLM_API_KEY: ${{ secrets.LLM_API_KEY }}
|
|
LLM_API_VERSION: ${{ secrets.LLM_API_VERSION }}
|
|
EMBEDDING_MODEL: ${{ secrets.EMBEDDING_MODEL }}
|
|
EMBEDDING_ENDPOINT: ${{ secrets.EMBEDDING_ENDPOINT }}
|
|
EMBEDDING_API_KEY: ${{ secrets.EMBEDDING_API_KEY }}
|
|
EMBEDDING_API_VERSION: ${{ secrets.EMBEDDING_API_VERSION }}
|
|
GRAPH_DATABASE_PROVIDER: 'kuzu'
|
|
VECTOR_DB_PROVIDER: 'pgvector'
|
|
ENABLE_BACKEND_ACCESS_CONTROL: 'false'
|
|
DB_PROVIDER: 'postgres'
|
|
DB_NAME: 'cognee_db'
|
|
DB_HOST: '127.0.0.1'
|
|
DB_PORT: 5432
|
|
DB_USERNAME: cognee
|
|
DB_PASSWORD: cognee
|
|
run: uv run pytest cognee/tests/test_search_db.py -v --log-level=INFO
|
|
|
|
run-neo4j-pgvector-postgres-search-tests:
|
|
name: Search test for Neo4j/PGVector/Postgres (Python ${{ matrix.python-version }})
|
|
runs-on: ubuntu-22.04
|
|
if: ${{ inputs.databases == 'all' || contains(inputs.databases, 'neo4j/pgvector/postgres') }}
|
|
strategy:
|
|
matrix:
|
|
python-version: ${{ fromJSON(inputs.python-versions) }}
|
|
fail-fast: false
|
|
services:
|
|
postgres:
|
|
image: pgvector/pgvector:pg17
|
|
env:
|
|
POSTGRES_USER: cognee
|
|
POSTGRES_PASSWORD: cognee
|
|
POSTGRES_DB: cognee_db
|
|
ports:
|
|
- 5432:5432
|
|
options: >-
|
|
--health-cmd pg_isready
|
|
--health-interval 10s
|
|
--health-timeout 5s
|
|
--health-retries=5
|
|
steps:
|
|
- name: Check out
|
|
uses: actions/checkout@v4
|
|
with:
|
|
fetch-depth: 0
|
|
|
|
- name: Cognee Setup
|
|
uses: ./.github/actions/cognee_setup
|
|
with:
|
|
python-version: ${{ matrix.python-version }}
|
|
extra-dependencies: "postgres"
|
|
|
|
- name: Setup Neo4j with GDS
|
|
uses: ./.github/actions/setup_neo4j
|
|
id: neo4j
|
|
|
|
- name: Dependencies already installed
|
|
run: echo "Dependencies already installed in setup"
|
|
|
|
- name: Run Neo4j + PGVector + Postgres search Tests
|
|
env:
|
|
ENV: dev
|
|
LLM_MODEL: ${{ secrets.LLM_MODEL }}
|
|
LLM_ENDPOINT: ${{ secrets.LLM_ENDPOINT }}
|
|
LLM_API_KEY: ${{ secrets.LLM_API_KEY }}
|
|
LLM_API_VERSION: ${{ secrets.LLM_API_VERSION }}
|
|
EMBEDDING_MODEL: ${{ secrets.EMBEDDING_MODEL }}
|
|
EMBEDDING_ENDPOINT: ${{ secrets.EMBEDDING_ENDPOINT }}
|
|
EMBEDDING_API_KEY: ${{ secrets.EMBEDDING_API_KEY }}
|
|
EMBEDDING_API_VERSION: ${{ secrets.EMBEDDING_API_VERSION }}
|
|
GRAPH_DATABASE_PROVIDER: 'neo4j'
|
|
VECTOR_DB_PROVIDER: 'pgvector'
|
|
DB_PROVIDER: 'postgres'
|
|
GRAPH_DATABASE_URL: ${{ steps.neo4j.outputs.neo4j-url }}
|
|
GRAPH_DATABASE_USERNAME: ${{ steps.neo4j.outputs.neo4j-username }}
|
|
GRAPH_DATABASE_PASSWORD: ${{ steps.neo4j.outputs.neo4j-password }}
|
|
ENABLE_BACKEND_ACCESS_CONTROL: 'false'
|
|
DB_NAME: cognee_db
|
|
DB_HOST: 127.0.0.1
|
|
DB_PORT: 5432
|
|
DB_USERNAME: cognee
|
|
DB_PASSWORD: cognee
|
|
run: uv run pytest cognee/tests/test_search_db.py -v --log-level=INFO
|