Files
openclaw/src/plugins/memory-embedding-providers.test.ts
Peter Steinberger 98e3f729bc refactor: remove dead plugin loader exports (#105937)
* refactor(plugins): trim activation and contract exports

* test(plugins): restore fixture cleanup

* refactor(plugins): trim install and loader exports

* test(plugins): fully reset loader caches

* refactor(plugins): trim metadata and catalog exports

* test(plugins): preserve catalog trust coverage

* refactor(plugins): trim provider and plugin exports

* refactor(plugins): trim runtime and tool exports

* test(plugins): update dead-export consumers

* test(plugins): remove empty dead-export suites

* refactor(plugins): align exports with split registry

* refactor(plugins): trim drifted loader exports

* style(plugins): format test fixtures

* refactor(scripts): use supported plugin APIs

* refactor(plugins): finish dead export cleanup

* chore(deadcode): refresh export baseline

* test(cli): mock production memory state

* chore(deadcode): sync latest export baseline

* fix(tests): keep plugin fixtures inside core

* chore(deadcode): refresh rebased export baseline

* chore(deadcode): sync current ratchets

* fix(plugins): retain reserved slot invariant

* fix(plugins): preserve dead-export invariants

* test(plugins): use neutral catalog query fixture

* test(plugins): satisfy catalog lint

* test(plugins): preserve integrity drift coverage

* fix(ci): register skill experience live proof
2026-07-13 01:29:33 -07:00

162 lines
4.9 KiB
TypeScript

// Covers plugin-provided memory embedding provider registration.
import { afterEach, beforeEach, describe, expect, it } from "vitest";
import {
clearMemoryEmbeddingProviders,
getMemoryEmbeddingProvider,
getRegisteredMemoryEmbeddingProvider,
listMemoryEmbeddingProviders,
listRegisteredMemoryEmbeddingProviders,
registerMemoryEmbeddingProvider,
restoreRegisteredMemoryEmbeddingProviders,
type MemoryEmbeddingProviderAdapter,
} from "./memory-embedding-providers.js";
const MEMORY_EMBEDDING_PROVIDERS_KEY = Symbol.for("openclaw.memoryEmbeddingProviders");
const INITIAL_REGISTERED_MEMORY_EMBEDDING_PROVIDERS = listRegisteredMemoryEmbeddingProviders();
function createAdapter(id: string): MemoryEmbeddingProviderAdapter {
return {
id,
create: async () => ({ provider: null }),
};
}
function expectRegisteredProviderEntry(
id: string,
entry: {
adapter: MemoryEmbeddingProviderAdapter;
ownerPluginId?: string;
},
) {
expect(getRegisteredMemoryEmbeddingProvider(id)).toEqual(entry);
}
function createOwnedAdapterEntry(id: string) {
return {
adapter: createAdapter(id),
ownerPluginId: "memory-core",
};
}
function expectRegisteredProviderState(params: {
entry: {
adapter: MemoryEmbeddingProviderAdapter;
ownerPluginId?: string;
};
expectedList?: Array<{
adapter: MemoryEmbeddingProviderAdapter;
ownerPluginId?: string;
}>;
}) {
expectRegisteredProviderEntry(params.entry.adapter.id, params.entry);
if (params.expectedList) {
expect(listRegisteredMemoryEmbeddingProviders()).toEqual(params.expectedList);
}
}
function expectMemoryEmbeddingProviderIds(expectedIds: readonly string[]) {
expect(listMemoryEmbeddingProviders().map((adapter) => adapter.id)).toEqual([...expectedIds]);
}
function expectCurrentMemoryEmbeddingProvider(
id: string,
adapter: MemoryEmbeddingProviderAdapter | undefined,
) {
expect(getMemoryEmbeddingProvider(id)).toBe(adapter);
}
function expectMemoryEmbeddingProviderState(params: {
expectedIds: readonly string[];
expectedCurrent?: { id: string; adapter: MemoryEmbeddingProviderAdapter };
}) {
if (params.expectedCurrent) {
expectCurrentMemoryEmbeddingProvider(params.expectedCurrent.id, params.expectedCurrent.adapter);
}
expectMemoryEmbeddingProviderIds(params.expectedIds);
}
function expectRegisteredProviderSnapshotCase(params: {
entry: {
adapter: MemoryEmbeddingProviderAdapter;
ownerPluginId?: string;
};
setup: (entry: { adapter: MemoryEmbeddingProviderAdapter; ownerPluginId?: string }) => void;
expectedList?: Array<{
adapter: MemoryEmbeddingProviderAdapter;
ownerPluginId?: string;
}>;
}) {
params.setup(params.entry);
expectRegisteredProviderState({
entry: params.entry,
...(params.expectedList ? { expectedList: params.expectedList } : {}),
});
}
beforeEach(() => {
clearMemoryEmbeddingProviders();
});
afterEach(() => {
restoreRegisteredMemoryEmbeddingProviders(INITIAL_REGISTERED_MEMORY_EMBEDDING_PROVIDERS);
});
describe("memory embedding provider registry", () => {
it("registers and lists adapters in insertion order", () => {
const alpha = createAdapter("alpha");
const beta = createAdapter("beta");
registerMemoryEmbeddingProvider(alpha);
registerMemoryEmbeddingProvider(beta);
expectMemoryEmbeddingProviderState({
expectedIds: ["alpha", "beta"],
expectedCurrent: { id: "alpha", adapter: alpha },
});
});
it.each([
{
name: "tracks owner plugin ids in registered snapshots",
entry: createOwnedAdapterEntry("alpha"),
setup: (entry: { adapter: MemoryEmbeddingProviderAdapter; ownerPluginId?: string }) =>
registerMemoryEmbeddingProvider(entry.adapter, { ownerPluginId: entry.ownerPluginId }),
expectList: true,
},
{
name: "restores registered snapshots with owner metadata",
entry: createOwnedAdapterEntry("beta"),
setup: (entry: { adapter: MemoryEmbeddingProviderAdapter; ownerPluginId?: string }) =>
restoreRegisteredMemoryEmbeddingProviders([entry]),
expectList: false,
},
] as const)("$name", ({ entry, setup, expectList }) => {
expectRegisteredProviderSnapshotCase({
entry,
setup,
...(expectList ? { expectedList: [entry] } : {}),
});
});
it("clears the registry", () => {
registerMemoryEmbeddingProvider(createAdapter("alpha"));
clearMemoryEmbeddingProviders();
expectMemoryEmbeddingProviderIds([]);
});
it("stores adapters in a process-global singleton map", () => {
const alpha = createAdapter("alpha");
registerMemoryEmbeddingProvider(alpha, { ownerPluginId: "memory-core" });
const globalRegistry = (globalThis as Record<PropertyKey, unknown>)[
MEMORY_EMBEDDING_PROVIDERS_KEY
] as Map<string, { adapter: MemoryEmbeddingProviderAdapter; ownerPluginId?: string }>;
expect(globalRegistry.get("alpha")).toEqual({
adapter: alpha,
ownerPluginId: "memory-core",
});
});
});