Files
FabledScribe/tests/test_routes_db_maintenance.py
T
bvandeusen 96079d5b77
CI & Build / Python lint (push) Successful in 3s
CI & Build / TypeScript typecheck (push) Successful in 32s
CI & Build / Python tests (push) Successful in 44s
CI & Build / Build & push image (push) Successful in 52s
feat(db): table-health readout — per-table bloat metrics in admin card
You can't decide what to maintain without seeing what's bloating. Adds a
read-only health panel driven by Postgres' own statistics views.

- services/db_maintenance.py: get_table_health() queries pg_stat_user_tables +
  pg_total_relation_size + pg_database_size — per-table size, live/dead tuples,
  dead-tuple ratio (the bloat signal), and last (auto)vacuum/(auto)analyze.
- routes/admin.py: admin-only GET /api/admin/db-maintenance/health.
- SettingsView.vue: 'Table health' table in the maintenance card, all tables
  sorted by dead tuples, rows >=20% dead-ratio flagged; total DB size shown;
  refreshes after a Run-now so the dead-tuple drop is visible.
- Tests: health row/size shaping + null-timestamp passthrough; route + service
  surface.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 17:53:24 -04:00

55 lines
1.8 KiB
Python

"""Structural tests for the DB-maintenance admin routes + scheduler surface."""
def test_admin_handlers_callable():
from scribe.routes import admin as admin_routes
for name in (
"get_db_maintenance",
"update_db_maintenance",
"run_db_maintenance_now",
"get_db_maintenance_health",
):
assert callable(getattr(admin_routes, name))
def test_db_maintenance_routes_registered():
from scribe.app import create_app
app = create_app()
rules = {r.rule for r in app.url_map.iter_rules()}
assert "/api/admin/db-maintenance" in rules
assert "/api/admin/db-maintenance/run" in rules
assert "/api/admin/db-maintenance/health" in rules
def test_scheduler_surface():
from scribe.services import db_maintenance_scheduler as sched
for fn in (
"start_db_maintenance_scheduler",
"stop_db_maintenance_scheduler",
"reschedule_db_maintenance",
"get_maintenance_hour",
"is_maintenance_enabled",
):
assert callable(getattr(sched, fn)), f"scheduler missing {fn}"
def test_service_surface_and_allowlist():
from scribe.services.db_maintenance import (
MAINTENANCE_TABLES,
get_last_run,
get_table_health,
run_maintenance,
)
assert callable(run_maintenance) and callable(get_last_run) and callable(get_table_health)
# The allowlist is a closed tuple covering exactly the high-churn tables.
assert isinstance(MAINTENANCE_TABLES, tuple)
assert set(MAINTENANCE_TABLES) == {
"app_logs", "notifications", "password_reset_tokens",
"invitation_tokens", "notes", "note_versions",
}
def test_set_admin_setting_exists():
from scribe.services.settings import set_admin_setting
assert callable(set_admin_setting)