fix(cli-node): keep every result in entity delete, not just the last (#5970)
This commit is contained in:
@@ -316,16 +316,18 @@ export class PlatformBackend implements Backend {
|
|||||||
if (entities.length === 0) {
|
if (entities.length === 0) {
|
||||||
throw new Error("At least one entity ID is required for deleteEntities.");
|
throw new Error("At least one entity ID is required for deleteEntities.");
|
||||||
}
|
}
|
||||||
// Delete each provided entity via the v2 path-based endpoint
|
// Delete each provided entity via the v2 path-based endpoint. Key each
|
||||||
let result: Record<string, unknown> = {};
|
// response by entity type so a multi-entity delete (e.g. --user-id and
|
||||||
|
// --agent-id together) doesn't discard everything but the last result.
|
||||||
|
const results: Record<string, unknown> = {};
|
||||||
for (const [entityType, entityId] of entities) {
|
for (const [entityType, entityId] of entities) {
|
||||||
result = (await this._request(
|
results[entityType] = (await this._request(
|
||||||
"DELETE",
|
"DELETE",
|
||||||
`/v2/entities/${entityType}/${entityId}/`,
|
`/v2/entities/${entityType}/${entityId}/`,
|
||||||
{ params: { source: "CLI" } },
|
{ params: { source: "CLI" } },
|
||||||
)) as Record<string, unknown>;
|
)) as Record<string, unknown>;
|
||||||
}
|
}
|
||||||
return result;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
async ping(): Promise<Record<string, unknown>> {
|
async ping(): Promise<Record<string, unknown>> {
|
||||||
|
|||||||
@@ -0,0 +1,52 @@
|
|||||||
|
/**
|
||||||
|
* Tests for the Platform backend (mem0 Platform API client).
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { describe, it, expect, vi } from "vitest";
|
||||||
|
import { PlatformBackend } from "../src/backend/platform.js";
|
||||||
|
import { createDefaultConfig } from "../src/config.js";
|
||||||
|
|
||||||
|
function makeBackend(): PlatformBackend {
|
||||||
|
// apiKey/baseUrl only build request headers; every test spies on _request,
|
||||||
|
// so no real network calls are made.
|
||||||
|
return new PlatformBackend(createDefaultConfig().platform);
|
||||||
|
}
|
||||||
|
|
||||||
|
describe("deleteEntities", () => {
|
||||||
|
it("returns all results keyed by entity type for a multi-entity delete", async () => {
|
||||||
|
const backend = makeBackend();
|
||||||
|
const responses: Record<string, unknown> = {
|
||||||
|
"/v2/entities/user/alice/": { message: "user deleted" },
|
||||||
|
"/v2/entities/agent/bob/": { message: "agent deleted" },
|
||||||
|
};
|
||||||
|
const spy = vi
|
||||||
|
// biome-ignore lint/suspicious/noExplicitAny: spying on a private method
|
||||||
|
.spyOn(backend as any, "_request")
|
||||||
|
.mockImplementation(async (_method: string, path: string) => responses[path]);
|
||||||
|
|
||||||
|
const result = await backend.deleteEntities({ userId: "alice", agentId: "bob" });
|
||||||
|
|
||||||
|
// Regression: previously only the last entity's response survived.
|
||||||
|
expect(result).toEqual({
|
||||||
|
user: { message: "user deleted" },
|
||||||
|
agent: { message: "agent deleted" },
|
||||||
|
});
|
||||||
|
expect(spy).toHaveBeenCalledTimes(2);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("keys a single-entity delete by its type", async () => {
|
||||||
|
const backend = makeBackend();
|
||||||
|
// biome-ignore lint/suspicious/noExplicitAny: spying on a private method
|
||||||
|
vi.spyOn(backend as any, "_request").mockResolvedValue({ message: "user deleted" });
|
||||||
|
|
||||||
|
const result = await backend.deleteEntities({ userId: "alice" });
|
||||||
|
expect(result).toEqual({ user: { message: "user deleted" } });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("throws when no entity id is provided", async () => {
|
||||||
|
const backend = makeBackend();
|
||||||
|
await expect(backend.deleteEntities({})).rejects.toThrow(
|
||||||
|
"At least one entity ID is required",
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user