"""真实驱动池的会话隔离与容量验证;只连接显式隔离测试库。""" from concurrent.futures import ThreadPoolExecutor from threading import Event import pytest from muse.共享.调用身份 import 用途 from muse.基础设施.数据库.连接 import 数据库工厂, 连接池耗尽 pytestmark = pytest.mark.数据库 @pytest.mark.case_id("NC-O06-POOL-PG-ISOLATION") def test_真实池只读与自动提交失败后不串用(应用测试库): provider = 数据库工厂(应用测试库[用途.生产].引用, 用途.生产, 常驻=True, 最大连接=1) provider.打开() try: with pytest.raises(ValueError): with provider.连接(只读=True) as conn: assert conn.execute("SHOW transaction_read_only").fetchone()[0] == "on" assert conn.execute("SELECT current_user").fetchone()[0] == "muse_app" raise ValueError("synthetic rollback") with provider.连接(autocommit=True) as conn: assert conn.autocommit assert conn.execute("SHOW transaction_read_only").fetchone()[0] == "off" assert ( conn.execute("SELECT current_setting('app.purpose')").fetchone()[0] == "production" ) with provider.连接(只读=True, autocommit=True) as conn: assert conn.execute("SHOW transaction_read_only").fetchone()[0] == "on" finally: provider.关闭() @pytest.mark.case_id("NC-O06-POOL-PG-CAPACITY") def test_真实池超容量按期限拒绝且释放后可再借(应用测试库): provider = 数据库工厂(应用测试库[用途.生产].引用, 用途.生产, 常驻=True, 最大连接=1, 等待秒=1) provider.打开() 持有 = Event() 释放 = Event() def occupy(): with provider.连接() as conn: conn.execute("SELECT 1") 持有.set() assert 释放.wait(10) try: with ThreadPoolExecutor(max_workers=1) as executor: future = executor.submit(occupy) try: assert 持有.wait(5) with pytest.raises(连接池耗尽): with provider.连接(): pytest.fail("容量一的池不得借出第二条") finally: 释放.set() future.result() with provider.连接() as conn: assert conn.execute("SELECT 1").fetchone()[0] == 1 finally: provider.关闭()