fix: P0/P1 安全与质量缺陷修复 — 10 项 QA 审查问题解决
P0 安全修复: - tenant_rls: SQL 拼接改为参数化查询防止注入 - follow_up_service: UUID SQL 拼接改为参数化原生查询 - RLS 策略: 新迁移移除空字符串绕过条件 - SSE 消息推送: token 键名 'token' → 'access_token' 修复 - rate_limit: 登录端点 Redis 不可达时 fail-close P1 质量修复: - 小程序缓存清理: preservedKeys 补全认证键名 - 小程序 token 刷新: 失败时清除所有认证数据 - 小程序 401: redirectTo → reLaunch 兼容 tabBar - 集成测试: 信号量限制并行数据库创建(4个) - change_password: 乐观锁 version 硬编码 → 动态递增 测试: 516 全部通过 (含 153 集成测试)
This commit is contained in:
@@ -1,7 +1,15 @@
|
||||
use sea_orm::{Database, ConnectionTrait, Statement, DatabaseBackend};
|
||||
use std::sync::Arc;
|
||||
|
||||
use erp_server_migration::MigratorTrait;
|
||||
|
||||
/// 全局信号量:限制同时创建数据库的测试数量,避免 PostgreSQL 连接耗尽
|
||||
static DB_SEMAPHORE: std::sync::OnceLock<Arc<tokio::sync::Semaphore>> = std::sync::OnceLock::new();
|
||||
|
||||
fn db_semaphore() -> &'static Arc<tokio::sync::Semaphore> {
|
||||
DB_SEMAPHORE.get_or_init(|| Arc::new(tokio::sync::Semaphore::new(4)))
|
||||
}
|
||||
|
||||
/// 测试数据库 — 使用本地 PostgreSQL 创建隔离测试库
|
||||
///
|
||||
/// 连接本地 PostgreSQL(wiki/infrastructure.md 配置),为每个测试创建独立的测试数据库。
|
||||
@@ -9,10 +17,13 @@ use erp_server_migration::MigratorTrait;
|
||||
pub struct TestDb {
|
||||
db: Option<sea_orm::DatabaseConnection>,
|
||||
db_name: String,
|
||||
_permit: Option<tokio::sync::OwnedSemaphorePermit>,
|
||||
}
|
||||
|
||||
impl TestDb {
|
||||
pub async fn new() -> Self {
|
||||
let permit = db_semaphore().clone().acquire_owned().await.expect("信号量获取失败");
|
||||
|
||||
let db_name = format!("erp_test_{}", uuid::Uuid::now_v7().simple());
|
||||
|
||||
let admin_url = std::env::var("TEST_DB_URL")
|
||||
@@ -47,7 +58,7 @@ impl TestDb {
|
||||
.await
|
||||
.expect("执行数据库迁移失败");
|
||||
|
||||
Self { db: Some(db), db_name }
|
||||
Self { db: Some(db), db_name, _permit: Some(permit) }
|
||||
}
|
||||
|
||||
/// 获取数据库连接引用
|
||||
|
||||
Reference in New Issue
Block a user