Increase storybook pages coverage (#4885)
On FE: - refreshing metadata mocks - updating jest tests - fixing storybook pages coverage - fixing storybook modules coverage
This commit is contained in:
@ -4,7 +4,7 @@ import { WorkspaceMember } from '@/workspace-member/types/WorkspaceMember';
|
||||
|
||||
export const currentWorkspaceMemberState = createState<Omit<
|
||||
WorkspaceMember,
|
||||
'createdAt' | 'updatedAt' | 'userId' | 'userEmail'
|
||||
'createdAt' | 'updatedAt' | 'userId' | 'userEmail' | '__typename'
|
||||
> | null>({
|
||||
key: 'currentWorkspaceMemberState',
|
||||
defaultValue: null,
|
||||
|
||||
@ -22,7 +22,7 @@ export const getOnboardingStatus = ({
|
||||
isLoggedIn: boolean;
|
||||
currentWorkspaceMember: Omit<
|
||||
WorkspaceMember,
|
||||
'createdAt' | 'updatedAt' | 'userId' | 'userEmail'
|
||||
'createdAt' | 'updatedAt' | 'userId' | 'userEmail' | '__typename'
|
||||
> | null;
|
||||
currentWorkspace: CurrentWorkspace | null;
|
||||
isBillingEnabled?: boolean;
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
export type Company = {
|
||||
__typename: 'Company';
|
||||
id: string;
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
|
||||
@ -7,6 +7,8 @@ import { currentMobileNavigationDrawerState } from '@/navigation/states/currentM
|
||||
import { AppPath } from '@/types/AppPath';
|
||||
import { isNavigationDrawerOpenState } from '@/ui/navigation/states/isNavigationDrawerOpenState';
|
||||
import { useIsMobile } from '@/ui/utilities/responsive/hooks/useIsMobile';
|
||||
import { IconsProviderDecorator } from '~/testing/decorators/IconsProviderDecorator';
|
||||
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
|
||||
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
|
||||
|
||||
import {
|
||||
@ -50,6 +52,8 @@ type StoryArgs = AppNavigationDrawerProps & {
|
||||
const meta: Meta<StoryArgs> = {
|
||||
title: 'Modules/Navigation/AppNavigationDrawer',
|
||||
decorators: [
|
||||
IconsProviderDecorator,
|
||||
ObjectMetadataItemsDecorator,
|
||||
(Story, { args }) => (
|
||||
<MemoryRouter initialEntries={[args.routePath]}>
|
||||
<Story />
|
||||
|
||||
@ -4,6 +4,7 @@ import { within } from '@storybook/test';
|
||||
|
||||
import { ComponentWithRecoilScopeDecorator } from '~/testing/decorators/ComponentWithRecoilScopeDecorator';
|
||||
import { ComponentWithRouterDecorator } from '~/testing/decorators/ComponentWithRouterDecorator';
|
||||
import { IconsProviderDecorator } from '~/testing/decorators/IconsProviderDecorator';
|
||||
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
|
||||
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
|
||||
import { graphqlMocks } from '~/testing/graphqlMocks';
|
||||
@ -14,6 +15,7 @@ const meta: Meta<typeof ObjectMetadataNavItems> = {
|
||||
title: 'Modules/ObjectMetadata/ObjectMetadataNavItems',
|
||||
component: ObjectMetadataNavItems,
|
||||
decorators: [
|
||||
IconsProviderDecorator,
|
||||
ObjectMetadataItemsDecorator,
|
||||
ComponentWithRouterDecorator,
|
||||
ComponentWithRecoilScopeDecorator,
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
import { SafeParseSuccess } from 'zod';
|
||||
|
||||
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
||||
import { mockedCompanyObjectMetadataItem } from '@/object-record/record-field/__mocks__/fieldDefinitions';
|
||||
import { mockedCompanyObjectMetadataItem } from '~/testing/mock-data/metadata';
|
||||
|
||||
import { objectMetadataItemSchema } from '../objectMetadataItemSchema';
|
||||
|
||||
|
||||
@ -7,41 +7,27 @@ import {
|
||||
FieldSelectMetadata,
|
||||
FieldTextMetadata,
|
||||
} from '@/object-record/record-field/types/FieldMetadata';
|
||||
import { type } from 'os';
|
||||
import { FieldMetadataType } from '~/generated-metadata/graphql';
|
||||
import {
|
||||
mockedCompaniesMetadata,
|
||||
mockedCustomMetadata,
|
||||
mockedPeopleMetadata,
|
||||
} from '~/testing/mock-data/metadata';
|
||||
import { mockedCompanyObjectMetadataItem, mockedPersonObjectMetadataItem } from '~/testing/mock-data/metadata';
|
||||
;
|
||||
|
||||
export const fieldMetadataId = 'fieldMetadataId';
|
||||
|
||||
export const mockedPersonObjectMetadataItem = {
|
||||
...mockedPeopleMetadata.node,
|
||||
fields: mockedPeopleMetadata.node.fields.edges.map(({ node }) => node),
|
||||
};
|
||||
|
||||
export const mockedCompanyObjectMetadataItem = {
|
||||
...mockedCompaniesMetadata.node,
|
||||
fields: mockedCompaniesMetadata.node.fields.edges.map(({ node }) => node),
|
||||
};
|
||||
|
||||
export const mockedCustomObjectMetadataItem = {
|
||||
...mockedCustomMetadata.node,
|
||||
fields: mockedCustomMetadata.node.fields.edges.map(({ node }) => node),
|
||||
};
|
||||
|
||||
export const textfieldDefinition: FieldDefinition<FieldTextMetadata> = {
|
||||
fieldMetadataId,
|
||||
label: 'User Name',
|
||||
iconName: 'User',
|
||||
defaultValue: '',
|
||||
type: FieldMetadataType.Text,
|
||||
metadata: { placeHolder: 'John Doe', fieldName: 'userName' },
|
||||
};
|
||||
|
||||
const relationFieldMetadataItem = mockedPersonObjectMetadataItem.fields.find(
|
||||
const relationFieldMetadataItem = mockedPersonObjectMetadataItem.fields?.find(
|
||||
({ name }) => name === 'company',
|
||||
);
|
||||
|
||||
export const relationFieldDefinition = formatFieldMetadataItemAsFieldDefinition(
|
||||
{
|
||||
field: relationFieldMetadataItem!,
|
||||
@ -54,6 +40,7 @@ export const selectFieldDefinition: FieldDefinition<FieldSelectMetadata> = {
|
||||
label: 'Account Owner',
|
||||
iconName: 'iconName',
|
||||
type: FieldMetadataType.Select,
|
||||
defaultValue: null,
|
||||
metadata: {
|
||||
fieldName: 'accountOwner',
|
||||
options: [{ label: 'Elon Musk', color: 'blue', value: 'userId' }],
|
||||
@ -65,6 +52,7 @@ export const fullNameFieldDefinition: FieldDefinition<FieldFullNameMetadata> = {
|
||||
label: 'Display Name',
|
||||
iconName: 'profile',
|
||||
type: FieldMetadataType.FullName,
|
||||
defaultValue: { firstName: '', lastName: '' },
|
||||
metadata: {
|
||||
fieldName: 'displayName',
|
||||
placeHolder: 'Mr Miagi',
|
||||
@ -76,13 +64,14 @@ export const linkFieldDefinition: FieldDefinition<FieldLinkMetadata> = {
|
||||
label: 'LinkedIn URL',
|
||||
iconName: 'url',
|
||||
type: FieldMetadataType.Link,
|
||||
defaultValue: { label: '', url: ''},
|
||||
metadata: {
|
||||
fieldName: 'linkedInURL',
|
||||
placeHolder: 'https://linkedin.com/user',
|
||||
},
|
||||
};
|
||||
|
||||
const phoneFieldMetadataItem = mockedPersonObjectMetadataItem.fields.find(
|
||||
const phoneFieldMetadataItem = mockedPersonObjectMetadataItem.fields?.find(
|
||||
({ name }) => name === 'phone',
|
||||
);
|
||||
export const phoneFieldDefinition = formatFieldMetadataItemAsFieldDefinition({
|
||||
@ -95,12 +84,13 @@ export const ratingfieldDefinition: FieldDefinition<FieldRatingMetadata> = {
|
||||
label: 'Rating',
|
||||
iconName: 'iconName',
|
||||
type: FieldMetadataType.Rating,
|
||||
defaultValue: null,
|
||||
metadata: {
|
||||
fieldName: 'rating',
|
||||
},
|
||||
};
|
||||
|
||||
const booleanFieldMetadataItem = mockedCompanyObjectMetadataItem.fields.find(
|
||||
const booleanFieldMetadataItem = mockedCompanyObjectMetadataItem.fields?.find(
|
||||
({ name }) => name === 'idealCustomerProfile',
|
||||
);
|
||||
export const booleanFieldDefinition = formatFieldMetadataItemAsFieldDefinition({
|
||||
|
||||
@ -24,6 +24,29 @@ const DateFieldValueSetterEffect = ({ value }: { value: Date }) => {
|
||||
return <></>;
|
||||
};
|
||||
|
||||
type DateFieldValueGaterProps = Pick<
|
||||
DateTimeFieldInputProps,
|
||||
'onEscape' | 'onEnter' | 'onClickOutside'
|
||||
>;
|
||||
|
||||
const DateFieldValueGater = ({
|
||||
onEscape,
|
||||
onEnter,
|
||||
onClickOutside,
|
||||
}: DateFieldValueGaterProps) => {
|
||||
const { fieldValue } = useDateTimeField();
|
||||
|
||||
return (
|
||||
fieldValue && (
|
||||
<DateTimeFieldInput
|
||||
onEscape={onEscape}
|
||||
onEnter={onEnter}
|
||||
onClickOutside={onClickOutside}
|
||||
/>
|
||||
)
|
||||
);
|
||||
};
|
||||
|
||||
type DateFieldInputWithContextProps = DateTimeFieldInputProps & {
|
||||
value: Date;
|
||||
entityId?: string;
|
||||
@ -47,6 +70,7 @@ const DateFieldInputWithContext = ({
|
||||
<FieldContextProvider
|
||||
fieldDefinition={{
|
||||
fieldMetadataId: 'date',
|
||||
defaultValue: null,
|
||||
label: 'Date',
|
||||
type: FieldMetadataType.DateTime,
|
||||
iconName: 'IconCalendarEvent',
|
||||
@ -58,7 +82,7 @@ const DateFieldInputWithContext = ({
|
||||
entityId={entityId}
|
||||
>
|
||||
<DateFieldValueSetterEffect value={value} />
|
||||
<DateTimeFieldInput
|
||||
<DateFieldValueGater
|
||||
onEscape={onEscape}
|
||||
onEnter={onEnter}
|
||||
onClickOutside={onClickOutside}
|
||||
@ -102,9 +126,9 @@ type Story = StoryObj<typeof DateFieldInputWithContext>;
|
||||
export const Default: Story = {
|
||||
play: async ({ canvasElement }) => {
|
||||
const canvas = within(canvasElement);
|
||||
const div = await canvas.findByText('Feb 1, 2022');
|
||||
const div = await canvas.findByText('February - 2022');
|
||||
|
||||
await expect(div.innerText).toContain('Feb 1, 2022');
|
||||
await expect(div.innerText).toContain('February - 2022');
|
||||
},
|
||||
};
|
||||
|
||||
@ -125,7 +149,7 @@ export const Escape: Story = {
|
||||
play: async () => {
|
||||
await expect(escapeJestFn).toHaveBeenCalledTimes(0);
|
||||
|
||||
await userEvent.keyboard('{esc}');
|
||||
await userEvent.keyboard('{escape}');
|
||||
|
||||
await expect(escapeJestFn).toHaveBeenCalledTimes(1);
|
||||
},
|
||||
|
||||
@ -62,6 +62,7 @@ export const RecordDetailRelationSection = () => {
|
||||
fieldValue && isToOneObject
|
||||
? [fieldValue as ObjectRecord]
|
||||
: (fieldValue as ObjectRecord[]) ?? [];
|
||||
|
||||
const relationRecordIds = relationRecords.map(({ id }) => id);
|
||||
|
||||
const dropdownId = `record-field-card-relation-picker-${fieldDefinition.label}`;
|
||||
|
||||
@ -2,7 +2,6 @@ import { Meta, StoryObj } from '@storybook/react';
|
||||
import { ComponentDecorator } from 'twenty-ui';
|
||||
|
||||
import { formatFieldMetadataItemAsFieldDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsFieldDefinition';
|
||||
import { mockedCompanyObjectMetadataItem } from '@/object-record/record-field/__mocks__/fieldDefinitions';
|
||||
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
|
||||
import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator';
|
||||
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
|
||||
@ -10,6 +9,7 @@ import { RecordStoreDecorator } from '~/testing/decorators/RecordStoreDecorator'
|
||||
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
|
||||
import { graphqlMocks } from '~/testing/graphqlMocks';
|
||||
import { mockedCompaniesData } from '~/testing/mock-data/companies';
|
||||
import { mockedCompanyObjectMetadataItem } from '~/testing/mock-data/metadata';
|
||||
import { mockedPeopleData } from '~/testing/mock-data/people';
|
||||
|
||||
import { RecordDetailRelationSection } from '../RecordDetailRelationSection';
|
||||
@ -59,7 +59,7 @@ export const WithRecords: Story = {
|
||||
records: [
|
||||
{
|
||||
...mockedCompaniesData[0],
|
||||
people: { edges: mockedPeopleData.map((person) => ({ node: person })) },
|
||||
people: mockedPeopleData,
|
||||
},
|
||||
...mockedPeopleData,
|
||||
],
|
||||
|
||||
@ -1,7 +1,8 @@
|
||||
import { ChangeEvent } from 'react';
|
||||
import { act, renderHook } from '@testing-library/react';
|
||||
import { RecoilRoot } from 'recoil';
|
||||
import { RecoilRoot, useRecoilValue } from 'recoil';
|
||||
|
||||
import { useRelationPickerScopedStates } from '@/object-record/relation-picker/hooks/internal/useRelationPickerScopedStates';
|
||||
import { useEntitySelectSearch } from '@/object-record/relation-picker/hooks/useEntitySelectSearch';
|
||||
import { RelationPickerScopeInternalContext } from '@/object-record/relation-picker/scopes/scope-internal-context/RelationPickerScopeInternalContext';
|
||||
|
||||
@ -14,16 +15,32 @@ const Wrapper = ({ children }: { children: React.ReactNode }) => (
|
||||
|
||||
describe('useEntitySelectSearch', () => {
|
||||
it('should update searchFilter after change event', async () => {
|
||||
const { result } = renderHook(() => useEntitySelectSearch(), {
|
||||
wrapper: Wrapper,
|
||||
});
|
||||
const { result } = renderHook(
|
||||
() => {
|
||||
const entitySelectSearchHook = useEntitySelectSearch({
|
||||
relationPickerScopeId: 'relation-picker',
|
||||
});
|
||||
const relationPickerScopedStatesHook = useRelationPickerScopedStates({
|
||||
relationPickerScopedId: 'relation-picker',
|
||||
});
|
||||
const internallyStoredFilter = useRecoilValue(
|
||||
relationPickerScopedStatesHook.relationPickerSearchFilterState,
|
||||
);
|
||||
return { entitySelectSearchHook, internallyStoredFilter };
|
||||
},
|
||||
{
|
||||
wrapper: Wrapper,
|
||||
},
|
||||
);
|
||||
|
||||
const filter = 'value';
|
||||
|
||||
act(() => {
|
||||
result.current.handleSearchFilterChange({
|
||||
result.current.entitySelectSearchHook.handleSearchFilterChange({
|
||||
currentTarget: { value: filter },
|
||||
} as ChangeEvent<HTMLInputElement>);
|
||||
});
|
||||
expect(result.current.searchFilter).toBe(filter);
|
||||
|
||||
expect(result.current.internallyStoredFilter).toBe(filter);
|
||||
});
|
||||
});
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
export type Person = {
|
||||
__typename: 'Person';
|
||||
id: string;
|
||||
createdAt: string;
|
||||
updatedAt: string;
|
||||
|
||||
@ -2,10 +2,6 @@ import { Meta, StoryObj } from '@storybook/react';
|
||||
import { fn } from '@storybook/test';
|
||||
import { ComponentDecorator } from 'twenty-ui';
|
||||
|
||||
import {
|
||||
mockedCompanyObjectMetadataItem,
|
||||
mockedPersonObjectMetadataItem,
|
||||
} from '@/object-record/record-field/__mocks__/fieldDefinitions';
|
||||
import { fieldMetadataFormDefaultValues } from '@/settings/data-model/fields/forms/hooks/useFieldMetadataForm';
|
||||
import {
|
||||
FieldMetadataType,
|
||||
@ -15,6 +11,10 @@ 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,
|
||||
mockedPersonObjectMetadataItem,
|
||||
} from '~/testing/mock-data/metadata';
|
||||
|
||||
import { SettingsDataModelFieldSettingsFormCard } from '../SettingsDataModelFieldSettingsFormCard';
|
||||
|
||||
|
||||
@ -1,15 +1,15 @@
|
||||
import { Meta, StoryObj } from '@storybook/react';
|
||||
import { ComponentDecorator } from 'twenty-ui';
|
||||
|
||||
import {
|
||||
mockedCompanyObjectMetadataItem,
|
||||
mockedPersonObjectMetadataItem,
|
||||
} from '@/object-record/record-field/__mocks__/fieldDefinitions';
|
||||
import { FieldMetadataType } from '~/generated-metadata/graphql';
|
||||
import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator';
|
||||
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
|
||||
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
|
||||
import { graphqlMocks } from '~/testing/graphqlMocks';
|
||||
import {
|
||||
mockedCompanyObjectMetadataItem,
|
||||
mockedPersonObjectMetadataItem,
|
||||
} from '~/testing/mock-data/metadata';
|
||||
|
||||
import { SettingsDataModelFieldPreviewCard } from '../SettingsDataModelFieldPreviewCard';
|
||||
|
||||
|
||||
@ -3,8 +3,8 @@ import { MockedProvider } from '@apollo/client/testing';
|
||||
import { renderHook } from '@testing-library/react';
|
||||
import { RecoilRoot } from 'recoil';
|
||||
|
||||
import { mockedCompanyObjectMetadataItem } from '@/object-record/record-field/__mocks__/fieldDefinitions';
|
||||
import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope';
|
||||
import { mockedCompanyObjectMetadataItem } from '~/testing/mock-data/metadata';
|
||||
|
||||
import { useFieldPreview } from '../useFieldPreview';
|
||||
|
||||
|
||||
@ -2,9 +2,9 @@ import styled from '@emotion/styled';
|
||||
import { Meta, StoryObj } from '@storybook/react';
|
||||
import { ComponentDecorator } from 'twenty-ui';
|
||||
|
||||
import { mockedCompanyObjectMetadataItem } from '@/object-record/record-field/__mocks__/fieldDefinitions';
|
||||
import { FormProviderDecorator } from '~/testing/decorators/FormProviderDecorator';
|
||||
import { IconsProviderDecorator } from '~/testing/decorators/IconsProviderDecorator';
|
||||
import { mockedCompanyObjectMetadataItem } from '~/testing/mock-data/metadata';
|
||||
|
||||
import { SettingsDataModelObjectAboutForm } from '../SettingsDataModelObjectAboutForm';
|
||||
|
||||
|
||||
@ -1,9 +1,10 @@
|
||||
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
||||
import { SettingsObjectFieldSelectFormValues } from '@/settings/data-model/components/SettingsObjectFieldSelectForm';
|
||||
import {
|
||||
mockedCompanyObjectMetadataItem,
|
||||
mockedOpportunityObjectMetadataItem,
|
||||
mockedPersonObjectMetadataItem,
|
||||
} from '@/object-record/record-field/__mocks__/fieldDefinitions';
|
||||
import { SettingsObjectFieldSelectFormValues } from '@/settings/data-model/components/SettingsObjectFieldSelectForm';
|
||||
} from '~/testing/mock-data/metadata';
|
||||
|
||||
import { getFieldDefaultPreviewValue } from '../getFieldDefaultPreviewValue';
|
||||
|
||||
@ -11,23 +12,12 @@ describe('getFieldDefaultPreviewValue', () => {
|
||||
describe('SELECT field', () => {
|
||||
it('returns the default select option', () => {
|
||||
// Given
|
||||
const objectMetadataItem = mockedCompanyObjectMetadataItem;
|
||||
const fieldMetadataItem = mockedCompanyObjectMetadataItem.fields.find(
|
||||
({ name }) => name === 'industry',
|
||||
const objectMetadataItem = mockedOpportunityObjectMetadataItem;
|
||||
const fieldMetadataItem = mockedOpportunityObjectMetadataItem.fields.find(
|
||||
({ name }) => name === 'stage',
|
||||
)!;
|
||||
const selectOptions: SettingsObjectFieldSelectFormValues = [
|
||||
{
|
||||
color: 'purple',
|
||||
label: '🏭 Industry',
|
||||
value: 'INDUSTRY',
|
||||
},
|
||||
{
|
||||
color: 'pink',
|
||||
isDefault: true,
|
||||
label: '💊 Health',
|
||||
value: 'HEALTH',
|
||||
},
|
||||
];
|
||||
const selectOptions: SettingsObjectFieldSelectFormValues =
|
||||
fieldMetadataItem.options ?? [];
|
||||
|
||||
// When
|
||||
const result = getFieldDefaultPreviewValue({
|
||||
@ -37,27 +27,17 @@ describe('getFieldDefaultPreviewValue', () => {
|
||||
});
|
||||
|
||||
// Then
|
||||
expect(result).toEqual(selectOptions[1].value);
|
||||
expect(result).toEqual(selectOptions[0].value);
|
||||
});
|
||||
|
||||
it('returns the first select option if no default option was found', () => {
|
||||
// Given
|
||||
const objectMetadataItem = mockedCompanyObjectMetadataItem;
|
||||
const fieldMetadataItem = mockedCompanyObjectMetadataItem.fields.find(
|
||||
({ name }) => name === 'industry',
|
||||
const objectMetadataItem = mockedOpportunityObjectMetadataItem;
|
||||
const fieldMetadataItem = mockedOpportunityObjectMetadataItem.fields.find(
|
||||
({ name }) => name === 'stage',
|
||||
)!;
|
||||
const selectOptions: SettingsObjectFieldSelectFormValues = [
|
||||
{
|
||||
color: 'purple' as const,
|
||||
label: '🏭 Industry',
|
||||
value: 'INDUSTRY',
|
||||
},
|
||||
{
|
||||
color: 'pink' as const,
|
||||
label: '💊 Health',
|
||||
value: 'HEALTH',
|
||||
},
|
||||
];
|
||||
const selectOptions: SettingsObjectFieldSelectFormValues =
|
||||
fieldMetadataItem.options ?? [];
|
||||
|
||||
// When
|
||||
const result = getFieldDefaultPreviewValue({
|
||||
|
||||
@ -1,9 +1,10 @@
|
||||
import {
|
||||
mockedCompanyObjectMetadataItem,
|
||||
mockedPersonObjectMetadataItem,
|
||||
} from '@/object-record/record-field/__mocks__/fieldDefinitions';
|
||||
import { ObjectRecord } from '@/object-record/types/ObjectRecord';
|
||||
import { SettingsObjectFieldSelectFormValues } from '@/settings/data-model/components/SettingsObjectFieldSelectForm';
|
||||
import {
|
||||
mockedCompanyObjectMetadataItem,
|
||||
mockedOpportunityObjectMetadataItem,
|
||||
mockedPersonObjectMetadataItem,
|
||||
} from '~/testing/mock-data/metadata';
|
||||
|
||||
import { getFieldPreviewValueFromRecord } from '../getFieldPreviewValueFromRecord';
|
||||
|
||||
@ -11,28 +12,12 @@ describe('getFieldPreviewValueFromRecord', () => {
|
||||
describe('SELECT field', () => {
|
||||
it('returns the select option corresponding to the record field value', () => {
|
||||
// Given
|
||||
const record: ObjectRecord = { id: '', industry: 'GREEN_TECH' };
|
||||
const fieldMetadataItem = mockedCompanyObjectMetadataItem.fields.find(
|
||||
({ name }) => name === 'industry',
|
||||
const record: ObjectRecord = { id: '', stage: 'MEETING' };
|
||||
const fieldMetadataItem = mockedOpportunityObjectMetadataItem.fields.find(
|
||||
({ name }) => name === 'stage',
|
||||
)!;
|
||||
const selectOptions: SettingsObjectFieldSelectFormValues = [
|
||||
{
|
||||
color: 'purple',
|
||||
label: '🏭 Industry',
|
||||
value: 'INDUSTRY',
|
||||
},
|
||||
{
|
||||
color: 'pink',
|
||||
isDefault: true,
|
||||
label: '💊 Health',
|
||||
value: 'HEALTH',
|
||||
},
|
||||
{
|
||||
color: 'turquoise',
|
||||
label: '🌿 Green tech',
|
||||
value: 'GREEN_TECH',
|
||||
},
|
||||
];
|
||||
const selectOptions: SettingsObjectFieldSelectFormValues =
|
||||
fieldMetadataItem.options ?? [];
|
||||
|
||||
// When
|
||||
const result = getFieldPreviewValueFromRecord({
|
||||
@ -47,28 +32,12 @@ describe('getFieldPreviewValueFromRecord', () => {
|
||||
|
||||
it('returns undefined if the select option was not found', () => {
|
||||
// Given
|
||||
const record: ObjectRecord = { id: '', industry: 'MOBILITY' };
|
||||
const fieldMetadataItem = mockedCompanyObjectMetadataItem.fields.find(
|
||||
({ name }) => name === 'industry',
|
||||
const record: ObjectRecord = { id: '', industry: 'DOES_NOT_EXIST' };
|
||||
const fieldMetadataItem = mockedOpportunityObjectMetadataItem.fields.find(
|
||||
({ name }) => name === 'stage',
|
||||
)!;
|
||||
const selectOptions: SettingsObjectFieldSelectFormValues = [
|
||||
{
|
||||
color: 'purple',
|
||||
label: '🏭 Industry',
|
||||
value: 'INDUSTRY',
|
||||
},
|
||||
{
|
||||
color: 'pink',
|
||||
isDefault: true,
|
||||
label: '💊 Health',
|
||||
value: 'HEALTH',
|
||||
},
|
||||
{
|
||||
color: 'turquoise',
|
||||
label: '🌿 Green tech',
|
||||
value: 'GREEN_TECH',
|
||||
},
|
||||
];
|
||||
const selectOptions: SettingsObjectFieldSelectFormValues =
|
||||
fieldMetadataItem.options ?? [];
|
||||
|
||||
// When
|
||||
const result = getFieldPreviewValueFromRecord({
|
||||
|
||||
@ -60,7 +60,11 @@ export const MonthAndYearDropdown = ({
|
||||
}}
|
||||
dropdownPlacement="bottom-start"
|
||||
clickableComponent={
|
||||
<LightIconButton Icon={IconCalendarDue} size="medium" />
|
||||
<LightIconButton
|
||||
testId="month-and-year-dropdown"
|
||||
Icon={IconCalendarDue}
|
||||
size="medium"
|
||||
/>
|
||||
}
|
||||
dropdownComponents={
|
||||
<DropdownMenuItemsContainer>
|
||||
|
||||
@ -23,11 +23,16 @@ export const WithOpenMonthSelect: Story = {
|
||||
play: async ({ canvasElement }) => {
|
||||
const canvas = within(canvasElement);
|
||||
|
||||
const monthSelect = canvas.getByText('January');
|
||||
const monthAndYearButton = await canvas.findByTestId(
|
||||
'month-and-year-dropdown',
|
||||
);
|
||||
|
||||
await userEvent.click(monthAndYearButton);
|
||||
|
||||
const monthSelect = await canvas.findByText('January');
|
||||
|
||||
await userEvent.click(monthSelect);
|
||||
|
||||
expect(canvas.getAllByText('January')).toHaveLength(2);
|
||||
[
|
||||
'February',
|
||||
'March',
|
||||
|
||||
@ -1,54 +0,0 @@
|
||||
import { MemoryRouter } from 'react-router-dom';
|
||||
import { MockedProvider } from '@apollo/client/testing';
|
||||
import { RecoilRoot } from 'recoil';
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
|
||||
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
||||
import { generateDeleteOneRecordMutation } from '@/object-record/utils/generateDeleteOneRecordMutation';
|
||||
import { ViewScope } from '@/views/scopes/ViewScope';
|
||||
|
||||
const mockedUuid = 'mocked-uuid';
|
||||
jest.mock('uuid');
|
||||
|
||||
(uuidv4 as jest.Mock).mockReturnValue(mockedUuid);
|
||||
|
||||
const mocks = [
|
||||
{
|
||||
request: {
|
||||
query: generateDeleteOneRecordMutation({
|
||||
objectMetadataItem: { nameSingular: 'view' } as ObjectMetadataItem,
|
||||
}),
|
||||
variables: { idToDelete: mockedUuid },
|
||||
},
|
||||
result: jest.fn(() => ({
|
||||
data: { deleteView: { id: '' } },
|
||||
})),
|
||||
},
|
||||
];
|
||||
|
||||
const Wrapper = ({ children }: { children: React.ReactNode }) => (
|
||||
<MemoryRouter
|
||||
initialEntries={['/one', '/two', { pathname: '/three' }]}
|
||||
initialIndex={1}
|
||||
>
|
||||
<MockedProvider mocks={mocks} addTypename={false}>
|
||||
<RecoilRoot>
|
||||
<ViewScope viewScopeId="viewScopeId" onCurrentViewChange={() => {}}>
|
||||
{children}
|
||||
</ViewScope>
|
||||
</RecoilRoot>
|
||||
</MockedProvider>
|
||||
</MemoryRouter>
|
||||
);
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
const _renderHookConfig = {
|
||||
wrapper: Wrapper,
|
||||
};
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
const _viewBarId = 'viewBarTestId';
|
||||
|
||||
describe('useViewBar', () => {
|
||||
it('should set and get current view Id', () => {});
|
||||
});
|
||||
@ -1,6 +1,7 @@
|
||||
export type ColorScheme = 'Dark' | 'Light' | 'System';
|
||||
|
||||
export type WorkspaceMember = {
|
||||
__typename: 'WorkspaceMember';
|
||||
id: string;
|
||||
name: {
|
||||
firstName: string;
|
||||
|
||||
Reference in New Issue
Block a user