Failing morph relation creation v2 integration testing & fixes (#14253)

# Introduction
closes https://github.com/twentyhq/core-team-issues/issues/1408
This commit is contained in:
Paul Rastoin
2025-09-03 12:14:43 +02:00
committed by GitHub
parent 2e7fe238ed
commit 6522498df0
43 changed files with 4022 additions and 2730 deletions
@@ -75,7 +75,11 @@ exports[`Workspace migration builder field actions test suite It should build an
"options": null,
"relationTargetFieldMetadataId": Any<String>,
"relationTargetObjectMetadataId": Any<String>,
"settings": null,
"settings": {
"joinColumnName": "sourceWhatever",
"onDelete": undefined,
"relationType": "ONE_TO_MANY",
},
"standardId": null,
"standardOverrides": null,
"type": "RELATION",
@@ -126,7 +130,11 @@ exports[`Workspace migration builder field actions test suite It should build an
"options": null,
"relationTargetFieldMetadataId": Any<String>,
"relationTargetObjectMetadataId": Any<String>,
"settings": null,
"settings": {
"joinColumnName": "whatever",
"onDelete": undefined,
"relationType": "MANY_TO_ONE",
},
"standardId": null,
"standardOverrides": null,
"type": "RELATION",
@@ -145,33 +153,6 @@ exports[`Workspace migration builder field actions test suite It should build an
"createdAt": Any<String>,
"defaultValue": null,
"description": "default flat field metadata description",
"flatRelationTargetFieldMetadata": {
"createdAt": Any<String>,
"defaultValue": null,
"description": "default flat field metadata description",
"icon": "icon",
"id": Any<String>,
"isActive": true,
"isCustom": true,
"isLabelSyncedWithName": false,
"isNullable": true,
"isSystem": false,
"isUIReadOnly": false,
"isUnique": false,
"label": "flat field metadata label",
"name": "flatFieldMetadataName",
"objectMetadataId": Any<String>,
"options": null,
"relationTargetFieldMetadataId": Any<String>,
"relationTargetObjectMetadataId": Any<String>,
"settings": null,
"standardId": null,
"standardOverrides": null,
"type": "RELATION",
"universalIdentifier": Any<String>,
"updatedAt": Any<String>,
"workspaceId": Any<String>,
},
"flatRelationTargetObjectMetadata": {
"createdAt": Any<String>,
"description": "A rocket",
@@ -215,7 +196,11 @@ exports[`Workspace migration builder field actions test suite It should build an
"options": null,
"relationTargetFieldMetadataId": Any<String>,
"relationTargetObjectMetadataId": Any<String>,
"settings": null,
"settings": {
"joinColumnName": "whatever",
"onDelete": undefined,
"relationType": "MANY_TO_ONE",
},
"standardId": null,
"standardOverrides": null,
"type": "RELATION",
@@ -266,7 +251,11 @@ exports[`Workspace migration builder field actions test suite It should build an
"options": null,
"relationTargetFieldMetadataId": Any<String>,
"relationTargetObjectMetadataId": Any<String>,
"settings": null,
"settings": {
"joinColumnName": "sourceWhatever",
"onDelete": undefined,
"relationType": "ONE_TO_MANY",
},
"standardId": null,
"standardOverrides": null,
"type": "RELATION",
@@ -647,8 +636,6 @@ exports[`Workspace migration builder object actions test suite It should build a
"createdAt": Any<String>,
"defaultValue": null,
"description": "TimelineActivities Rocket",
"flatRelationTargetFieldMetadata": null,
"flatRelationTargetObjectMetadata": null,
"icon": "IconBuildingSkyscraper",
"id": Any<String>,
"isActive": true,
@@ -713,8 +700,6 @@ exports[`Workspace migration builder object actions test suite It should build a
"createdAt": Any<String>,
"defaultValue": null,
"description": "Favorites Rocket",
"flatRelationTargetFieldMetadata": null,
"flatRelationTargetObjectMetadata": null,
"icon": "IconBuildingSkyscraper",
"id": Any<String>,
"isActive": true,
@@ -779,8 +764,6 @@ exports[`Workspace migration builder object actions test suite It should build a
"createdAt": Any<String>,
"defaultValue": null,
"description": "Attachments Rocket",
"flatRelationTargetFieldMetadata": null,
"flatRelationTargetObjectMetadata": null,
"icon": "IconBuildingSkyscraper",
"id": Any<String>,
"isActive": true,
@@ -845,8 +828,6 @@ exports[`Workspace migration builder object actions test suite It should build a
"createdAt": Any<String>,
"defaultValue": null,
"description": "NoteTargets Rocket",
"flatRelationTargetFieldMetadata": null,
"flatRelationTargetObjectMetadata": null,
"icon": "IconBuildingSkyscraper",
"id": Any<String>,
"isActive": true,
@@ -911,8 +892,6 @@ exports[`Workspace migration builder object actions test suite It should build a
"createdAt": Any<String>,
"defaultValue": null,
"description": "TaskTargets Rocket",
"flatRelationTargetFieldMetadata": null,
"flatRelationTargetObjectMetadata": null,
"icon": "IconBuildingSkyscraper",
"id": Any<String>,
"isActive": true,
@@ -1126,8 +1105,6 @@ exports[`Workspace migration builder object actions test suite It should build a
"createdAt": Any<String>,
"defaultValue": null,
"description": "NoteTargets Pet",
"flatRelationTargetFieldMetadata": null,
"flatRelationTargetObjectMetadata": null,
"icon": "IconBuildingSkyscraper",
"id": Any<String>,
"isActive": true,
@@ -1419,8 +1396,6 @@ exports[`Workspace migration builder object actions test suite It should build a
"createdAt": Any<String>,
"defaultValue": null,
"description": "TimelineActivities Pet",
"flatRelationTargetFieldMetadata": null,
"flatRelationTargetObjectMetadata": null,
"icon": "IconBuildingSkyscraper",
"id": Any<String>,
"isActive": true,
@@ -1485,8 +1460,6 @@ exports[`Workspace migration builder object actions test suite It should build a
"createdAt": Any<String>,
"defaultValue": null,
"description": "Favorites Pet",
"flatRelationTargetFieldMetadata": null,
"flatRelationTargetObjectMetadata": null,
"icon": "IconBuildingSkyscraper",
"id": Any<String>,
"isActive": true,
@@ -1551,8 +1524,6 @@ exports[`Workspace migration builder object actions test suite It should build a
"createdAt": Any<String>,
"defaultValue": null,
"description": "Attachments Pet",
"flatRelationTargetFieldMetadata": null,
"flatRelationTargetObjectMetadata": null,
"icon": "IconBuildingSkyscraper",
"id": Any<String>,
"isActive": true,
@@ -1617,8 +1588,6 @@ exports[`Workspace migration builder object actions test suite It should build a
"createdAt": Any<String>,
"defaultValue": null,
"description": "TaskTargets Pet",
"flatRelationTargetFieldMetadata": null,
"flatRelationTargetObjectMetadata": null,
"icon": "IconBuildingSkyscraper",
"id": Any<String>,
"isActive": true,
@@ -2811,8 +2780,6 @@ exports[`Workspace migration builder object actions test suite It should build a
"createdAt": Any<String>,
"defaultValue": null,
"description": "TimelineActivities Rocket",
"flatRelationTargetFieldMetadata": null,
"flatRelationTargetObjectMetadata": null,
"icon": "IconBuildingSkyscraper",
"id": Any<String>,
"isActive": true,
@@ -2877,8 +2844,6 @@ exports[`Workspace migration builder object actions test suite It should build a
"createdAt": Any<String>,
"defaultValue": null,
"description": "Favorites Rocket",
"flatRelationTargetFieldMetadata": null,
"flatRelationTargetObjectMetadata": null,
"icon": "IconBuildingSkyscraper",
"id": Any<String>,
"isActive": true,
@@ -2943,8 +2908,6 @@ exports[`Workspace migration builder object actions test suite It should build a
"createdAt": Any<String>,
"defaultValue": null,
"description": "Attachments Rocket",
"flatRelationTargetFieldMetadata": null,
"flatRelationTargetObjectMetadata": null,
"icon": "IconBuildingSkyscraper",
"id": Any<String>,
"isActive": true,
@@ -3009,8 +2972,6 @@ exports[`Workspace migration builder object actions test suite It should build a
"createdAt": Any<String>,
"defaultValue": null,
"description": "NoteTargets Rocket",
"flatRelationTargetFieldMetadata": null,
"flatRelationTargetObjectMetadata": null,
"icon": "IconBuildingSkyscraper",
"id": Any<String>,
"isActive": true,
@@ -3075,8 +3036,6 @@ exports[`Workspace migration builder object actions test suite It should build a
"createdAt": Any<String>,
"defaultValue": null,
"description": "TaskTargets Rocket",
"flatRelationTargetFieldMetadata": null,
"flatRelationTargetObjectMetadata": null,
"icon": "IconBuildingSkyscraper",
"id": Any<String>,
"isActive": true,
@@ -6,8 +6,10 @@ import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfa
import { COMPANY_FLAT_FIELDS_MOCK } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/company-flat-fields.mock';
import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock';
import { getMorphOrRelationTargetFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-morph-or-relation-target-flat-field-metadata-mock';
import { OPPORTUNITY_FLAT_FIELDS_MOCK } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/opportunity-flat-fields.mock';
import { PET_FLAT_FIELDS_MOCK } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/pet-flat-fields.mock';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { FLAT_OBJECT_METADATA_MAPS_MOCKS } from 'src/engine/metadata-modules/flat-object-metadata-maps/mocks/flat-object-metadata-maps.mock';
import { addFlatFieldMetadataInFlatObjectMetadataMapsOrThrow } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/add-flat-field-metadata-in-flat-object-metadata-maps-or-throw.util';
import { deleteFieldFromFlatObjectMetadataMapsOrThrow } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/delete-field-from-flat-object-metadata-maps-or-throw.util';
@@ -27,39 +29,54 @@ const relationTestCases: WorkspaceMigrationBuilderTestCase[] = [
input: () => {
const targetRelationId = faker.string.uuid();
const sourceRelationId = faker.string.uuid();
const sourceRelationFlatField = getFlatFieldMetadataMock({
id: sourceRelationId,
universalIdentifier: 'field-metadata-unique-identifier-1',
objectMetadataId: PET_FLAT_OBJECT_MOCK.id,
type: FieldMetadataType.RELATION,
relationTargetFieldMetadataId: targetRelationId,
relationTargetObjectMetadataId: ROCKET_FLAT_OBJECT_MOCK.id,
flatRelationTargetFieldMetadata: undefined,
flatRelationTargetObjectMetadata:
fromFlatObjectMetadataToFlatObjectMetadataWithoutFields(
ROCKET_FLAT_OBJECT_MOCK,
),
});
const draftSourceRelationFlatField =
getMorphOrRelationTargetFlatFieldMetadataMock({
id: sourceRelationId,
universalIdentifier: 'field-metadata-unique-identifier-1',
objectMetadataId: PET_FLAT_OBJECT_MOCK.id,
type: FieldMetadataType.RELATION,
settings: {
relationType: RelationType.MANY_TO_ONE,
joinColumnName: 'whatever',
onDelete: undefined,
},
relationTargetFieldMetadataId: targetRelationId,
relationTargetObjectMetadataId: ROCKET_FLAT_OBJECT_MOCK.id,
flatRelationTargetObjectMetadata:
fromFlatObjectMetadataToFlatObjectMetadataWithoutFields(
ROCKET_FLAT_OBJECT_MOCK,
),
});
const targetRelationFlatField = getFlatFieldMetadataMock({
id: targetRelationId,
universalIdentifier: 'field-metadata-unique-identifier-2',
objectMetadataId: ROCKET_FLAT_OBJECT_MOCK.id,
type: FieldMetadataType.RELATION,
settings: {
relationType: RelationType.ONE_TO_MANY,
joinColumnName: 'sourceWhatever',
onDelete: undefined,
},
relationTargetFieldMetadataId: sourceRelationId,
relationTargetObjectMetadataId: PET_FLAT_OBJECT_MOCK.id,
flatRelationTargetFieldMetadata: sourceRelationFlatField,
flatRelationTargetFieldMetadata: draftSourceRelationFlatField,
flatRelationTargetObjectMetadata:
fromFlatObjectMetadataToFlatObjectMetadataWithoutFields(
PET_FLAT_OBJECT_MOCK,
),
});
sourceRelationFlatField.flatRelationTargetFieldMetadata =
removePropertiesFromRecord(targetRelationFlatField, [
'flatRelationTargetFieldMetadata',
'flatRelationTargetObjectMetadata',
]);
const sourceRelationFlatField = getFlatFieldMetadataMock({
...draftSourceRelationFlatField,
flatRelationTargetFieldMetadata: removePropertiesFromRecord(
targetRelationFlatField as FlatFieldMetadata<FieldMetadataType.RELATION>,
[
'flatRelationTargetFieldMetadata',
'flatRelationTargetObjectMetadata',
],
),
});
const toFlatObjectMetadataMaps = [
sourceRelationFlatField,
targetRelationFlatField,
@@ -11,7 +11,8 @@ import {
import { getCompositeTypeOrThrow } from 'src/engine/metadata-modules/field-metadata/utils/get-composite-type-or-throw.util';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { isCompositeFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-composite-flat-field-metadata.util';
import { isFlatFieldMetadataEntityOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util';
import { isFlatFieldMetadataOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util';
import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util';
import { type FlatObjectMetadataWithoutFields } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
import { fieldMetadataTypeToColumnType } from 'src/engine/metadata-modules/workspace-migration/utils/field-metadata-type-to-column-type.util';
import { type WorkspaceSchemaColumnDefinition } from 'src/engine/twenty-orm/workspace-schema-manager/types/workspace-schema-column-definition.type';
@@ -181,24 +182,12 @@ export const generateColumnDefinitions = ({
}
if (
isFlatFieldMetadataEntityOfType(
flatFieldMetadata,
FieldMetadataType.TS_VECTOR,
)
isFlatFieldMetadataOfType(flatFieldMetadata, FieldMetadataType.TS_VECTOR)
) {
return [generateTsVectorColumnDefinition(flatFieldMetadata)];
}
if (
isFlatFieldMetadataEntityOfType(
flatFieldMetadata,
FieldMetadataType.RELATION,
) ||
isFlatFieldMetadataEntityOfType(
flatFieldMetadata,
FieldMetadataType.MORPH_RELATION,
)
) {
if (isMorphOrRelationFlatFieldMetadata(flatFieldMetadata)) {
const relationColumn = generateRelationColumnDefinition(flatFieldMetadata);
return relationColumn ? [relationColumn] : [];