diff --git a/crates/presenter/src/host/accounts/tests.rs b/crates/presenter/src/host/accounts/tests.rs index d8c9be9..cce5d36 100644 --- a/crates/presenter/src/host/accounts/tests.rs +++ b/crates/presenter/src/host/accounts/tests.rs @@ -11,7 +11,7 @@ use std::time::Duration; -use unlucky_core::auth::microsoft::{client_id_status, CLIENT_ID_BUILD, CLIENT_ID_ENV}; +use unlucky_core::auth::microsoft::{client_id_status, CLIENT_ID_ENV}; use unlucky_core::auth::AuthError; use super::*; @@ -91,6 +91,10 @@ fn only_a_missing_client_id_becomes_the_config_gap_code() { /// 的唯一开关,而 `auth_failure` 自己的单测对它一声不响。 /// 零网络:`MicrosoftAuth::from_env` 在 id 判定处就地早退,连 HTTP 客户端都不建,所以这里 /// 不需要任何桩,也不会因为没网而红。 +/// +/// **它要求一个「两处都没有 client id」的构建**:构建期烘焙了 id(`option_env!`)的构建里它 +/// `panic!` 而不是跳过——跳过就等于让这条锚悄悄失效(r2 复审实测过那种形态),红着喊人才 +/// 逼得人做决定(不带 id 构建,或给 `resolve_client_id` 加接缝后重写这条锚)。 #[test] fn a_missing_client_id_reaches_the_login_panel_as_a_config_gap() { // 环境变量是**进程级**的:动它的用例必须串行(core 侧同一套写法),否则并行跑互相污染。 @@ -111,14 +115,17 @@ fn a_missing_client_id_reaches_the_login_panel_as_a_config_gap() { } let _restore = Restore(saved); - if client_id_status().is_configured() { - // 构建期注入过 id(`ULL_MSA_CLIENT_ID= cargo build`)的构建里没有「缺配置」可言; - // 本仓库 CI 与本地都不注入,走到这里只允许是这个原因(不是「跳过」开关)。 - assert!( - CLIENT_ID_BUILD.is_some_and(|value| !value.trim().is_empty()), - "没配环境变量却报告已配置" + // 环境变量已经摘掉了,此时若仍报告「已配置」,来源只可能是构建期注入 + // (`ULL_MSA_CLIENT_ID= cargo build` ⇒ `option_env!`),或者 `resolve_client_id` 的 + // 实现变了。**这种构建里必须红**:这条锚验证不了缺 id 路径,静默 `return` 就是让锚悄悄失效 + // (r2 复审实测:注入 id + 同一变异 → 全绿 22 passed,正是塔台最怕的「守门空跑」形态)。 + if let Some(source) = client_id_status().source() { + panic!( + "这条锚要求「两处都没有 client id」的构建,但二进制里 client id 已被报告为已配置\ + (source={source:?},环境变量 {CLIENT_ID_ENV} 已摘掉)。要么不带 \ + ULL_MSA_CLIENT_ID 构建,要么给 `unlucky_core::auth::microsoft::resolve_client_id` \ + 加一个可注入的接缝,再按接缝重写这条锚。" ); - return; } assert_config_gap("device", start_login);