| """Schema-shape tests for the prediction log table. |
| |
| We don't connect to a real DB here — just verify the SQLAlchemy Table object |
| contains the columns we expect, with the right types and nullability. |
| """ |
|
|
| from __future__ import annotations |
|
|
| from sqlalchemy import MetaData |
|
|
| from database.models import ( |
| PROD_TABLE_NAME, |
| TEST_TABLE_NAME, |
| build_predictions_log_table, |
| ) |
|
|
|
|
| def test_prod_and_test_tables_have_identical_schemas() -> None: |
| prod = build_predictions_log_table(PROD_TABLE_NAME, MetaData()) |
| tst = build_predictions_log_table(TEST_TABLE_NAME, MetaData()) |
|
|
| prod_cols = {c.name: (c.type.__class__, c.nullable) for c in prod.columns} |
| test_cols = {c.name: (c.type.__class__, c.nullable) for c in tst.columns} |
|
|
| assert prod_cols == test_cols |
| assert prod.name == "predictions_log" |
| assert tst.name == "predictions_log_test" |
|
|
|
|
| def test_table_contains_expected_columns() -> None: |
| table = build_predictions_log_table("predictions_log", MetaData()) |
| names = {c.name for c in table.columns} |
| expected = { |
| "id", |
| "timestamp", |
| "sk_id_curr", |
| "client_known", |
| "latency_ms", |
| "feature_assembly_ms", |
| "inference_ms", |
| "inference_cpu_ms", |
| "plumbing_ms", |
| "db_log_ms", |
| "status_code", |
| "error_message", |
| "raw_input", |
| "features", |
| "probability_default", |
| "decision", |
| "threshold", |
| "model_version", |
| "top_shap", |
| "ground_truth", |
| } |
| assert expected <= names |
|
|
|
|
| def test_required_columns_are_not_null() -> None: |
| table = build_predictions_log_table("predictions_log", MetaData()) |
| cols = {c.name: c for c in table.columns} |
|
|
| assert cols["sk_id_curr"].nullable is False |
| assert cols["decision"].nullable is False |
| assert cols["raw_input"].nullable is False |
| assert cols["features"].nullable is False |
| |
| assert cols["probability_default"].nullable is True |
| |
| assert cols["ground_truth"].nullable is True |
| assert cols["top_shap"].nullable is True |
| |
| assert cols["feature_assembly_ms"].nullable is True |
| assert cols["inference_ms"].nullable is True |
| assert cols["inference_cpu_ms"].nullable is True |
| assert cols["plumbing_ms"].nullable is True |
| assert cols["db_log_ms"].nullable is True |
|
|