diff --git a/apps/web/src/test/integration/agents/agents-conversations.integration.test.ts b/apps/web/src/test/integration/agents/agents-conversations.integration.test.ts index a189e70..f409435 100644 --- a/apps/web/src/test/integration/agents/agents-conversations.integration.test.ts +++ b/apps/web/src/test/integration/agents/agents-conversations.integration.test.ts @@ -15,9 +15,9 @@ describe('Agent Conversations Endpoints', () => { beforeAll(async () => { ctx = getTestContext(); - // Create a test agent for conversation tests + // Create a test agent for conversation tests with unique name testAgent = await ctx.factories.agent.create({ - name: 'Conversation Test Agent', + name: `Conversation Test Agent ${Date.now()}`, description: 'Agent for testing conversations', systemPrompt: 'You are a helpful assistant. Keep responses brief.', maxToolCallsPerTurn: 5, diff --git a/apps/web/src/test/integration/agents/agents-crud.integration.test.ts b/apps/web/src/test/integration/agents/agents-crud.integration.test.ts index da8f530..6f7ae0d 100644 --- a/apps/web/src/test/integration/agents/agents-crud.integration.test.ts +++ b/apps/web/src/test/integration/agents/agents-crud.integration.test.ts @@ -29,9 +29,10 @@ describe('Agents CRUD Endpoints', () => { }); describe('POST /api/agents', () => { - it('should create a new agent with session auth', async () => { + it('should create a new agent with API key auth', async () => { + const uniqueName = `Test CRUD Agent ${Date.now()}`; const agent = await ctx.factories.agent.create({ - name: 'Test CRUD Agent', + name: uniqueName, description: 'Created via integration test', provider: 'OPENAI', modelId: 'gpt-4o-mini', @@ -39,7 +40,7 @@ describe('Agents CRUD Endpoints', () => { }); expect(agent.id).toBeDefined(); - expect(agent.name).toBe('Test CRUD Agent'); + expect(agent.name).toBe(uniqueName); expect(agent.description).toBe('Created via integration test'); expect(agent.provider).toBe('OPENAI'); expect(agent.isPublic).toBe(true); @@ -57,21 +58,29 @@ describe('Agents CRUD Endpoints', () => { expect(result.status).toBe(401); }); - it('should reject duplicate uids', async () => { + it('should auto-suffix duplicate uids', async () => { const uid = `test-duplicate-uid-${Date.now()}`; // Create first agent - await ctx.factories.agent.create({ uid }); + const firstAgent = await ctx.factories.agent.create({ uid }); + expect(firstAgent.uid).toBe(uid); - // Try to create second with same uid - const result = await ctx.apiKeyClient.post<{ success: boolean; error?: string }>('/api/agents', { + // Create second with same uid - should succeed with modified uid + const result = await ctx.apiKeyClient.post<{ success: boolean; data: { uid: string } }>('/api/agents', { uid, - name: 'Duplicate UID Agent', + name: `Duplicate UID Agent ${Date.now()}`, provider: 'OPENAI', modelId: 'gpt-4o-mini', }); - expect(result.ok).toBe(false); + expect(result.ok).toBe(true); + if (result.ok) { + // The new agent should have a different (auto-suffixed) uid + expect(result.data.data.uid).not.toBe(uid); + expect(result.data.data.uid).toMatch(new RegExp(`^${uid}-`)); + // Track for cleanup (use id, not uid) + ctx.tracker.trackAgent((result.data.data as { id: string }).id); + } }); }); @@ -102,8 +111,9 @@ describe('Agents CRUD Endpoints', () => { describe('GET /api/agents/:id', () => { it('should get a specific agent', async () => { + const uniqueName = `Specific Agent ${Date.now()}`; const created = await ctx.factories.agent.create({ - name: 'Specific Agent', + name: uniqueName, }); const result = await ctx.apiKeyClient.get<{ @@ -114,7 +124,7 @@ describe('Agents CRUD Endpoints', () => { expect(result.ok).toBe(true); if (result.ok) { expect(result.data.data.id).toBe(created.id); - expect(result.data.data.name).toBe('Specific Agent'); + expect(result.data.data.name).toBe(uniqueName); } }); @@ -128,22 +138,24 @@ describe('Agents CRUD Endpoints', () => { describe('PATCH /api/agents/:id', () => { it('should update an agent', async () => { + const timestamp = Date.now(); const created = await ctx.factories.agent.create({ - name: 'Before Update', + name: `Before Update ${timestamp}`, description: 'Original description', }); + const updatedName = `After Update ${timestamp}`; const result = await ctx.apiKeyClient.patch<{ success: boolean; data: AgentResponse; }>(`/api/agents/${created.id}`, { - name: 'After Update', + name: updatedName, description: 'Updated description', }); expect(result.ok).toBe(true); if (result.ok) { - expect(result.data.data.name).toBe('After Update'); + expect(result.data.data.name).toBe(updatedName); expect(result.data.data.description).toBe('Updated description'); } }); diff --git a/apps/web/src/test/integration/collections/collections-crud.integration.test.ts b/apps/web/src/test/integration/collections/collections-crud.integration.test.ts index f6fe6ff..800467b 100644 --- a/apps/web/src/test/integration/collections/collections-crud.integration.test.ts +++ b/apps/web/src/test/integration/collections/collections-crud.integration.test.ts @@ -28,15 +28,16 @@ describe('Collections CRUD Endpoints', () => { }); describe('POST /api/collections', () => { - it('should create a new collection with session auth', async () => { + it('should create a new collection with API key auth', async () => { + const uniqueName = `Test CRUD Collection ${Date.now()}`; const collection = await ctx.factories.collection.create({ - name: 'Test CRUD Collection', + name: uniqueName, description: 'Created via integration test', isPublic: true, }); expect(collection.id).toBeDefined(); - expect(collection.name).toBe('Test CRUD Collection'); + expect(collection.name).toBe(uniqueName); expect(collection.description).toBe('Created via integration test'); expect(collection.isPublic).toBe(true); }); @@ -51,19 +52,19 @@ describe('Collections CRUD Endpoints', () => { expect(result.status).toBe(401); }); - it('should reject duplicate slugs for same user', async () => { - const slug = `test-duplicate-${Date.now()}`; + it('should reject duplicate names for same user', async () => { + const uniqueName = `Duplicate Test ${Date.now()}`; // Create first collection - await ctx.factories.collection.create({ slug }); + await ctx.factories.collection.create({ name: uniqueName }); - // Try to create second with same slug - const result = await ctx.apiKeyClient.post<{ success: boolean; error?: string }>('/api/collections', { - slug, - name: 'Duplicate Slug', + // Try to create second with same name + const result = await ctx.apiKeyClient.post<{ success: boolean; error?: { code: string } }>('/api/collections', { + name: uniqueName, }); expect(result.ok).toBe(false); + expect(result.status).toBe(409); }); }); @@ -94,8 +95,9 @@ describe('Collections CRUD Endpoints', () => { describe('GET /api/collections/:id', () => { it('should get a specific collection', async () => { + const uniqueName = `Specific Collection ${Date.now()}`; const created = await ctx.factories.collection.create({ - name: 'Specific Collection', + name: uniqueName, }); const result = await ctx.apiKeyClient.get<{ @@ -106,7 +108,7 @@ describe('Collections CRUD Endpoints', () => { expect(result.ok).toBe(true); if (result.ok) { expect(result.data.data.id).toBe(created.id); - expect(result.data.data.name).toBe('Specific Collection'); + expect(result.data.data.name).toBe(uniqueName); } }); @@ -120,22 +122,24 @@ describe('Collections CRUD Endpoints', () => { describe('PATCH /api/collections/:id', () => { it('should update a collection', async () => { + const timestamp = Date.now(); const created = await ctx.factories.collection.create({ - name: 'Before Update', + name: `Before Update ${timestamp}`, description: 'Original description', }); + const updatedName = `After Update ${timestamp}`; const result = await ctx.apiKeyClient.patch<{ success: boolean; data: CollectionResponse; }>(`/api/collections/${created.id}`, { - name: 'After Update', + name: updatedName, description: 'Updated description', }); expect(result.ok).toBe(true); if (result.ok) { - expect(result.data.data.name).toBe('After Update'); + expect(result.data.data.name).toBe(updatedName); expect(result.data.data.description).toBe('Updated description'); } });