Files
modelstudioai__cli/packages/cli/tests/e2e/auth.e2e.test.ts
T
若麒 df89ededc2 test(e2e): align with UsageError validation contract
Missing required flags now throw UsageError (exit code 2, error on
stderr, JSON under --output json) instead of printing help and exiting
0. Update assertions and titles accordingly:

- missing-flag cases: exitCode 0/1 -> 2, retitle to "errors as usage error (2)"
- auth / video-task-get under --output json: assert the error JSON on stderr
- proxy probe: import setupProxyFromEnv from runtime/src/proxy.ts
- drop tests for the removed config export-schema command
- fix t2v dry-run: cliTimeoutPrefix misplaced between --model and its value
2026-06-29 14:53:24 +08:00

183 lines
5.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { describe, expect, test } from "vite-plus/test";
import { isDashScopeE2EReady, parseStdoutJson, runCli } from "./helpers.ts";
/**
* Auth 相关 E2E:只验证 CLI 进程能正常解析参数并退出。
*/
describe("e2e: auth", () => {
test("auth 分组展示子命令帮助且退出码为 0", async () => {
const { stdout, stderr, exitCode } = await runCli(["auth"]);
expect(exitCode, stderr).toBe(0);
const out = `${stdout}\n${stderr}`;
expect(out).toMatch(/auth|Authentication|login|logout|status/i);
});
test("auth login --help 正常退出", async () => {
const { stderr, exitCode } = await runCli(["auth", "login", "--help"]);
expect(exitCode, stderr).toBe(0);
expect(stderr).toMatch(/login|api-key/i);
expect(stderr).toMatch(/--console-site/);
});
test("auth logout --help 正常退出", async () => {
const { stderr, exitCode } = await runCli(["auth", "logout", "--help"]);
expect(exitCode, stderr).toBe(0);
expect(stderr).toMatch(/logout|dry-run|yes/i);
});
test("auth status --help 正常退出", async () => {
const { stderr, exitCode } = await runCli(["auth", "status", "--help"]);
expect(exitCode, stderr).toBe(0);
expect(stderr).toMatch(/status|output/i);
});
test("auth login 缺少 --api-key 时报用法错误并退出 (2)", async () => {
const { stderr, exitCode } = await runCli(["auth", "login", "--non-interactive"]);
expect(exitCode, stderr).toBe(2);
expect(stderr).toMatch(/--api-key|Usage:/i);
});
test("auth login --dry-run --api-key 不发起校验与落盘", async () => {
const { stdout, stderr, exitCode } = await runCli([
"auth",
"login",
"--dry-run",
"--api-key",
"sk-e2e-dry-run-placeholder",
"--non-interactive",
]);
expect(exitCode, stderr).toBe(0);
expect(stdout).toContain("Would validate and save API key.");
});
test("auth login --dry-run 覆盖全局参数 --output json --timeout", async () => {
const { stdout, stderr, exitCode } = await runCli([
"auth",
"login",
"--dry-run",
"--api-key",
"sk-e2e-dry-run-placeholder",
"--non-interactive",
"--output",
"json",
"--timeout",
"120",
"--no-color",
]);
expect(exitCode, stderr).toBe(0);
expect(stdout).toContain("Would validate and save API key.");
});
test("auth login 缺少密钥且 --output json 时报用法错误并退出 (2)", async () => {
const { stderr, exitCode } = await runCli([
"auth",
"login",
"--non-interactive",
"--output",
"json",
]);
expect(exitCode).toBe(2);
const err = JSON.parse(stderr.trim()) as { error?: { code?: number; message?: string } };
expect(err.error?.code).toBe(2);
expect(err.error?.message).toMatch(/--api-key|console/i);
});
test("auth logout --dry-run 不写入配置", async () => {
const { stdout, stderr, exitCode } = await runCli(["auth", "logout", "--dry-run"]);
expect(exitCode, stderr).toBe(0);
expect(stdout).toContain("No changes made.");
expect(stderr).not.toContain("Cleared api_key");
});
test("auth logout --dry-run --yes --non-interactive", async () => {
const { stdout, stderr, exitCode } = await runCli([
"auth",
"logout",
"--dry-run",
"--yes",
"--non-interactive",
]);
expect(exitCode, stderr).toBe(0);
expect(stdout).toContain("No changes made.");
expect(stderr).not.toContain("Cleared api_key");
});
test("auth logout --dry-run --quiet --no-color", async () => {
const { stdout, stderr, exitCode } = await runCli([
"auth",
"logout",
"--dry-run",
"--quiet",
"--no-color",
]);
expect(exitCode, stderr).toBe(0);
expect(stdout).toContain("No changes made.");
});
test("auth logout --dry-run --output json(不清除密钥)", async () => {
const { stdout, stderr, exitCode } = await runCli([
"auth",
"logout",
"--dry-run",
"--output",
"json",
"--non-interactive",
]);
expect(exitCode, stderr).toBe(0);
expect(stdout).toContain("No changes made.");
expect(stderr).not.toContain("Cleared api_key");
});
test.skipIf(!isDashScopeE2EReady())("auth status 文本输出", async () => {
const { stdout, stderr, exitCode } = await runCli([
"auth",
"status",
"--non-interactive",
"--output",
"text",
]);
expect(exitCode, stderr).toBe(0);
expect(stdout).toMatch(
/Authentication Status|API key:|Console token:|DashScope API:|Console gateway:/,
);
});
test.skipIf(!isDashScopeE2EReady())("auth status --output json", async () => {
const { stdout, stderr, exitCode } = await runCli([
"auth",
"status",
"--non-interactive",
"--output",
"json",
]);
expect(exitCode, stderr).toBe(0);
const data = parseStdoutJson<{
authenticated?: boolean;
api_key?: { source?: string; masked?: string; base_url?: string };
}>(stdout);
expect(data.authenticated).toBe(true);
expect(data.api_key?.source).toBeDefined();
});
test.skipIf(!isDashScopeE2EReady())(
"auth status --output json --quiet --base-url 国内",
async () => {
const { stdout, stderr, exitCode } = await runCli([
"auth",
"status",
"--non-interactive",
"--output",
"json",
"--quiet",
"--base-url",
"https://dashscope.aliyuncs.com",
]);
expect(exitCode, stderr).toBe(0);
const data = parseStdoutJson<{ authenticated?: boolean; api_key?: unknown }>(stdout);
expect(data.authenticated).toBe(true);
expect(data.api_key).toBeDefined();
},
);
});