diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/generate-default-value.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/generate-default-value.ts index 5d9ab51d98..bb09a0365e 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/generate-default-value.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/generate-default-value.ts @@ -4,22 +4,23 @@ import { FieldMetadataDefaultValue } from 'src/engine/metadata-modules/field-met import { FieldActorSource } from 'src/engine/metadata-modules/field-metadata/composite-types/actor.composite-type'; +// No need to refactor as unused in workspace migration v2 export function generateDefaultValue( type: FieldMetadataType, ): FieldMetadataDefaultValue { switch (type) { case FieldMetadataType.TEXT: - return "''"; + return "''" satisfies FieldMetadataDefaultValue; case FieldMetadataType.EMAILS: return { primaryEmail: "''", additionalEmails: null, - }; + } satisfies FieldMetadataDefaultValue; case FieldMetadataType.FULL_NAME: return { firstName: "''", lastName: "''", - }; + } satisfies FieldMetadataDefaultValue; case FieldMetadataType.ADDRESS: return { addressStreet1: "''", @@ -30,36 +31,31 @@ export function generateDefaultValue( addressPostcode: "''", addressLat: null, addressLng: null, - }; + } satisfies FieldMetadataDefaultValue; case FieldMetadataType.CURRENCY: return { amountMicros: null, currencyCode: "''", - }; + } satisfies FieldMetadataDefaultValue; case FieldMetadataType.LINKS: return { primaryLinkLabel: "''", primaryLinkUrl: "''", - secondaryLinks: "'[]'", - }; + secondaryLinks: null, + } satisfies FieldMetadataDefaultValue; case FieldMetadataType.PHONES: return { primaryPhoneNumber: "''", primaryPhoneCountryCode: "''", primaryPhoneCallingCode: "''", additionalPhones: null, - }; - case FieldMetadataType.RICH_TEXT_V2: - return { - blocknote: "''", - markdown: "''", - }; + } satisfies FieldMetadataDefaultValue; case FieldMetadataType.ACTOR: return { source: `'${FieldActorSource.MANUAL}'`, name: "'System'", - context: {}, - }; + workspaceMemberId: null, + } satisfies FieldMetadataDefaultValue; default: return null; } diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/from-flat-field-metadata-to-flat-field-metadata-maps.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-flat-field-metadata-to-flat-field-metadata-maps.util.ts similarity index 95% rename from packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/from-flat-field-metadata-to-flat-field-metadata-maps.util.ts rename to packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-flat-field-metadata-to-flat-field-metadata-maps.util.ts index e12304699d..d9608829d6 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/from-flat-field-metadata-to-flat-field-metadata-maps.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-field-metadata/utils/from-flat-field-metadata-to-flat-field-metadata-maps.util.ts @@ -4,7 +4,7 @@ import { fromObjectMetadataItemWithFieldMapsToFlatObjectMetadata } from 'src/eng import { ObjectMetadataItemWithFieldMaps } from 'src/engine/metadata-modules/types/object-metadata-item-with-field-maps'; import { ObjectMetadataMaps } from 'src/engine/metadata-modules/types/object-metadata-maps'; -type FromObjectMetadataItemWithFieldMapsToFlatObjectWithFlatFieldMetadataMapsArgs = +export type FromObjectMetadataItemWithFieldMapsToFlatObjectWithFlatFieldMetadataMapsArgs = { objectMetadataItemWithFieldMaps: ObjectMetadataItemWithFieldMaps; objectMetadataMaps: ObjectMetadataMaps; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/__tests__/utils/expect-flat-field-metadata-to-be-in-flat-object-metadata-maps.util.test.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/__tests__/utils/expect-flat-field-metadata-to-be-in-flat-object-metadata-maps.util.test.ts new file mode 100644 index 0000000000..bdbe6416cc --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/__tests__/utils/expect-flat-field-metadata-to-be-in-flat-object-metadata-maps.util.test.ts @@ -0,0 +1,41 @@ +import { jestExpectToBeDefined } from 'test/utils/expect-to-be-defined.util.test'; +import { FieldMetadataType } from 'twenty-shared/types'; +import { isDefined } from 'twenty-shared/utils'; + +import { FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; +import { isFlatFieldMetadataEntityOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util'; +import { FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type'; + +type ExpectFlatFieldMetadataToBeInFlatObjectMetadataMapsArgs = { + flatObjectMetadataMaps: FlatObjectMetadataMaps; + flatFieldMetadata: FlatFieldMetadata; +}; +export const expectFlatFieldMetadataToBeInFlatObjectMetadataMaps = ({ + flatFieldMetadata, + flatObjectMetadataMaps, +}: ExpectFlatFieldMetadataToBeInFlatObjectMetadataMapsArgs) => { + const { objectMetadataId, id: flatFieldMetadataId } = flatFieldMetadata; + const petObject = flatObjectMetadataMaps.byId[objectMetadataId]; + + jestExpectToBeDefined(petObject); + + if ( + isFlatFieldMetadataEntityOfType( + flatFieldMetadata, + FieldMetadataType.RELATION, + ) && + isDefined(flatFieldMetadata.settings.joinColumnName) + ) { + expect( + petObject.fieldIdByJoinColumnName[ + flatFieldMetadata.settings.joinColumnName + ], + ).toEqual(flatFieldMetadataId); + } + + expect(petObject.fieldsById[flatFieldMetadataId]).toBeDefined(); + expect(petObject.fieldsById[flatFieldMetadataId]).toEqual(flatFieldMetadata); + expect(petObject.fieldIdByName[flatFieldMetadata.name]).toEqual( + flatFieldMetadataId, + ); +}; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/__tests__/utils/expect-flat-object-metadata-to-strictly-be-in-flat-object-metadata-maps.util.test.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/__tests__/utils/expect-flat-object-metadata-to-strictly-be-in-flat-object-metadata-maps.util.test.ts new file mode 100644 index 0000000000..e41edd0964 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/__tests__/utils/expect-flat-object-metadata-to-strictly-be-in-flat-object-metadata-maps.util.test.ts @@ -0,0 +1,48 @@ +import { jestExpectToBeDefined } from 'test/utils/expect-to-be-defined.util.test'; + +import { expectFlatFieldMetadataToBeInFlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/__tests__/utils/expect-flat-field-metadata-to-be-in-flat-object-metadata-maps.util.test'; +import { FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type'; +import { deleteFieldFromFlatObjectMetadataWithFlatFieldMapsOrThrow } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/delete-field-from-flat-object-metadata-with-flat-field-maps-or-throw.util'; +import { FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; + +type ExpectFlatObjectMetadataToBeInFlatObjectMetadataMapsArgs = { + flatObjectMetadataMaps: FlatObjectMetadataMaps; + flatObjectMetadata: FlatObjectMetadata; +}; +export const expectFlatObjectMetadataToStrictlyBeInFlatObjectMetadataMaps = ({ + flatObjectMetadataMaps, + flatObjectMetadata, +}: ExpectFlatObjectMetadataToBeInFlatObjectMetadataMapsArgs) => { + const { id: objectMetadataId } = flatObjectMetadata; + const flatObjectMetadataWithFlatFieldMaps = + flatObjectMetadataMaps.byId[objectMetadataId]; + + expect( + flatObjectMetadataMaps.idByNameSingular[flatObjectMetadata.nameSingular], + ).toEqual(objectMetadataId); + jestExpectToBeDefined(flatObjectMetadataWithFlatFieldMaps); + + const finalObjectMetadataWithFlatFieldMaps = + flatObjectMetadata.flatFieldMetadatas.reduce( + (flatObjectMetadataWithFlatFieldMaps, flatFieldMetadata) => { + expectFlatFieldMetadataToBeInFlatObjectMetadataMaps({ + flatFieldMetadata, + flatObjectMetadataMaps, + }); + + return deleteFieldFromFlatObjectMetadataWithFlatFieldMapsOrThrow({ + fieldMetadataId: flatFieldMetadata.id, + flatObjectMetadataWithFlatFieldMaps, + }); + }, + flatObjectMetadataWithFlatFieldMaps, + ); + + expect(finalObjectMetadataWithFlatFieldMaps).toEqual({ + ...flatObjectMetadata, + flatFieldMetadatas: [], + fieldsById: {}, + fieldIdByJoinColumnName: {}, + fieldIdByName: {}, + }); +}; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/__snapshots__/add-flat-field-metadata-in-flat-object-metadata-maps-or-throw.spec.ts.snap b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/__snapshots__/add-flat-field-metadata-in-flat-object-metadata-maps-or-throw.spec.ts.snap new file mode 100644 index 0000000000..ec04ae6524 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/__snapshots__/add-flat-field-metadata-in-flat-object-metadata-maps-or-throw.spec.ts.snap @@ -0,0 +1,5 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`addFlatFieldMetadataInFlatObjectMetadataMapsOrThrow should throw when field metadata parent object metadata does not exist 1`] = `"addFlatFieldMetadataInFlatObjectMetadataMapsOrThrow field parent object metadata not found"`; + +exports[`addFlatFieldMetadataInFlatObjectMetadataMapsOrThrow should throw when field metadata to add already exist in object 1`] = `"addFlatFieldMetadataToFlatObjectMetadataWithFlatFieldMaps added flatFieldMetadata already exists"`; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/__snapshots__/add-flat-object-metadata-to-flat-object-metadata-maps-or-throw.spec.ts.snap b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/__snapshots__/add-flat-object-metadata-to-flat-object-metadata-maps-or-throw.spec.ts.snap new file mode 100644 index 0000000000..31f5800e85 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/__snapshots__/add-flat-object-metadata-to-flat-object-metadata-maps-or-throw.spec.ts.snap @@ -0,0 +1,3 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`addFlatObjectMetadataToFlatObjectMetadataMapsOrThrow should throw when object metadata to add already exists 1`] = `"addFlatObjectMetadataToFlatObjectMetadataMapsOrThrow: flat object metadata to add already exists"`; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/__snapshots__/delete-field-from-flat-object-metadata-maps-or-throw.spec.ts.snap b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/__snapshots__/delete-field-from-flat-object-metadata-maps-or-throw.spec.ts.snap new file mode 100644 index 0000000000..e2e178736d --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/__snapshots__/delete-field-from-flat-object-metadata-maps-or-throw.spec.ts.snap @@ -0,0 +1,5 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`deleteFieldFromFlatObjectMetadataMapsOrThrow should throw when field metadata id does not exist in object 1`] = `"deleteFieldFromFlatObjectMetadataWithFlatFieldMapsOrThrow: field to delete not found"`; + +exports[`deleteFieldFromFlatObjectMetadataMapsOrThrow should throw when object metadata id does not exist 1`] = `"deleteFieldFromFlatObjectMetadataMapsOrThrow: field metadata to delete parent flat object metadata not found"`; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/__snapshots__/delete-object-from-flat-object-metadata-maps-or-throw.spec.ts.snap b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/__snapshots__/delete-object-from-flat-object-metadata-maps-or-throw.spec.ts.snap new file mode 100644 index 0000000000..2e873ed37d --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/__snapshots__/delete-object-from-flat-object-metadata-maps-or-throw.spec.ts.snap @@ -0,0 +1,3 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`deleteObjectFromFlatObjectMetadataMapsOrThrow should throw when object metadata to delete does not exist 1`] = `"deleteObjectFromFlatObjectMetadataMapsOrThrow: object to delete not found"`; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/__snapshots__/replace-flat-field-metadata-in-flat-object-metadata-maps-or-throw.spec.ts.snap b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/__snapshots__/replace-flat-field-metadata-in-flat-object-metadata-maps-or-throw.spec.ts.snap new file mode 100644 index 0000000000..7c23049b66 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/__snapshots__/replace-flat-field-metadata-in-flat-object-metadata-maps-or-throw.spec.ts.snap @@ -0,0 +1,5 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`replaceFlatFieldMetadataInFlatObjectMetadataMapsOrThrow should throw when field metadata parent object does not exist 1`] = `"deleteFieldFromFlatObjectMetadataMapsOrThrow: field metadata to delete parent flat object metadata not found"`; + +exports[`replaceFlatFieldMetadataInFlatObjectMetadataMapsOrThrow should throw when field metadata to replace does not exist 1`] = `"deleteFieldFromFlatObjectMetadataWithFlatFieldMapsOrThrow: field to delete not found"`; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/__snapshots__/replace-flat-object-metadata-in-flat-object-metadata-maps-or-throw.spec.ts.snap b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/__snapshots__/replace-flat-object-metadata-in-flat-object-metadata-maps-or-throw.spec.ts.snap new file mode 100644 index 0000000000..57574dec4d --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/__snapshots__/replace-flat-object-metadata-in-flat-object-metadata-maps-or-throw.spec.ts.snap @@ -0,0 +1,3 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`replaceFlatObjectMetadataInFlatObjectMetadataMapsOrThrow should throw when object metadata to replace does not exist 1`] = `"deleteObjectFromFlatObjectMetadataMapsOrThrow: object to delete not found"`; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/add-flat-field-metadata-in-flat-object-metadata-maps-or-throw.spec.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/add-flat-field-metadata-in-flat-object-metadata-maps-or-throw.spec.ts new file mode 100644 index 0000000000..c249251ed4 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/add-flat-field-metadata-in-flat-object-metadata-maps-or-throw.spec.ts @@ -0,0 +1,109 @@ +import { + EachTestingContext, + eachTestingContextFilter, +} from 'twenty-shared/testing'; +import { FieldMetadataType } from 'twenty-shared/types'; + +import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; + +import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock'; +import { PET_FLAT_FIELDS_MOCK } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/pet-flat-fields.mock'; +import { expectFlatFieldMetadataToBeInFlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/__tests__/utils/expect-flat-field-metadata-to-be-in-flat-object-metadata-maps.util.test'; +import { FLAT_OBJECT_METADATA_MAPS_MOCKS } from 'src/engine/metadata-modules/flat-object-metadata-maps/mocks/flat-object-metadata-maps.mock'; +import { + AddFlatFieldMetadataInFlatObjectMetadataMapsOrThrowArgs, + addFlatFieldMetadataInFlatObjectMetadataMapsOrThrow, +} from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/add-flat-field-metadata-in-flat-object-metadata-maps-or-throw.util'; +import { PET_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/pet-flat-object.mock'; +import { RelationOnDeleteAction } from 'src/engine/metadata-modules/relation-metadata/relation-on-delete-action.type'; + +type AddFlatFieldMetadataInFlatObjectMetadataMapsOrThrowArgsTestCase = { + input: AddFlatFieldMetadataInFlatObjectMetadataMapsOrThrowArgs; + shouldThrow?: true; +}; + +describe('addFlatFieldMetadataInFlatObjectMetadataMapsOrThrow', () => { + const testCases: EachTestingContext[] = + [ + { + title: + 'should throw when field metadata parent object metadata does not exist', + context: { + shouldThrow: true, + input: { + flatObjectMetadataMaps: FLAT_OBJECT_METADATA_MAPS_MOCKS, + flatFieldMetadata: getFlatFieldMetadataMock({ + objectMetadataId: 'non-existent', + type: FieldMetadataType.TEXT, + uniqueIdentifier: 'unique-id-1', + id: 'unique-id-1', + }), + }, + }, + }, + { + title: + 'should throw when field metadata to add already exist in object', + context: { + shouldThrow: true, + input: { + flatObjectMetadataMaps: FLAT_OBJECT_METADATA_MAPS_MOCKS, + flatFieldMetadata: PET_FLAT_FIELDS_MOCK.species, + }, + }, + }, + { + title: 'should add a new relation field to pet object', + context: { + input: { + flatObjectMetadataMaps: FLAT_OBJECT_METADATA_MAPS_MOCKS, + flatFieldMetadata: getFlatFieldMetadataMock({ + objectMetadataId: PET_FLAT_OBJECT_MOCK.id, + type: FieldMetadataType.RELATION, + uniqueIdentifier: 'field-metadata-id', + id: 'field-metadata-id', + settings: { + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'whateverId', + onDelete: RelationOnDeleteAction.CASCADE, + }, + relationTargetObjectMetadataId: PET_FLAT_OBJECT_MOCK.id, + relationTargetFieldMetadataId: 'does-not-matter', + }), + }, + }, + }, + ]; + + const filteredTestCases = eachTestingContextFilter(testCases); + + it.each(filteredTestCases)( + '$title', + ({ + context: { + input: { flatFieldMetadata, flatObjectMetadataMaps }, + shouldThrow = false, + }, + }) => { + if (shouldThrow) { + expect(() => + addFlatFieldMetadataInFlatObjectMetadataMapsOrThrow({ + flatFieldMetadata, + flatObjectMetadataMaps, + }), + ).toThrowErrorMatchingSnapshot(); + } else { + const updatedFlatObjectMetadataMaps = + addFlatFieldMetadataInFlatObjectMetadataMapsOrThrow({ + flatFieldMetadata, + flatObjectMetadataMaps, + }); + + expectFlatFieldMetadataToBeInFlatObjectMetadataMaps({ + flatFieldMetadata, + flatObjectMetadataMaps: updatedFlatObjectMetadataMaps, + }); + } + }, + ); +}); diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/add-flat-object-metadata-to-flat-object-metadata-maps-or-throw.spec.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/add-flat-object-metadata-to-flat-object-metadata-maps-or-throw.spec.ts new file mode 100644 index 0000000000..a07a6e8776 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/add-flat-object-metadata-to-flat-object-metadata-maps-or-throw.spec.ts @@ -0,0 +1,85 @@ +import { jestExpectToBeDefined } from 'test/utils/expect-to-be-defined.util.test'; +import { + EachTestingContext, + eachTestingContextFilter, +} from 'twenty-shared/testing'; + +import { FLAT_OBJECT_METADATA_MAPS_MOCKS } from 'src/engine/metadata-modules/flat-object-metadata-maps/mocks/flat-object-metadata-maps.mock'; +import { FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type'; +import { addFlatObjectMetadataToFlatObjectMetadataMapsOrThrow } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/add-flat-object-metadata-to-flat-object-metadata-maps-or-throw.util'; +import { PET_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/pet-flat-object.mock'; +import { ROCKET_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/rocket-flat-object.mock'; +import { FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; +import { fromFlatObjectMetadatasToFlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata/utils/from-flat-object-metadatas-to-flat-object-metadata-maps.util'; + +type AddFlatObjectMetadataToFlatObjectMetadataMapsTestCase = { + input: { + flatObjectMetadata: FlatObjectMetadata; + flatObjectMetadataMaps: FlatObjectMetadataMaps; + }; + shouldThrow?: true; + expected?: FlatObjectMetadataMaps; +}; + +describe('addFlatObjectMetadataToFlatObjectMetadataMapsOrThrow', () => { + const testCases: EachTestingContext[] = + [ + { + title: 'should throw when object metadata to add already exists', + context: { + input: { + flatObjectMetadata: PET_FLAT_OBJECT_MOCK, + flatObjectMetadataMaps: FLAT_OBJECT_METADATA_MAPS_MOCKS, + }, + shouldThrow: true, + }, + }, + { + title: 'should add object to flat object metadata maps', + context: { + input: { + flatObjectMetadata: ROCKET_FLAT_OBJECT_MOCK, + flatObjectMetadataMaps: + fromFlatObjectMetadatasToFlatObjectMetadataMaps([ + PET_FLAT_OBJECT_MOCK, + ]), + }, + expected: fromFlatObjectMetadatasToFlatObjectMetadataMaps([ + PET_FLAT_OBJECT_MOCK, + ROCKET_FLAT_OBJECT_MOCK, + ]), + }, + }, + ]; + + const filteredTestCases = eachTestingContextFilter(testCases); + + it.each(filteredTestCases)( + '$title', + ({ + context: { + input: { flatObjectMetadata, flatObjectMetadataMaps }, + shouldThrow = false, + expected, + }, + }) => { + if (shouldThrow) { + expect(() => + addFlatObjectMetadataToFlatObjectMetadataMapsOrThrow({ + flatObjectMetadata, + flatObjectMetadataMaps, + }), + ).toThrowErrorMatchingSnapshot(); + } else { + jestExpectToBeDefined(expected); + const updatedFlatObjectMetadataMaps = + addFlatObjectMetadataToFlatObjectMetadataMapsOrThrow({ + flatObjectMetadata, + flatObjectMetadataMaps, + }); + + expect(updatedFlatObjectMetadataMaps).toEqual(expected); + } + }, + ); +}); diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/delete-field-from-flat-object-metadata-maps-or-throw.spec.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/delete-field-from-flat-object-metadata-maps-or-throw.spec.ts new file mode 100644 index 0000000000..42a0a53728 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/delete-field-from-flat-object-metadata-maps-or-throw.spec.ts @@ -0,0 +1,113 @@ +import { jestExpectToBeDefined } from 'test/utils/expect-to-be-defined.util.test'; +import { + EachTestingContext, + eachTestingContextFilter, +} from 'twenty-shared/testing'; +import { FieldMetadataType } from 'twenty-shared/types'; + +import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface'; + +import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock'; +import { FLAT_OBJECT_METADATA_MAPS_MOCKS } from 'src/engine/metadata-modules/flat-object-metadata-maps/mocks/flat-object-metadata-maps.mock'; +import { FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type'; +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'; +import { PET_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/pet-flat-object.mock'; +import { RelationOnDeleteAction } from 'src/engine/metadata-modules/relation-metadata/relation-on-delete-action.type'; + +type DeleteFieldFromFlatObjectMetadataMapsTestCase = { + input: { + flatObjectMetadataMaps: FlatObjectMetadataMaps | undefined; + fieldMetadataId: string; + objectMetadataId: string; + }; + shouldThrow?: true; + expected?: FlatObjectMetadataMaps; +}; + +describe('deleteFieldFromFlatObjectMetadataMapsOrThrow', () => { + const testCases: EachTestingContext[] = + [ + { + title: 'should throw when object metadata id does not exist', + context: { + input: { + flatObjectMetadataMaps: FLAT_OBJECT_METADATA_MAPS_MOCKS, + fieldMetadataId: 'field-1', + objectMetadataId: 'non-existent', + }, + shouldThrow: true, + }, + }, + { + title: 'should throw when field metadata id does not exist in object', + context: { + input: { + flatObjectMetadataMaps: FLAT_OBJECT_METADATA_MAPS_MOCKS, + fieldMetadataId: 'non-existent-field', + objectMetadataId: PET_FLAT_OBJECT_MOCK.id, + }, + shouldThrow: true, + }, + }, + { + title: 'should delete species custom relation from pet object', + context: { + input: { + flatObjectMetadataMaps: + addFlatFieldMetadataInFlatObjectMetadataMapsOrThrow({ + flatFieldMetadata: getFlatFieldMetadataMock({ + objectMetadataId: PET_FLAT_OBJECT_MOCK.id, + type: FieldMetadataType.RELATION, + uniqueIdentifier: 'field-metadata-id', + id: 'field-metadata-id', + settings: { + relationType: RelationType.MANY_TO_ONE, + joinColumnName: 'whateverId', + onDelete: RelationOnDeleteAction.CASCADE, + }, + relationTargetObjectMetadataId: PET_FLAT_OBJECT_MOCK.id, + relationTargetFieldMetadataId: 'does-not-matter', + }), + flatObjectMetadataMaps: FLAT_OBJECT_METADATA_MAPS_MOCKS, + }), + fieldMetadataId: 'field-metadata-id', + objectMetadataId: PET_FLAT_OBJECT_MOCK.id, + }, + expected: FLAT_OBJECT_METADATA_MAPS_MOCKS, + }, + }, + ]; + + const filteredTestCases = eachTestingContextFilter(testCases); + + it.each(filteredTestCases)( + '$title', + ({ + context: { + input: { fieldMetadataId, objectMetadataId, flatObjectMetadataMaps }, + expected, + shouldThrow = false, + }, + }) => { + jestExpectToBeDefined(flatObjectMetadataMaps); + if (shouldThrow) { + expect(() => + deleteFieldFromFlatObjectMetadataMapsOrThrow({ + fieldMetadataId, + flatObjectMetadataMaps, + objectMetadataId, + }), + ).toThrowErrorMatchingSnapshot(); + } else { + const result = deleteFieldFromFlatObjectMetadataMapsOrThrow({ + fieldMetadataId, + flatObjectMetadataMaps, + objectMetadataId, + }); + + expect(result).toEqual(expected); + } + }, + ); +}); diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/delete-object-from-flat-object-metadata-maps-or-throw.spec.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/delete-object-from-flat-object-metadata-maps-or-throw.spec.ts new file mode 100644 index 0000000000..443f487cdc --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/delete-object-from-flat-object-metadata-maps-or-throw.spec.ts @@ -0,0 +1,70 @@ +import { + EachTestingContext, + eachTestingContextFilter, +} from 'twenty-shared/testing'; + +import { FLAT_OBJECT_METADATA_MAPS_MOCKS } from 'src/engine/metadata-modules/flat-object-metadata-maps/mocks/flat-object-metadata-maps.mock'; +import { FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type'; +import { + DeleteObjectFromFlatObjectMetadataMapsOrThrowArgs, + deleteObjectFromFlatObjectMetadataMapsOrThrow, +} from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/delete-object-from-flat-object-metadata-maps-or-throw.util'; +import { PET_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/pet-flat-object.mock'; +import { ROCKET_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/rocket-flat-object.mock'; +import { fromFlatObjectMetadatasToFlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata/utils/from-flat-object-metadatas-to-flat-object-metadata-maps.util'; + +type DeleteObjectFromFlatObjectMetadataMapsTestCase = { + input: DeleteObjectFromFlatObjectMetadataMapsOrThrowArgs; + shouldThrow?: true; + expected?: FlatObjectMetadataMaps; +}; + +describe('deleteObjectFromFlatObjectMetadataMapsOrThrow', () => { + const testCases: EachTestingContext[] = + [ + { + title: 'should throw when object metadata to delete does not exist', + context: { + input: { + flatObjectMetadataMaps: FLAT_OBJECT_METADATA_MAPS_MOCKS, + objectMetadataId: 'non-existent', + }, + shouldThrow: true, + }, + }, + { + title: 'should delete object from flat object metadata maps', + context: { + input: { + flatObjectMetadataMaps: + fromFlatObjectMetadatasToFlatObjectMetadataMaps([ + PET_FLAT_OBJECT_MOCK, + ROCKET_FLAT_OBJECT_MOCK, + ]), + objectMetadataId: ROCKET_FLAT_OBJECT_MOCK.id, + }, + expected: fromFlatObjectMetadatasToFlatObjectMetadataMaps([ + PET_FLAT_OBJECT_MOCK, + ]), + }, + }, + ]; + + const filteredTestCases = eachTestingContextFilter(testCases); + + it.each(filteredTestCases)( + '$title', + ({ context: { input, expected, shouldThrow = false } }) => { + if (shouldThrow) { + expect(() => + deleteObjectFromFlatObjectMetadataMapsOrThrow(input), + ).toThrowErrorMatchingSnapshot(); + } else { + const updatedFlatObjectMetadataMaps = + deleteObjectFromFlatObjectMetadataMapsOrThrow(input); + + expect(updatedFlatObjectMetadataMaps).toEqual(expected); + } + }, + ); +}); diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/find-flat-field-metadata-in-flat-object-metadata-maps.spec.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/find-flat-field-metadata-in-flat-object-metadata-maps.spec.ts new file mode 100644 index 0000000000..9ce6dbdf22 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/find-flat-field-metadata-in-flat-object-metadata-maps.spec.ts @@ -0,0 +1,75 @@ +import { + EachTestingContext, + eachTestingContextFilter, +} from 'twenty-shared/testing'; + +import { PET_FLAT_FIELDS_MOCK } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/pet-flat-fields.mock'; +import { 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 { + FindFlatFieldMetadataInFlatObjectMetadataMapsArgs, + findFlatFieldMetadataInFlatObjectMetadataMaps, +} from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/find-flat-field-metadata-in-flat-object-metadata-maps.util'; +import { PET_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/pet-flat-object.mock'; + +type FindFlatFieldMetadataInFlatObjectMetadataMapsTestCase = { + input: FindFlatFieldMetadataInFlatObjectMetadataMapsArgs; + expected?: FlatFieldMetadata; +}; + +describe('findFlatFieldMetadataInFlatObjectMetadataMaps', () => { + const testCases: EachTestingContext[] = + [ + { + title: 'should return undefined when object metadata does not exist', + context: { + input: { + fieldMetadataId: PET_FLAT_FIELDS_MOCK.species.id, + objectMetadataId: 'non-existent', + flatObjectMetadataMaps: FLAT_OBJECT_METADATA_MAPS_MOCKS, + }, + }, + }, + { + title: 'should return undefined when field metadata does not exist', + context: { + input: { + fieldMetadataId: 'non-existent', + objectMetadataId: PET_FLAT_OBJECT_MOCK.id, + flatObjectMetadataMaps: FLAT_OBJECT_METADATA_MAPS_MOCKS, + }, + }, + }, + { + title: 'should find field metadata in flat object metadata maps', + context: { + input: { + fieldMetadataId: PET_FLAT_FIELDS_MOCK.species.id, + objectMetadataId: PET_FLAT_OBJECT_MOCK.id, + flatObjectMetadataMaps: FLAT_OBJECT_METADATA_MAPS_MOCKS, + }, + expected: PET_FLAT_FIELDS_MOCK.species, + }, + }, + ]; + + const filteredTestCases = eachTestingContextFilter(testCases); + + it.each(filteredTestCases)( + '$title', + ({ + context: { + input: { fieldMetadataId, objectMetadataId, flatObjectMetadataMaps }, + expected, + }, + }) => { + const findResult = findFlatFieldMetadataInFlatObjectMetadataMaps({ + fieldMetadataId, + objectMetadataId, + flatObjectMetadataMaps, + }); + + expect(findResult).toEqual(expected); + }, + ); +}); diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/find-flat-object-metadata-in-flat-object-metadata-maps.spec.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/find-flat-object-metadata-in-flat-object-metadata-maps.spec.ts new file mode 100644 index 0000000000..7df28348e1 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/find-flat-object-metadata-in-flat-object-metadata-maps.spec.ts @@ -0,0 +1,61 @@ +import { + EachTestingContext, + eachTestingContextFilter, +} from 'twenty-shared/testing'; + +import { FLAT_OBJECT_METADATA_MAPS_MOCKS } from 'src/engine/metadata-modules/flat-object-metadata-maps/mocks/flat-object-metadata-maps.mock'; +import { + FindFlatObjectMetadataInFlatObjectMetadataMapsArgs, + findFlatObjectMetadataInFlatObjectMetadataMaps, +} from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/find-flat-object-metadata-in-flat-object-metadata-maps.util'; +import { PET_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/pet-flat-object.mock'; +import { FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; + +type FindFlatObjectMetadataInFlatObjectMetadataMapsTestCase = { + input: FindFlatObjectMetadataInFlatObjectMetadataMapsArgs; + expected?: FlatObjectMetadata; +}; + +describe('findFlatObjectMetadataInFlatObjectMetadataMaps', () => { + const testCases: EachTestingContext[] = + [ + { + title: 'should return undefined when object metadata does not exist', + context: { + input: { + objectMetadataId: 'non-existent', + flatObjectMetadataMaps: FLAT_OBJECT_METADATA_MAPS_MOCKS, + }, + }, + }, + { + title: 'should find object metadata in flat object metadata maps', + context: { + input: { + objectMetadataId: PET_FLAT_OBJECT_MOCK.id, + flatObjectMetadataMaps: FLAT_OBJECT_METADATA_MAPS_MOCKS, + }, + expected: PET_FLAT_OBJECT_MOCK, + }, + }, + ]; + + const filteredTestCases = eachTestingContextFilter(testCases); + + it.each(filteredTestCases)( + '$title', + ({ + context: { + input: { objectMetadataId, flatObjectMetadataMaps }, + expected, + }, + }) => { + const result = findFlatObjectMetadataInFlatObjectMetadataMaps({ + objectMetadataId, + flatObjectMetadataMaps, + }); + + expect(result).toEqual(expected); + }, + ); +}); diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/replace-flat-field-metadata-in-flat-object-metadata-maps-or-throw.spec.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/replace-flat-field-metadata-in-flat-object-metadata-maps-or-throw.spec.ts new file mode 100644 index 0000000000..bbd91559c5 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/replace-flat-field-metadata-in-flat-object-metadata-maps-or-throw.spec.ts @@ -0,0 +1,104 @@ +import { + EachTestingContext, + eachTestingContextFilter, +} from 'twenty-shared/testing'; +import { FieldMetadataType } from 'twenty-shared/types'; + +import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock'; +import { PET_FLAT_FIELDS_MOCK } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/pet-flat-fields.mock'; +import { expectFlatFieldMetadataToBeInFlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/__tests__/utils/expect-flat-field-metadata-to-be-in-flat-object-metadata-maps.util.test'; +import { FLAT_OBJECT_METADATA_MAPS_MOCKS } from 'src/engine/metadata-modules/flat-object-metadata-maps/mocks/flat-object-metadata-maps.mock'; +import { + ReplaceFlatFieldMetadataInFlatObjectMetadataMapsOrThrowArgs, + replaceFlatFieldMetadataInFlatObjectMetadataMapsOrThrow, +} from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/replace-flat-field-metadata-in-flat-object-metadata-maps-or-throw.util'; +import { PET_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/pet-flat-object.mock'; +import { ROCKET_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/rocket-flat-object.mock'; +import { fromFlatObjectMetadatasToFlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata/utils/from-flat-object-metadatas-to-flat-object-metadata-maps.util'; + +type ReplaceFlatFieldMetadataInFlatObjectMetadataMapsTestCase = { + input: ReplaceFlatFieldMetadataInFlatObjectMetadataMapsOrThrowArgs; + shouldThrow?: true; +}; + +describe('replaceFlatFieldMetadataInFlatObjectMetadataMapsOrThrow', () => { + const testCases: EachTestingContext[] = + [ + { + title: 'should throw when field metadata to replace does not exist', + context: { + input: { + flatFieldMetadata: getFlatFieldMetadataMock({ + objectMetadataId: ROCKET_FLAT_OBJECT_MOCK.id, + type: FieldMetadataType.TEXT, + uniqueIdentifier: 'unique-identifier-1', + id: 'non-existent', + }), + flatObjectMetadataMaps: FLAT_OBJECT_METADATA_MAPS_MOCKS, + }, + shouldThrow: true, + }, + }, + { + title: 'should throw when field metadata parent object does not exist', + context: { + input: { + flatFieldMetadata: getFlatFieldMetadataMock({ + ...PET_FLAT_FIELDS_MOCK.species, + objectMetadataId: 'non-existent', + }), + flatObjectMetadataMaps: FLAT_OBJECT_METADATA_MAPS_MOCKS, + }, + shouldThrow: true, + }, + }, + { + title: 'should replace field metadata in flat object metadata maps', + context: { + input: { + flatFieldMetadata: getFlatFieldMetadataMock({ + ...PET_FLAT_FIELDS_MOCK.species, + name: 'not-species-anymore', + }), + flatObjectMetadataMaps: + fromFlatObjectMetadatasToFlatObjectMetadataMaps([ + PET_FLAT_OBJECT_MOCK, + ROCKET_FLAT_OBJECT_MOCK, + ]), + }, + }, + }, + ]; + + const filteredTestCases = eachTestingContextFilter(testCases); + + it.each(filteredTestCases)( + '$title', + ({ + context: { + input: { flatFieldMetadata, flatObjectMetadataMaps }, + shouldThrow = false, + }, + }) => { + if (shouldThrow) { + expect(() => + replaceFlatFieldMetadataInFlatObjectMetadataMapsOrThrow({ + flatFieldMetadata, + flatObjectMetadataMaps, + }), + ).toThrowErrorMatchingSnapshot(); + } else { + const updatedFlatObjectMetadataMaps = + replaceFlatFieldMetadataInFlatObjectMetadataMapsOrThrow({ + flatFieldMetadata, + flatObjectMetadataMaps, + }); + + expectFlatFieldMetadataToBeInFlatObjectMetadataMaps({ + flatFieldMetadata, + flatObjectMetadataMaps: updatedFlatObjectMetadataMaps, + }); + } + }, + ); +}); diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/replace-flat-object-metadata-in-flat-object-metadata-maps-or-throw.spec.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/replace-flat-object-metadata-in-flat-object-metadata-maps-or-throw.spec.ts new file mode 100644 index 0000000000..67e4067083 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/__tests__/replace-flat-object-metadata-in-flat-object-metadata-maps-or-throw.spec.ts @@ -0,0 +1,86 @@ +import { + EachTestingContext, + eachTestingContextFilter, +} from 'twenty-shared/testing'; + +import { expectFlatObjectMetadataToStrictlyBeInFlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/__tests__/utils/expect-flat-object-metadata-to-strictly-be-in-flat-object-metadata-maps.util.test'; +import { FLAT_OBJECT_METADATA_MAPS_MOCKS } from 'src/engine/metadata-modules/flat-object-metadata-maps/mocks/flat-object-metadata-maps.mock'; +import { + ReplaceFlatObjectMetadataInFlatObjectMetadataMapsOrThrowArgs, + replaceFlatObjectMetadataInFlatObjectMetadataMapsOrThrow, +} from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/replace-flat-object-metadata-in-flat-object-metadata-maps-or-throw.util'; +import { PET_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/pet-flat-object.mock'; +import { ROCKET_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/rocket-flat-object.mock'; +import { fromFlatObjectMetadatasToFlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata/utils/from-flat-object-metadatas-to-flat-object-metadata-maps.util'; + +type ReplaceFlatObjectMetadataInFlatObjectMetadataMapsTestCase = { + input: ReplaceFlatObjectMetadataInFlatObjectMetadataMapsOrThrowArgs; + shouldThrow?: true; +}; + +describe('replaceFlatObjectMetadataInFlatObjectMetadataMapsOrThrow', () => { + const testCases: EachTestingContext[] = + [ + { + title: 'should throw when object metadata to replace does not exist', + context: { + input: { + flatObjectMetadata: { + ...PET_FLAT_OBJECT_MOCK, + id: 'non-existent', + }, + flatObjectMetadataMaps: FLAT_OBJECT_METADATA_MAPS_MOCKS, + }, + shouldThrow: true, + }, + }, + { + title: 'should replace object metadata in flat object metadata maps', + context: { + input: { + flatObjectMetadata: { + ...PET_FLAT_OBJECT_MOCK, + nameSingular: 'not-pet-anymore', + }, + flatObjectMetadataMaps: + fromFlatObjectMetadatasToFlatObjectMetadataMaps([ + PET_FLAT_OBJECT_MOCK, + ROCKET_FLAT_OBJECT_MOCK, + ]), + }, + }, + }, + ]; + + const filteredTestCases = eachTestingContextFilter(testCases); + + it.each(filteredTestCases)( + '$title', + ({ + context: { + input: { flatObjectMetadata, flatObjectMetadataMaps }, + shouldThrow = false, + }, + }) => { + if (shouldThrow) { + expect(() => + replaceFlatObjectMetadataInFlatObjectMetadataMapsOrThrow({ + flatObjectMetadata, + flatObjectMetadataMaps, + }), + ).toThrowErrorMatchingSnapshot(); + } else { + const updatedFlatObjectMetadataMaps = + replaceFlatObjectMetadataInFlatObjectMetadataMapsOrThrow({ + flatObjectMetadata, + flatObjectMetadataMaps, + }); + + expectFlatObjectMetadataToStrictlyBeInFlatObjectMetadataMaps({ + flatObjectMetadata, + flatObjectMetadataMaps: updatedFlatObjectMetadataMaps, + }); + } + }, + ); +}); diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/add-flat-field-metadata-in-flat-object-metadata-maps-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/add-flat-field-metadata-in-flat-object-metadata-maps-or-throw.util.ts index 4359590a4b..68aa3fc806 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/add-flat-field-metadata-in-flat-object-metadata-maps-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/add-flat-field-metadata-in-flat-object-metadata-maps-or-throw.util.ts @@ -8,13 +8,14 @@ import { import { FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type'; import { addFlatFieldMetadataToFlatObjectMetadataWithFlatFieldMapsOrThrow } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/add-flat-field-metadata-to-flat-object-metadata-with-flat-field-maps-or-throw.util'; +export type AddFlatFieldMetadataInFlatObjectMetadataMapsOrThrowArgs = { + flatFieldMetadata: FlatFieldMetadata; + flatObjectMetadataMaps: FlatObjectMetadataMaps; +}; export const addFlatFieldMetadataInFlatObjectMetadataMapsOrThrow = ({ flatFieldMetadata, flatObjectMetadataMaps, -}: { - flatFieldMetadata: FlatFieldMetadata; - flatObjectMetadataMaps: FlatObjectMetadataMaps; -}): FlatObjectMetadataMaps | undefined => { +}: AddFlatFieldMetadataInFlatObjectMetadataMapsOrThrowArgs): FlatObjectMetadataMaps => { const flatObjectMetadataWithFlatFieldMaps = flatObjectMetadataMaps.byId[flatFieldMetadata.objectMetadataId]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/add-flat-field-metadata-to-flat-object-metadata-with-flat-field-maps-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/add-flat-field-metadata-to-flat-object-metadata-with-flat-field-maps-or-throw.util.ts index e76aafa52c..114ef2214c 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/add-flat-field-metadata-to-flat-object-metadata-with-flat-field-maps-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/add-flat-field-metadata-to-flat-object-metadata-with-flat-field-maps-or-throw.util.ts @@ -12,14 +12,15 @@ import { FlatObjectMetadataWithFlatFieldMaps, } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-with-flat-field-metadata-maps.type'; +type AddFlatFieldMetadataToFlatObjectMetadataWithFlatFieldMapsOrThrowArgs = { + flatFieldMetadata: FlatFieldMetadata; + flatObjectMetadataWithFlatFieldMaps: FlatObjectMetadataWithFlatFieldMaps; +}; export const addFlatFieldMetadataToFlatObjectMetadataWithFlatFieldMapsOrThrow = ({ flatFieldMetadata, flatObjectMetadataWithFlatFieldMaps, - }: { - flatFieldMetadata: FlatFieldMetadata; - flatObjectMetadataWithFlatFieldMaps: FlatObjectMetadataWithFlatFieldMaps; - }): FlatObjectMetadataWithFlatFieldMaps => { + }: AddFlatFieldMetadataToFlatObjectMetadataWithFlatFieldMapsOrThrowArgs): FlatObjectMetadataWithFlatFieldMaps => { if ( isDefined( flatObjectMetadataWithFlatFieldMaps.fieldsById[flatFieldMetadata.id], diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/delete-field-from-flat-object-metadata-maps-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/delete-field-from-flat-object-metadata-maps-or-throw.util.ts index 67666d7593..df8286c2c6 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/delete-field-from-flat-object-metadata-maps-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/delete-field-from-flat-object-metadata-maps-or-throw.util.ts @@ -7,7 +7,7 @@ import { import { FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type'; import { deleteFieldFromFlatObjectMetadataWithFlatFieldMapsOrThrow } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/delete-field-from-flat-object-metadata-with-flat-field-maps-or-throw.util'; -type DeleteFieldFromFlatObjectMetadataMapsArgs = { +type DeleteFieldFromFlatObjectMetadataMapsOrThrowArgs = { fieldMetadataId: string; objectMetadataId: string; flatObjectMetadataMaps: FlatObjectMetadataMaps; @@ -16,13 +16,13 @@ export const deleteFieldFromFlatObjectMetadataMapsOrThrow = ({ flatObjectMetadataMaps, fieldMetadataId, objectMetadataId, -}: DeleteFieldFromFlatObjectMetadataMapsArgs): FlatObjectMetadataMaps => { +}: DeleteFieldFromFlatObjectMetadataMapsOrThrowArgs): FlatObjectMetadataMaps => { const flatObjectMetadataWithFlatFieldMaps = flatObjectMetadataMaps.byId[objectMetadataId]; if (!isDefined(flatObjectMetadataWithFlatFieldMaps)) { throw new FlatObjectMetadataMapsException( - 'deleteFieldFromFlatObjectMetadataMapsOrThrow: flat field metadata to delete parent flat object metadata not found', + 'deleteFieldFromFlatObjectMetadataMapsOrThrow: field metadata to delete parent flat object metadata not found', FlatObjectMetadataMapsExceptionCode.OBJECT_METADATA_NOT_FOUND, ); } diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/delete-field-from-flat-object-metadata-with-flat-field-maps-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/delete-field-from-flat-object-metadata-with-flat-field-maps-or-throw.util.ts index 5db86f4dd1..01a2f0af2d 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/delete-field-from-flat-object-metadata-with-flat-field-maps-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/delete-field-from-flat-object-metadata-with-flat-field-maps-or-throw.util.ts @@ -6,14 +6,14 @@ import { } from 'src/engine/metadata-modules/flat-object-metadata-maps/flat-object-metadata-maps.exception'; import { FlatObjectMetadataWithFlatFieldMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-with-flat-field-metadata-maps.type'; -type DeleteFieldFromFlatObjectMetadataMapsArgs = { +type DeleteFieldFromFlatObjectMetadataMapsOrThrowArgs = { fieldMetadataId: string; flatObjectMetadataWithFlatFieldMaps: FlatObjectMetadataWithFlatFieldMaps; }; export const deleteFieldFromFlatObjectMetadataWithFlatFieldMapsOrThrow = ({ flatObjectMetadataWithFlatFieldMaps, fieldMetadataId: fieldMetadataIdToRemove, -}: DeleteFieldFromFlatObjectMetadataMapsArgs): FlatObjectMetadataWithFlatFieldMaps => { +}: DeleteFieldFromFlatObjectMetadataMapsOrThrowArgs): FlatObjectMetadataWithFlatFieldMaps => { const flatFieldMetadataToRemove = flatObjectMetadataWithFlatFieldMaps.fieldsById[fieldMetadataIdToRemove]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/delete-object-from-flat-object-metadata-maps-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/delete-object-from-flat-object-metadata-maps-or-throw.util.ts index 153d522f32..176f20710e 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/delete-object-from-flat-object-metadata-maps-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/delete-object-from-flat-object-metadata-maps-or-throw.util.ts @@ -6,7 +6,7 @@ import { } from 'src/engine/metadata-modules/flat-object-metadata-maps/flat-object-metadata-maps.exception'; import { FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type'; -type DeleteObjectFromFlatObjectMetadataMapsOrThrowArgs = { +export type DeleteObjectFromFlatObjectMetadataMapsOrThrowArgs = { objectMetadataId: string; flatObjectMetadataMaps: FlatObjectMetadataMaps; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/find-flat-field-metadata-in-flat-object-metadata-maps.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/find-flat-field-metadata-in-flat-object-metadata-maps.util.ts index abe3f13da4..0c2add7e55 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/find-flat-field-metadata-in-flat-object-metadata-maps.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/find-flat-field-metadata-in-flat-object-metadata-maps.util.ts @@ -3,15 +3,18 @@ import { isDefined } from 'twenty-shared/utils'; import { FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type'; +export type FindFlatFieldMetadataInFlatObjectMetadataMapsArgs = { + objectMetadataId: string; + fieldMetadataId: string; + flatObjectMetadataMaps: FlatObjectMetadataMaps; +}; export const findFlatFieldMetadataInFlatObjectMetadataMaps = ({ flatObjectMetadataMaps, fieldMetadataId, objectMetadataId, -}: { - objectMetadataId: string; - fieldMetadataId: string; - flatObjectMetadataMaps: FlatObjectMetadataMaps; -}): FlatFieldMetadata | undefined => { +}: FindFlatFieldMetadataInFlatObjectMetadataMapsArgs): + | FlatFieldMetadata + | undefined => { const flatObjectMetadataWithFlatFieldMaps = flatObjectMetadataMaps.byId[objectMetadataId]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/find-flat-object-metadata-in-flat-object-metadata-maps.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/find-flat-object-metadata-in-flat-object-metadata-maps.util.ts index 7ace3afd98..ed09975d2b 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/find-flat-object-metadata-in-flat-object-metadata-maps.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/find-flat-object-metadata-in-flat-object-metadata-maps.util.ts @@ -4,13 +4,16 @@ import { FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object- import { FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; import { fromFlatObjectMetadataWithFlatFieldMapsToFlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/utils/from-flat-object-metadata-with-flat-field-maps-to-flat-object-metadatas.util'; -export const findFlatObjectdMetadataInFlatObjectMetadataMaps = ({ - flatObjectMetadataMaps, - objectMetadataId, -}: { +export type FindFlatObjectMetadataInFlatObjectMetadataMapsArgs = { objectMetadataId: string; flatObjectMetadataMaps: FlatObjectMetadataMaps; -}): FlatObjectMetadata | undefined => { +}; +export const findFlatObjectMetadataInFlatObjectMetadataMaps = ({ + flatObjectMetadataMaps, + objectMetadataId, +}: FindFlatObjectMetadataInFlatObjectMetadataMapsArgs): + | FlatObjectMetadata + | undefined => { const flatObjectMetadataWithFlatFieldMaps = flatObjectMetadataMaps.byId[objectMetadataId]; diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/from-flat-object-metadata-to-flat-object-metadata-with-flat-field-maps.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/from-flat-object-metadata-to-flat-object-metadata-with-flat-field-maps.util.ts index d8ed28b987..c8ddc0d709 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/from-flat-object-metadata-to-flat-object-metadata-with-flat-field-maps.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/from-flat-object-metadata-to-flat-object-metadata-with-flat-field-maps.util.ts @@ -1,7 +1,7 @@ import { isDefined } from 'twenty-shared/utils'; +import { fromObjectMetadataItemWithFieldMapsToFlatObjectWithFlatFieldMetadataMaps } from 'src/engine/metadata-modules/flat-field-metadata/utils/from-flat-field-metadata-to-flat-field-metadata-maps.util'; import { FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type'; -import { fromObjectMetadataItemWithFieldMapsToFlatObjectWithFlatFieldMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/from-flat-field-metadata-to-flat-field-metadata-maps.util'; import { ObjectMetadataMaps } from 'src/engine/metadata-modules/types/object-metadata-maps'; export const fromObjectMetadataMapsToFlatObjectMetadataMaps = ( diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/replace-flat-field-metadata-in-flat-object-metadata-maps-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/replace-flat-field-metadata-in-flat-object-metadata-maps-or-throw.util.ts index e1c0523b0f..f83d1f6a90 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/replace-flat-field-metadata-in-flat-object-metadata-maps-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/replace-flat-field-metadata-in-flat-object-metadata-maps-or-throw.util.ts @@ -3,13 +3,14 @@ import { FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object- 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'; +export type ReplaceFlatFieldMetadataInFlatObjectMetadataMapsOrThrowArgs = { + flatFieldMetadata: FlatFieldMetadata; + flatObjectMetadataMaps: FlatObjectMetadataMaps; +}; export const replaceFlatFieldMetadataInFlatObjectMetadataMapsOrThrow = ({ flatFieldMetadata, flatObjectMetadataMaps, -}: { - flatFieldMetadata: FlatFieldMetadata; - flatObjectMetadataMaps: FlatObjectMetadataMaps; -}): FlatObjectMetadataMaps | undefined => { +}: ReplaceFlatFieldMetadataInFlatObjectMetadataMapsOrThrowArgs): FlatObjectMetadataMaps => { const flatObjectMetadataMapsWithoutFlatFieldMetadataToReplace = deleteFieldFromFlatObjectMetadataMapsOrThrow({ fieldMetadataId: flatFieldMetadata.id, diff --git a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/replace-flat-object-metadata-in-flat-object-metadata-maps-or-throw.util.ts b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/replace-flat-object-metadata-in-flat-object-metadata-maps-or-throw.util.ts index 1c5fdae91d..3eb24d293e 100644 --- a/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/replace-flat-object-metadata-in-flat-object-metadata-maps-or-throw.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/flat-object-metadata-maps/utils/replace-flat-object-metadata-in-flat-object-metadata-maps-or-throw.util.ts @@ -3,13 +3,14 @@ import { addFlatObjectMetadataToFlatObjectMetadataMapsOrThrow } from 'src/engine import { deleteObjectFromFlatObjectMetadataMapsOrThrow } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/delete-object-from-flat-object-metadata-maps-or-throw.util'; import { FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; -export const replaceFlatObjectMetadataInFlatObjectMetadataMaps = ({ - flatObjectMetadata, - flatObjectMetadataMaps, -}: { +export type ReplaceFlatObjectMetadataInFlatObjectMetadataMapsOrThrowArgs = { flatObjectMetadata: FlatObjectMetadata; flatObjectMetadataMaps: FlatObjectMetadataMaps; -}) => { +}; +export const replaceFlatObjectMetadataInFlatObjectMetadataMapsOrThrow = ({ + flatObjectMetadata, + flatObjectMetadataMaps, +}: ReplaceFlatObjectMetadataInFlatObjectMetadataMapsOrThrowArgs) => { const flatObjectMetadataMapsWithoutFlatObjectMetadataToReplace = deleteObjectFromFlatObjectMetadataMapsOrThrow({ flatObjectMetadataMaps, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/apply-workspace-migration-action-on-flat-object-metadata-maps.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/apply-workspace-migration-action-on-flat-object-metadata-maps.ts index 488c709a95..ba66a9acca 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/apply-workspace-migration-action-on-flat-object-metadata-maps.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/apply-workspace-migration-action-on-flat-object-metadata-maps.ts @@ -6,9 +6,9 @@ import { addFlatObjectMetadataToFlatObjectMetadataMapsOrThrow } from 'src/engine import { deleteFieldFromFlatObjectMetadataMapsOrThrow } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/delete-field-from-flat-object-metadata-maps-or-throw.util'; import { deleteObjectFromFlatObjectMetadataMapsOrThrow } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/delete-object-from-flat-object-metadata-maps-or-throw.util'; import { findFlatFieldMetadataInFlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/find-flat-field-metadata-in-flat-object-metadata-maps.util'; -import { findFlatObjectdMetadataInFlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/find-flat-object-metadata-in-flat-object-metadata-maps.util'; +import { findFlatObjectMetadataInFlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/find-flat-object-metadata-in-flat-object-metadata-maps.util'; import { replaceFlatFieldMetadataInFlatObjectMetadataMapsOrThrow } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/replace-flat-field-metadata-in-flat-object-metadata-maps-or-throw.util'; -import { replaceFlatObjectMetadataInFlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/replace-flat-object-metadata-in-flat-object-metadata-maps-or-throw.util'; +import { replaceFlatObjectMetadataInFlatObjectMetadataMapsOrThrow } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/replace-flat-object-metadata-in-flat-object-metadata-maps-or-throw.util'; import { WorkspaceMigrationRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-runner-args.type'; import { fromWorkspaceMigrationUpdateActionToPartialEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-workspace-migration-update-action-to-partial-field-or-object-entity.util'; import { @@ -49,7 +49,7 @@ export const applyWorkspaceMigrationActionOnFlatObjectMetadataMaps = ({ case 'update_object': { const { objectMetadataId } = action; const existingFlatObjectMetadata = - findFlatObjectdMetadataInFlatObjectMetadataMaps({ + findFlatObjectMetadataInFlatObjectMetadataMaps({ objectMetadataId, flatObjectMetadataMaps, }); @@ -65,7 +65,7 @@ export const applyWorkspaceMigrationActionOnFlatObjectMetadataMaps = ({ ...fromWorkspaceMigrationUpdateActionToPartialEntity(action), }; - return replaceFlatObjectMetadataInFlatObjectMetadataMaps({ + return replaceFlatObjectMetadataInFlatObjectMetadataMapsOrThrow({ flatObjectMetadata: updatedFlatObjectMetadata, flatObjectMetadataMaps, }); diff --git a/packages/twenty-server/test/utils/expect-to-be-defined.util.test.ts b/packages/twenty-server/test/utils/expect-to-be-defined.util.test.ts new file mode 100644 index 0000000000..87661903d6 --- /dev/null +++ b/packages/twenty-server/test/utils/expect-to-be-defined.util.test.ts @@ -0,0 +1,6 @@ +type AssertIsDefined = (value: T) => asserts value is NonNullable; + +export const jestExpectToBeDefined: AssertIsDefined = (value: T) => { + expect(value).toBeDefined(); + expect(value).not.toBeNull(); +};