omniterm 0.2.26

Web-based tmux terminal manager — one browser tab to watch and drive your AI coding agents
//! 共享测试工具(仅 `#[cfg(test)]` 编译)。
//!
//! 各 API 模块的 handler 测试复用同一个「内存 sqlite + 全部迁移」的
//! `AppState` 构造,避免逐模块复制 17 行初始化代码。`settings.rs` 的
//! `tests::test_state` 也已迁移为对本函数的转发(原先逐字重复),
//! `AppState` 新增字段时只改这一处。

use crate::AppState;
use crate::acp::AcpSupervisor;
use crate::auth::LoginGuard;
use crate::engine::EngineRegistry;
use crate::proxy::ProxyState;
use sqlx::sqlite::SqlitePoolOptions;
use std::collections::HashMap;
use std::sync::Arc;
use std::sync::atomic::{AtomicBool, AtomicU64};

/// 构造内存 sqlite + 跑完全部迁移的 `AppState`。
pub async fn test_state() -> AppState {
    let db = SqlitePoolOptions::new()
        .max_connections(1)
        .connect("sqlite::memory:")
        .await
        .expect("in-memory sqlite pool");
    sqlx::migrate!("./migrations").run(&db).await.expect("run migrations");
    AppState {
        jwt_secret: "test-secret".into(),
        token_cookie: crate::TOKEN_COOKIE_BASE.to_string(),
        api_keys: HashMap::new(),
        auth_enabled: Arc::new(AtomicBool::new(false)),
        // 默认安全姿态:本地访问同样要求密码(与启动读取的缺失默认值一致,D4)。
        local_auth_required: Arc::new(AtomicBool::new(true)),
        acp_idle_recycle_secs: Arc::new(AtomicU64::new(300)),
        acp_perm_timeout: Arc::new(crate::acp::reaper::PermissionTimeoutConfig::default()),
        login_guard: LoginGuard::new(),
        engines: EngineRegistry::new(db.clone(), 9777),
        acp_supervisor: AcpSupervisor::default(),
        proxy: ProxyState {
            client: reqwest::Client::new(),
            self_port: 9777,
            base_host: None,
            max_request_body: crate::proxy::MAX_REQUEST_BODY,
            audited_ports: std::sync::Arc::new(std::sync::Mutex::new(
                crate::proxy::PortAuditLog::default(),
            )),
        },
        max_upload_body: crate::api::files::MAX_UPLOAD_BODY_DEFAULT,
        db,
    }
}