

























@@ -5,6 +5,13 @@ import {
55clearRuntimeAuthProfileStoreSnapshots,
66ensureAuthProfileStore,
77} from "openclaw/plugin-sdk/agent-runtime";
8+import type {
9+OpenClawConfig,
10+OpenClawPluginApi,
11+ProviderAuthResult,
12+ProviderCatalogResult,
13+UnifiedModelCatalogEntry,
14+} from "openclaw/plugin-sdk/plugin-entry";
815import { createTestPluginApi } from "openclaw/plugin-sdk/plugin-test-api";
916import { afterAll, afterEach, describe, expect, it, vi } from "vitest";
1017@@ -23,6 +30,21 @@ vi.mock("./register.runtime.js", () => ({
2330import plugin from "./index.js";
24312532const tempDirs: string[] = [];
33+type RegisteredMemoryEmbeddingProvider = Parameters<
34+OpenClawPluginApi["registerMemoryEmbeddingProvider"]
35+>[0];
36+type GithubCopilotTestProvider = {
37+auth: Array<{
38+run: (ctx: unknown) => Promise<ProviderAuthResult | null>;
39+runNonInteractive: (ctx: unknown) => Promise<OpenClawConfig | null>;
40+}>;
41+catalog: {
42+run: (ctx: unknown) => Promise<ProviderCatalogResult>;
43+};
44+};
45+type GithubCopilotTestModelCatalogProvider = {
46+liveCatalog: (ctx: unknown) => Promise<readonly UnifiedModelCatalogEntry[] | null | undefined>;
47+};
26482749afterEach(async () => {
2850vi.clearAllMocks();
@@ -46,9 +68,21 @@ function _registerProvider() {
4668return registerProviderWithPluginConfig({});
4769}
487071+function requireFirstMockArg<T>(
72+mock: { mock: { calls: Array<[T, ...unknown[]]> } },
73+label: string,
74+) {
75+const [call] = mock.mock.calls;
76+if (!call) {
77+throw new Error(`Expected ${label}`);
78+}
79+return call[0];
80+}
81+4982function registerProviderAndCatalogWithPluginConfig(pluginConfig: Record<string, unknown>) {
50-const registerProviderMock = vi.fn();
51-const registerModelCatalogProviderMock = vi.fn();
83+const registerProviderMock = vi.fn<OpenClawPluginApi["registerProvider"]>();
84+const registerModelCatalogProviderMock =
85+vi.fn<OpenClawPluginApi["registerModelCatalogProvider"]>();
52865387plugin.register(
5488createTestPluginApi({
@@ -66,8 +100,14 @@ function registerProviderAndCatalogWithPluginConfig(pluginConfig: Record<string,
66100expect(registerProviderMock).toHaveBeenCalledTimes(1);
67101expect(registerModelCatalogProviderMock).toHaveBeenCalledTimes(1);
68102return {
69-provider: registerProviderMock.mock.calls[0]?.[0],
70-modelCatalogProvider: registerModelCatalogProviderMock.mock.calls[0]?.[0],
103+provider: requireFirstMockArg(
104+registerProviderMock,
105+"provider registration",
106+) as GithubCopilotTestProvider,
107+modelCatalogProvider: requireFirstMockArg(
108+registerModelCatalogProviderMock,
109+"model catalog provider registration",
110+) as GithubCopilotTestModelCatalogProvider,
71111};
72112}
73113@@ -77,7 +117,8 @@ function registerProviderWithPluginConfig(pluginConfig: Record<string, unknown>)
7711778118describe("github-copilot plugin", () => {
79119it("registers embedding provider", () => {
80-const registerMemoryEmbeddingProviderMock = vi.fn();
120+const registerMemoryEmbeddingProviderMock =
121+vi.fn<OpenClawPluginApi["registerMemoryEmbeddingProvider"]>();
8112282123plugin.register(
83124createTestPluginApi({
@@ -93,7 +134,10 @@ describe("github-copilot plugin", () => {
93134);
9413595136expect(registerMemoryEmbeddingProviderMock).toHaveBeenCalledTimes(1);
96-const adapter = registerMemoryEmbeddingProviderMock.mock.calls[0]?.[0];
137+const adapter = requireFirstMockArg<RegisteredMemoryEmbeddingProvider>(
138+registerMemoryEmbeddingProviderMock,
139+"memory embedding provider registration",
140+);
97141expect(adapter.id).toBe("github-copilot");
98142});
99143@@ -330,6 +374,9 @@ describe("github-copilot plugin", () => {
330374initialValue: false,
331375});
332376expect(mocks.githubCopilotLoginCommand).not.toHaveBeenCalled();
377+if (!result) {
378+throw new Error("Expected GitHub Copilot auth result");
379+}
333380expect(result.profiles[0]?.credential).toEqual({
334381type: "token",
335382provider: "github-copilot",
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。