test: add cleanup hooks and refactor integration test helpers

This commit is contained in:
kartik-mem0
2026-03-19 15:50:43 +05:30
parent 1b7c904b98
commit 388b61a099
4 changed files with 70 additions and 77 deletions
+2 -4
View File
@@ -2,8 +2,6 @@
module.exports = { module.exports = {
...require("./jest.config"), ...require("./jest.config"),
testMatch: ["**/integration/**/*.test.ts"], testMatch: ["**/integration/**/*.test.ts"],
globalSetup: globalSetup: "<rootDir>/src/client/tests/integration/global-setup.ts",
"<rootDir>/src/client/tests/integration/global-setup.ts", globalTeardown: "<rootDir>/src/client/tests/integration/global-teardown.ts",
globalTeardown:
"<rootDir>/src/client/tests/integration/global-teardown.ts",
}; };
@@ -200,7 +200,10 @@ describeIntegration("MemoryClient Integration — CRUD", () => {
const result = await client.add( const result = await client.add(
[ [
{ role: "user" as const, content: "I prefer dark mode in all apps." }, { role: "user" as const, content: "I prefer dark mode in all apps." },
{ role: "assistant" as const, content: "Noted, dark mode preference saved!" }, {
role: "assistant" as const,
content: "Noted, dark mode preference saved!",
},
], ],
{ {
user_id: TEST_USER_ID, user_id: TEST_USER_ID,
@@ -60,9 +60,7 @@ export async function waitForMemories(
): Promise<Memory[]> { ): Promise<Memory[]> {
const start = Date.now(); const start = Date.now();
while (Date.now() - start < maxWaitMs) { while (Date.now() - start < maxWaitMs) {
const memories = await withRetry(() => const memories = await withRetry(() => client.getAll({ user_id: userId }));
client.getAll({ user_id: userId }),
);
if (Array.isArray(memories) && memories.length >= minCount) { if (Array.isArray(memories) && memories.length >= minCount) {
return memories; return memories;
} }
@@ -133,8 +131,7 @@ export async function seedTestMemories(
[ [
{ {
role: "user" as const, role: "user" as const,
content: content: "Hi, I'm integration-test-user. My favorite color is blue.",
"Hi, I'm integration-test-user. My favorite color is blue.",
}, },
{ {
role: "assistant" as const, role: "assistant" as const,
@@ -193,9 +190,7 @@ export async function cleanupTestUser(
* Used as cleanup before and after integration test runs so tests * Used as cleanup before and after integration test runs so tests
* start from a clean slate and don't leave data behind. * start from a clean slate and don't leave data behind.
*/ */
export async function fullProjectCleanup( export async function fullProjectCleanup(client: MemoryClient): Promise<void> {
client: MemoryClient,
): Promise<void> {
// Delete all memories — all four filters set explicitly // Delete all memories — all four filters set explicitly
try { try {
await client.deleteAll({ await client.deleteAll({
@@ -23,79 +23,76 @@ jest.setTimeout(120_000);
const TEST_USER_ID = `integration-mgmt-${randomUUID()}`; const TEST_USER_ID = `integration-mgmt-${randomUUID()}`;
describeIntegration( describeIntegration("MemoryClient Integration — Users & Project", () => {
"MemoryClient Integration — Users & Project", let client: MemoryClient;
() => { let cleanup: () => void;
let client: MemoryClient;
let cleanup: () => void;
beforeAll(async () => { beforeAll(async () => {
cleanup = suppressTelemetryNoise(); cleanup = suppressTelemetryNoise();
client = createTestClient(); client = createTestClient();
await seedTestMemories(client, TEST_USER_ID); await seedTestMemories(client, TEST_USER_ID);
});
afterAll(async () => {
await cleanupTestUser(client, TEST_USER_ID);
cleanup();
});
// ─── Users ────────────────────────────────────────────────
describe("user management", () => {
test("lists users and finds test user", async () => {
const allUsers = await client.users();
expect(typeof allUsers.count).toBe("number");
expect(Array.isArray(allUsers.results)).toBe(true);
if (allUsers.results.length > 0) {
const user = allUsers.results[0];
expect(typeof user.id).toBe("string");
expect(typeof user.name).toBe("string");
expect(typeof user.type).toBe("string");
}
const testUser = allUsers.results.find((u) => u.name === TEST_USER_ID);
expect(testUser).toBeDefined();
}); });
});
afterAll(async () => { // ─── Project ──────────────────────────────────────────────
await cleanupTestUser(client, TEST_USER_ID); describe("project management", () => {
cleanup(); let originalInstructions: string | undefined;
});
// ─── Users ──────────────────────────────────────────────── test("gets project with custom_instructions field", async () => {
describe("user management", () => { const project = await client.getProject({
test("lists users and finds test user", async () => { fields: ["custom_instructions"],
const allUsers = await client.users();
expect(typeof allUsers.count).toBe("number");
expect(Array.isArray(allUsers.results)).toBe(true);
if (allUsers.results.length > 0) {
const user = allUsers.results[0];
expect(typeof user.id).toBe("string");
expect(typeof user.name).toBe("string");
expect(typeof user.type).toBe("string");
}
const testUser = allUsers.results.find((u) => u.name === TEST_USER_ID);
expect(testUser).toBeDefined();
});
});
// ─── Project ──────────────────────────────────────────────
describe("project management", () => {
let originalInstructions: string | undefined;
test("gets project with custom_instructions field", async () => {
const project = await client.getProject({
fields: ["custom_instructions"],
});
expect(project).toBeDefined();
expect(typeof project).toBe("object");
expect("custom_instructions" in project).toBe(true);
originalInstructions = project.custom_instructions;
}); });
test("updates project custom_instructions via updateProject()", async () => { expect(project).toBeDefined();
const testInstruction = `integration-test-${randomUUID().slice(0, 8)}`; expect(typeof project).toBe("object");
expect("custom_instructions" in project).toBe(true);
const result = await client.updateProject({ originalInstructions = project.custom_instructions;
custom_instructions: testInstruction, });
});
expect(result).toBeDefined(); test("updates project custom_instructions via updateProject()", async () => {
const testInstruction = `integration-test-${randomUUID().slice(0, 8)}`;
// Verify the update took effect const result = await client.updateProject({
const project = await client.getProject({ custom_instructions: testInstruction,
fields: ["custom_instructions"], });
});
expect(project.custom_instructions).toBe(testInstruction);
// Restore original expect(result).toBeDefined();
await client.updateProject({
custom_instructions: originalInstructions || "", // Verify the update took effect
}); const project = await client.getProject({
fields: ["custom_instructions"],
});
expect(project.custom_instructions).toBe(testInstruction);
// Restore original
await client.updateProject({
custom_instructions: originalInstructions || "",
}); });
}); });
}, });
); });