Files
twenty/packages/twenty-server/test/integration/metadata/suites/object-metadata/create-delete-and-create-object-metadata-v2.integration-spec.ts
T
Weiko 1607aebcc6 Deprecate object metadata maps in favor of flat entities (#16080)
## Context
Deprecating the old objectMetadataMap type in favour of split flat
entities to match with our new caching.
In the long run, trying to achieve:
- Better performance through caching
- Consistent data access patterns across the codebase
- Reduced database queries

Now that everything is based on flat entities, which are cached, we can
finish the refactoring of workspace context cache which should already
improve performances.
Then the last step will be to consume that new cache in the new global
datasource to get rid of the many workspace datasources stored in the
server
2025-11-27 13:43:34 +01:00

166 lines
5.1 KiB
TypeScript

import { type CreateOneFieldFactoryInput } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata-query-factory.util';
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
import { deleteOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/delete-one-field-metadata.util';
import { updateOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/update-one-field-metadata.util';
import { type CreateOneObjectFactoryInput } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata-query-factory.util';
import { createOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/create-one-object-metadata.util';
import { deleteOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/delete-one-object-metadata.util';
import { updateOneObjectMetadata } from 'test/integration/metadata/suites/object-metadata/utils/update-one-object-metadata.util';
import { FieldMetadataType } from 'twenty-shared/types';
import { isDefined } from 'twenty-shared/utils';
describe('Handle same object sequential operations test suite', () => {
let createdObjectMetadataId: string | undefined = undefined;
const uniqueSuffix = Date.now().toString().slice(-8);
afterEach(async () => {
if (!isDefined(createdObjectMetadataId)) {
return;
}
await updateOneObjectMetadata({
expectToFail: false,
input: {
idToUpdate: createdObjectMetadataId,
updatePayload: {
isActive: false,
},
},
});
await deleteOneObjectMetadata({
input: { idToDelete: createdObjectMetadataId },
expectToFail: false,
});
createdObjectMetadataId = undefined;
});
it('It should handle creation deletion and creation of the same metadata entity gracefully', async () => {
const createObjectInput: CreateOneObjectFactoryInput = {
namePlural: `dishes${uniqueSuffix}`,
nameSingular: `dish${uniqueSuffix}`,
labelPlural: `Dishes ${uniqueSuffix}`,
labelSingular: `Dish ${uniqueSuffix}`,
description: 'My favorite dishes',
icon: 'IconBuildingSkyscraper',
isLabelSyncedWithName: false,
};
const objectCreationGqlFields = `
id
labelPlural
description
labelSingular
namePlural
nameSingular
icon
isLabelSyncedWithName
`;
const fieldCreationGqlFields = `
id
label
name
type
description
`;
const {
data: { createOneObject },
} = await createOneObjectMetadata({
expectToFail: false,
input: createObjectInput,
gqlFields: objectCreationGqlFields,
});
createdObjectMetadataId = createOneObject.id;
expect(createOneObject).toMatchObject(createObjectInput);
const createFieldInput: Omit<
CreateOneFieldFactoryInput,
'objectMetadataId'
> = {
label: 'field label',
name: 'fieldName',
type: FieldMetadataType.TEXT,
description: 'custom description',
};
const {
data: { createOneField },
} = await createOneFieldMetadata({
input: {
...createFieldInput,
objectMetadataId: createdObjectMetadataId,
},
expectToFail: false,
gqlFields: fieldCreationGqlFields,
});
expect(createOneField).toMatchObject(createFieldInput);
await updateOneFieldMetadata({
expectToFail: false,
input: {
idToUpdate: createOneField.id,
updatePayload: {
isActive: false,
},
},
});
await deleteOneFieldMetadata({
input: {
idToDelete: createOneField.id,
},
expectToFail: false,
});
const {
data: { createOneField: secondCreateOneField },
} = await createOneFieldMetadata({
input: {
...createFieldInput,
objectMetadataId: createdObjectMetadataId,
},
expectToFail: false,
gqlFields: fieldCreationGqlFields,
});
expect(secondCreateOneField).toMatchObject(createFieldInput);
await updateOneObjectMetadata({
expectToFail: false,
input: {
idToUpdate: createdObjectMetadataId,
updatePayload: {
isActive: false,
},
},
});
await deleteOneObjectMetadata({
input: { idToDelete: createdObjectMetadataId },
expectToFail: false,
});
createdObjectMetadataId = undefined;
const {
data: { createOneObject: secondCreateOneObject },
} = await createOneObjectMetadata({
expectToFail: false,
input: createObjectInput,
gqlFields: objectCreationGqlFields,
});
createdObjectMetadataId = secondCreateOneObject.id;
expect(secondCreateOneObject).toMatchObject(createObjectInput);
const {
data: { createOneField: thirdCreateOneField },
} = await createOneFieldMetadata({
input: {
...createFieldInput,
objectMetadataId: createdObjectMetadataId,
},
expectToFail: false,
gqlFields: fieldCreationGqlFields,
});
expect(thirdCreateOneField).toMatchObject(createFieldInput);
});
});