mirror of
https://github.com/n8n-io/n8n.git
synced 2025-03-05 20:50:17 -08:00
chore: Create table and typeorm entity for test definitions (no-changelog) (#11505)
Co-authored-by: Tomi Turtiainen <10324676+tomi@users.noreply.github.com>
This commit is contained in:
parent
7a2be77f38
commit
5c69ba2c44
|
@ -50,8 +50,8 @@ export class CreateTable extends TableOperation {
|
||||||
ref: {
|
ref: {
|
||||||
tableName: string;
|
tableName: string;
|
||||||
columnName: string;
|
columnName: string;
|
||||||
onDelete?: 'CASCADE';
|
onDelete?: 'RESTRICT' | 'CASCADE' | 'NO ACTION' | 'SET NULL';
|
||||||
onUpdate?: 'CASCADE';
|
onUpdate?: 'RESTRICT' | 'CASCADE' | 'NO ACTION' | 'SET NULL';
|
||||||
name?: string;
|
name?: string;
|
||||||
},
|
},
|
||||||
) {
|
) {
|
||||||
|
|
|
@ -20,6 +20,7 @@ import { Settings } from './settings';
|
||||||
import { SharedCredentials } from './shared-credentials';
|
import { SharedCredentials } from './shared-credentials';
|
||||||
import { SharedWorkflow } from './shared-workflow';
|
import { SharedWorkflow } from './shared-workflow';
|
||||||
import { TagEntity } from './tag-entity';
|
import { TagEntity } from './tag-entity';
|
||||||
|
import { TestDefinition } from './test-definition';
|
||||||
import { User } from './user';
|
import { User } from './user';
|
||||||
import { Variables } from './variables';
|
import { Variables } from './variables';
|
||||||
import { WebhookEntity } from './webhook-entity';
|
import { WebhookEntity } from './webhook-entity';
|
||||||
|
@ -58,4 +59,5 @@ export const entities = {
|
||||||
ProjectRelation,
|
ProjectRelation,
|
||||||
ApiKey,
|
ApiKey,
|
||||||
ProcessedData,
|
ProcessedData,
|
||||||
|
TestDefinition,
|
||||||
};
|
};
|
||||||
|
|
61
packages/cli/src/databases/entities/test-definition.ts
Normal file
61
packages/cli/src/databases/entities/test-definition.ts
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
import {
|
||||||
|
Column,
|
||||||
|
Entity,
|
||||||
|
Generated,
|
||||||
|
Index,
|
||||||
|
ManyToOne,
|
||||||
|
OneToOne,
|
||||||
|
PrimaryColumn,
|
||||||
|
RelationId,
|
||||||
|
} from '@n8n/typeorm';
|
||||||
|
import { Length } from 'class-validator';
|
||||||
|
|
||||||
|
import { AnnotationTagEntity } from '@/databases/entities/annotation-tag-entity.ee';
|
||||||
|
import { WorkflowEntity } from '@/databases/entities/workflow-entity';
|
||||||
|
|
||||||
|
import { WithTimestamps } from './abstract-entity';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Entity representing a Test Definition
|
||||||
|
* It combines:
|
||||||
|
* - the workflow under test
|
||||||
|
* - the workflow used to evaluate the results of test execution
|
||||||
|
* - the filter used to select test cases from previous executions of the workflow under test - annotation tag
|
||||||
|
*/
|
||||||
|
@Entity()
|
||||||
|
@Index(['workflow'])
|
||||||
|
@Index(['evaluationWorkflow'])
|
||||||
|
export class TestDefinition extends WithTimestamps {
|
||||||
|
@Generated()
|
||||||
|
@PrimaryColumn()
|
||||||
|
id: number;
|
||||||
|
|
||||||
|
@Column({ length: 255 })
|
||||||
|
@Length(1, 255, { message: 'Test name must be $constraint1 to $constraint2 characters long.' })
|
||||||
|
name: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Relation to the workflow under test
|
||||||
|
*/
|
||||||
|
@ManyToOne('WorkflowEntity', 'tests')
|
||||||
|
workflow: WorkflowEntity;
|
||||||
|
|
||||||
|
@RelationId((test: TestDefinition) => test.workflow)
|
||||||
|
workflowId: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Relation to the workflow used to evaluate the results of test execution
|
||||||
|
*/
|
||||||
|
@ManyToOne('WorkflowEntity', 'evaluationTests')
|
||||||
|
evaluationWorkflow: WorkflowEntity;
|
||||||
|
|
||||||
|
@RelationId((test: TestDefinition) => test.evaluationWorkflow)
|
||||||
|
evaluationWorkflowId: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Relation to the annotation tag associated with the test
|
||||||
|
* This tag will be used to select the test cases to run from previous executions
|
||||||
|
*/
|
||||||
|
@OneToOne('AnnotationTagEntity', 'test')
|
||||||
|
annotationTag: AnnotationTagEntity;
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
import type { MigrationContext, ReversibleMigration } from '@/databases/types';
|
||||||
|
|
||||||
|
const testEntityTableName = 'test_definition';
|
||||||
|
|
||||||
|
export class CreateTestDefinitionTable1730386903556 implements ReversibleMigration {
|
||||||
|
async up({ schemaBuilder: { createTable, column } }: MigrationContext) {
|
||||||
|
await createTable(testEntityTableName)
|
||||||
|
.withColumns(
|
||||||
|
column('id').int.notNull.primary.autoGenerate,
|
||||||
|
column('name').varchar(255).notNull,
|
||||||
|
column('workflowId').varchar(36).notNull,
|
||||||
|
column('evaluationWorkflowId').varchar(36),
|
||||||
|
column('annotationTagId').varchar(16),
|
||||||
|
)
|
||||||
|
.withIndexOn('workflowId')
|
||||||
|
.withIndexOn('evaluationWorkflowId')
|
||||||
|
.withForeignKey('workflowId', {
|
||||||
|
tableName: 'workflow_entity',
|
||||||
|
columnName: 'id',
|
||||||
|
onDelete: 'CASCADE',
|
||||||
|
})
|
||||||
|
.withForeignKey('evaluationWorkflowId', {
|
||||||
|
tableName: 'workflow_entity',
|
||||||
|
columnName: 'id',
|
||||||
|
onDelete: 'SET NULL',
|
||||||
|
})
|
||||||
|
.withForeignKey('annotationTagId', {
|
||||||
|
tableName: 'annotation_tag_entity',
|
||||||
|
columnName: 'id',
|
||||||
|
onDelete: 'SET NULL',
|
||||||
|
}).withTimestamps;
|
||||||
|
}
|
||||||
|
|
||||||
|
async down({ schemaBuilder: { dropTable } }: MigrationContext) {
|
||||||
|
await dropTable(testEntityTableName);
|
||||||
|
}
|
||||||
|
}
|
|
@ -68,6 +68,7 @@ import { CreateProcessedDataTable1726606152711 } from '../common/1726606152711-C
|
||||||
import { SeparateExecutionCreationFromStart1727427440136 } from '../common/1727427440136-SeparateExecutionCreationFromStart';
|
import { SeparateExecutionCreationFromStart1727427440136 } from '../common/1727427440136-SeparateExecutionCreationFromStart';
|
||||||
import { AddMissingPrimaryKeyOnAnnotationTagMapping1728659839644 } from '../common/1728659839644-AddMissingPrimaryKeyOnAnnotationTagMapping';
|
import { AddMissingPrimaryKeyOnAnnotationTagMapping1728659839644 } from '../common/1728659839644-AddMissingPrimaryKeyOnAnnotationTagMapping';
|
||||||
import { UpdateProcessedDataValueColumnToText1729607673464 } from '../common/1729607673464-UpdateProcessedDataValueColumnToText';
|
import { UpdateProcessedDataValueColumnToText1729607673464 } from '../common/1729607673464-UpdateProcessedDataValueColumnToText';
|
||||||
|
import { CreateTestDefinitionTable1730386903556 } from '../common/1730386903556-CreateTestDefinitionTable';
|
||||||
|
|
||||||
export const mysqlMigrations: Migration[] = [
|
export const mysqlMigrations: Migration[] = [
|
||||||
InitialMigration1588157391238,
|
InitialMigration1588157391238,
|
||||||
|
@ -138,4 +139,5 @@ export const mysqlMigrations: Migration[] = [
|
||||||
CreateProcessedDataTable1726606152711,
|
CreateProcessedDataTable1726606152711,
|
||||||
AddMissingPrimaryKeyOnAnnotationTagMapping1728659839644,
|
AddMissingPrimaryKeyOnAnnotationTagMapping1728659839644,
|
||||||
UpdateProcessedDataValueColumnToText1729607673464,
|
UpdateProcessedDataValueColumnToText1729607673464,
|
||||||
|
CreateTestDefinitionTable1730386903556,
|
||||||
];
|
];
|
||||||
|
|
|
@ -68,6 +68,7 @@ import { CreateProcessedDataTable1726606152711 } from '../common/1726606152711-C
|
||||||
import { SeparateExecutionCreationFromStart1727427440136 } from '../common/1727427440136-SeparateExecutionCreationFromStart';
|
import { SeparateExecutionCreationFromStart1727427440136 } from '../common/1727427440136-SeparateExecutionCreationFromStart';
|
||||||
import { AddMissingPrimaryKeyOnAnnotationTagMapping1728659839644 } from '../common/1728659839644-AddMissingPrimaryKeyOnAnnotationTagMapping';
|
import { AddMissingPrimaryKeyOnAnnotationTagMapping1728659839644 } from '../common/1728659839644-AddMissingPrimaryKeyOnAnnotationTagMapping';
|
||||||
import { UpdateProcessedDataValueColumnToText1729607673464 } from '../common/1729607673464-UpdateProcessedDataValueColumnToText';
|
import { UpdateProcessedDataValueColumnToText1729607673464 } from '../common/1729607673464-UpdateProcessedDataValueColumnToText';
|
||||||
|
import { CreateTestDefinitionTable1730386903556 } from '../common/1730386903556-CreateTestDefinitionTable';
|
||||||
|
|
||||||
export const postgresMigrations: Migration[] = [
|
export const postgresMigrations: Migration[] = [
|
||||||
InitialMigration1587669153312,
|
InitialMigration1587669153312,
|
||||||
|
@ -138,4 +139,5 @@ export const postgresMigrations: Migration[] = [
|
||||||
CreateProcessedDataTable1726606152711,
|
CreateProcessedDataTable1726606152711,
|
||||||
AddMissingPrimaryKeyOnAnnotationTagMapping1728659839644,
|
AddMissingPrimaryKeyOnAnnotationTagMapping1728659839644,
|
||||||
UpdateProcessedDataValueColumnToText1729607673464,
|
UpdateProcessedDataValueColumnToText1729607673464,
|
||||||
|
CreateTestDefinitionTable1730386903556,
|
||||||
];
|
];
|
||||||
|
|
|
@ -65,6 +65,7 @@ import { CreateAnnotationTables1724753530828 } from '../common/1724753530828-Cre
|
||||||
import { CreateProcessedDataTable1726606152711 } from '../common/1726606152711-CreateProcessedDataTable';
|
import { CreateProcessedDataTable1726606152711 } from '../common/1726606152711-CreateProcessedDataTable';
|
||||||
import { SeparateExecutionCreationFromStart1727427440136 } from '../common/1727427440136-SeparateExecutionCreationFromStart';
|
import { SeparateExecutionCreationFromStart1727427440136 } from '../common/1727427440136-SeparateExecutionCreationFromStart';
|
||||||
import { UpdateProcessedDataValueColumnToText1729607673464 } from '../common/1729607673464-UpdateProcessedDataValueColumnToText';
|
import { UpdateProcessedDataValueColumnToText1729607673464 } from '../common/1729607673464-UpdateProcessedDataValueColumnToText';
|
||||||
|
import { CreateTestDefinitionTable1730386903556 } from '../common/1730386903556-CreateTestDefinitionTable';
|
||||||
|
|
||||||
const sqliteMigrations: Migration[] = [
|
const sqliteMigrations: Migration[] = [
|
||||||
InitialMigration1588102412422,
|
InitialMigration1588102412422,
|
||||||
|
@ -132,6 +133,7 @@ const sqliteMigrations: Migration[] = [
|
||||||
CreateProcessedDataTable1726606152711,
|
CreateProcessedDataTable1726606152711,
|
||||||
AddMissingPrimaryKeyOnAnnotationTagMapping1728659839644,
|
AddMissingPrimaryKeyOnAnnotationTagMapping1728659839644,
|
||||||
UpdateProcessedDataValueColumnToText1729607673464,
|
UpdateProcessedDataValueColumnToText1729607673464,
|
||||||
|
CreateTestDefinitionTable1730386903556,
|
||||||
];
|
];
|
||||||
|
|
||||||
export { sqliteMigrations };
|
export { sqliteMigrations };
|
||||||
|
|
|
@ -3,6 +3,7 @@ import { validate } from 'class-validator';
|
||||||
import type { AnnotationTagEntity } from '@/databases/entities/annotation-tag-entity.ee';
|
import type { AnnotationTagEntity } from '@/databases/entities/annotation-tag-entity.ee';
|
||||||
import type { CredentialsEntity } from '@/databases/entities/credentials-entity';
|
import type { CredentialsEntity } from '@/databases/entities/credentials-entity';
|
||||||
import type { TagEntity } from '@/databases/entities/tag-entity';
|
import type { TagEntity } from '@/databases/entities/tag-entity';
|
||||||
|
import type { TestDefinition } from '@/databases/entities/test-definition';
|
||||||
import type { User } from '@/databases/entities/user';
|
import type { User } from '@/databases/entities/user';
|
||||||
import type { WorkflowEntity } from '@/databases/entities/workflow-entity';
|
import type { WorkflowEntity } from '@/databases/entities/workflow-entity';
|
||||||
|
|
||||||
|
@ -12,6 +13,7 @@ import { BadRequestError } from './errors/response-errors/bad-request.error';
|
||||||
export async function validateEntity(
|
export async function validateEntity(
|
||||||
entity:
|
entity:
|
||||||
| WorkflowEntity
|
| WorkflowEntity
|
||||||
|
| TestDefinition
|
||||||
| CredentialsEntity
|
| CredentialsEntity
|
||||||
| TagEntity
|
| TagEntity
|
||||||
| AnnotationTagEntity
|
| AnnotationTagEntity
|
||||||
|
|
Loading…
Reference in a new issue