## Expected behavior Described behavior regarding: (update | create) x (custom | standard) x (icon, label, name, isSynced) **Custom:** - Field RELATION create: name, label, isSynced, icon should be editable - Field RELATION update: name should not, icon label, isSynced should - For other fields, icon, label, name, isSynced should be editable at field creation | update To simplify: Field RELATION name should not be editable at update **Standards** - Field: create does not makes sense - Field: name should not, icon label, isSynced should (this will end up in overrides) To simplify, no Field RELATION edge case, name should not be editable at update **Note:** the FE logic is quite different as the UI is hiding some details behind the syncWithLabel. See my comments and TODO there ## What I've tested: (update | create) x (custom | standard) x (icon, label, name, isSynced, description)
120 lines
3.7 KiB
TypeScript
120 lines
3.7 KiB
TypeScript
import { createOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/create-one-field-metadata.util';
|
|
import { updateOneFieldMetadata } from 'test/integration/metadata/suites/field-metadata/utils/update-one-field-metadata.util';
|
|
import {
|
|
LISTING_NAME_PLURAL,
|
|
LISTING_NAME_SINGULAR,
|
|
} from 'test/integration/metadata/suites/object-metadata/constants/test-object-names.constant';
|
|
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 { FieldMetadataType } from 'twenty-shared/types';
|
|
|
|
describe('updateOne', () => {
|
|
describe('FieldMetadataService name/label sync', () => {
|
|
let listingObjectId = '';
|
|
let testFieldId = '';
|
|
|
|
beforeEach(async () => {
|
|
const { data } = await createOneObjectMetadata({
|
|
input: {
|
|
labelSingular: LISTING_NAME_SINGULAR,
|
|
labelPlural: LISTING_NAME_PLURAL,
|
|
nameSingular: LISTING_NAME_SINGULAR,
|
|
namePlural: LISTING_NAME_PLURAL,
|
|
icon: 'IconBuildingSkyscraper',
|
|
isLabelSyncedWithName: true,
|
|
},
|
|
});
|
|
|
|
listingObjectId = data.createOneObject.id;
|
|
|
|
const { data: createdFieldMetadata } = await createOneFieldMetadata({
|
|
input: {
|
|
objectMetadataId: listingObjectId,
|
|
type: FieldMetadataType.TEXT,
|
|
name: 'testName',
|
|
label: 'Test name',
|
|
isLabelSyncedWithName: true,
|
|
},
|
|
});
|
|
|
|
testFieldId = createdFieldMetadata.createOneField.id;
|
|
});
|
|
afterEach(async () => {
|
|
await deleteOneObjectMetadata({
|
|
input: { idToDelete: listingObjectId },
|
|
});
|
|
});
|
|
|
|
it('should update a field name and label when they are synced correctly', async () => {
|
|
// Arrange
|
|
const updateFieldInput = {
|
|
name: 'newName',
|
|
label: 'New name',
|
|
isLabelSyncedWithName: true,
|
|
};
|
|
|
|
// Act
|
|
const { data } = await updateOneFieldMetadata({
|
|
input: { idToUpdate: testFieldId, updatePayload: updateFieldInput },
|
|
gqlFields: `
|
|
id
|
|
name
|
|
label
|
|
isLabelSyncedWithName
|
|
`,
|
|
});
|
|
|
|
// Assert
|
|
expect(data.updateOneField.name).toBe('newName');
|
|
});
|
|
|
|
it('should update a field name and label when they are not synced correctly and labelSync is false', async () => {
|
|
// Arrange
|
|
const updateFieldInput = {
|
|
name: 'differentName',
|
|
label: 'New name',
|
|
isLabelSyncedWithName: false,
|
|
};
|
|
|
|
// Act
|
|
const { data } = await updateOneFieldMetadata({
|
|
input: { idToUpdate: testFieldId, updatePayload: updateFieldInput },
|
|
gqlFields: `
|
|
id
|
|
name
|
|
label
|
|
isLabelSyncedWithName
|
|
`,
|
|
});
|
|
|
|
// Assert
|
|
expect(data.updateOneField.name).toBe('differentName');
|
|
});
|
|
|
|
it('should not update a field name if it is not synced correctly with label and labelSync is true', async () => {
|
|
// Arrange
|
|
const updateFieldInput = {
|
|
name: 'newName',
|
|
isLabelSyncedWithName: true,
|
|
};
|
|
|
|
// Act
|
|
const { errors } = await updateOneFieldMetadata({
|
|
input: { idToUpdate: testFieldId, updatePayload: updateFieldInput },
|
|
gqlFields: `
|
|
id
|
|
name
|
|
label
|
|
isLabelSyncedWithName
|
|
`,
|
|
expectToFail: true,
|
|
});
|
|
|
|
// Assert
|
|
expect(errors[0].message).toBe(
|
|
'Name is not synced with label. Expected name: "testName", got newName',
|
|
);
|
|
});
|
|
});
|
|
});
|