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
@@ -1,9 +1,15 @@
import { joinColumnNameForManyToOneMorphRelationField1 } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util';
export const TEST_OBJECT_GQL_FIELDS = `
id
manyToOneRelationFieldId
manyToOneRelationField {
id
}
${joinColumnNameForManyToOneMorphRelationField1}
${joinColumnNameForManyToOneMorphRelationField1.replace('Id', '')}{
id
}
uuidField
textField
phonesField {
@@ -0,0 +1,11 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`Create input validation - MORPH_RELATION Gql create input - failure MORPH_RELATION - should fail with : {"manyToOneMorphRelationFieldApiInputValidationTargetTestObject1Id":"not-a-morph-relation"} 1`] = `"Invalid UUID value 'not-a-morph-relation' for field "manyToOneMorphRelationFieldApiInputValidationTargetTestObject1Id""`;
exports[`Create input validation - MORPH_RELATION Gql create input - failure MORPH_RELATION - should fail with : {"manyToOneMorphRelationFieldApiInputValidationTargetTestObject1Id":[]} 1`] = `"ID cannot represent value: []"`;
exports[`Create input validation - MORPH_RELATION Gql create input - failure MORPH_RELATION - should fail with : {"manyToOneMorphRelationFieldApiInputValidationTargetTestObject1Id":{}} 1`] = `"ID cannot represent value: {}"`;
exports[`Create input validation - MORPH_RELATION Gql create input - failure MORPH_RELATION - should fail with : {"manyToOneMorphRelationFieldApiInputValidationTargetTestObject1Id":1} 1`] = `"Invalid UUID value '1' for field "manyToOneMorphRelationFieldApiInputValidationTargetTestObject1Id""`;
exports[`Create input validation - MORPH_RELATION Gql create input - failure MORPH_RELATION - should fail with : {"manyToOneMorphRelationFieldApiInputValidationTargetTestObject1Id":true} 1`] = `"ID cannot represent value: true"`;
@@ -20,7 +20,8 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -28,13 +29,15 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -19,7 +19,8 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -27,13 +28,15 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -14,7 +14,8 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -22,13 +23,15 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -1,4 +1,5 @@
import { type FieldMetadataTypesToTestForCreateInputValidation } from 'test/integration/graphql/suites/inputs-validation/types/field-metadata-type-to-test';
import { joinColumnNameForManyToOneMorphRelationField1 } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util';
import { FieldMetadataType } from 'twenty-shared/types';
export const failingCreateInputByFieldMetadataType: {
@@ -160,6 +161,33 @@ export const failingCreateInputByFieldMetadataType: {
},
},
],
[FieldMetadataType.MORPH_RELATION]: [
{
input: {
[joinColumnNameForManyToOneMorphRelationField1]: 'not-a-morph-relation',
},
},
{
input: {
[joinColumnNameForManyToOneMorphRelationField1]: {},
},
},
{
input: {
[joinColumnNameForManyToOneMorphRelationField1]: [],
},
},
{
input: {
[joinColumnNameForManyToOneMorphRelationField1]: true,
},
},
{
input: {
[joinColumnNameForManyToOneMorphRelationField1]: 1,
},
},
],
[FieldMetadataType.RATING]: [
{
input: {
@@ -1,5 +1,8 @@
import { type FieldMetadataTypesToTestForCreateInputValidation } from 'test/integration/graphql/suites/inputs-validation/types/field-metadata-type-to-test';
import { TEST_TARGET_OBJECT_RECORD_ID_FIELD_VALUE } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util';
import {
joinColumnNameForManyToOneMorphRelationField1,
TEST_TARGET_OBJECT_RECORD_ID_FIELD_VALUE,
} from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util';
import { FieldMetadataType } from 'twenty-shared/types';
export const successfulCreateInputByFieldMetadataType: {
@@ -120,6 +123,28 @@ export const successfulCreateInputByFieldMetadataType: {
},
},
],
[FieldMetadataType.MORPH_RELATION]: [
{
input: {
[joinColumnNameForManyToOneMorphRelationField1]:
TEST_TARGET_OBJECT_RECORD_ID_FIELD_VALUE,
},
validateInput: (record: Record<string, any>) => {
return (
record[joinColumnNameForManyToOneMorphRelationField1] ===
TEST_TARGET_OBJECT_RECORD_ID_FIELD_VALUE
);
},
},
{
input: {
[joinColumnNameForManyToOneMorphRelationField1]: null,
},
validateInput: (record: Record<string, any>) => {
return record[joinColumnNameForManyToOneMorphRelationField1] === null;
},
},
],
[FieldMetadataType.RAW_JSON]: [
{
input: {
@@ -20,7 +20,8 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -28,13 +29,15 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -19,7 +19,8 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -27,13 +28,15 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -19,7 +19,8 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -27,13 +28,15 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -20,7 +20,8 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -28,13 +29,15 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -20,7 +20,8 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -28,13 +29,15 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -20,7 +20,8 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -28,13 +29,15 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -0,0 +1,115 @@
import { failingCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/failing-create-input-by-field-metadata-type.constant';
import { successfulCreateInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/create-validation/constants/successful-create-input-by-field-metadata-type.constant';
import { expectGqlCreateInputValidationError } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-error.util';
import { expectGqlCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-gql-create-input-validation-success.util';
import { expectRestCreateInputValidationError } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-error.util';
import { expectRestCreateInputValidationSuccess } from 'test/integration/graphql/suites/inputs-validation/create-validation/utils/expect-rest-create-input-validation-success.util';
import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata';
import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util';
import { FieldMetadataType } from 'twenty-shared/types';
const FIELD_METADATA_TYPE = FieldMetadataType.MORPH_RELATION;
const failingTestCases =
failingCreateInputByFieldMetadataType[FIELD_METADATA_TYPE];
const successfulTestCases =
successfulCreateInputByFieldMetadataType[FIELD_METADATA_TYPE];
describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
describe('Gql create input - failure', () => {
it.each(
failingTestCases.map((testCase) => ({
...testCase,
stringifiedInput: JSON.stringify(testCase.input),
})),
)(
`${FIELD_METADATA_TYPE} - should fail with : $stringifiedInput`,
async ({ input }) => {
await expectGqlCreateInputValidationError(
objectMetadataSingularName,
input,
);
},
);
});
// TODO - add when REST API can handle morph relations
xdescribe('Rest create input - failure', () => {
it.each(
failingTestCases.map((testCase) => ({
...testCase,
stringifiedInput: JSON.stringify(testCase.input),
})),
)(
`${FIELD_METADATA_TYPE} - should fail with : $stringifiedInput`,
async ({ input }) => {
await expectRestCreateInputValidationError(
objectMetadataPluralName,
input,
);
},
);
});
describe('Gql create input - success', () => {
it.each(
successfulTestCases.map((testCase) => ({
...testCase,
stringifiedInput: JSON.stringify(testCase.input),
})),
)(
`${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`,
async ({ input, validateInput }) => {
await expectGqlCreateInputValidationSuccess(
objectMetadataSingularName,
input,
validateInput,
);
},
);
});
// TODO - add when REST API can handle morph relations
xdescribe('Rest create input - success', () => {
it.each(
successfulTestCases.map((testCase) => ({
...testCase,
stringifiedInput: JSON.stringify(testCase.input),
})),
)(
`${FIELD_METADATA_TYPE} - should succeed with : $stringifiedInput`,
async ({ input, validateInput }) => {
await expectRestCreateInputValidationSuccess(
objectMetadataPluralName,
objectMetadataSingularName,
input,
validateInput,
);
},
);
});
});
@@ -19,7 +19,8 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -27,13 +28,15 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -14,7 +14,8 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -22,13 +23,15 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -19,7 +19,8 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -27,13 +28,15 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -19,7 +19,8 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -27,13 +28,15 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -19,7 +19,8 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -27,13 +28,15 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -19,7 +19,8 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -27,13 +28,15 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -14,7 +14,8 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -22,13 +23,15 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -20,7 +20,8 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -28,13 +29,15 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -19,7 +19,8 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -27,13 +28,15 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -19,7 +19,8 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -27,13 +28,15 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -19,7 +19,8 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -27,13 +28,15 @@ describe(`Create input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -13,7 +13,8 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -21,13 +22,15 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -15,7 +15,8 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -23,13 +24,15 @@ describe(`Filter args validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -14,7 +14,8 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -22,13 +23,15 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -1,4 +1,5 @@
import { type FieldMetadataTypesToTestForFilterInputValidation } from 'test/integration/graphql/suites/inputs-validation/types/field-metadata-type-to-test';
import { joinColumnNameForManyToOneMorphRelationField1 } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util';
import { FieldMetadataType } from 'twenty-shared/types';
import { type CompositeFieldMetadataType } from 'src/engine/metadata-modules/workspace-migration/factories/composite-column-action.factory';
@@ -60,6 +61,26 @@ export const failingFilterInputByFieldMetadataType: {
// restErrorMessage: "'oneToManyRelationFieldId' does not exist",
// },
],
[FieldMetadataType.MORPH_RELATION]: [
{
gqlFilterInput: {
[joinColumnNameForManyToOneMorphRelationField1]: { eq: 'invalid-uuid' },
},
gqlErrorMessage: 'Invalid UUID',
restFilterInput: `${joinColumnNameForManyToOneMorphRelationField1}[eq]:"invalid-uuid"`,
restErrorMessage: 'invalid input syntax for type uuid',
},
{
gqlFilterInput: {
[joinColumnNameForManyToOneMorphRelationField1.replace('Id', '')]: {
eq: '6dd71a46-68fe-4420-82b3-0d5b00ad2642',
},
},
gqlErrorMessage: 'is not defined by type',
restFilterInput: `${[joinColumnNameForManyToOneMorphRelationField1.replace('Id', '')]}[eq]:"6dd71a46-68fe-4420-82b3-0d5b00ad2642"`,
restErrorMessage: `column apiInputValidationTestObject.${joinColumnNameForManyToOneMorphRelationField1.replace('Id', '')} does not exist`,
},
],
[FieldMetadataType.UUID]: [
{
gqlFilterInput: { uuidField: { eq: 'invalid-uuid' } },
@@ -1,5 +1,6 @@
import { type FieldMetadataTypesToTestForFilterInputValidation } from 'test/integration/graphql/suites/inputs-validation/types/field-metadata-type-to-test';
import {
joinColumnNameForManyToOneMorphRelationField1,
TEST_TARGET_OBJECT_RECORD_ID,
TEST_UUID_FIELD_VALUE,
} from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util';
@@ -138,6 +139,125 @@ export const successfulFilterInputByFieldMetadataType: {
},
},
],
[FieldMetadataType.MORPH_RELATION]: [
{
gqlFilterInput: {
[joinColumnNameForManyToOneMorphRelationField1]: {
neq: '00000000-0000-4000-8000-000000000000',
},
},
restFilterInput: `${joinColumnNameForManyToOneMorphRelationField1}[neq]:"00000000-0000-4000-8000-000000000000"`,
validateFilter: (record: Record<string, any>) => {
return (
record[joinColumnNameForManyToOneMorphRelationField1] !==
'00000000-0000-4000-8000-000000000000'
);
},
},
{
gqlFilterInput: {
[joinColumnNameForManyToOneMorphRelationField1]: {
eq: TEST_TARGET_OBJECT_RECORD_ID,
},
},
restFilterInput: `${joinColumnNameForManyToOneMorphRelationField1}[eq]:"${TEST_TARGET_OBJECT_RECORD_ID}"`,
validateFilter: (record: Record<string, any>) => {
return (
record[joinColumnNameForManyToOneMorphRelationField1] ===
TEST_TARGET_OBJECT_RECORD_ID
);
},
},
{
gqlFilterInput: {
[joinColumnNameForManyToOneMorphRelationField1]: {
gt: '00000000-0000-4000-8000-000000000000',
},
},
restFilterInput: `${joinColumnNameForManyToOneMorphRelationField1}[gt]:"00000000-0000-4000-8000-000000000000"`,
validateFilter: (record: Record<string, any>) => {
// Morph relation join column is a UUID stored as string
return (
record[joinColumnNameForManyToOneMorphRelationField1] >
'00000000-0000-4000-8000-000000000000'
);
},
},
{
gqlFilterInput: {
[joinColumnNameForManyToOneMorphRelationField1]: {
gte: '00000000-0000-4000-8000-000000000000',
},
},
restFilterInput: `${joinColumnNameForManyToOneMorphRelationField1}[gte]:"00000000-0000-4000-8000-000000000000"`,
validateFilter: (record: Record<string, any>) => {
return (
record[joinColumnNameForManyToOneMorphRelationField1] >=
'00000000-0000-4000-8000-000000000000'
);
},
},
{
gqlFilterInput: {
[joinColumnNameForManyToOneMorphRelationField1]: {
lt: 'ffffffff-ffff-4fff-bfff-ffffffffffff',
},
},
restFilterInput: `${joinColumnNameForManyToOneMorphRelationField1}[lt]:"ffffffff-ffff-4fff-bfff-ffffffffffff"`,
validateFilter: (record: Record<string, any>) => {
return (
record[joinColumnNameForManyToOneMorphRelationField1] <
'ffffffff-ffff-4fff-bfff-ffffffffffff'
);
},
},
{
gqlFilterInput: {
[joinColumnNameForManyToOneMorphRelationField1]: {
lte: 'ffffffff-ffff-4fff-bfff-ffffffffffff',
},
},
restFilterInput: `${joinColumnNameForManyToOneMorphRelationField1}[lte]:"ffffffff-ffff-4fff-bfff-ffffffffffff"`,
validateFilter: (record: Record<string, any>) => {
return (
record[joinColumnNameForManyToOneMorphRelationField1] <=
'ffffffff-ffff-4fff-bfff-ffffffffffff'
);
},
},
{
gqlFilterInput: {
[joinColumnNameForManyToOneMorphRelationField1]: {
in: [TEST_TARGET_OBJECT_RECORD_ID],
},
},
restFilterInput: `${joinColumnNameForManyToOneMorphRelationField1}[in]:["${TEST_TARGET_OBJECT_RECORD_ID}"]`,
validateFilter: (record: Record<string, any>) => {
return (
record[joinColumnNameForManyToOneMorphRelationField1] ===
TEST_TARGET_OBJECT_RECORD_ID
);
},
},
{
gqlFilterInput: {
[joinColumnNameForManyToOneMorphRelationField1]: { is: 'NULL' },
},
restFilterInput: `${joinColumnNameForManyToOneMorphRelationField1}[is]:NULL`,
validateFilter: (record: Record<string, any>) => {
return record[joinColumnNameForManyToOneMorphRelationField1] === null;
},
},
{
gqlFilterInput: {
[joinColumnNameForManyToOneMorphRelationField1]: { is: 'NOT_NULL' },
},
restFilterInput: `${joinColumnNameForManyToOneMorphRelationField1}[is]:"NOT_NULL"`,
validateFilter: (record: Record<string, any>) => {
return isDefined(record[joinColumnNameForManyToOneMorphRelationField1]);
},
},
],
[FieldMetadataType.UUID]: [
{
gqlFilterInput: {
@@ -13,7 +13,8 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -21,13 +22,15 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -18,7 +18,8 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -26,13 +27,15 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -18,7 +18,8 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -26,13 +27,15 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -13,7 +13,8 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -21,13 +22,15 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -13,7 +13,8 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -21,13 +22,15 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -13,7 +13,8 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -21,13 +22,15 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -0,0 +1,117 @@
import { failingFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/filter-validation/constants/failing-filter-input-by-field-metadata-type.constant';
import { successfulFilterInputByFieldMetadataType } from 'test/integration/graphql/suites/inputs-validation/filter-validation/constants/successful-filter-input-by-field-metadata-type.constant';
import { testGqlFailingScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-failing-scenario.util';
import { testGqlSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-gql-successful-scenario.util';
import { testRestFailingScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-rest-failing-scenario.util';
import { testRestSuccessfulScenario } from 'test/integration/graphql/suites/inputs-validation/filter-validation/utils/test-rest-successful-scenario.util';
import { destroyManyObjectsMetadata } from 'test/integration/graphql/suites/inputs-validation/utils/destroy-many-objects-metadata';
import { setupTestObjectsWithAllFieldTypes } from 'test/integration/graphql/suites/inputs-validation/utils/setup-test-objects-with-all-field-types.util';
import { FieldMetadataType } from 'twenty-shared/types';
const FIELD_METADATA_TYPE = FieldMetadataType.MORPH_RELATION;
const failingTestCases =
failingFilterInputByFieldMetadataType[FIELD_METADATA_TYPE];
const successfulTestCases =
successfulFilterInputByFieldMetadataType[FIELD_METADATA_TYPE];
describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
describe('Gql filter input - failure', () => {
it.each(
failingTestCases.map((testCase) => ({
...testCase,
stringifiedFilter: JSON.stringify(testCase.gqlFilterInput),
})),
)(
`${FIELD_METADATA_TYPE} field type - should fail with filter : $stringifiedFilter`,
async ({ gqlFilterInput: filter, gqlErrorMessage: errorMessage }) => {
await testGqlFailingScenario(
objectMetadataSingularName,
objectMetadataPluralName,
filter,
errorMessage,
);
},
);
});
// TODO : Refacto-common - Uncomment this
describe('Rest filter input - failure', () => {
it.each(
failingTestCases.map((testCase) => ({
...testCase,
stringifiedFilter: JSON.stringify(testCase.restFilterInput),
})),
)(
`${FIELD_METADATA_TYPE} field type - should fail with filter : $stringifiedFilter`,
async ({ restFilterInput: filter, restErrorMessage: errorMessage }) => {
await testRestFailingScenario(
objectMetadataPluralName,
filter,
errorMessage,
);
},
);
});
describe('Gql filter input - success', () => {
it.each(
successfulTestCases.map((testCase) => ({
...testCase,
stringifiedFilter: JSON.stringify(testCase.gqlFilterInput),
})),
)(
`${FIELD_METADATA_TYPE} field type - should succeed with filter : $stringifiedFilter`,
async ({ gqlFilterInput: filter, validateFilter }) => {
await testGqlSuccessfulScenario(
objectMetadataSingularName,
objectMetadataPluralName,
filter,
validateFilter,
);
},
);
});
// TODO @guillim - fix this once REST API can handle morph relations
xdescribe('Rest filter input - success', () => {
it.each(
successfulTestCases.map((testCase) => ({
...testCase,
stringifiedFilter: JSON.stringify(testCase.restFilterInput),
})),
)(
`${FIELD_METADATA_TYPE} field type - should succeed with filter : $stringifiedFilter`,
async ({ restFilterInput, validateFilter }) => {
await testRestSuccessfulScenario(
objectMetadataPluralName,
restFilterInput,
validateFilter,
);
},
);
});
});
@@ -18,7 +18,8 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -26,13 +27,15 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -15,7 +15,8 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -23,13 +24,15 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -13,7 +13,8 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -21,13 +22,15 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -18,7 +18,8 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -26,13 +27,15 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -15,7 +15,8 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -23,13 +24,15 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -18,7 +18,8 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -26,13 +27,15 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -17,7 +17,8 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -25,13 +26,15 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -18,7 +18,8 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -26,13 +27,15 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -18,7 +18,8 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
let objectMetadataId: string;
let objectMetadataSingularName: string;
let objectMetadataPluralName: string;
let targetObjectMetadataId: string;
let targetObjectMetadata1Id: string;
let targetObjectMetadata2Id: string;
beforeAll(async () => {
const setupTest = await setupTestObjectsWithAllFieldTypes();
@@ -26,13 +27,15 @@ describe(`Filter input validation - ${FIELD_METADATA_TYPE}`, () => {
objectMetadataId = setupTest.objectMetadataId;
objectMetadataSingularName = setupTest.objectMetadataSingularName;
objectMetadataPluralName = setupTest.objectMetadataPluralName;
targetObjectMetadataId = setupTest.targetObjectMetadataId;
targetObjectMetadata1Id = setupTest.targetObjectMetadata1Id;
targetObjectMetadata2Id = setupTest.targetObjectMetadata2Id;
});
afterAll(async () => {
await destroyManyObjectsMetadata([
objectMetadataId,
targetObjectMetadataId,
targetObjectMetadata1Id,
targetObjectMetadata2Id,
]);
});
@@ -5,7 +5,6 @@ type FieldMetadataTypesNotTestedForFilterInputValidation =
| 'RICH_TEXT'
| 'POSITION'
| 'ACTOR'
| 'MORPH_RELATION'
| 'NUMERIC'
| 'RICH_TEXT_V2';
@@ -13,7 +12,6 @@ type FieldMetadataTypesNotTestedForCreateInputValidation =
| 'TS_VECTOR'
| 'ACTOR'
| 'POSITION'
| 'MORPH_RELATION'
| 'NUMERIC';
export type FieldMetadataTypesToTestForCreateInputValidation = Exclude<
@@ -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,
};
@@ -1,8 +1,7 @@
import { randomUUID } from 'crypto';
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 { capitalize } from 'twenty-shared/utils';
import { v4 } from 'uuid';
export const performCreateManyOperation = async (
objectMetadataSingularName: string,
@@ -16,7 +15,7 @@ export const performCreateManyOperation = async (
objectMetadataPluralName,
gqlFields,
data: data.map((item) => ({
id: randomUUID(),
id: v4(),
...item,
})),
}),