diff --git a/packages/cli/src/databases/entities/test-definition.ee.ts b/packages/cli/src/databases/entities/test-definition.ee.ts index 1ec08e9e66..f8ec8d6cb7 100644 --- a/packages/cli/src/databases/entities/test-definition.ee.ts +++ b/packages/cli/src/databases/entities/test-definition.ee.ts @@ -35,6 +35,9 @@ export class TestDefinition extends WithTimestamps { }) name: string; + @Column('text') + description: string; + /** * Relation to the workflow under test */ diff --git a/packages/cli/src/databases/migrations/common/1731404028106-AddDescriptionToTestDefinition.ts b/packages/cli/src/databases/migrations/common/1731404028106-AddDescriptionToTestDefinition.ts new file mode 100644 index 0000000000..5063bdf232 --- /dev/null +++ b/packages/cli/src/databases/migrations/common/1731404028106-AddDescriptionToTestDefinition.ts @@ -0,0 +1,11 @@ +import type { MigrationContext, ReversibleMigration } from '@/databases/types'; + +export class AddDescriptionToTestDefinition1731404028106 implements ReversibleMigration { + async up({ schemaBuilder: { addColumns, column } }: MigrationContext) { + await addColumns('test_definition', [column('description').text]); + } + + async down({ schemaBuilder: { dropColumns } }: MigrationContext) { + await dropColumns('test_definition', ['description']); + } +} diff --git a/packages/cli/src/databases/migrations/mysqldb/index.ts b/packages/cli/src/databases/migrations/mysqldb/index.ts index ebe7cf76c0..5f0b23d601 100644 --- a/packages/cli/src/databases/migrations/mysqldb/index.ts +++ b/packages/cli/src/databases/migrations/mysqldb/index.ts @@ -69,6 +69,7 @@ import { SeparateExecutionCreationFromStart1727427440136 } from '../common/17274 import { AddMissingPrimaryKeyOnAnnotationTagMapping1728659839644 } from '../common/1728659839644-AddMissingPrimaryKeyOnAnnotationTagMapping'; import { UpdateProcessedDataValueColumnToText1729607673464 } from '../common/1729607673464-UpdateProcessedDataValueColumnToText'; import { CreateTestDefinitionTable1730386903556 } from '../common/1730386903556-CreateTestDefinitionTable'; +import { AddDescriptionToTestDefinition1731404028106 } from '../common/1731404028106-AddDescriptionToTestDefinition'; export const mysqlMigrations: Migration[] = [ InitialMigration1588157391238, @@ -140,4 +141,5 @@ export const mysqlMigrations: Migration[] = [ AddMissingPrimaryKeyOnAnnotationTagMapping1728659839644, UpdateProcessedDataValueColumnToText1729607673464, CreateTestDefinitionTable1730386903556, + AddDescriptionToTestDefinition1731404028106, ]; diff --git a/packages/cli/src/databases/migrations/postgresdb/index.ts b/packages/cli/src/databases/migrations/postgresdb/index.ts index 731ddc2680..5372256371 100644 --- a/packages/cli/src/databases/migrations/postgresdb/index.ts +++ b/packages/cli/src/databases/migrations/postgresdb/index.ts @@ -69,6 +69,7 @@ import { SeparateExecutionCreationFromStart1727427440136 } from '../common/17274 import { AddMissingPrimaryKeyOnAnnotationTagMapping1728659839644 } from '../common/1728659839644-AddMissingPrimaryKeyOnAnnotationTagMapping'; import { UpdateProcessedDataValueColumnToText1729607673464 } from '../common/1729607673464-UpdateProcessedDataValueColumnToText'; import { CreateTestDefinitionTable1730386903556 } from '../common/1730386903556-CreateTestDefinitionTable'; +import { AddDescriptionToTestDefinition1731404028106 } from '../common/1731404028106-AddDescriptionToTestDefinition'; export const postgresMigrations: Migration[] = [ InitialMigration1587669153312, @@ -140,4 +141,5 @@ export const postgresMigrations: Migration[] = [ AddMissingPrimaryKeyOnAnnotationTagMapping1728659839644, UpdateProcessedDataValueColumnToText1729607673464, CreateTestDefinitionTable1730386903556, + AddDescriptionToTestDefinition1731404028106, ]; diff --git a/packages/cli/src/databases/migrations/sqlite/1731404028106-AddDescriptionToTestDefinition.ts b/packages/cli/src/databases/migrations/sqlite/1731404028106-AddDescriptionToTestDefinition.ts new file mode 100644 index 0000000000..3c3ad4e4ed --- /dev/null +++ b/packages/cli/src/databases/migrations/sqlite/1731404028106-AddDescriptionToTestDefinition.ts @@ -0,0 +1,5 @@ +import { AddDescriptionToTestDefinition1731404028106 as BaseMigration } from '../common/1731404028106-AddDescriptionToTestDefinition'; + +export class AddDescriptionToTestDefinition1731404028106 extends BaseMigration { + transaction = false as const; +} diff --git a/packages/cli/src/databases/migrations/sqlite/index.ts b/packages/cli/src/databases/migrations/sqlite/index.ts index 8004894ccf..e9b09ff483 100644 --- a/packages/cli/src/databases/migrations/sqlite/index.ts +++ b/packages/cli/src/databases/migrations/sqlite/index.ts @@ -39,6 +39,7 @@ import { DropRoleMapping1705429061930 } from './1705429061930-DropRoleMapping'; import { AddActivatedAtUserSetting1717498465931 } from './1717498465931-AddActivatedAtUserSetting'; import { AddApiKeysTable1724951148974 } from './1724951148974-AddApiKeysTable'; import { AddMissingPrimaryKeyOnAnnotationTagMapping1728659839644 } from './1728659839644-AddMissingPrimaryKeyOnAnnotationTagMapping'; +import { AddDescriptionToTestDefinition1731404028106 } from './1731404028106-AddDescriptionToTestDefinition'; import { UniqueWorkflowNames1620821879465 } from '../common/1620821879465-UniqueWorkflowNames'; import { UpdateWorkflowCredentials1630330987096 } from '../common/1630330987096-UpdateWorkflowCredentials'; import { AddNodeIds1658930531669 } from '../common/1658930531669-AddNodeIds'; @@ -134,6 +135,7 @@ const sqliteMigrations: Migration[] = [ AddMissingPrimaryKeyOnAnnotationTagMapping1728659839644, UpdateProcessedDataValueColumnToText1729607673464, CreateTestDefinitionTable1730386903556, + AddDescriptionToTestDefinition1731404028106, ]; export { sqliteMigrations }; diff --git a/packages/cli/src/evaluation/test-definition.schema.ts b/packages/cli/src/evaluation/test-definition.schema.ts index ffb6d82ab5..8f71ee6858 100644 --- a/packages/cli/src/evaluation/test-definition.schema.ts +++ b/packages/cli/src/evaluation/test-definition.schema.ts @@ -4,13 +4,16 @@ export const testDefinitionCreateRequestBodySchema = z .object({ name: z.string().min(1).max(255), workflowId: z.string().min(1), + description: z.string().optional(), evaluationWorkflowId: z.string().min(1).optional(), + annotationTagId: z.string().min(1).optional(), }) .strict(); export const testDefinitionPatchRequestBodySchema = z .object({ name: z.string().min(1).max(255).optional(), + description: z.string().optional(), evaluationWorkflowId: z.string().min(1).optional(), annotationTagId: z.string().min(1).optional(), }) diff --git a/packages/cli/src/evaluation/test-definition.service.ee.ts b/packages/cli/src/evaluation/test-definition.service.ee.ts index 6431568363..404167078b 100644 --- a/packages/cli/src/evaluation/test-definition.service.ee.ts +++ b/packages/cli/src/evaluation/test-definition.service.ee.ts @@ -26,6 +26,7 @@ export class TestDefinitionService { private toEntityLike(attrs: { name?: string; + description?: string; workflowId?: string; evaluationWorkflowId?: string; annotationTagId?: string; @@ -41,6 +42,10 @@ export class TestDefinitionService { entity.name = attrs.name?.trim(); } + if (attrs.description) { + entity.description = attrs.description.trim(); + } + if (attrs.workflowId) { entity.workflow = { id: attrs.workflowId, diff --git a/packages/cli/test/integration/evaluation/test-definitions.api.test.ts b/packages/cli/test/integration/evaluation/test-definitions.api.test.ts index 5d75b21ffd..3309bc08d4 100644 --- a/packages/cli/test/integration/evaluation/test-definitions.api.test.ts +++ b/packages/cli/test/integration/evaluation/test-definitions.api.test.ts @@ -163,9 +163,36 @@ describe('POST /evaluation/test-definitions', () => { }); expect(resp.statusCode).toBe(200); - expect(resp.body.data.name).toBe('test'); - expect(resp.body.data.workflowId).toBe(workflowUnderTest.id); - expect(resp.body.data.evaluationWorkflowId).toBe(evaluationWorkflow.id); + expect(resp.body.data).toEqual( + expect.objectContaining({ + name: 'test', + workflowId: workflowUnderTest.id, + evaluationWorkflowId: evaluationWorkflow.id, + }), + ); + }); + + test('should create test definition with all fields', async () => { + const resp = await authOwnerAgent.post('/evaluation/test-definitions').send({ + name: 'test', + description: 'test description', + workflowId: workflowUnderTest.id, + evaluationWorkflowId: evaluationWorkflow.id, + annotationTagId: annotationTag.id, + }); + + expect(resp.statusCode).toBe(200); + expect(resp.body.data).toEqual( + expect.objectContaining({ + name: 'test', + description: 'test description', + workflowId: workflowUnderTest.id, + evaluationWorkflowId: evaluationWorkflow.id, + annotationTag: expect.objectContaining({ + id: annotationTag.id, + }), + }), + ); }); test('should return error if name is empty', async () => {