fix: fix Apollo client cache update error for Links field (#5473)

Fixes #5437
This commit is contained in:
Thaïs
2024-05-22 10:55:24 +02:00
committed by GitHub
parent d1cbd709bd
commit 474dfd7bd8
8 changed files with 159 additions and 15 deletions

View File

@ -0,0 +1,80 @@
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import {
mockedObjectMetadataItems,
mockedPersonObjectMetadataItem,
} from '~/testing/mock-data/metadata';
import { mockedPeopleData } from '~/testing/mock-data/people';
import { getRecordNodeFromRecord } from '../getRecordNodeFromRecord';
describe('getRecordNodeFromRecord', () => {
it('computes relation records cache references by default', () => {
// Given
const objectMetadataItems: ObjectMetadataItem[] = mockedObjectMetadataItems;
const objectMetadataItem: Pick<
ObjectMetadataItem,
'fields' | 'namePlural' | 'nameSingular'
> = mockedPersonObjectMetadataItem;
const recordGqlFields = {
name: true,
company: true,
};
const record = mockedPeopleData[0];
// When
const result = getRecordNodeFromRecord({
objectMetadataItems,
objectMetadataItem,
recordGqlFields,
record,
});
// Then
expect(result).toEqual({
__typename: 'Person',
company: {
__ref: 'Company:5c21e19e-e049-4393-8c09-3e3f8fb09ecb',
},
name: {
__typename: 'FullName',
firstName: 'Alexandre',
lastName: 'Prot',
},
});
});
it('does not compute relation records cache references when `computeReferences` is false', () => {
// Given
const objectMetadataItems: ObjectMetadataItem[] = mockedObjectMetadataItems;
const objectMetadataItem: Pick<
ObjectMetadataItem,
'fields' | 'namePlural' | 'nameSingular'
> = mockedPersonObjectMetadataItem;
const recordGqlFields = {
name: true,
company: true,
};
const record = mockedPeopleData[0];
const computeReferences = false;
// When
const result = getRecordNodeFromRecord({
objectMetadataItems,
objectMetadataItem,
recordGqlFields,
record,
computeReferences,
});
// Then
expect(result).toEqual({
__typename: 'Person',
company: record.company,
name: {
__typename: 'FullName',
firstName: 'Alexandre',
lastName: 'Prot',
},
});
});
});

View File

@ -11,7 +11,7 @@ import {
RelationDefinitionType,
} from '~/generated-metadata/graphql';
import { isDefined } from '~/utils/isDefined';
import { lowerAndCapitalize } from '~/utils/string/lowerAndCapitalize';
import { pascalCase } from '~/utils/string/pascalCase';
export const getRecordNodeFromRecord = <T extends ObjectRecord>({
objectMetadataItems,
@ -129,6 +129,7 @@ export const getRecordNodeFromRecord = <T extends ObjectRecord>({
];
}
case FieldMetadataType.Link:
case FieldMetadataType.Links:
case FieldMetadataType.Address:
case FieldMetadataType.FullName:
case FieldMetadataType.Currency: {
@ -136,7 +137,7 @@ export const getRecordNodeFromRecord = <T extends ObjectRecord>({
fieldName,
{
...value,
__typename: lowerAndCapitalize(field.type),
__typename: pascalCase(field.type),
},
];
}

View File

@ -49,11 +49,11 @@ export const responseData = {
personDuplicates: {
edges: [
{
node: { __typename: 'Person', ...mockedPeopleData[0], updatedAt: '' },
node: { ...mockedPeopleData[0], updatedAt: '' },
cursor: 'cursor1',
},
{
node: { __typename: 'Person', ...mockedPeopleData[1], updatedAt: '' },
node: { ...mockedPeopleData[1], updatedAt: '' },
cursor: 'cursor2',
},
],

View File

@ -19,7 +19,7 @@ export const generateEmptyFieldValue = (
};
}
case FieldMetadataType.Links: {
return { primaryLinkUrl: '', primaryLinkLabel: '' };
return { primaryLinkUrl: '', primaryLinkLabel: '', secondaryLinks: null };
}
case FieldMetadataType.FullName: {
return {