test: add cleanup hooks and refactor integration test helpers
This commit is contained in:
@@ -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 || "",
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
});
|
||||||
);
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user