Morph INPUT integration test (#16464)

- Adding a new target to the test setup suite
- We add the MORPH_RELATION to the list of types we wanna test in the
current test suites

Important:
I noticed the REST API was not working well with Morph relations. I
created [an
issue](https://github.com/twentyhq/core-team-issues/issues/2002) to work
on that. Within that timeframe, I `xdescribed` the related tests

Fixes https://github.com/twentyhq/core-team-issues/issues/1327
This commit is contained in:
Guillim
2025-12-11 10:10:30 +01:00
committed by GitHub
parent 7021cd41ea
commit 5daef28328
50 changed files with 766 additions and 145 deletions
@@ -17,11 +17,13 @@ type FieldMetadataCreationInput = {
objectMetadataId: string;
options?: FieldMetadataComplexOption[];
relationCreationPayload?: RelationCreationPayload;
morphRelationsCreationPayload?: RelationCreationPayload[];
};
export const getFieldMetadataCreationInputs = (
objectMetadataId: string,
targetObjectMetadataId: string,
targetObjectMetadata1Id: string,
targetObjectMetadata2Id: string,
) => {
const fieldInputsMap: {
[K in Exclude<
@@ -170,7 +172,7 @@ export const getFieldMetadataCreationInputs = (
type: FieldMetadataType.RELATION,
objectMetadataId,
relationCreationPayload: {
targetObjectMetadataId: targetObjectMetadataId,
targetObjectMetadataId: targetObjectMetadata1Id,
targetFieldLabel: 'oneToManyTargetRelationField',
targetFieldIcon: 'IconListOpportunity',
type: RelationType.MANY_TO_ONE,
@@ -182,13 +184,47 @@ export const getFieldMetadataCreationInputs = (
type: FieldMetadataType.RELATION,
objectMetadataId,
relationCreationPayload: {
targetObjectMetadataId: targetObjectMetadataId,
targetObjectMetadataId: targetObjectMetadata1Id,
targetFieldLabel: 'manyToOneTargetRelationField',
targetFieldIcon: 'IconListOpportunity',
type: RelationType.ONE_TO_MANY,
},
},
],
[FieldMetadataType.MORPH_RELATION]: [
{
name: 'manyToOneMorphRelationField',
label: 'manyToOneMorphRelationField',
type: FieldMetadataType.MORPH_RELATION,
objectMetadataId,
morphRelationsCreationPayload: [
{
targetObjectMetadataId: targetObjectMetadata1Id,
targetFieldLabel: 'oneToManyTarget1MorphRelationField',
targetFieldIcon: 'IconListOpportunity',
type: RelationType.MANY_TO_ONE,
},
{
targetObjectMetadataId: targetObjectMetadata2Id,
targetFieldLabel: 'oneToManyTarget2MorphRelationField',
targetFieldIcon: 'IconListOpportunity',
type: RelationType.MANY_TO_ONE,
},
],
},
// {
// name: 'oneToManyRelationField',
// label: 'oneToManyRelationField',
// type: FieldMetadataType.RELATION,
// objectMetadataId,
// relationCreationPayload: {
// targetObjectMetadataId: targetObjectMetadata1Id,
// targetFieldLabel: 'manyToOneTargetRelationField',
// targetFieldIcon: 'IconListOpportunity',
// type: RelationType.ONE_TO_MANY,
// },
// },
],
};
return Object.values(fieldInputsMap).flat();
@@ -1,17 +1,22 @@
import { randomUUID } from 'crypto';
import { getFieldMetadataCreationInputs } from 'test/integration/graphql/suites/inputs-validation/utils/get-field-metadata-creation-inputs.util';
import { createManyOperationFactory } from 'test/integration/graphql/utils/create-many-operation-factory.util';
import { makeGraphqlAPIRequest } from 'test/integration/graphql/utils/make-graphql-api-request.util';
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
import { RelationType } from 'twenty-shared/types';
import { computeMorphRelationFieldName } from 'twenty-shared/utils';
import { v4 } from 'uuid';
const TEST_OBJECT_METADATA_NAME_SINGULAR = 'apiInputValidationTestObject';
const TEST_OBJECT_METADATA_NAME_PLURAL = 'apiInputValidationTestObjects';
const TEST_TARGET_OBJECT_METADATA_NAME_SINGULAR =
'apiInputValidationTargetTestObject';
const TEST_TARGET_OBJECT_METADATA_NAME_PLURAL =
'apiInputValidationTargetTestObjects';
const TEST_TARGET_OBJECT_METADATA_NAME_SINGULAR_1 =
'apiInputValidationTargetTestObject1';
const TEST_TARGET_OBJECT_METADATA_NAME_PLURAL_1 =
'apiInputValidationTargetTestObjects1';
const TEST_TARGET_OBJECT_METADATA_NAME_SINGULAR_2 =
'apiInputValidationTargetTestObject2';
const TEST_TARGET_OBJECT_METADATA_NAME_PLURAL_2 =
'apiInputValidationTargetTestObjects2';
export const TEST_TARGET_OBJECT_RECORD_ID =
'20202020-a21e-4ec2-873b-de4264d89025';
@@ -21,6 +26,15 @@ export const TEST_UUID_FIELD_VALUE = '20202020-b21e-4ec2-873b-de4264d89025';
export const TEST_TARGET_OBJECT_RECORD_ID_FIELD_VALUE =
'20202020-b21e-4ec2-873b-de4264d89021';
export const joinColumnNameForManyToOneMorphRelationField1 =
computeMorphRelationFieldName({
fieldName: 'manyToOneMorphRelationField',
relationType: RelationType.MANY_TO_ONE,
targetObjectMetadataNameSingular:
TEST_TARGET_OBJECT_METADATA_NAME_SINGULAR_1,
targetObjectMetadataNamePlural: TEST_TARGET_OBJECT_METADATA_NAME_PLURAL_1,
}) + 'Id';
export const setupTestObjectsWithAllFieldTypes = async () => {
const createdObjectMetadata = await createOneObjectMetadata({
input: {
@@ -33,21 +47,33 @@ export const setupTestObjectsWithAllFieldTypes = async () => {
const objectMetadataId = createdObjectMetadata.data.createOneObject.id;
const createdTargetObjectMetadata = await createOneObjectMetadata({
const createdTargetObjectMetadata1 = await createOneObjectMetadata({
input: {
nameSingular: TEST_TARGET_OBJECT_METADATA_NAME_SINGULAR,
namePlural: TEST_TARGET_OBJECT_METADATA_NAME_PLURAL,
labelSingular: TEST_TARGET_OBJECT_METADATA_NAME_SINGULAR,
labelPlural: TEST_TARGET_OBJECT_METADATA_NAME_PLURAL,
nameSingular: TEST_TARGET_OBJECT_METADATA_NAME_SINGULAR_1,
namePlural: TEST_TARGET_OBJECT_METADATA_NAME_PLURAL_1,
labelSingular: TEST_TARGET_OBJECT_METADATA_NAME_SINGULAR_1,
labelPlural: TEST_TARGET_OBJECT_METADATA_NAME_PLURAL_1,
},
});
const targetObjectMetadataId =
createdTargetObjectMetadata.data.createOneObject.id;
const createdTargetObjectMetadata2 = await createOneObjectMetadata({
input: {
nameSingular: TEST_TARGET_OBJECT_METADATA_NAME_SINGULAR_2,
namePlural: TEST_TARGET_OBJECT_METADATA_NAME_PLURAL_2,
labelSingular: TEST_TARGET_OBJECT_METADATA_NAME_SINGULAR_2,
labelPlural: TEST_TARGET_OBJECT_METADATA_NAME_PLURAL_2,
},
});
const targetObjectMetadata1Id =
createdTargetObjectMetadata1.data.createOneObject.id;
const targetObjectMetadata2Id =
createdTargetObjectMetadata2.data.createOneObject.id;
const fieldMetadataCreationInputs = getFieldMetadataCreationInputs(
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
);
for (const input of fieldMetadataCreationInputs) {
@@ -58,8 +84,8 @@ export const setupTestObjectsWithAllFieldTypes = async () => {
await makeGraphqlAPIRequest(
createManyOperationFactory({
objectMetadataSingularName: TEST_TARGET_OBJECT_METADATA_NAME_SINGULAR,
objectMetadataPluralName: TEST_TARGET_OBJECT_METADATA_NAME_PLURAL,
objectMetadataSingularName: TEST_TARGET_OBJECT_METADATA_NAME_SINGULAR_1,
objectMetadataPluralName: TEST_TARGET_OBJECT_METADATA_NAME_PLURAL_1,
gqlFields: `id`,
data: [
{
@@ -73,11 +99,15 @@ export const setupTestObjectsWithAllFieldTypes = async () => {
createManyOperationFactory({
objectMetadataSingularName: TEST_OBJECT_METADATA_NAME_SINGULAR,
objectMetadataPluralName: TEST_OBJECT_METADATA_NAME_PLURAL,
gqlFields: `id`,
gqlFields: `
id
${joinColumnNameForManyToOneMorphRelationField1}`,
data: [
{
id: randomUUID(),
id: v4(),
manyToOneRelationFieldId: TEST_TARGET_OBJECT_RECORD_ID,
[joinColumnNameForManyToOneMorphRelationField1]:
TEST_TARGET_OBJECT_RECORD_ID,
uuidField: TEST_UUID_FIELD_VALUE,
textField: 'test',
phonesField: {
@@ -135,7 +165,7 @@ export const setupTestObjectsWithAllFieldTypes = async () => {
arrayField: ['test'],
},
{
id: randomUUID(),
id: v4(),
},
],
}),
@@ -143,8 +173,8 @@ export const setupTestObjectsWithAllFieldTypes = async () => {
await makeGraphqlAPIRequest(
createManyOperationFactory({
objectMetadataSingularName: TEST_TARGET_OBJECT_METADATA_NAME_SINGULAR,
objectMetadataPluralName: TEST_TARGET_OBJECT_METADATA_NAME_PLURAL,
objectMetadataSingularName: TEST_TARGET_OBJECT_METADATA_NAME_SINGULAR_1,
objectMetadataPluralName: TEST_TARGET_OBJECT_METADATA_NAME_PLURAL_1,
gqlFields: `id`,
data: [
{
@@ -156,7 +186,8 @@ export const setupTestObjectsWithAllFieldTypes = async () => {
return {
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
objectMetadataSingularName: TEST_OBJECT_METADATA_NAME_SINGULAR,
objectMetadataPluralName: TEST_OBJECT_METADATA_NAME_PLURAL,
};