Fix all broken CIs (#7439)

Fix all the broken CIs :p

This includes an ongoing effort to simplify test maintenance by having 1
unique source of truth about metadata and data mocks (that will later be
generated from a unique source of seeds: dev = demo = test)

Regressions:
- Unit line coverage: 60 > 55
- Storybook Pages branch coverage: 40 > 35
We will need to write tests to increase those coverage
- RelationFieldDisplay perf: 0.2ms to 0.22ms > We might have a
regression here
- Removed perf story about RawJSON > We will need to re-add it
This commit is contained in:
Charles Bochet
2024-10-05 00:22:38 +02:00
committed by Charles Bochet
parent bd305c8432
commit d8c4af9279
148 changed files with 4357 additions and 2536 deletions

View File

@ -3,7 +3,7 @@ import { ComponentDecorator } from 'twenty-ui';
import { FormProviderDecorator } from '~/testing/decorators/FormProviderDecorator';
import { mockedPersonObjectMetadataItem } from '~/testing/mock-data/metadata';
import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems';
import { SettingsDataModelFieldDescriptionForm } from '../SettingsDataModelFieldDescriptionForm';
const meta: Meta<typeof SettingsDataModelFieldDescriptionForm> = {
@ -25,11 +25,15 @@ type Story = StoryObj<typeof SettingsDataModelFieldDescriptionForm>;
export const Default: Story = {};
const mockedPersonObjectMetadataItem = generatedMockObjectMetadataItems.find(
(item) => item.namePlural === 'person',
);
export const WithFieldMetadataItem: Story = {
args: {
fieldMetadataItem: mockedPersonObjectMetadataItem.fields.find(
fieldMetadataItem: mockedPersonObjectMetadataItem?.fields.find(
({ description }) => description === 'description',
)!,
),
},
};

View File

@ -5,7 +5,7 @@ import { ComponentDecorator } from 'twenty-ui';
import { FormProviderDecorator } from '~/testing/decorators/FormProviderDecorator';
import { IconsProviderDecorator } from '~/testing/decorators/IconsProviderDecorator';
import { mockedPersonObjectMetadataItem } from '~/testing/mock-data/metadata';
import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems';
import { SettingsDataModelFieldIconLabelForm } from '../SettingsDataModelFieldIconLabelForm';
const StyledContainer = styled.div`
@ -32,11 +32,15 @@ type Story = StoryObj<typeof SettingsDataModelFieldIconLabelForm>;
export const Default: Story = {};
const mockedPersonObjectMetadataItem = generatedMockObjectMetadataItems.find(
(item) => item.namePlural === 'person',
);
export const WithFieldMetadataItem: Story = {
args: {
fieldMetadataItem: mockedPersonObjectMetadataItem.fields.find(
fieldMetadataItem: mockedPersonObjectMetadataItem?.fields.find(
({ name }) => name === 'name',
)!,
),
},
};

View File

@ -7,10 +7,18 @@ import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorato
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
import { graphqlMocks } from '~/testing/graphqlMocks';
import { mockedCompanyObjectMetadataItem } from '~/testing/mock-data/metadata';
import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems';
import { SettingsDataModelFieldSettingsFormCard } from '../SettingsDataModelFieldSettingsFormCard';
const mockedCompanyObjectMetadataItem = generatedMockObjectMetadataItems.find(
(item) => item.nameSingular === 'company',
);
if (!mockedCompanyObjectMetadataItem) {
throw new Error('Company object metadata item not found');
}
const fieldMetadataItem = mockedCompanyObjectMetadataItem.fields.find(
({ type }) => type === FieldMetadataType.Text,
)!;

View File

@ -6,14 +6,23 @@ import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorato
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
import { graphqlMocks } from '~/testing/graphqlMocks';
import {
mockedCompanyObjectMetadataItem,
mockedOpportunityObjectMetadataItem,
mockedPersonObjectMetadataItem,
} from '~/testing/mock-data/metadata';
import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems';
import { SettingsDataModelFieldPreviewCard } from '../SettingsDataModelFieldPreviewCard';
const mockedCompanyObjectMetadataItem = generatedMockObjectMetadataItems.find(
(item) => item.nameSingular === 'company',
);
const mockedOpportunityObjectMetadataItem =
generatedMockObjectMetadataItems.find(
(item) => item.nameSingular === 'opportunity',
);
const mockedPersonObjectMetadataItem = generatedMockObjectMetadataItems.find(
(item) => item.nameSingular === 'person',
);
const meta: Meta<typeof SettingsDataModelFieldPreviewCard> = {
title:
'Modules/Settings/DataModel/Fields/Preview/SettingsDataModelFieldPreviewCard',
@ -38,7 +47,7 @@ type Story = StoryObj<typeof SettingsDataModelFieldPreviewCard>;
export const LabelIdentifier: Story = {
args: {
fieldMetadataItem: mockedPersonObjectMetadataItem.fields.find(
fieldMetadataItem: mockedPersonObjectMetadataItem?.fields.find(
({ name, type }) =>
name === 'name' && type === FieldMetadataType.FullName,
),
@ -47,7 +56,7 @@ export const LabelIdentifier: Story = {
export const Text: Story = {
args: {
fieldMetadataItem: mockedPersonObjectMetadataItem.fields.find(
fieldMetadataItem: mockedPersonObjectMetadataItem?.fields.find(
({ name, type }) => name === 'city' && type === FieldMetadataType.Text,
),
},
@ -55,7 +64,7 @@ export const Text: Story = {
export const Boolean: Story = {
args: {
fieldMetadataItem: mockedCompanyObjectMetadataItem.fields.find(
fieldMetadataItem: mockedCompanyObjectMetadataItem?.fields.find(
({ name, type }) =>
name === 'idealCustomerProfile' && type === FieldMetadataType.Boolean,
),
@ -65,7 +74,7 @@ export const Boolean: Story = {
export const Currency: Story = {
args: {
fieldMetadataItem: mockedCompanyObjectMetadataItem.fields.find(
fieldMetadataItem: mockedCompanyObjectMetadataItem?.fields.find(
({ name, type }) =>
name === 'annualRecurringRevenue' &&
type === FieldMetadataType.Currency,
@ -76,7 +85,7 @@ export const Currency: Story = {
export const Date: Story = {
args: {
fieldMetadataItem: mockedCompanyObjectMetadataItem.fields.find(
fieldMetadataItem: mockedCompanyObjectMetadataItem?.fields.find(
({ type }) => type === FieldMetadataType.DateTime,
),
objectMetadataItem: mockedCompanyObjectMetadataItem,
@ -85,7 +94,7 @@ export const Date: Story = {
export const Links: Story = {
args: {
fieldMetadataItem: mockedCompanyObjectMetadataItem.fields.find(
fieldMetadataItem: mockedCompanyObjectMetadataItem?.fields.find(
({ name, type }) =>
name === 'linkedinLink' && type === FieldMetadataType.Links,
),
@ -95,7 +104,7 @@ export const Links: Story = {
export const Number: Story = {
args: {
fieldMetadataItem: mockedCompanyObjectMetadataItem.fields.find(
fieldMetadataItem: mockedCompanyObjectMetadataItem?.fields.find(
({ type }) => type === FieldMetadataType.Number,
),
objectMetadataItem: mockedCompanyObjectMetadataItem,
@ -114,7 +123,7 @@ export const Rating: Story = {
export const Relation: Story = {
args: {
fieldMetadataItem: mockedPersonObjectMetadataItem.fields.find(
fieldMetadataItem: mockedPersonObjectMetadataItem?.fields.find(
({ name }) => name === 'company',
),
relationObjectMetadataItem: mockedCompanyObjectMetadataItem,
@ -123,7 +132,7 @@ export const Relation: Story = {
export const Select: Story = {
args: {
fieldMetadataItem: mockedOpportunityObjectMetadataItem.fields.find(
fieldMetadataItem: mockedOpportunityObjectMetadataItem?.fields.find(
({ name, type }) => name === 'stage' && type === FieldMetadataType.Select,
),
objectMetadataItem: mockedOpportunityObjectMetadataItem,

View File

@ -1,35 +1,34 @@
import { ReactNode } from 'react';
import { MockedProvider } from '@apollo/client/testing';
import { renderHook } from '@testing-library/react';
import { RecoilRoot } from 'recoil';
import { ObjectMetadataItemsProvider } from '@/object-metadata/components/ObjectMetadataItemsProvider';
import { FieldMetadataItemOption } from '@/object-metadata/types/FieldMetadataItem';
import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope';
import { FieldMetadataType } from '~/generated/graphql';
import {
mockedCompanyObjectMetadataItem,
mockedOpportunityObjectMetadataItem,
mockedPersonObjectMetadataItem,
} from '~/testing/mock-data/metadata';
import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper';
import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems';
import { useFieldPreviewValue } from '../useFieldPreviewValue';
const Wrapper = ({ children }: { children: ReactNode }) => (
<RecoilRoot>
<MockedProvider>
<SnackBarProviderScope snackBarManagerScopeId="snack-bar-manager">
<ObjectMetadataItemsProvider>{children}</ObjectMetadataItemsProvider>
</SnackBarProviderScope>
</MockedProvider>
</RecoilRoot>
const mockedCompanyObjectMetadataItem = generatedMockObjectMetadataItems.find(
(item) => item.nameSingular === 'company',
);
const mockedOpportunityObjectMetadataItem =
generatedMockObjectMetadataItems.find(
(item) => item.nameSingular === 'opportunity',
);
const mockedPersonObjectMetadataItem = generatedMockObjectMetadataItems.find(
(item) => item.nameSingular === 'person',
);
const Wrapper = getJestMetadataAndApolloMocksWrapper({
apolloMocks: [],
});
describe('useFieldPreviewValue', () => {
it('returns null if skip is true', () => {
// Given
const fieldName = 'amount';
const fieldMetadataItem = mockedOpportunityObjectMetadataItem.fields.find(
const fieldMetadataItem = mockedOpportunityObjectMetadataItem?.fields.find(
({ name, type }) =>
name === fieldName && type === FieldMetadataType.Currency,
);
@ -52,7 +51,7 @@ describe('useFieldPreviewValue', () => {
it("returns the field's preview value for a Currency field", () => {
// Given
const fieldName = 'amount';
const fieldMetadataItem = mockedOpportunityObjectMetadataItem.fields.find(
const fieldMetadataItem = mockedOpportunityObjectMetadataItem?.fields.find(
({ name, type }) =>
name === fieldName && type === FieldMetadataType.Currency,
);
@ -106,7 +105,7 @@ describe('useFieldPreviewValue', () => {
it("returns the field's preview value for a Select field", () => {
// Given
const fieldName = 'stage';
const fieldMetadataItem = mockedOpportunityObjectMetadataItem.fields.find(
const fieldMetadataItem = mockedOpportunityObjectMetadataItem?.fields.find(
({ name, type }) =>
name === fieldName && type === FieldMetadataType.Select,
);
@ -169,7 +168,7 @@ describe('useFieldPreviewValue', () => {
it("returns the field's preview value for other field types", () => {
// Given
const fieldName = 'employees';
const fieldMetadataItem = mockedCompanyObjectMetadataItem.fields.find(
const fieldMetadataItem = mockedCompanyObjectMetadataItem?.fields.find(
({ name }) => name === fieldName,
);

View File

@ -1,16 +1,22 @@
import { CurrencyCode } from '@/object-record/record-field/types/CurrencyCode';
import { FieldMetadataType } from '~/generated-metadata/graphql';
import {
mockedCompanyObjectMetadataItem,
mockedOpportunityObjectMetadataItem,
} from '~/testing/mock-data/metadata';
import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems';
import { getCurrencyFieldPreviewValue } from '../getCurrencyFieldPreviewValue';
const mockedCompanyObjectMetadataItem = generatedMockObjectMetadataItems.find(
(item) => item.nameSingular === 'company',
);
const mockedOpportunityObjectMetadataItem =
generatedMockObjectMetadataItems.find(
(item) => item.nameSingular === 'opportunity',
);
describe('getCurrencyFieldPreviewValue', () => {
it('returns null if the field is not a Currency field', () => {
// Given
const fieldMetadataItem = mockedCompanyObjectMetadataItem.fields.find(
const fieldMetadataItem = mockedCompanyObjectMetadataItem?.fields.find(
({ type }) => type !== FieldMetadataType.Currency,
);
@ -26,7 +32,7 @@ describe('getCurrencyFieldPreviewValue', () => {
});
const fieldName = 'amount';
const fieldMetadataItem = mockedOpportunityObjectMetadataItem.fields.find(
const fieldMetadataItem = mockedOpportunityObjectMetadataItem?.fields.find(
({ name, type }) =>
name === fieldName && type === FieldMetadataType.Currency,
);

View File

@ -1,17 +1,21 @@
import { getFieldPreviewValue } from '@/settings/data-model/fields/preview/utils/getFieldPreviewValue';
import { getSettingsFieldTypeConfig } from '@/settings/data-model/utils/getSettingsFieldTypeConfig';
import { FieldMetadataType } from '~/generated-metadata/graphql';
import {
mockedCompanyObjectMetadataItem,
mockedCustomObjectMetadataItem,
mockedPersonObjectMetadataItem,
} from '~/testing/mock-data/metadata';
import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems';
const mockedCompanyObjectMetadataItem = generatedMockObjectMetadataItems.find(
(item) => item.nameSingular === 'company',
);
const mockedPersonObjectMetadataItem = generatedMockObjectMetadataItems.find(
(item) => item.nameSingular === 'person',
);
describe('getFieldPreviewValue', () => {
it("returns the field's defaultValue from metadata if it exists", () => {
// Given
const fieldName = 'idealCustomerProfile';
const fieldMetadataItem = mockedCompanyObjectMetadataItem.fields.find(
const fieldMetadataItem = mockedCompanyObjectMetadataItem?.fields.find(
({ name }) => name === fieldName,
);
@ -29,7 +33,7 @@ describe('getFieldPreviewValue', () => {
it('returns a placeholder defaultValue if the field metadata does not have a defaultValue', () => {
// Given
const fieldName = 'employees';
const fieldMetadataItem = mockedCompanyObjectMetadataItem.fields.find(
const fieldMetadataItem = mockedCompanyObjectMetadataItem?.fields.find(
({ name }) => name === fieldName,
);
@ -50,25 +54,7 @@ describe('getFieldPreviewValue', () => {
it('returns null if the field is supported in Settings but has no pre-configured placeholder defaultValue', () => {
// Given
const fieldName = 'company';
const fieldMetadataItem = mockedPersonObjectMetadataItem.fields.find(
({ name }) => name === fieldName,
);
if (!fieldMetadataItem) {
throw new Error(`Field '${fieldName}' not found`);
}
// When
const result = getFieldPreviewValue({ fieldMetadataItem });
// Then
expect(result).toBeNull();
});
it('returns null if the field is not supported in Settings', () => {
// Given
const fieldName = 'position';
const fieldMetadataItem = mockedCustomObjectMetadataItem.fields.find(
const fieldMetadataItem = mockedPersonObjectMetadataItem?.fields.find(
({ name }) => name === fieldName,
);

View File

@ -1,15 +1,20 @@
import { FieldMetadataType } from '~/generated-metadata/graphql';
import {
mockedCompanyObjectMetadataItem,
mockedCustomObjectMetadataItem,
} from '~/testing/mock-data/metadata';
import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems';
import { getMultiSelectFieldPreviewValue } from '../getMultiSelectFieldPreviewValue';
const mockedCompanyObjectMetadataItem = generatedMockObjectMetadataItems.find(
(item) => item.nameSingular === 'company',
);
const mockedOpportunityObjectMetadataItem =
generatedMockObjectMetadataItems.find(
(item) => item.nameSingular === 'opportunity',
);
describe('getMultiSelectFieldPreviewValue', () => {
it('returns null if the field is not a Multi-Select field', () => {
// Given
const fieldMetadataItem = mockedCompanyObjectMetadataItem.fields.find(
const fieldMetadataItem = mockedCompanyObjectMetadataItem?.fields.find(
({ type }) => type !== FieldMetadataType.MultiSelect,
);
@ -24,10 +29,11 @@ describe('getMultiSelectFieldPreviewValue', () => {
expect(previewValue).toBeNull();
});
const fieldName = 'priority';
const selectFieldMetadataItem = mockedCustomObjectMetadataItem.fields.find(
({ name, type }) => name === fieldName && type === FieldMetadataType.Select,
);
const fieldName = 'stage';
const selectFieldMetadataItem =
mockedOpportunityObjectMetadataItem?.fields.find(
({ name }) => name === fieldName,
);
if (!selectFieldMetadataItem) {
throw new Error(`Field '${fieldName}' not found`);
@ -52,7 +58,13 @@ describe('getMultiSelectFieldPreviewValue', () => {
});
// Then
expect(previewValue).toEqual(['MEDIUM', 'LOW']);
expect(previewValue).toEqual([
'NEW',
'SCREENING',
'MEETING',
'PROPOSAL',
'CUSTOMER',
]);
});
it("returns all option values if no defaultValue was found in the field's metadata", () => {
@ -69,7 +81,13 @@ describe('getMultiSelectFieldPreviewValue', () => {
});
// Then
expect(previewValue).toEqual(['LOW', 'MEDIUM', 'HIGH']);
expect(previewValue).toEqual([
'NEW',
'SCREENING',
'MEETING',
'PROPOSAL',
'CUSTOMER',
]);
expect(previewValue).toEqual(
fieldMetadataItemWithDefaultValue.options?.map(({ value }) => value),
);
@ -89,7 +107,13 @@ describe('getMultiSelectFieldPreviewValue', () => {
});
// Then
expect(previewValue).toEqual(['LOW', 'MEDIUM', 'HIGH']);
expect(previewValue).toEqual([
'NEW',
'SCREENING',
'MEETING',
'PROPOSAL',
'CUSTOMER',
]);
expect(previewValue).toEqual(
fieldMetadataItemWithDefaultValue.options?.map(({ value }) => value),
);

View File

@ -1,15 +1,21 @@
import { FieldMetadataType } from '~/generated-metadata/graphql';
import {
mockedCompanyObjectMetadataItem,
mockedCustomObjectMetadataItem,
} from '~/testing/mock-data/metadata';
import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems';
import { getSelectFieldPreviewValue } from '../getSelectFieldPreviewValue';
const mockedCompanyObjectMetadataItem = generatedMockObjectMetadataItems.find(
(item) => item.nameSingular === 'company',
);
const mockedOpportunityObjectMetadataItem =
generatedMockObjectMetadataItems.find(
(item) => item.nameSingular === 'opportunity',
);
describe('getSelectFieldPreviewValue', () => {
it('returns null if the field is not a Select field', () => {
// Given
const fieldMetadataItem = mockedCompanyObjectMetadataItem.fields.find(
const fieldMetadataItem = mockedCompanyObjectMetadataItem?.fields.find(
({ type }) => type !== FieldMetadataType.Select,
);
@ -24,9 +30,9 @@ describe('getSelectFieldPreviewValue', () => {
expect(previewValue).toBeNull();
});
const fieldName = 'priority';
const fieldMetadataItem = mockedCustomObjectMetadataItem.fields.find(
({ name, type }) => name === fieldName && type === FieldMetadataType.Select,
const fieldName = 'stage';
const fieldMetadataItem = mockedOpportunityObjectMetadataItem?.fields.find(
({ name }) => name === fieldName,
);
if (!fieldMetadataItem) {
@ -35,7 +41,7 @@ describe('getSelectFieldPreviewValue', () => {
it("returns the defaultValue as an option value if a valid defaultValue is found in the field's metadata", () => {
// Given
const defaultValue = "'MEDIUM'";
const defaultValue = "'NEW'";
const fieldMetadataItemWithDefaultValue = {
...fieldMetadataItem,
defaultValue,
@ -47,7 +53,7 @@ describe('getSelectFieldPreviewValue', () => {
});
// Then
expect(previewValue).toBe('MEDIUM');
expect(previewValue).toBe('NEW');
});
it("returns the first option value if no defaultValue was found in the field's metadata", () => {
@ -64,7 +70,7 @@ describe('getSelectFieldPreviewValue', () => {
});
// Then
expect(previewValue).toBe('LOW');
expect(previewValue).toBe('NEW');
expect(previewValue).toBe(
fieldMetadataItemWithDefaultValue.options?.[0]?.value,
);
@ -84,7 +90,7 @@ describe('getSelectFieldPreviewValue', () => {
});
// Then
expect(previewValue).toBe('LOW');
expect(previewValue).toBe('NEW');
expect(previewValue).toBe(
fieldMetadataItemWithDefaultValue.options?.[0]?.value,
);