Isolate providers per client: add provider targets and a Codex-side form

This commit is contained in:
kate522 committed 2026-10-18 19:22:38 +08:00
1 parent adc8234cc9
commit d759fe5e5d
13 files changed
+595 -309

No files matched your search

+27 -2
View File
@@ -4,14 +4,15 @@ import { renderWithProviders } from "@/test/utils";
import userEvent from "@testing-library/user-event";
const listProviders = vi.fn();
const createProvider = vi.fn();
const applyProvider = vi.fn();
const restore = vi.fn();
const getStatus = vi.fn();
vi.mock("@/lib/api", () => ({
api: {
listProviders: () => listProviders(),
createProvider: vi.fn(),
listProviders: (target: string) => listProviders(target),
createProvider: (input: unknown) => createProvider(input),
updateProvider: vi.fn(),
deleteProvider: vi.fn(),
applyProvider: (id: string, target: string) => applyProvider(id, target),
@@ -35,6 +36,7 @@ const provider = {
models: { default: "deepseek-chat", sonnet: "deepseek-chat", haiku: "deepseek-chat", opus: "deepseek-chat" },
enabled_for_claude: false,
enabled_for_codex: false,
target: "codex",
created_at: "2026-10-18T00:00:00Z",
};
@@ -53,6 +55,7 @@ beforeEach(() => {
port_mode: "auto",
fixed_port: 0,
});
createProvider.mockResolvedValue({ ...provider, id: "p_2" });
applyProvider.mockResolvedValue({
provider,
injection: {
@@ -77,6 +80,28 @@ describe("Codex page", () => {
expect(screen.getByText("DeepSeek")).toBeInTheDocument();
});
it("requests only Codex providers", async () => {
renderWithProviders(<Codex />);
await screen.findByText("DeepSeek");
expect(listProviders).toHaveBeenCalledWith("codex");
});
it("creates a provider scoped to Codex", async () => {
const user = userEvent.setup();
renderWithProviders(<Codex />);
await user.click(await screen.findByRole("button", { name: /新增供应商|Add provider/ }));
await user.type(screen.getByLabelText(/名称|Name/), "Kimi");
await user.type(screen.getByLabelText(/Base URL/), "https://api.moonshot.cn/v1");
await user.type(screen.getByLabelText(/API Key/), "sk-kimi");
await user.click(screen.getByRole("button", { name: /保存|Save/ }));
await waitFor(() => expect(createProvider).toHaveBeenCalledTimes(1));
expect(createProvider.mock.calls[0][0]).toMatchObject({
name: "Kimi",
base_url: "https://api.moonshot.cn/v1",
target: "codex",
});
});
it("activates a provider for Codex and previews the injected keys", async () => {
const user = userEvent.setup();
renderWithProviders(<Codex />);