@@ -63,11 +63,13 @@ describe("e2e: config", () => {
6363 const data = parseStdoutJson < {
6464 config_file ?: string ;
6565 base_url ?: string ;
66+ DASHSCOPE_BASE_URL ?: string ;
6667 timeout ?: number ;
6768 watermark ?: boolean ;
6869 } > ( stdout ) ;
6970 expect ( data . config_file ) . toBeDefined ( ) ;
70- expect ( data . base_url ) . toBeDefined ( ) ;
71+ // 生效 base_url 可能来自文件/默认(base_url)或 env(DASHSCOPE_BASE_URL)
72+ expect ( data . base_url ?? data . DASHSCOPE_BASE_URL ) . toBeDefined ( ) ;
7173 expect ( data . timeout ) . toBeDefined ( ) ;
7274 expect ( data . watermark ) . toBe ( true ) ;
7375 } ) ;
@@ -147,6 +149,114 @@ describe("e2e: config", () => {
147149 }
148150 } ) ;
149151
152+ test ( "config show 脱敏 DASHSCOPE_*,JSON 用 active 标出生效层且值保持干净" , async ( ) => {
153+ const configDir = mkdtempSync ( join ( tmpdir ( ) , "bl-config-show-env-" ) ) ;
154+ try {
155+ writeFileSync (
156+ join ( configDir , "config.json" ) ,
157+ JSON . stringify (
158+ {
159+ api_key : "sk-file-secret-key" ,
160+ base_url : "https://file.example.com" ,
161+ } ,
162+ null ,
163+ 2 ,
164+ ) + "\n" ,
165+ ) ;
166+
167+ const { stdout, stderr, exitCode } = await runCommandE2e (
168+ CONFIG_ROUTES ,
169+ [ "config" , "show" , "--output" , "json" ] ,
170+ {
171+ BAILIAN_CONFIG_DIR : configDir ,
172+ DASHSCOPE_API_KEY : "sk-env-secret-key" ,
173+ DASHSCOPE_BASE_URL : "https://env.example.com" ,
174+ } ,
175+ ) ;
176+ expect ( exitCode , stderr ) . toBe ( 0 ) ;
177+ const data = parseStdoutJson < {
178+ api_key ?: string ;
179+ base_url ?: string ;
180+ DASHSCOPE_API_KEY ?: string ;
181+ DASHSCOPE_BASE_URL ?: string ;
182+ active ?: { api_key ?: string ; base_url ?: string } ;
183+ } > ( stdout ) ;
184+ expect ( data . DASHSCOPE_API_KEY ) . toBeDefined ( ) ;
185+ expect ( data . DASHSCOPE_API_KEY ) . not . toContain ( "sk-env-secret-key" ) ;
186+ expect ( data . DASHSCOPE_API_KEY ) . not . toMatch ( / a c t i v e / ) ;
187+ expect ( data . DASHSCOPE_BASE_URL ) . toBe ( "https://env.example.com" ) ;
188+ expect ( data . api_key ) . toBeDefined ( ) ;
189+ expect ( data . api_key ) . not . toMatch ( / a c t i v e / ) ;
190+ expect ( data . api_key ) . not . toContain ( "sk-file-secret-key" ) ;
191+ expect ( data . base_url ) . toBe ( "https://file.example.com" ) ;
192+ expect ( data . active ) . toEqual ( { api_key : "env" , base_url : "env" } ) ;
193+ expect ( stdout ) . not . toContain ( "sk-env-secret-key" ) ;
194+ expect ( stdout ) . not . toContain ( "sk-file-secret-key" ) ;
195+ } finally {
196+ rmSync ( configDir , { recursive : true , force : true } ) ;
197+ }
198+ } ) ;
199+
200+ test ( "config show 在仅有 DASHSCOPE_BASE_URL 时仍输出文件层默认 base_url" , async ( ) => {
201+ const configDir = mkdtempSync ( join ( tmpdir ( ) , "bl-config-show-env-base-only-" ) ) ;
202+ try {
203+ writeFileSync (
204+ join ( configDir , "config.json" ) ,
205+ JSON . stringify ( { api_key : "sk-file" } , null , 2 ) + "\n" ,
206+ ) ;
207+
208+ const { stdout, stderr, exitCode } = await runCommandE2e (
209+ CONFIG_ROUTES ,
210+ [ "config" , "show" , "--output" , "json" ] ,
211+ {
212+ BAILIAN_CONFIG_DIR : configDir ,
213+ DASHSCOPE_API_KEY : "" ,
214+ DASHSCOPE_BASE_URL : "https://env.example.com" ,
215+ } ,
216+ ) ;
217+ expect ( exitCode , stderr ) . toBe ( 0 ) ;
218+ const data = parseStdoutJson < {
219+ base_url ?: string ;
220+ DASHSCOPE_BASE_URL ?: string ;
221+ active ?: { api_key ?: string ; base_url ?: string } ;
222+ } > ( stdout ) ;
223+ expect ( data . base_url ) . toBe ( "https://dashscope.aliyuncs.com" ) ;
224+ expect ( data . DASHSCOPE_BASE_URL ) . toBe ( "https://env.example.com" ) ;
225+ expect ( data . active ) . toEqual ( { api_key : "config" , base_url : "env" } ) ;
226+ } finally {
227+ rmSync ( configDir , { recursive : true , force : true } ) ;
228+ }
229+ } ) ;
230+
231+ test ( "config show 对 DASHSCOPE_BASE_URL 只展示 origin,不泄露 userinfo/query" , async ( ) => {
232+ const configDir = mkdtempSync ( join ( tmpdir ( ) , "bl-config-show-env-url-secret-" ) ) ;
233+ const rawEnvBaseUrl = "https://user:pass@example.com/path?token=super-secret#frag" ;
234+ try {
235+ writeFileSync ( join ( configDir , "config.json" ) , "{}\n" ) ;
236+
237+ const { stdout, stderr, exitCode } = await runCommandE2e (
238+ CONFIG_ROUTES ,
239+ [ "config" , "show" , "--output" , "json" ] ,
240+ {
241+ BAILIAN_CONFIG_DIR : configDir ,
242+ DASHSCOPE_BASE_URL : rawEnvBaseUrl ,
243+ } ,
244+ ) ;
245+ expect ( exitCode , stderr ) . toBe ( 0 ) ;
246+ const data = parseStdoutJson < {
247+ DASHSCOPE_BASE_URL ?: string ;
248+ active ?: { base_url ?: string } ;
249+ } > ( stdout ) ;
250+ expect ( data . DASHSCOPE_BASE_URL ) . toBe ( "https://example.com" ) ;
251+ expect ( data . active ?. base_url ) . toBe ( "env" ) ;
252+ expect ( stdout ) . not . toContain ( "user:pass" ) ;
253+ expect ( stdout ) . not . toContain ( "super-secret" ) ;
254+ expect ( stdout ) . not . toContain ( rawEnvBaseUrl ) ;
255+ } finally {
256+ rmSync ( configDir , { recursive : true , force : true } ) ;
257+ }
258+ } ) ;
259+
150260 test ( "config set 缺少 --key / --value 时报用法错误并退出 (2)" , async ( ) => {
151261 const { stderr, exitCode } = await runCommandE2e ( CONFIG_ROUTES , [ "config" , "set" , "--quiet" ] ) ;
152262 expect ( exitCode , stderr ) . toBe ( 2 ) ;
0 commit comments