

























11// Memory Core tests cover manager.async search plugin behavior.
22import { describe, expect, it, vi } from "vitest";
33import { awaitPendingManagerWork, startAsyncSearchSync } from "./manager-async-state.js";
4+import { MemoryIndexManager } from "./manager.js";
4556describe("memory search async sync", () => {
6-it("does not await sync when searching", async () => {
7+it("waits for dirty sync before querying", async () => {
78let releaseSync = () => {};
8-const pending = new Promise<void>((resolve) => {
9+const pendingSync = new Promise<void>((resolve) => {
910releaseSync = () => resolve();
1011});
1112const syncMock = vi.fn(async () => {
12-return pending;
13+return pendingSync;
1314});
14-const onError = vi.fn();
15-16-startAsyncSearchSync({
17-enabled: true,
15+const queryMock = vi.fn(async () => []);
16+const manager = Object.create(MemoryIndexManager.prototype) as MemoryIndexManager;
17+Object.assign(manager as unknown as Record<string, unknown>, {
18+providerRequirement: { mode: "fts-only", provider: "none" },
19+hasIndexedContent: () => true,
20+settings: {
21+sync: { onSearch: true },
22+query: {
23+minScore: 0,
24+maxResults: 5,
25+hybrid: {
26+enabled: true,
27+candidateMultiplier: 2,
28+temporalDecay: { enabled: false, halfLifeDays: 30 },
29+},
30+},
31+},
32+warmSession: vi.fn(),
33+ensureProviderInitialized: vi.fn(async () => {}),
34+assertRequiredProviderAvailable: vi.fn(),
1835dirty: true,
1936sessionsDirty: false,
2037sync: syncMock,
21- onError,
38+provider: null,
39+providerLifecycle: { mode: "fts-only", reason: "test" },
40+refreshIndexIdentityDirty: () => ({ status: "valid" }),
41+sources: new Set(["memory"]),
42+fts: { enabled: true, available: true },
43+searchKeywordWithFallback: queryMock,
44+workspaceDir: "",
2245});
234647+const searchPromise = manager.search("current memory");
48+await vi.waitFor(() => expect(syncMock).toHaveBeenCalledWith({ reason: "search" }));
49+expect(queryMock).not.toHaveBeenCalled();
50+2451expect(syncMock).toHaveBeenCalledTimes(1);
2552releaseSync();
26-await pending;
27-expect(onError).not.toHaveBeenCalled();
53+await searchPromise;
54+expect(queryMock).toHaveBeenCalledTimes(1);
2855});
29563057it("waits for in-flight search sync during close", async () => {
@@ -45,9 +72,9 @@ describe("memory search async sync", () => {
4572await closePromise;
4673});
477448-it("skips background search sync when search-triggered sync is disabled", () => {
75+it("skips background search sync when search-triggered sync is disabled", async () => {
4976const syncMock = vi.fn(async () => {});
50-startAsyncSearchSync({
77+await startAsyncSearchSync({
5178enabled: false,
5279dirty: true,
5380sessionsDirty: false,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。