feat: harden long-range batch queries with redis+parquet caching
This commit is contained in:
101
tests/test_database_slow_pool.py
Normal file
101
tests/test_database_slow_pool.py
Normal file
@@ -0,0 +1,101 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Unit tests for isolated slow-query pool path."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
import mes_dashboard.core.database as db
|
||||
|
||||
|
||||
@patch.object(db, "oracledb")
|
||||
@patch.object(db, "get_slow_engine")
|
||||
@patch.object(db, "_get_slow_query_semaphore")
|
||||
@patch.object(db, "get_db_runtime_config")
|
||||
def test_read_sql_df_slow_uses_slow_pool_when_enabled(
|
||||
mock_runtime,
|
||||
mock_sem_fn,
|
||||
mock_get_slow_engine,
|
||||
mock_oracledb,
|
||||
):
|
||||
"""Slow query should checkout connection from isolated slow pool."""
|
||||
mock_runtime.return_value = {
|
||||
"slow_pool_enabled": True,
|
||||
"slow_call_timeout_ms": 60000,
|
||||
"slow_fetchmany_size": 5000,
|
||||
"tcp_connect_timeout": 10,
|
||||
"retry_count": 1,
|
||||
"retry_delay": 1.0,
|
||||
}
|
||||
|
||||
sem = MagicMock()
|
||||
sem.acquire.return_value = True
|
||||
mock_sem_fn.return_value = sem
|
||||
|
||||
cursor = MagicMock()
|
||||
cursor.description = [("COL_A",), ("COL_B",)]
|
||||
cursor.fetchall.return_value = [("v1", "v2")]
|
||||
|
||||
conn = MagicMock()
|
||||
conn.cursor.return_value = cursor
|
||||
|
||||
engine = MagicMock()
|
||||
engine.raw_connection.return_value = conn
|
||||
mock_get_slow_engine.return_value = engine
|
||||
|
||||
df = db.read_sql_df_slow("SELECT 1", {"p0": "x"})
|
||||
|
||||
assert list(df.columns) == ["COL_A", "COL_B"]
|
||||
assert len(df) == 1
|
||||
mock_get_slow_engine.assert_called_once()
|
||||
mock_oracledb.connect.assert_not_called()
|
||||
conn.close.assert_called_once()
|
||||
sem.release.assert_called_once()
|
||||
|
||||
|
||||
@patch.object(db, "oracledb")
|
||||
@patch.object(db, "get_slow_engine")
|
||||
@patch.object(db, "_get_slow_query_semaphore")
|
||||
@patch.object(db, "get_db_runtime_config")
|
||||
def test_read_sql_df_slow_iter_uses_slow_pool_when_enabled(
|
||||
mock_runtime,
|
||||
mock_sem_fn,
|
||||
mock_get_slow_engine,
|
||||
mock_oracledb,
|
||||
):
|
||||
"""Slow iterator query should checkout connection from isolated slow pool."""
|
||||
mock_runtime.return_value = {
|
||||
"slow_pool_enabled": True,
|
||||
"slow_call_timeout_ms": 60000,
|
||||
"slow_fetchmany_size": 2,
|
||||
"tcp_connect_timeout": 10,
|
||||
"retry_count": 1,
|
||||
"retry_delay": 1.0,
|
||||
}
|
||||
|
||||
sem = MagicMock()
|
||||
sem.acquire.return_value = True
|
||||
mock_sem_fn.return_value = sem
|
||||
|
||||
cursor = MagicMock()
|
||||
cursor.description = [("COL_A",), ("COL_B",)]
|
||||
cursor.fetchmany.side_effect = [
|
||||
[("r1a", "r1b")],
|
||||
[],
|
||||
]
|
||||
|
||||
conn = MagicMock()
|
||||
conn.cursor.return_value = cursor
|
||||
|
||||
engine = MagicMock()
|
||||
engine.raw_connection.return_value = conn
|
||||
mock_get_slow_engine.return_value = engine
|
||||
|
||||
batches = list(db.read_sql_df_slow_iter("SELECT 1", {"p0": "x"}, batch_size=2))
|
||||
|
||||
assert batches == [(["COL_A", "COL_B"], [("r1a", "r1b")])]
|
||||
mock_get_slow_engine.assert_called_once()
|
||||
mock_oracledb.connect.assert_not_called()
|
||||
conn.close.assert_called_once()
|
||||
sem.release.assert_called_once()
|
||||
|
||||
Reference in New Issue
Block a user