Files
cleveragents-core/features/postgresql_backend.feature
freemo 721ece458c fix(server): address PostgreSQL backend review findings
- Move psycopg2-binary to optional [server] extra with lazy import
- Replace silent fallback PostgreSQL URL with ValueError
- Add TODO for wiring resolve_database_url into engine paths
- Add pool-parameter source comment in UnitOfWork
- Add read-only properties for pool params in UnitOfWork
- Add UUID/INTERVAL/ARRAY/JSONB to portable type allowlist
- Add development-only warning to Docker Compose credentials
- Update BDD scenario for new ValueError behavior
2026-03-24 20:32:03 +00:00

106 lines
4.5 KiB
Gherkin

@phase1 @database @postgresql @server_mode
Feature: PostgreSQL Storage Backend for Server Mode
As a platform operator
I want CleverAgents to support PostgreSQL as its storage backend
So that server mode can handle multi-user collaborative access
Background:
Given I have imported the database infrastructure modules
# ── Settings & URL Selection ──────────────────────────────────────
@settings @database_url
Scenario: Default database URL is SQLite in local mode
Given I create settings with server_mode disabled
Then the resolved database URL should start with "sqlite"
@settings @database_url
Scenario: Server mode with default URL raises ValueError
Given I create settings with server_mode enabled
And the database_url is the default SQLite value
Then resolving the database URL should raise a ValueError
@settings @database_url
Scenario: Server mode with explicit PostgreSQL URL uses that URL
Given I create settings with server_mode enabled
And the database_url is "postgresql://myhost/mydb"
Then the resolved database URL should be "postgresql://myhost/mydb"
@settings @database_url
Scenario: is_postgresql returns True for PostgreSQL URLs
Given I create settings with server_mode enabled
And the database_url is "postgresql://localhost/cleveragents"
Then is_postgresql should return True
@settings @database_url
Scenario: is_postgresql returns False for SQLite URLs
Given I create settings with server_mode disabled
Then is_postgresql should return False
# ── Pool Configuration ────────────────────────────────────────────
@settings @pool
Scenario: Default pool settings are appropriate for multi-user
Given I create settings with server_mode enabled
Then the db_pool_size should be 5
And the db_max_overflow should be 10
And the db_pool_recycle should be 1800
@settings @pool
Scenario: Pool settings can be overridden via environment
Given I create settings with custom pool configuration
| setting | value |
| db_pool_size | 20 |
| db_max_overflow | 30 |
| db_pool_recycle | 900 |
Then the db_pool_size should be 20
And the db_max_overflow should be 30
And the db_pool_recycle should be 900
# ── UnitOfWork Engine Creation ────────────────────────────────────
@engine @sqlite
Scenario: UnitOfWork creates SQLite engine for local mode
Given I create a UnitOfWork with URL "sqlite:///:memory:"
When I access the engine
Then the engine dialect should be "sqlite"
@engine @pool
Scenario: UnitOfWork passes pool parameters to non-SQLite engines
Given I create a UnitOfWork with URL "sqlite:///:memory:" and pool_size 8
Then the UnitOfWork pool_size should be 8
And the UnitOfWork max_overflow should be 10
And the UnitOfWork pool_recycle should be 1800
# ── ORM Model Dialect Compatibility ───────────────────────────────
@models @dialect
Scenario: ORM models use only dialect-agnostic column types
Given I inspect all ORM models from the Base metadata
Then no column should use a SQLite-specific type
And all columns should use standard SQLAlchemy types
@models @dialect
Scenario: ORM models define no raw SQL or sqlite3 imports
Given I read the models module source code
Then the source should not contain "sqlite3"
And the source should not contain "PRAGMA"
And the source should not contain "raw_sql"
@models @dialect
Scenario: All table names are valid PostgreSQL identifiers
Given I inspect all ORM models from the Base metadata
Then all table names should be valid SQL identifiers
# ── Migration Runner ──────────────────────────────────────────────
@migration
Scenario: Migration runner handles SQLite URLs
Given I create a MigrationRunner with URL "sqlite:///:memory:"
Then the migration runner database_url should start with "sqlite"
@migration
Scenario: Migration runner handles PostgreSQL URLs
Given I create a MigrationRunner with URL "postgresql://localhost/test"
Then the migration runner database_url should start with "postgresql"