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:
@ -5,6 +5,7 @@ module.exports = {
|
|||||||
'node_modules',
|
'node_modules',
|
||||||
'mockServiceWorker.js',
|
'mockServiceWorker.js',
|
||||||
'**/generated*/*',
|
'**/generated*/*',
|
||||||
|
'**/generated/standard-metadata-query-result.ts',
|
||||||
'tsup.config.ts',
|
'tsup.config.ts',
|
||||||
'build',
|
'build',
|
||||||
'coverage',
|
'coverage',
|
||||||
|
|||||||
@ -14,8 +14,8 @@ const modulesCoverage = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const pagesCoverage = {
|
const pagesCoverage = {
|
||||||
statements: 55,
|
statements: 60,
|
||||||
lines: 55,
|
lines: 60,
|
||||||
functions: 45,
|
functions: 45,
|
||||||
exclude: ['src/generated/**/*', 'src/modules/**/*', 'src/**/*.ts'],
|
exclude: ['src/generated/**/*', 'src/modules/**/*', 'src/**/*.ts'],
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,14 +1,23 @@
|
|||||||
import { HelmetProvider } from 'react-helmet-async';
|
import { HelmetProvider } from 'react-helmet-async';
|
||||||
|
import { getOperationName } from '@apollo/client/utilities';
|
||||||
import { Meta, StoryObj } from '@storybook/react';
|
import { Meta, StoryObj } from '@storybook/react';
|
||||||
|
import { graphql, HttpResponse } from 'msw';
|
||||||
|
import { IconsProvider } from 'twenty-ui';
|
||||||
|
|
||||||
import { ClientConfigProvider } from '@/client-config/components/ClientConfigProvider';
|
import { ClientConfigProvider } from '@/client-config/components/ClientConfigProvider';
|
||||||
|
import { ClientConfigProviderEffect } from '@/client-config/components/ClientConfigProviderEffect';
|
||||||
import { ObjectMetadataItemsProvider } from '@/object-metadata/components/ObjectMetadataItemsProvider';
|
import { ObjectMetadataItemsProvider } from '@/object-metadata/components/ObjectMetadataItemsProvider';
|
||||||
|
import { SnackBarProvider } from '@/ui/feedback/snack-bar-manager/components/SnackBarProvider';
|
||||||
import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope';
|
import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope';
|
||||||
|
import { AppThemeProvider } from '@/ui/theme/components/AppThemeProvider';
|
||||||
import { UserProvider } from '@/users/components/UserProvider';
|
import { UserProvider } from '@/users/components/UserProvider';
|
||||||
|
import { UserProviderEffect } from '@/users/components/UserProviderEffect';
|
||||||
|
import { GET_CURRENT_USER } from '@/users/graphql/queries/getCurrentUser';
|
||||||
import { App } from '~/App';
|
import { App } from '~/App';
|
||||||
import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator';
|
import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator';
|
||||||
import { FullHeightStorybookLayout } from '~/testing/FullHeightStorybookLayout';
|
import { FullHeightStorybookLayout } from '~/testing/FullHeightStorybookLayout';
|
||||||
import { graphqlMocks } from '~/testing/graphqlMocks';
|
import { graphqlMocks } from '~/testing/graphqlMocks';
|
||||||
|
import { mockedUsersData } from '~/testing/mock-data/users';
|
||||||
|
|
||||||
const meta: Meta<typeof App> = {
|
const meta: Meta<typeof App> = {
|
||||||
title: 'App/App',
|
title: 'App/App',
|
||||||
@ -16,19 +25,33 @@ const meta: Meta<typeof App> = {
|
|||||||
decorators: [
|
decorators: [
|
||||||
MemoryRouterDecorator,
|
MemoryRouterDecorator,
|
||||||
(Story) => (
|
(Story) => (
|
||||||
<ClientConfigProvider>
|
<>
|
||||||
<UserProvider>
|
<SnackBarProviderScope snackBarManagerScopeId="snack-bar-manager">
|
||||||
<FullHeightStorybookLayout>
|
<ClientConfigProviderEffect />
|
||||||
<HelmetProvider>
|
<ClientConfigProvider>
|
||||||
<SnackBarProviderScope snackBarManagerScopeId="snack-bar-manager">
|
<UserProviderEffect />
|
||||||
|
<UserProvider>
|
||||||
|
<FullHeightStorybookLayout>
|
||||||
<ObjectMetadataItemsProvider>
|
<ObjectMetadataItemsProvider>
|
||||||
<Story />
|
<IconsProvider>
|
||||||
|
<HelmetProvider>
|
||||||
|
<SnackBarProvider>
|
||||||
|
<AppThemeProvider>
|
||||||
|
<SnackBarProviderScope snackBarManagerScopeId="snack-bar-manager">
|
||||||
|
<ObjectMetadataItemsProvider>
|
||||||
|
<Story />
|
||||||
|
</ObjectMetadataItemsProvider>
|
||||||
|
</SnackBarProviderScope>
|
||||||
|
</AppThemeProvider>
|
||||||
|
</SnackBarProvider>
|
||||||
|
</HelmetProvider>
|
||||||
|
</IconsProvider>
|
||||||
</ObjectMetadataItemsProvider>
|
</ObjectMetadataItemsProvider>
|
||||||
</SnackBarProviderScope>
|
</FullHeightStorybookLayout>
|
||||||
</HelmetProvider>
|
</UserProvider>
|
||||||
</FullHeightStorybookLayout>
|
</ClientConfigProvider>
|
||||||
</UserProvider>
|
</SnackBarProviderScope>
|
||||||
</ClientConfigProvider>
|
</>
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
parameters: {
|
parameters: {
|
||||||
@ -43,8 +66,25 @@ export const Default: Story = {};
|
|||||||
|
|
||||||
export const DarkMode: Story = {
|
export const DarkMode: Story = {
|
||||||
parameters: {
|
parameters: {
|
||||||
theming: {
|
msw: {
|
||||||
themeOverride: 'dark',
|
handlers: [
|
||||||
|
...graphqlMocks.handlers.filter((handler) => {
|
||||||
|
return (handler.info as any).operationName !== 'GetCurrentUser';
|
||||||
|
}),
|
||||||
|
graphql.query(getOperationName(GET_CURRENT_USER) ?? '', () => {
|
||||||
|
return HttpResponse.json({
|
||||||
|
data: {
|
||||||
|
currentUser: {
|
||||||
|
...mockedUsersData[0],
|
||||||
|
workspaceMember: {
|
||||||
|
...mockedUsersData[0].workspaceMember,
|
||||||
|
colorScheme: 'Dark',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import { WorkspaceMember } from '@/workspace-member/types/WorkspaceMember';
|
|||||||
|
|
||||||
export const currentWorkspaceMemberState = createState<Omit<
|
export const currentWorkspaceMemberState = createState<Omit<
|
||||||
WorkspaceMember,
|
WorkspaceMember,
|
||||||
'createdAt' | 'updatedAt' | 'userId' | 'userEmail'
|
'createdAt' | 'updatedAt' | 'userId' | 'userEmail' | '__typename'
|
||||||
> | null>({
|
> | null>({
|
||||||
key: 'currentWorkspaceMemberState',
|
key: 'currentWorkspaceMemberState',
|
||||||
defaultValue: null,
|
defaultValue: null,
|
||||||
|
|||||||
@ -22,7 +22,7 @@ export const getOnboardingStatus = ({
|
|||||||
isLoggedIn: boolean;
|
isLoggedIn: boolean;
|
||||||
currentWorkspaceMember: Omit<
|
currentWorkspaceMember: Omit<
|
||||||
WorkspaceMember,
|
WorkspaceMember,
|
||||||
'createdAt' | 'updatedAt' | 'userId' | 'userEmail'
|
'createdAt' | 'updatedAt' | 'userId' | 'userEmail' | '__typename'
|
||||||
> | null;
|
> | null;
|
||||||
currentWorkspace: CurrentWorkspace | null;
|
currentWorkspace: CurrentWorkspace | null;
|
||||||
isBillingEnabled?: boolean;
|
isBillingEnabled?: boolean;
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
export type Company = {
|
export type Company = {
|
||||||
|
__typename: 'Company';
|
||||||
id: string;
|
id: string;
|
||||||
createdAt: string;
|
createdAt: string;
|
||||||
updatedAt: string;
|
updatedAt: string;
|
||||||
|
|||||||
@ -7,6 +7,8 @@ import { currentMobileNavigationDrawerState } from '@/navigation/states/currentM
|
|||||||
import { AppPath } from '@/types/AppPath';
|
import { AppPath } from '@/types/AppPath';
|
||||||
import { isNavigationDrawerOpenState } from '@/ui/navigation/states/isNavigationDrawerOpenState';
|
import { isNavigationDrawerOpenState } from '@/ui/navigation/states/isNavigationDrawerOpenState';
|
||||||
import { useIsMobile } from '@/ui/utilities/responsive/hooks/useIsMobile';
|
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 { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
@ -50,6 +52,8 @@ type StoryArgs = AppNavigationDrawerProps & {
|
|||||||
const meta: Meta<StoryArgs> = {
|
const meta: Meta<StoryArgs> = {
|
||||||
title: 'Modules/Navigation/AppNavigationDrawer',
|
title: 'Modules/Navigation/AppNavigationDrawer',
|
||||||
decorators: [
|
decorators: [
|
||||||
|
IconsProviderDecorator,
|
||||||
|
ObjectMetadataItemsDecorator,
|
||||||
(Story, { args }) => (
|
(Story, { args }) => (
|
||||||
<MemoryRouter initialEntries={[args.routePath]}>
|
<MemoryRouter initialEntries={[args.routePath]}>
|
||||||
<Story />
|
<Story />
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import { within } from '@storybook/test';
|
|||||||
|
|
||||||
import { ComponentWithRecoilScopeDecorator } from '~/testing/decorators/ComponentWithRecoilScopeDecorator';
|
import { ComponentWithRecoilScopeDecorator } from '~/testing/decorators/ComponentWithRecoilScopeDecorator';
|
||||||
import { ComponentWithRouterDecorator } from '~/testing/decorators/ComponentWithRouterDecorator';
|
import { ComponentWithRouterDecorator } from '~/testing/decorators/ComponentWithRouterDecorator';
|
||||||
|
import { IconsProviderDecorator } from '~/testing/decorators/IconsProviderDecorator';
|
||||||
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
|
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
|
||||||
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
|
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
|
||||||
import { graphqlMocks } from '~/testing/graphqlMocks';
|
import { graphqlMocks } from '~/testing/graphqlMocks';
|
||||||
@ -14,6 +15,7 @@ const meta: Meta<typeof ObjectMetadataNavItems> = {
|
|||||||
title: 'Modules/ObjectMetadata/ObjectMetadataNavItems',
|
title: 'Modules/ObjectMetadata/ObjectMetadataNavItems',
|
||||||
component: ObjectMetadataNavItems,
|
component: ObjectMetadataNavItems,
|
||||||
decorators: [
|
decorators: [
|
||||||
|
IconsProviderDecorator,
|
||||||
ObjectMetadataItemsDecorator,
|
ObjectMetadataItemsDecorator,
|
||||||
ComponentWithRouterDecorator,
|
ComponentWithRouterDecorator,
|
||||||
ComponentWithRecoilScopeDecorator,
|
ComponentWithRecoilScopeDecorator,
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import { SafeParseSuccess } from 'zod';
|
import { SafeParseSuccess } from 'zod';
|
||||||
|
|
||||||
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
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';
|
import { objectMetadataItemSchema } from '../objectMetadataItemSchema';
|
||||||
|
|
||||||
|
|||||||
@ -7,41 +7,27 @@ import {
|
|||||||
FieldSelectMetadata,
|
FieldSelectMetadata,
|
||||||
FieldTextMetadata,
|
FieldTextMetadata,
|
||||||
} from '@/object-record/record-field/types/FieldMetadata';
|
} from '@/object-record/record-field/types/FieldMetadata';
|
||||||
|
import { type } from 'os';
|
||||||
import { FieldMetadataType } from '~/generated-metadata/graphql';
|
import { FieldMetadataType } from '~/generated-metadata/graphql';
|
||||||
import {
|
import { mockedCompanyObjectMetadataItem, mockedPersonObjectMetadataItem } from '~/testing/mock-data/metadata';
|
||||||
mockedCompaniesMetadata,
|
;
|
||||||
mockedCustomMetadata,
|
|
||||||
mockedPeopleMetadata,
|
|
||||||
} from '~/testing/mock-data/metadata';
|
|
||||||
|
|
||||||
export const fieldMetadataId = 'fieldMetadataId';
|
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> = {
|
export const textfieldDefinition: FieldDefinition<FieldTextMetadata> = {
|
||||||
fieldMetadataId,
|
fieldMetadataId,
|
||||||
label: 'User Name',
|
label: 'User Name',
|
||||||
iconName: 'User',
|
iconName: 'User',
|
||||||
|
defaultValue: '',
|
||||||
type: FieldMetadataType.Text,
|
type: FieldMetadataType.Text,
|
||||||
metadata: { placeHolder: 'John Doe', fieldName: 'userName' },
|
metadata: { placeHolder: 'John Doe', fieldName: 'userName' },
|
||||||
};
|
};
|
||||||
|
|
||||||
const relationFieldMetadataItem = mockedPersonObjectMetadataItem.fields.find(
|
const relationFieldMetadataItem = mockedPersonObjectMetadataItem.fields?.find(
|
||||||
({ name }) => name === 'company',
|
({ name }) => name === 'company',
|
||||||
);
|
);
|
||||||
|
|
||||||
export const relationFieldDefinition = formatFieldMetadataItemAsFieldDefinition(
|
export const relationFieldDefinition = formatFieldMetadataItemAsFieldDefinition(
|
||||||
{
|
{
|
||||||
field: relationFieldMetadataItem!,
|
field: relationFieldMetadataItem!,
|
||||||
@ -54,6 +40,7 @@ export const selectFieldDefinition: FieldDefinition<FieldSelectMetadata> = {
|
|||||||
label: 'Account Owner',
|
label: 'Account Owner',
|
||||||
iconName: 'iconName',
|
iconName: 'iconName',
|
||||||
type: FieldMetadataType.Select,
|
type: FieldMetadataType.Select,
|
||||||
|
defaultValue: null,
|
||||||
metadata: {
|
metadata: {
|
||||||
fieldName: 'accountOwner',
|
fieldName: 'accountOwner',
|
||||||
options: [{ label: 'Elon Musk', color: 'blue', value: 'userId' }],
|
options: [{ label: 'Elon Musk', color: 'blue', value: 'userId' }],
|
||||||
@ -65,6 +52,7 @@ export const fullNameFieldDefinition: FieldDefinition<FieldFullNameMetadata> = {
|
|||||||
label: 'Display Name',
|
label: 'Display Name',
|
||||||
iconName: 'profile',
|
iconName: 'profile',
|
||||||
type: FieldMetadataType.FullName,
|
type: FieldMetadataType.FullName,
|
||||||
|
defaultValue: { firstName: '', lastName: '' },
|
||||||
metadata: {
|
metadata: {
|
||||||
fieldName: 'displayName',
|
fieldName: 'displayName',
|
||||||
placeHolder: 'Mr Miagi',
|
placeHolder: 'Mr Miagi',
|
||||||
@ -76,13 +64,14 @@ export const linkFieldDefinition: FieldDefinition<FieldLinkMetadata> = {
|
|||||||
label: 'LinkedIn URL',
|
label: 'LinkedIn URL',
|
||||||
iconName: 'url',
|
iconName: 'url',
|
||||||
type: FieldMetadataType.Link,
|
type: FieldMetadataType.Link,
|
||||||
|
defaultValue: { label: '', url: ''},
|
||||||
metadata: {
|
metadata: {
|
||||||
fieldName: 'linkedInURL',
|
fieldName: 'linkedInURL',
|
||||||
placeHolder: 'https://linkedin.com/user',
|
placeHolder: 'https://linkedin.com/user',
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
const phoneFieldMetadataItem = mockedPersonObjectMetadataItem.fields.find(
|
const phoneFieldMetadataItem = mockedPersonObjectMetadataItem.fields?.find(
|
||||||
({ name }) => name === 'phone',
|
({ name }) => name === 'phone',
|
||||||
);
|
);
|
||||||
export const phoneFieldDefinition = formatFieldMetadataItemAsFieldDefinition({
|
export const phoneFieldDefinition = formatFieldMetadataItemAsFieldDefinition({
|
||||||
@ -95,12 +84,13 @@ export const ratingfieldDefinition: FieldDefinition<FieldRatingMetadata> = {
|
|||||||
label: 'Rating',
|
label: 'Rating',
|
||||||
iconName: 'iconName',
|
iconName: 'iconName',
|
||||||
type: FieldMetadataType.Rating,
|
type: FieldMetadataType.Rating,
|
||||||
|
defaultValue: null,
|
||||||
metadata: {
|
metadata: {
|
||||||
fieldName: 'rating',
|
fieldName: 'rating',
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
const booleanFieldMetadataItem = mockedCompanyObjectMetadataItem.fields.find(
|
const booleanFieldMetadataItem = mockedCompanyObjectMetadataItem.fields?.find(
|
||||||
({ name }) => name === 'idealCustomerProfile',
|
({ name }) => name === 'idealCustomerProfile',
|
||||||
);
|
);
|
||||||
export const booleanFieldDefinition = formatFieldMetadataItemAsFieldDefinition({
|
export const booleanFieldDefinition = formatFieldMetadataItemAsFieldDefinition({
|
||||||
|
|||||||
@ -24,6 +24,29 @@ const DateFieldValueSetterEffect = ({ value }: { value: Date }) => {
|
|||||||
return <></>;
|
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 & {
|
type DateFieldInputWithContextProps = DateTimeFieldInputProps & {
|
||||||
value: Date;
|
value: Date;
|
||||||
entityId?: string;
|
entityId?: string;
|
||||||
@ -47,6 +70,7 @@ const DateFieldInputWithContext = ({
|
|||||||
<FieldContextProvider
|
<FieldContextProvider
|
||||||
fieldDefinition={{
|
fieldDefinition={{
|
||||||
fieldMetadataId: 'date',
|
fieldMetadataId: 'date',
|
||||||
|
defaultValue: null,
|
||||||
label: 'Date',
|
label: 'Date',
|
||||||
type: FieldMetadataType.DateTime,
|
type: FieldMetadataType.DateTime,
|
||||||
iconName: 'IconCalendarEvent',
|
iconName: 'IconCalendarEvent',
|
||||||
@ -58,7 +82,7 @@ const DateFieldInputWithContext = ({
|
|||||||
entityId={entityId}
|
entityId={entityId}
|
||||||
>
|
>
|
||||||
<DateFieldValueSetterEffect value={value} />
|
<DateFieldValueSetterEffect value={value} />
|
||||||
<DateTimeFieldInput
|
<DateFieldValueGater
|
||||||
onEscape={onEscape}
|
onEscape={onEscape}
|
||||||
onEnter={onEnter}
|
onEnter={onEnter}
|
||||||
onClickOutside={onClickOutside}
|
onClickOutside={onClickOutside}
|
||||||
@ -102,9 +126,9 @@ type Story = StoryObj<typeof DateFieldInputWithContext>;
|
|||||||
export const Default: Story = {
|
export const Default: Story = {
|
||||||
play: async ({ canvasElement }) => {
|
play: async ({ canvasElement }) => {
|
||||||
const canvas = within(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 () => {
|
play: async () => {
|
||||||
await expect(escapeJestFn).toHaveBeenCalledTimes(0);
|
await expect(escapeJestFn).toHaveBeenCalledTimes(0);
|
||||||
|
|
||||||
await userEvent.keyboard('{esc}');
|
await userEvent.keyboard('{escape}');
|
||||||
|
|
||||||
await expect(escapeJestFn).toHaveBeenCalledTimes(1);
|
await expect(escapeJestFn).toHaveBeenCalledTimes(1);
|
||||||
},
|
},
|
||||||
|
|||||||
@ -62,6 +62,7 @@ export const RecordDetailRelationSection = () => {
|
|||||||
fieldValue && isToOneObject
|
fieldValue && isToOneObject
|
||||||
? [fieldValue as ObjectRecord]
|
? [fieldValue as ObjectRecord]
|
||||||
: (fieldValue as ObjectRecord[]) ?? [];
|
: (fieldValue as ObjectRecord[]) ?? [];
|
||||||
|
|
||||||
const relationRecordIds = relationRecords.map(({ id }) => id);
|
const relationRecordIds = relationRecords.map(({ id }) => id);
|
||||||
|
|
||||||
const dropdownId = `record-field-card-relation-picker-${fieldDefinition.label}`;
|
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 { ComponentDecorator } from 'twenty-ui';
|
||||||
|
|
||||||
import { formatFieldMetadataItemAsFieldDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsFieldDefinition';
|
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 { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
|
||||||
import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator';
|
import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator';
|
||||||
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
|
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
|
||||||
@ -10,6 +9,7 @@ import { RecordStoreDecorator } from '~/testing/decorators/RecordStoreDecorator'
|
|||||||
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
|
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
|
||||||
import { graphqlMocks } from '~/testing/graphqlMocks';
|
import { graphqlMocks } from '~/testing/graphqlMocks';
|
||||||
import { mockedCompaniesData } from '~/testing/mock-data/companies';
|
import { mockedCompaniesData } from '~/testing/mock-data/companies';
|
||||||
|
import { mockedCompanyObjectMetadataItem } from '~/testing/mock-data/metadata';
|
||||||
import { mockedPeopleData } from '~/testing/mock-data/people';
|
import { mockedPeopleData } from '~/testing/mock-data/people';
|
||||||
|
|
||||||
import { RecordDetailRelationSection } from '../RecordDetailRelationSection';
|
import { RecordDetailRelationSection } from '../RecordDetailRelationSection';
|
||||||
@ -59,7 +59,7 @@ export const WithRecords: Story = {
|
|||||||
records: [
|
records: [
|
||||||
{
|
{
|
||||||
...mockedCompaniesData[0],
|
...mockedCompaniesData[0],
|
||||||
people: { edges: mockedPeopleData.map((person) => ({ node: person })) },
|
people: mockedPeopleData,
|
||||||
},
|
},
|
||||||
...mockedPeopleData,
|
...mockedPeopleData,
|
||||||
],
|
],
|
||||||
|
|||||||
@ -1,7 +1,8 @@
|
|||||||
import { ChangeEvent } from 'react';
|
import { ChangeEvent } from 'react';
|
||||||
import { act, renderHook } from '@testing-library/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 { useEntitySelectSearch } from '@/object-record/relation-picker/hooks/useEntitySelectSearch';
|
||||||
import { RelationPickerScopeInternalContext } from '@/object-record/relation-picker/scopes/scope-internal-context/RelationPickerScopeInternalContext';
|
import { RelationPickerScopeInternalContext } from '@/object-record/relation-picker/scopes/scope-internal-context/RelationPickerScopeInternalContext';
|
||||||
|
|
||||||
@ -14,16 +15,32 @@ const Wrapper = ({ children }: { children: React.ReactNode }) => (
|
|||||||
|
|
||||||
describe('useEntitySelectSearch', () => {
|
describe('useEntitySelectSearch', () => {
|
||||||
it('should update searchFilter after change event', async () => {
|
it('should update searchFilter after change event', async () => {
|
||||||
const { result } = renderHook(() => useEntitySelectSearch(), {
|
const { result } = renderHook(
|
||||||
wrapper: Wrapper,
|
() => {
|
||||||
});
|
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';
|
const filter = 'value';
|
||||||
|
|
||||||
act(() => {
|
act(() => {
|
||||||
result.current.handleSearchFilterChange({
|
result.current.entitySelectSearchHook.handleSearchFilterChange({
|
||||||
currentTarget: { value: filter },
|
currentTarget: { value: filter },
|
||||||
} as ChangeEvent<HTMLInputElement>);
|
} as ChangeEvent<HTMLInputElement>);
|
||||||
});
|
});
|
||||||
expect(result.current.searchFilter).toBe(filter);
|
|
||||||
|
expect(result.current.internallyStoredFilter).toBe(filter);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
export type Person = {
|
export type Person = {
|
||||||
|
__typename: 'Person';
|
||||||
id: string;
|
id: string;
|
||||||
createdAt: string;
|
createdAt: string;
|
||||||
updatedAt: string;
|
updatedAt: string;
|
||||||
|
|||||||
@ -2,10 +2,6 @@ import { Meta, StoryObj } from '@storybook/react';
|
|||||||
import { fn } from '@storybook/test';
|
import { fn } from '@storybook/test';
|
||||||
import { ComponentDecorator } from 'twenty-ui';
|
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 { fieldMetadataFormDefaultValues } from '@/settings/data-model/fields/forms/hooks/useFieldMetadataForm';
|
||||||
import {
|
import {
|
||||||
FieldMetadataType,
|
FieldMetadataType,
|
||||||
@ -15,6 +11,10 @@ import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorato
|
|||||||
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
|
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
|
||||||
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
|
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
|
||||||
import { graphqlMocks } from '~/testing/graphqlMocks';
|
import { graphqlMocks } from '~/testing/graphqlMocks';
|
||||||
|
import {
|
||||||
|
mockedCompanyObjectMetadataItem,
|
||||||
|
mockedPersonObjectMetadataItem,
|
||||||
|
} from '~/testing/mock-data/metadata';
|
||||||
|
|
||||||
import { SettingsDataModelFieldSettingsFormCard } from '../SettingsDataModelFieldSettingsFormCard';
|
import { SettingsDataModelFieldSettingsFormCard } from '../SettingsDataModelFieldSettingsFormCard';
|
||||||
|
|
||||||
|
|||||||
@ -1,15 +1,15 @@
|
|||||||
import { Meta, StoryObj } from '@storybook/react';
|
import { Meta, StoryObj } from '@storybook/react';
|
||||||
import { ComponentDecorator } from 'twenty-ui';
|
import { ComponentDecorator } from 'twenty-ui';
|
||||||
|
|
||||||
import {
|
|
||||||
mockedCompanyObjectMetadataItem,
|
|
||||||
mockedPersonObjectMetadataItem,
|
|
||||||
} from '@/object-record/record-field/__mocks__/fieldDefinitions';
|
|
||||||
import { FieldMetadataType } from '~/generated-metadata/graphql';
|
import { FieldMetadataType } from '~/generated-metadata/graphql';
|
||||||
import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator';
|
import { MemoryRouterDecorator } from '~/testing/decorators/MemoryRouterDecorator';
|
||||||
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
|
import { ObjectMetadataItemsDecorator } from '~/testing/decorators/ObjectMetadataItemsDecorator';
|
||||||
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
|
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
|
||||||
import { graphqlMocks } from '~/testing/graphqlMocks';
|
import { graphqlMocks } from '~/testing/graphqlMocks';
|
||||||
|
import {
|
||||||
|
mockedCompanyObjectMetadataItem,
|
||||||
|
mockedPersonObjectMetadataItem,
|
||||||
|
} from '~/testing/mock-data/metadata';
|
||||||
|
|
||||||
import { SettingsDataModelFieldPreviewCard } from '../SettingsDataModelFieldPreviewCard';
|
import { SettingsDataModelFieldPreviewCard } from '../SettingsDataModelFieldPreviewCard';
|
||||||
|
|
||||||
|
|||||||
@ -3,8 +3,8 @@ import { MockedProvider } from '@apollo/client/testing';
|
|||||||
import { renderHook } from '@testing-library/react';
|
import { renderHook } from '@testing-library/react';
|
||||||
import { RecoilRoot } from 'recoil';
|
import { RecoilRoot } from 'recoil';
|
||||||
|
|
||||||
import { mockedCompanyObjectMetadataItem } from '@/object-record/record-field/__mocks__/fieldDefinitions';
|
|
||||||
import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope';
|
import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope';
|
||||||
|
import { mockedCompanyObjectMetadataItem } from '~/testing/mock-data/metadata';
|
||||||
|
|
||||||
import { useFieldPreview } from '../useFieldPreview';
|
import { useFieldPreview } from '../useFieldPreview';
|
||||||
|
|
||||||
|
|||||||
@ -2,9 +2,9 @@ import styled from '@emotion/styled';
|
|||||||
import { Meta, StoryObj } from '@storybook/react';
|
import { Meta, StoryObj } from '@storybook/react';
|
||||||
import { ComponentDecorator } from 'twenty-ui';
|
import { ComponentDecorator } from 'twenty-ui';
|
||||||
|
|
||||||
import { mockedCompanyObjectMetadataItem } from '@/object-record/record-field/__mocks__/fieldDefinitions';
|
|
||||||
import { FormProviderDecorator } from '~/testing/decorators/FormProviderDecorator';
|
import { FormProviderDecorator } from '~/testing/decorators/FormProviderDecorator';
|
||||||
import { IconsProviderDecorator } from '~/testing/decorators/IconsProviderDecorator';
|
import { IconsProviderDecorator } from '~/testing/decorators/IconsProviderDecorator';
|
||||||
|
import { mockedCompanyObjectMetadataItem } from '~/testing/mock-data/metadata';
|
||||||
|
|
||||||
import { SettingsDataModelObjectAboutForm } from '../SettingsDataModelObjectAboutForm';
|
import { SettingsDataModelObjectAboutForm } from '../SettingsDataModelObjectAboutForm';
|
||||||
|
|
||||||
|
|||||||
@ -1,9 +1,10 @@
|
|||||||
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
||||||
|
import { SettingsObjectFieldSelectFormValues } from '@/settings/data-model/components/SettingsObjectFieldSelectForm';
|
||||||
import {
|
import {
|
||||||
mockedCompanyObjectMetadataItem,
|
mockedCompanyObjectMetadataItem,
|
||||||
|
mockedOpportunityObjectMetadataItem,
|
||||||
mockedPersonObjectMetadataItem,
|
mockedPersonObjectMetadataItem,
|
||||||
} from '@/object-record/record-field/__mocks__/fieldDefinitions';
|
} from '~/testing/mock-data/metadata';
|
||||||
import { SettingsObjectFieldSelectFormValues } from '@/settings/data-model/components/SettingsObjectFieldSelectForm';
|
|
||||||
|
|
||||||
import { getFieldDefaultPreviewValue } from '../getFieldDefaultPreviewValue';
|
import { getFieldDefaultPreviewValue } from '../getFieldDefaultPreviewValue';
|
||||||
|
|
||||||
@ -11,23 +12,12 @@ describe('getFieldDefaultPreviewValue', () => {
|
|||||||
describe('SELECT field', () => {
|
describe('SELECT field', () => {
|
||||||
it('returns the default select option', () => {
|
it('returns the default select option', () => {
|
||||||
// Given
|
// Given
|
||||||
const objectMetadataItem = mockedCompanyObjectMetadataItem;
|
const objectMetadataItem = mockedOpportunityObjectMetadataItem;
|
||||||
const fieldMetadataItem = mockedCompanyObjectMetadataItem.fields.find(
|
const fieldMetadataItem = mockedOpportunityObjectMetadataItem.fields.find(
|
||||||
({ name }) => name === 'industry',
|
({ name }) => name === 'stage',
|
||||||
)!;
|
)!;
|
||||||
const selectOptions: SettingsObjectFieldSelectFormValues = [
|
const selectOptions: SettingsObjectFieldSelectFormValues =
|
||||||
{
|
fieldMetadataItem.options ?? [];
|
||||||
color: 'purple',
|
|
||||||
label: '🏭 Industry',
|
|
||||||
value: 'INDUSTRY',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
color: 'pink',
|
|
||||||
isDefault: true,
|
|
||||||
label: '💊 Health',
|
|
||||||
value: 'HEALTH',
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
// When
|
// When
|
||||||
const result = getFieldDefaultPreviewValue({
|
const result = getFieldDefaultPreviewValue({
|
||||||
@ -37,27 +27,17 @@ describe('getFieldDefaultPreviewValue', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Then
|
// 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', () => {
|
it('returns the first select option if no default option was found', () => {
|
||||||
// Given
|
// Given
|
||||||
const objectMetadataItem = mockedCompanyObjectMetadataItem;
|
const objectMetadataItem = mockedOpportunityObjectMetadataItem;
|
||||||
const fieldMetadataItem = mockedCompanyObjectMetadataItem.fields.find(
|
const fieldMetadataItem = mockedOpportunityObjectMetadataItem.fields.find(
|
||||||
({ name }) => name === 'industry',
|
({ name }) => name === 'stage',
|
||||||
)!;
|
)!;
|
||||||
const selectOptions: SettingsObjectFieldSelectFormValues = [
|
const selectOptions: SettingsObjectFieldSelectFormValues =
|
||||||
{
|
fieldMetadataItem.options ?? [];
|
||||||
color: 'purple' as const,
|
|
||||||
label: '🏭 Industry',
|
|
||||||
value: 'INDUSTRY',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
color: 'pink' as const,
|
|
||||||
label: '💊 Health',
|
|
||||||
value: 'HEALTH',
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
// When
|
// When
|
||||||
const result = getFieldDefaultPreviewValue({
|
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 { ObjectRecord } from '@/object-record/types/ObjectRecord';
|
||||||
import { SettingsObjectFieldSelectFormValues } from '@/settings/data-model/components/SettingsObjectFieldSelectForm';
|
import { SettingsObjectFieldSelectFormValues } from '@/settings/data-model/components/SettingsObjectFieldSelectForm';
|
||||||
|
import {
|
||||||
|
mockedCompanyObjectMetadataItem,
|
||||||
|
mockedOpportunityObjectMetadataItem,
|
||||||
|
mockedPersonObjectMetadataItem,
|
||||||
|
} from '~/testing/mock-data/metadata';
|
||||||
|
|
||||||
import { getFieldPreviewValueFromRecord } from '../getFieldPreviewValueFromRecord';
|
import { getFieldPreviewValueFromRecord } from '../getFieldPreviewValueFromRecord';
|
||||||
|
|
||||||
@ -11,28 +12,12 @@ describe('getFieldPreviewValueFromRecord', () => {
|
|||||||
describe('SELECT field', () => {
|
describe('SELECT field', () => {
|
||||||
it('returns the select option corresponding to the record field value', () => {
|
it('returns the select option corresponding to the record field value', () => {
|
||||||
// Given
|
// Given
|
||||||
const record: ObjectRecord = { id: '', industry: 'GREEN_TECH' };
|
const record: ObjectRecord = { id: '', stage: 'MEETING' };
|
||||||
const fieldMetadataItem = mockedCompanyObjectMetadataItem.fields.find(
|
const fieldMetadataItem = mockedOpportunityObjectMetadataItem.fields.find(
|
||||||
({ name }) => name === 'industry',
|
({ name }) => name === 'stage',
|
||||||
)!;
|
)!;
|
||||||
const selectOptions: SettingsObjectFieldSelectFormValues = [
|
const selectOptions: SettingsObjectFieldSelectFormValues =
|
||||||
{
|
fieldMetadataItem.options ?? [];
|
||||||
color: 'purple',
|
|
||||||
label: '🏭 Industry',
|
|
||||||
value: 'INDUSTRY',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
color: 'pink',
|
|
||||||
isDefault: true,
|
|
||||||
label: '💊 Health',
|
|
||||||
value: 'HEALTH',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
color: 'turquoise',
|
|
||||||
label: '🌿 Green tech',
|
|
||||||
value: 'GREEN_TECH',
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
// When
|
// When
|
||||||
const result = getFieldPreviewValueFromRecord({
|
const result = getFieldPreviewValueFromRecord({
|
||||||
@ -47,28 +32,12 @@ describe('getFieldPreviewValueFromRecord', () => {
|
|||||||
|
|
||||||
it('returns undefined if the select option was not found', () => {
|
it('returns undefined if the select option was not found', () => {
|
||||||
// Given
|
// Given
|
||||||
const record: ObjectRecord = { id: '', industry: 'MOBILITY' };
|
const record: ObjectRecord = { id: '', industry: 'DOES_NOT_EXIST' };
|
||||||
const fieldMetadataItem = mockedCompanyObjectMetadataItem.fields.find(
|
const fieldMetadataItem = mockedOpportunityObjectMetadataItem.fields.find(
|
||||||
({ name }) => name === 'industry',
|
({ name }) => name === 'stage',
|
||||||
)!;
|
)!;
|
||||||
const selectOptions: SettingsObjectFieldSelectFormValues = [
|
const selectOptions: SettingsObjectFieldSelectFormValues =
|
||||||
{
|
fieldMetadataItem.options ?? [];
|
||||||
color: 'purple',
|
|
||||||
label: '🏭 Industry',
|
|
||||||
value: 'INDUSTRY',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
color: 'pink',
|
|
||||||
isDefault: true,
|
|
||||||
label: '💊 Health',
|
|
||||||
value: 'HEALTH',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
color: 'turquoise',
|
|
||||||
label: '🌿 Green tech',
|
|
||||||
value: 'GREEN_TECH',
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
// When
|
// When
|
||||||
const result = getFieldPreviewValueFromRecord({
|
const result = getFieldPreviewValueFromRecord({
|
||||||
|
|||||||
@ -60,7 +60,11 @@ export const MonthAndYearDropdown = ({
|
|||||||
}}
|
}}
|
||||||
dropdownPlacement="bottom-start"
|
dropdownPlacement="bottom-start"
|
||||||
clickableComponent={
|
clickableComponent={
|
||||||
<LightIconButton Icon={IconCalendarDue} size="medium" />
|
<LightIconButton
|
||||||
|
testId="month-and-year-dropdown"
|
||||||
|
Icon={IconCalendarDue}
|
||||||
|
size="medium"
|
||||||
|
/>
|
||||||
}
|
}
|
||||||
dropdownComponents={
|
dropdownComponents={
|
||||||
<DropdownMenuItemsContainer>
|
<DropdownMenuItemsContainer>
|
||||||
|
|||||||
@ -23,11 +23,16 @@ export const WithOpenMonthSelect: Story = {
|
|||||||
play: async ({ canvasElement }) => {
|
play: async ({ canvasElement }) => {
|
||||||
const canvas = within(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);
|
await userEvent.click(monthSelect);
|
||||||
|
|
||||||
expect(canvas.getAllByText('January')).toHaveLength(2);
|
|
||||||
[
|
[
|
||||||
'February',
|
'February',
|
||||||
'March',
|
'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 ColorScheme = 'Dark' | 'Light' | 'System';
|
||||||
|
|
||||||
export type WorkspaceMember = {
|
export type WorkspaceMember = {
|
||||||
|
__typename: 'WorkspaceMember';
|
||||||
id: string;
|
id: string;
|
||||||
name: {
|
name: {
|
||||||
firstName: string;
|
firstName: string;
|
||||||
|
|||||||
@ -0,0 +1,75 @@
|
|||||||
|
import { getOperationName } from '@apollo/client/utilities';
|
||||||
|
import { Meta, StoryObj } from '@storybook/react';
|
||||||
|
import { within } from '@storybook/testing-library';
|
||||||
|
import { graphql, HttpResponse } from 'msw';
|
||||||
|
|
||||||
|
import { AppPath } from '@/types/AppPath';
|
||||||
|
import { GET_CURRENT_USER } from '@/users/graphql/queries/getCurrentUser';
|
||||||
|
import {
|
||||||
|
PageDecorator,
|
||||||
|
PageDecoratorArgs,
|
||||||
|
} from '~/testing/decorators/PageDecorator';
|
||||||
|
import { graphqlMocks } from '~/testing/graphqlMocks';
|
||||||
|
import { mockedOnboardingUsersData } from '~/testing/mock-data/users';
|
||||||
|
import { sleep } from '~/testing/sleep';
|
||||||
|
|
||||||
|
import { ChooseYourPlan } from '../ChooseYourPlan';
|
||||||
|
|
||||||
|
const meta: Meta<PageDecoratorArgs> = {
|
||||||
|
title: 'Pages/Auth/ChooseYourPlan',
|
||||||
|
component: ChooseYourPlan,
|
||||||
|
decorators: [PageDecorator],
|
||||||
|
args: { routePath: AppPath.PlanRequired },
|
||||||
|
parameters: {
|
||||||
|
msw: {
|
||||||
|
handlers: [
|
||||||
|
graphql.query(getOperationName(GET_CURRENT_USER) ?? '', () => {
|
||||||
|
return HttpResponse.json({
|
||||||
|
data: {
|
||||||
|
currentUser: mockedOnboardingUsersData[0],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
graphql.query('GetProductPrices', () => {
|
||||||
|
return HttpResponse.json({
|
||||||
|
data: {
|
||||||
|
getProductPrices: {
|
||||||
|
__typename: 'ProductPricesEntity',
|
||||||
|
productPrices: [
|
||||||
|
{
|
||||||
|
__typename: 'ProductPriceEntity',
|
||||||
|
created: 1699860608,
|
||||||
|
recurringInterval: 'month',
|
||||||
|
stripePriceId: 'monthly8usd',
|
||||||
|
unitAmount: 900,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
__typename: 'ProductPriceEntity',
|
||||||
|
created: 1701874964,
|
||||||
|
recurringInterval: 'year',
|
||||||
|
stripePriceId: 'priceId',
|
||||||
|
unitAmount: 9000,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
graphqlMocks.handlers,
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default meta;
|
||||||
|
|
||||||
|
export type Story = StoryObj<typeof ChooseYourPlan>;
|
||||||
|
|
||||||
|
export const Default: Story = {
|
||||||
|
play: async ({ canvasElement }) => {
|
||||||
|
const canvas = within(canvasElement);
|
||||||
|
sleep(100);
|
||||||
|
|
||||||
|
await canvas.findByText('Choose your Plan');
|
||||||
|
},
|
||||||
|
};
|
||||||
@ -4,6 +4,7 @@ import { within } from '@storybook/test';
|
|||||||
import { graphql, HttpResponse } from 'msw';
|
import { graphql, HttpResponse } from 'msw';
|
||||||
|
|
||||||
import { GET_CURRENT_USER } from '@/users/graphql/queries/getCurrentUser';
|
import { GET_CURRENT_USER } from '@/users/graphql/queries/getCurrentUser';
|
||||||
|
import { ValidatePasswordResetTokenDocument } from '~/generated/graphql';
|
||||||
import { PasswordReset } from '~/pages/auth/PasswordReset';
|
import { PasswordReset } from '~/pages/auth/PasswordReset';
|
||||||
import {
|
import {
|
||||||
PageDecorator,
|
PageDecorator,
|
||||||
@ -16,10 +17,26 @@ const meta: Meta<PageDecoratorArgs> = {
|
|||||||
title: 'Pages/Auth/PasswordReset',
|
title: 'Pages/Auth/PasswordReset',
|
||||||
component: PasswordReset,
|
component: PasswordReset,
|
||||||
decorators: [PageDecorator],
|
decorators: [PageDecorator],
|
||||||
args: { routePath: '/reset-password/resetToken' },
|
args: {
|
||||||
|
routePath: '/reset-password/:passwordResetToken',
|
||||||
|
routeParams: { ':passwordResetToken': 'MOCKED_TOKEN' },
|
||||||
|
},
|
||||||
parameters: {
|
parameters: {
|
||||||
msw: {
|
msw: {
|
||||||
handlers: [
|
handlers: [
|
||||||
|
graphql.query(
|
||||||
|
getOperationName(ValidatePasswordResetTokenDocument) ?? '',
|
||||||
|
() => {
|
||||||
|
return HttpResponse.json({
|
||||||
|
data: {
|
||||||
|
validatePasswordResetToken: {
|
||||||
|
id: mockedOnboardingUsersData[0].id,
|
||||||
|
email: mockedOnboardingUsersData[0].email,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
},
|
||||||
|
),
|
||||||
graphql.query(getOperationName(GET_CURRENT_USER) ?? '', () => {
|
graphql.query(getOperationName(GET_CURRENT_USER) ?? '', () => {
|
||||||
return HttpResponse.json({
|
return HttpResponse.json({
|
||||||
data: {
|
data: {
|
||||||
|
|||||||
@ -2,6 +2,7 @@ import { Meta, StoryObj } from '@storybook/react';
|
|||||||
import { within } from '@storybook/test';
|
import { within } from '@storybook/test';
|
||||||
|
|
||||||
import { ComponentWithRouterDecorator } from '~/testing/decorators/ComponentWithRouterDecorator';
|
import { ComponentWithRouterDecorator } from '~/testing/decorators/ComponentWithRouterDecorator';
|
||||||
|
import { HelmetProviderDecorator } from '~/testing/decorators/HelmetProviderDecorator';
|
||||||
import { PageDecoratorArgs } from '~/testing/decorators/PageDecorator';
|
import { PageDecoratorArgs } from '~/testing/decorators/PageDecorator';
|
||||||
import { RelationPickerDecorator } from '~/testing/decorators/RelationPickerDecorator';
|
import { RelationPickerDecorator } from '~/testing/decorators/RelationPickerDecorator';
|
||||||
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
|
import { SnackBarDecorator } from '~/testing/decorators/SnackBarDecorator';
|
||||||
@ -12,6 +13,7 @@ const meta: Meta<PageDecoratorArgs> = {
|
|||||||
title: 'Pages/NotFound/Default',
|
title: 'Pages/NotFound/Default',
|
||||||
component: NotFound,
|
component: NotFound,
|
||||||
decorators: [
|
decorators: [
|
||||||
|
HelmetProviderDecorator,
|
||||||
ComponentWithRouterDecorator,
|
ComponentWithRouterDecorator,
|
||||||
SnackBarDecorator,
|
SnackBarDecorator,
|
||||||
RelationPickerDecorator,
|
RelationPickerDecorator,
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
import { Meta, StoryObj } from '@storybook/react';
|
import { Meta, StoryObj } from '@storybook/react';
|
||||||
|
import { within } from '@storybook/test';
|
||||||
|
|
||||||
import { getSettingsPagePath } from '@/settings/utils/getSettingsPagePath';
|
import { getSettingsPagePath } from '@/settings/utils/getSettingsPagePath';
|
||||||
import { SettingsPath } from '@/types/SettingsPath';
|
import { SettingsPath } from '@/types/SettingsPath';
|
||||||
@ -7,6 +8,7 @@ import {
|
|||||||
PageDecoratorArgs,
|
PageDecoratorArgs,
|
||||||
} from '~/testing/decorators/PageDecorator';
|
} from '~/testing/decorators/PageDecorator';
|
||||||
import { graphqlMocks } from '~/testing/graphqlMocks';
|
import { graphqlMocks } from '~/testing/graphqlMocks';
|
||||||
|
import { sleep } from '~/testing/sleep';
|
||||||
|
|
||||||
import { SettingsBilling } from '../SettingsBilling';
|
import { SettingsBilling } from '../SettingsBilling';
|
||||||
|
|
||||||
@ -24,4 +26,11 @@ export default meta;
|
|||||||
|
|
||||||
export type Story = StoryObj<typeof SettingsBilling>;
|
export type Story = StoryObj<typeof SettingsBilling>;
|
||||||
|
|
||||||
export const Default: Story = {};
|
export const Default: Story = {
|
||||||
|
play: async ({ canvasElement }) => {
|
||||||
|
const canvas = within(canvasElement);
|
||||||
|
sleep(1000);
|
||||||
|
|
||||||
|
await canvas.findByRole('button', { name: 'View billing details' });
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
import { Meta, StoryObj } from '@storybook/react';
|
import { Meta, StoryObj } from '@storybook/react';
|
||||||
|
import { within } from '@storybook/test';
|
||||||
|
|
||||||
import { getSettingsPagePath } from '@/settings/utils/getSettingsPagePath';
|
import { getSettingsPagePath } from '@/settings/utils/getSettingsPagePath';
|
||||||
import { SettingsPath } from '@/types/SettingsPath';
|
import { SettingsPath } from '@/types/SettingsPath';
|
||||||
@ -7,6 +8,7 @@ import {
|
|||||||
PageDecoratorArgs,
|
PageDecoratorArgs,
|
||||||
} from '~/testing/decorators/PageDecorator';
|
} from '~/testing/decorators/PageDecorator';
|
||||||
import { graphqlMocks } from '~/testing/graphqlMocks';
|
import { graphqlMocks } from '~/testing/graphqlMocks';
|
||||||
|
import { sleep } from '~/testing/sleep';
|
||||||
|
|
||||||
import { SettingsAccountsCalendars } from '../SettingsAccountsCalendars';
|
import { SettingsAccountsCalendars } from '../SettingsAccountsCalendars';
|
||||||
|
|
||||||
@ -27,4 +29,11 @@ export default meta;
|
|||||||
|
|
||||||
export type Story = StoryObj<typeof SettingsAccountsCalendars>;
|
export type Story = StoryObj<typeof SettingsAccountsCalendars>;
|
||||||
|
|
||||||
export const Default: Story = {};
|
export const Default: Story = {
|
||||||
|
play: async ({ canvasElement }) => {
|
||||||
|
const canvas = within(canvasElement);
|
||||||
|
sleep(100);
|
||||||
|
|
||||||
|
await canvas.findByText('Calendar settings');
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|||||||
@ -1,4 +1,6 @@
|
|||||||
import { Meta, StoryObj } from '@storybook/react';
|
import { Meta, StoryObj } from '@storybook/react';
|
||||||
|
import { within } from '@storybook/test';
|
||||||
|
import { graphql, HttpResponse } from 'msw';
|
||||||
|
|
||||||
import { getSettingsPagePath } from '@/settings/utils/getSettingsPagePath';
|
import { getSettingsPagePath } from '@/settings/utils/getSettingsPagePath';
|
||||||
import { SettingsPath } from '@/types/SettingsPath';
|
import { SettingsPath } from '@/types/SettingsPath';
|
||||||
@ -8,6 +10,7 @@ import {
|
|||||||
} from '~/testing/decorators/PageDecorator';
|
} from '~/testing/decorators/PageDecorator';
|
||||||
import { graphqlMocks } from '~/testing/graphqlMocks';
|
import { graphqlMocks } from '~/testing/graphqlMocks';
|
||||||
import { mockedConnectedAccounts } from '~/testing/mock-data/accounts';
|
import { mockedConnectedAccounts } from '~/testing/mock-data/accounts';
|
||||||
|
import { sleep } from '~/testing/sleep';
|
||||||
|
|
||||||
import { SettingsAccountsCalendarsSettings } from '../SettingsAccountsCalendarsSettings';
|
import { SettingsAccountsCalendarsSettings } from '../SettingsAccountsCalendarsSettings';
|
||||||
|
|
||||||
@ -21,7 +24,26 @@ const meta: Meta<PageDecoratorArgs> = {
|
|||||||
},
|
},
|
||||||
parameters: {
|
parameters: {
|
||||||
layout: 'fullscreen',
|
layout: 'fullscreen',
|
||||||
msw: graphqlMocks,
|
msw: {
|
||||||
|
handlers: [
|
||||||
|
...graphqlMocks.handlers,
|
||||||
|
graphql.query('FindOneCalendarChannel', () => {
|
||||||
|
return HttpResponse.json({
|
||||||
|
data: {
|
||||||
|
calendarChannel: {
|
||||||
|
edges: [],
|
||||||
|
pageInfo: {
|
||||||
|
hasNextPage: false,
|
||||||
|
hasPreviousPage: false,
|
||||||
|
startCursor: null,
|
||||||
|
endCursor: null,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -29,4 +51,11 @@ export default meta;
|
|||||||
|
|
||||||
export type Story = StoryObj<typeof SettingsAccountsCalendarsSettings>;
|
export type Story = StoryObj<typeof SettingsAccountsCalendarsSettings>;
|
||||||
|
|
||||||
export const Default: Story = {};
|
export const Default: Story = {
|
||||||
|
play: async ({ canvasElement }) => {
|
||||||
|
const canvas = within(canvasElement);
|
||||||
|
sleep(100);
|
||||||
|
|
||||||
|
await canvas.findByText('Event visibility');
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|||||||
@ -34,6 +34,6 @@ export const StandardObject: Story = {
|
|||||||
|
|
||||||
export const CustomObject: Story = {
|
export const CustomObject: Story = {
|
||||||
args: {
|
args: {
|
||||||
routeParams: { ':objectSlug': 'workspaces' },
|
routeParams: { ':objectSlug': 'listings' },
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
import { Meta, StoryObj } from '@storybook/react';
|
import { Meta, StoryObj } from '@storybook/react';
|
||||||
|
import { within } from '@storybook/test';
|
||||||
|
|
||||||
import { SettingsDevelopers } from '~/pages/settings/developers/SettingsDevelopers';
|
import { SettingsDevelopers } from '~/pages/settings/developers/SettingsDevelopers';
|
||||||
import {
|
import {
|
||||||
@ -23,7 +24,10 @@ export default meta;
|
|||||||
export type Story = StoryObj<typeof SettingsDevelopers>;
|
export type Story = StoryObj<typeof SettingsDevelopers>;
|
||||||
|
|
||||||
export const Default: Story = {
|
export const Default: Story = {
|
||||||
play: async () => {
|
play: async ({ canvasElement }) => {
|
||||||
|
const canvas = within(canvasElement);
|
||||||
await sleep(100);
|
await sleep(100);
|
||||||
|
|
||||||
|
await canvas.findByText('API keys');
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
import { Meta, StoryObj } from '@storybook/react';
|
import { Meta, StoryObj } from '@storybook/react';
|
||||||
|
import { within } from '@storybook/test';
|
||||||
|
|
||||||
import { getSettingsPagePath } from '@/settings/utils/getSettingsPagePath';
|
import { getSettingsPagePath } from '@/settings/utils/getSettingsPagePath';
|
||||||
import { SettingsPath } from '@/types/SettingsPath';
|
import { SettingsPath } from '@/types/SettingsPath';
|
||||||
@ -8,6 +9,7 @@ import {
|
|||||||
PageDecoratorArgs,
|
PageDecoratorArgs,
|
||||||
} from '~/testing/decorators/PageDecorator';
|
} from '~/testing/decorators/PageDecorator';
|
||||||
import { graphqlMocks } from '~/testing/graphqlMocks';
|
import { graphqlMocks } from '~/testing/graphqlMocks';
|
||||||
|
import { sleep } from '~/testing/sleep';
|
||||||
|
|
||||||
const meta: Meta<PageDecoratorArgs> = {
|
const meta: Meta<PageDecoratorArgs> = {
|
||||||
title: 'Pages/Settings/Integrations/SettingsIntegrationDatabase',
|
title: 'Pages/Settings/Integrations/SettingsIntegrationDatabase',
|
||||||
@ -26,4 +28,11 @@ export default meta;
|
|||||||
|
|
||||||
export type Story = StoryObj<typeof SettingsIntegrationDatabase>;
|
export type Story = StoryObj<typeof SettingsIntegrationDatabase>;
|
||||||
|
|
||||||
export const Default: Story = {};
|
export const Default: Story = {
|
||||||
|
play: async ({ canvasElement }) => {
|
||||||
|
const canvas = within(canvasElement);
|
||||||
|
sleep(1000);
|
||||||
|
|
||||||
|
await canvas.findByText('PostgreSQL database');
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
import { Meta, StoryObj } from '@storybook/react';
|
import { Meta, StoryObj } from '@storybook/react';
|
||||||
|
import { within } from '@storybook/test';
|
||||||
|
|
||||||
import { getSettingsPagePath } from '@/settings/utils/getSettingsPagePath';
|
import { getSettingsPagePath } from '@/settings/utils/getSettingsPagePath';
|
||||||
import { SettingsPath } from '@/types/SettingsPath';
|
import { SettingsPath } from '@/types/SettingsPath';
|
||||||
@ -8,6 +9,7 @@ import {
|
|||||||
PageDecoratorArgs,
|
PageDecoratorArgs,
|
||||||
} from '~/testing/decorators/PageDecorator';
|
} from '~/testing/decorators/PageDecorator';
|
||||||
import { graphqlMocks } from '~/testing/graphqlMocks';
|
import { graphqlMocks } from '~/testing/graphqlMocks';
|
||||||
|
import { sleep } from '~/testing/sleep';
|
||||||
|
|
||||||
const meta: Meta<PageDecoratorArgs> = {
|
const meta: Meta<PageDecoratorArgs> = {
|
||||||
title: 'Pages/Settings/Integrations/SettingsIntegrationDatabaseConnection',
|
title: 'Pages/Settings/Integrations/SettingsIntegrationDatabaseConnection',
|
||||||
@ -29,4 +31,12 @@ export default meta;
|
|||||||
|
|
||||||
export type Story = StoryObj<typeof SettingsIntegrationDatabaseConnection>;
|
export type Story = StoryObj<typeof SettingsIntegrationDatabaseConnection>;
|
||||||
|
|
||||||
export const Default: Story = {};
|
export const Default: Story = {
|
||||||
|
play: async ({ canvasElement }) => {
|
||||||
|
within(canvasElement);
|
||||||
|
sleep(1000);
|
||||||
|
|
||||||
|
// Todo: Implement mocks in graphqlMocks for databaseConnection
|
||||||
|
// await canvas.findByText('Tables');
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
import { Meta, StoryObj } from '@storybook/react';
|
import { Meta, StoryObj } from '@storybook/react';
|
||||||
|
import { within } from '@storybook/test';
|
||||||
|
|
||||||
import { SettingsIntegrationNewDatabaseConnection } from '~/pages/settings/integrations/SettingsIntegrationNewDatabaseConnection';
|
import { SettingsIntegrationNewDatabaseConnection } from '~/pages/settings/integrations/SettingsIntegrationNewDatabaseConnection';
|
||||||
import {
|
import {
|
||||||
@ -6,6 +7,7 @@ import {
|
|||||||
PageDecoratorArgs,
|
PageDecoratorArgs,
|
||||||
} from '~/testing/decorators/PageDecorator';
|
} from '~/testing/decorators/PageDecorator';
|
||||||
import { graphqlMocks } from '~/testing/graphqlMocks';
|
import { graphqlMocks } from '~/testing/graphqlMocks';
|
||||||
|
import { sleep } from '~/testing/sleep';
|
||||||
|
|
||||||
const meta: Meta<PageDecoratorArgs> = {
|
const meta: Meta<PageDecoratorArgs> = {
|
||||||
title: 'Pages/Settings/Integrations/SettingsIntegrationNewDatabaseConnection',
|
title: 'Pages/Settings/Integrations/SettingsIntegrationNewDatabaseConnection',
|
||||||
@ -24,4 +26,11 @@ export default meta;
|
|||||||
|
|
||||||
export type Story = StoryObj<typeof SettingsIntegrationNewDatabaseConnection>;
|
export type Story = StoryObj<typeof SettingsIntegrationNewDatabaseConnection>;
|
||||||
|
|
||||||
export const Default: Story = {};
|
export const Default: Story = {
|
||||||
|
play: async ({ canvasElement }) => {
|
||||||
|
const canvas = within(canvasElement);
|
||||||
|
sleep(100);
|
||||||
|
|
||||||
|
await canvas.findByText('Connect a new database');
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
import { Meta, StoryObj } from '@storybook/react';
|
import { Meta, StoryObj } from '@storybook/react';
|
||||||
|
import { graphql, HttpResponse } from 'msw';
|
||||||
|
|
||||||
import { AppPath } from '@/types/AppPath';
|
import { AppPath } from '@/types/AppPath';
|
||||||
import {
|
import {
|
||||||
@ -6,6 +7,7 @@ import {
|
|||||||
PageDecoratorArgs,
|
PageDecoratorArgs,
|
||||||
} from '~/testing/decorators/PageDecorator';
|
} from '~/testing/decorators/PageDecorator';
|
||||||
import { graphqlMocks } from '~/testing/graphqlMocks';
|
import { graphqlMocks } from '~/testing/graphqlMocks';
|
||||||
|
import { mockedWorkspaceMemberData } from '~/testing/mock-data/users';
|
||||||
import { sleep } from '~/testing/sleep';
|
import { sleep } from '~/testing/sleep';
|
||||||
|
|
||||||
import { Tasks } from '../Tasks';
|
import { Tasks } from '../Tasks';
|
||||||
@ -16,7 +18,18 @@ const meta: Meta<PageDecoratorArgs> = {
|
|||||||
decorators: [PageDecorator],
|
decorators: [PageDecorator],
|
||||||
args: { routePath: AppPath.TasksPage },
|
args: { routePath: AppPath.TasksPage },
|
||||||
parameters: {
|
parameters: {
|
||||||
msw: graphqlMocks,
|
msw: {
|
||||||
|
handlers: [
|
||||||
|
graphql.query('FindOneWorkspaceMember', () => {
|
||||||
|
return HttpResponse.json({
|
||||||
|
data: {
|
||||||
|
workspaceMember: mockedWorkspaceMemberData,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}),
|
||||||
|
graphqlMocks.handlers,
|
||||||
|
],
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,10 @@
|
|||||||
|
import { HelmetProvider } from 'react-helmet-async';
|
||||||
|
import { Decorator } from '@storybook/react';
|
||||||
|
|
||||||
|
export const HelmetProviderDecorator: Decorator = (Story) => {
|
||||||
|
return (
|
||||||
|
<HelmetProvider>
|
||||||
|
<Story />
|
||||||
|
</HelmetProvider>
|
||||||
|
);
|
||||||
|
};
|
||||||
@ -1,12 +1,15 @@
|
|||||||
import { HelmetProvider } from 'react-helmet-async';
|
import { HelmetProvider } from 'react-helmet-async';
|
||||||
import { MemoryRouter, Route, Routes } from 'react-router-dom';
|
import { MemoryRouter, Route, Routes } from 'react-router-dom';
|
||||||
import { ApolloProvider } from '@apollo/client';
|
import { ApolloProvider } from '@apollo/client';
|
||||||
|
import { loadDevMessages } from '@apollo/client/dev';
|
||||||
import { Decorator } from '@storybook/react';
|
import { Decorator } from '@storybook/react';
|
||||||
import { RecoilRoot } from 'recoil';
|
import { RecoilRoot } from 'recoil';
|
||||||
|
|
||||||
|
import { ClientConfigProviderEffect } from '@/client-config/components/ClientConfigProviderEffect';
|
||||||
import { ObjectMetadataItemsProvider } from '@/object-metadata/components/ObjectMetadataItemsProvider';
|
import { ObjectMetadataItemsProvider } from '@/object-metadata/components/ObjectMetadataItemsProvider';
|
||||||
import { ApolloMetadataClientMockedProvider } from '@/object-metadata/hooks/__mocks__/ApolloMetadataClientProvider';
|
import { ApolloMetadataClientMockedProvider } from '@/object-metadata/hooks/__mocks__/ApolloMetadataClientProvider';
|
||||||
import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope';
|
import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope';
|
||||||
|
import { UserProviderEffect } from '@/users/components/UserProviderEffect';
|
||||||
import { ClientConfigProvider } from '~/modules/client-config/components/ClientConfigProvider';
|
import { ClientConfigProvider } from '~/modules/client-config/components/ClientConfigProvider';
|
||||||
import { DefaultLayout } from '~/modules/ui/layout/page/DefaultLayout';
|
import { DefaultLayout } from '~/modules/ui/layout/page/DefaultLayout';
|
||||||
import { UserProvider } from '~/modules/users/components/UserProvider';
|
import { UserProvider } from '~/modules/users/components/UserProvider';
|
||||||
@ -32,14 +35,23 @@ const computeLocation = (routePath: string, routeParams: RouteParams) => {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const ApolloStorybookDevLogEffect = () => {
|
||||||
|
loadDevMessages();
|
||||||
|
|
||||||
|
return <></>;
|
||||||
|
};
|
||||||
|
|
||||||
export const PageDecorator: Decorator<{
|
export const PageDecorator: Decorator<{
|
||||||
routePath: string;
|
routePath: string;
|
||||||
routeParams: RouteParams;
|
routeParams: RouteParams;
|
||||||
}> = (Story, { args }) => (
|
}> = (Story, { args }) => (
|
||||||
<RecoilRoot>
|
<RecoilRoot>
|
||||||
<ApolloProvider client={mockedApolloClient}>
|
<ApolloProvider client={mockedApolloClient}>
|
||||||
|
<ApolloStorybookDevLogEffect />
|
||||||
<ApolloMetadataClientMockedProvider>
|
<ApolloMetadataClientMockedProvider>
|
||||||
|
<UserProviderEffect />
|
||||||
<UserProvider>
|
<UserProvider>
|
||||||
|
<ClientConfigProviderEffect />
|
||||||
<ClientConfigProvider>
|
<ClientConfigProvider>
|
||||||
<MemoryRouter
|
<MemoryRouter
|
||||||
initialEntries={[
|
initialEntries={[
|
||||||
|
|||||||
@ -12,10 +12,10 @@ import {
|
|||||||
mockedDuplicateCompanyData,
|
mockedDuplicateCompanyData,
|
||||||
} from '~/testing/mock-data/companies';
|
} from '~/testing/mock-data/companies';
|
||||||
import { mockedClientConfig } from '~/testing/mock-data/config';
|
import { mockedClientConfig } from '~/testing/mock-data/config';
|
||||||
|
import { mockedObjectMetadataItemsQueryResult } from '~/testing/mock-data/metadata';
|
||||||
import { mockedUsersData } from '~/testing/mock-data/users';
|
import { mockedUsersData } from '~/testing/mock-data/users';
|
||||||
import { mockWorkspaceMembers } from '~/testing/mock-data/workspace-members';
|
import { mockWorkspaceMembers } from '~/testing/mock-data/workspace-members';
|
||||||
|
|
||||||
import { mockedObjectMetadataItems } from './mock-data/metadata';
|
|
||||||
import { mockedPeopleData } from './mock-data/people';
|
import { mockedPeopleData } from './mock-data/people';
|
||||||
import { mockedViewFieldsData } from './mock-data/view-fields';
|
import { mockedViewFieldsData } from './mock-data/view-fields';
|
||||||
import { mockedViewsData } from './mock-data/views';
|
import { mockedViewsData } from './mock-data/views';
|
||||||
@ -49,7 +49,7 @@ export const graphqlMocks = {
|
|||||||
getOperationName(FIND_MANY_OBJECT_METADATA_ITEMS) ?? '',
|
getOperationName(FIND_MANY_OBJECT_METADATA_ITEMS) ?? '',
|
||||||
() => {
|
() => {
|
||||||
return HttpResponse.json({
|
return HttpResponse.json({
|
||||||
data: { objects: mockedObjectMetadataItems },
|
data: mockedObjectMetadataItemsQueryResult,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|||||||
@ -35,14 +35,18 @@ type MockedActivity = Pick<
|
|||||||
| 'companyId'
|
| 'companyId'
|
||||||
| 'targetObjectNameSingular'
|
| 'targetObjectNameSingular'
|
||||||
> & {
|
> & {
|
||||||
activity: Pick<Activity, 'id' | 'createdAt' | 'updatedAt'>;
|
activity: Pick<Activity, 'id' | 'createdAt' | 'updatedAt' | '__typename'>;
|
||||||
person?: Pick<Person, 'id' | 'name' | 'avatarUrl'> | null;
|
person?: Pick<Person, 'id' | 'name' | 'avatarUrl' | '__typename'> | null;
|
||||||
company?: Pick<Company, 'id' | 'name' | 'domainName'> | null;
|
company?: Pick<
|
||||||
|
Company,
|
||||||
|
'id' | 'name' | 'domainName' | '__typename'
|
||||||
|
> | null;
|
||||||
}
|
}
|
||||||
>;
|
>;
|
||||||
};
|
};
|
||||||
|
|
||||||
const workspaceMember: WorkspaceMember = {
|
const workspaceMember: WorkspaceMember = {
|
||||||
|
__typename: 'WorkspaceMember',
|
||||||
id: '374fe3a5-df1e-4119-afe0-2a62a2ba481e',
|
id: '374fe3a5-df1e-4119-afe0-2a62a2ba481e',
|
||||||
name: {
|
name: {
|
||||||
firstName: 'Charles',
|
firstName: 'Charles',
|
||||||
@ -103,6 +107,7 @@ export const mockedActivities: Array<MockedActivity> = [
|
|||||||
personId: null,
|
personId: null,
|
||||||
companyId: '89bb825c-171e-4bcc-9cf7-43448d6fb280',
|
companyId: '89bb825c-171e-4bcc-9cf7-43448d6fb280',
|
||||||
company: {
|
company: {
|
||||||
|
__typename: 'Company',
|
||||||
id: '89bb825c-171e-4bcc-9cf7-43448d6fb280',
|
id: '89bb825c-171e-4bcc-9cf7-43448d6fb280',
|
||||||
name: 'Airbnb',
|
name: 'Airbnb',
|
||||||
domainName: 'airbnb.com',
|
domainName: 'airbnb.com',
|
||||||
@ -110,6 +115,7 @@ export const mockedActivities: Array<MockedActivity> = [
|
|||||||
person: null,
|
person: null,
|
||||||
activityId: '89bb825c-171e-4bcc-9cf7-43448d6fb230',
|
activityId: '89bb825c-171e-4bcc-9cf7-43448d6fb230',
|
||||||
activity: {
|
activity: {
|
||||||
|
__typename: 'Activity',
|
||||||
id: '89bb825c-171e-4bcc-9cf7-43448d6fb230',
|
id: '89bb825c-171e-4bcc-9cf7-43448d6fb230',
|
||||||
createdAt: '2023-04-26T10:12:42.33625+00:00',
|
createdAt: '2023-04-26T10:12:42.33625+00:00',
|
||||||
updatedAt: '2023-04-26T10:23:42.33625+00:00',
|
updatedAt: '2023-04-26T10:23:42.33625+00:00',
|
||||||
@ -124,6 +130,7 @@ export const mockedActivities: Array<MockedActivity> = [
|
|||||||
personId: null,
|
personId: null,
|
||||||
companyId: 'b396e6b9-dc5c-4643-bcff-61b6cf7523ae',
|
companyId: 'b396e6b9-dc5c-4643-bcff-61b6cf7523ae',
|
||||||
company: {
|
company: {
|
||||||
|
__typename: 'Company',
|
||||||
id: '89bb825c-171e-4bcc-9cf7-43448d6fb278',
|
id: '89bb825c-171e-4bcc-9cf7-43448d6fb278',
|
||||||
name: 'Aircall',
|
name: 'Aircall',
|
||||||
domainName: 'aircall.io',
|
domainName: 'aircall.io',
|
||||||
@ -131,6 +138,7 @@ export const mockedActivities: Array<MockedActivity> = [
|
|||||||
person: null,
|
person: null,
|
||||||
activityId: 'b396e6b9-dc5c-4643-bcff-61b6cf7523ae',
|
activityId: 'b396e6b9-dc5c-4643-bcff-61b6cf7523ae',
|
||||||
activity: {
|
activity: {
|
||||||
|
__typename: 'Activity',
|
||||||
id: '89bb825c-171e-4bcc-9cf7-43448d6fb231',
|
id: '89bb825c-171e-4bcc-9cf7-43448d6fb231',
|
||||||
createdAt: new Date().toISOString(),
|
createdAt: new Date().toISOString(),
|
||||||
updatedAt: new Date().toISOString(),
|
updatedAt: new Date().toISOString(),
|
||||||
@ -166,6 +174,7 @@ export const mockedActivities: Array<MockedActivity> = [
|
|||||||
targetObjectNameSingular: 'person',
|
targetObjectNameSingular: 'person',
|
||||||
personId: '7dfbc3f7-6e5e-4128-957e-8d86808cdf6b', // Alexandre
|
personId: '7dfbc3f7-6e5e-4128-957e-8d86808cdf6b', // Alexandre
|
||||||
person: {
|
person: {
|
||||||
|
__typename: 'Person',
|
||||||
id: '7dfbc3f7-6e5e-4128-957e-8d86808cdf6b',
|
id: '7dfbc3f7-6e5e-4128-957e-8d86808cdf6b',
|
||||||
name: {
|
name: {
|
||||||
firstName: 'Alexandre',
|
firstName: 'Alexandre',
|
||||||
@ -177,6 +186,7 @@ export const mockedActivities: Array<MockedActivity> = [
|
|||||||
companyId: null,
|
companyId: null,
|
||||||
activityId: '89bb825c-171e-4bcc-9cf7-43448d6fb278a',
|
activityId: '89bb825c-171e-4bcc-9cf7-43448d6fb278a',
|
||||||
activity: {
|
activity: {
|
||||||
|
__typename: 'Activity',
|
||||||
id: '89bb825c-171e-4bcc-9cf7-43448d6fb278a',
|
id: '89bb825c-171e-4bcc-9cf7-43448d6fb278a',
|
||||||
createdAt: '2023-04-26T10:12:42.33625+00:00',
|
createdAt: '2023-04-26T10:12:42.33625+00:00',
|
||||||
updatedAt: '2023-04-26T10:23:42.33625+00:00',
|
updatedAt: '2023-04-26T10:23:42.33625+00:00',
|
||||||
@ -192,6 +202,7 @@ export const mockedActivities: Array<MockedActivity> = [
|
|||||||
targetObjectNameSingular: 'person',
|
targetObjectNameSingular: 'person',
|
||||||
company: null,
|
company: null,
|
||||||
person: {
|
person: {
|
||||||
|
__typename: 'Person',
|
||||||
id: '7dfbc3f7-6e5e-4128-957e-8d86808cdf6d',
|
id: '7dfbc3f7-6e5e-4128-957e-8d86808cdf6d',
|
||||||
name: {
|
name: {
|
||||||
firstName: 'Jean',
|
firstName: 'Jean',
|
||||||
@ -201,6 +212,7 @@ export const mockedActivities: Array<MockedActivity> = [
|
|||||||
},
|
},
|
||||||
activityId: '89bb825c-171e-4bcc-9cf7-43448d6fb278a',
|
activityId: '89bb825c-171e-4bcc-9cf7-43448d6fb278a',
|
||||||
activity: {
|
activity: {
|
||||||
|
__typename: 'Activity',
|
||||||
id: '89bb825c-171e-4bcc-9cf7-43448d6fb278a',
|
id: '89bb825c-171e-4bcc-9cf7-43448d6fb278a',
|
||||||
createdAt: new Date().toISOString(),
|
createdAt: new Date().toISOString(),
|
||||||
updatedAt: new Date().toISOString(),
|
updatedAt: new Date().toISOString(),
|
||||||
|
|||||||
@ -11,6 +11,7 @@ type MockedCompany = Omit<Company, 'deletedAt'> & {
|
|||||||
|
|
||||||
export const mockedCompaniesData: Array<MockedCompany> = [
|
export const mockedCompaniesData: Array<MockedCompany> = [
|
||||||
{
|
{
|
||||||
|
__typename: 'Company',
|
||||||
id: '89bb825c-171e-4bcc-9cf7-43448d6fb278',
|
id: '89bb825c-171e-4bcc-9cf7-43448d6fb278',
|
||||||
domainName: 'airbnb.com',
|
domainName: 'airbnb.com',
|
||||||
name: 'Airbnb',
|
name: 'Airbnb',
|
||||||
@ -31,6 +32,7 @@ export const mockedCompaniesData: Array<MockedCompany> = [
|
|||||||
Favorite: null,
|
Favorite: null,
|
||||||
accountOwnerId: mockedUsersData[0].id,
|
accountOwnerId: mockedUsersData[0].id,
|
||||||
accountOwner: {
|
accountOwner: {
|
||||||
|
__typename: 'WorkspaceMember',
|
||||||
name: {
|
name: {
|
||||||
firstName: 'Charles',
|
firstName: 'Charles',
|
||||||
lastName: 'Test',
|
lastName: 'Test',
|
||||||
@ -46,6 +48,7 @@ export const mockedCompaniesData: Array<MockedCompany> = [
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
__typename: 'Company',
|
||||||
id: 'b396e6b9-dc5c-4643-bcff-61b6cf7523ae',
|
id: 'b396e6b9-dc5c-4643-bcff-61b6cf7523ae',
|
||||||
domainName: 'aircall.io',
|
domainName: 'aircall.io',
|
||||||
name: 'Aircall',
|
name: 'Aircall',
|
||||||
@ -68,6 +71,7 @@ export const mockedCompaniesData: Array<MockedCompany> = [
|
|||||||
Favorite: null,
|
Favorite: null,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
__typename: 'Company',
|
||||||
id: 'a674fa6c-1455-4c57-afaf-dd5dc086361d',
|
id: 'a674fa6c-1455-4c57-afaf-dd5dc086361d',
|
||||||
domainName: 'algolia.com',
|
domainName: 'algolia.com',
|
||||||
name: 'Algolia',
|
name: 'Algolia',
|
||||||
@ -90,6 +94,7 @@ export const mockedCompaniesData: Array<MockedCompany> = [
|
|||||||
accountOwnerId: null,
|
accountOwnerId: null,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
__typename: 'Company',
|
||||||
id: 'b1cfd51b-a831-455f-ba07-4e30671e1dc3',
|
id: 'b1cfd51b-a831-455f-ba07-4e30671e1dc3',
|
||||||
domainName: 'apple.com',
|
domainName: 'apple.com',
|
||||||
name: 'Apple',
|
name: 'Apple',
|
||||||
@ -112,6 +117,7 @@ export const mockedCompaniesData: Array<MockedCompany> = [
|
|||||||
accountOwnerId: null,
|
accountOwnerId: null,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
__typename: 'Company',
|
||||||
id: '5c21e19e-e049-4393-8c09-3e3f8fb09ecb',
|
id: '5c21e19e-e049-4393-8c09-3e3f8fb09ecb',
|
||||||
domainName: 'qonto.com',
|
domainName: 'qonto.com',
|
||||||
name: 'Qonto',
|
name: 'Qonto',
|
||||||
@ -134,6 +140,7 @@ export const mockedCompaniesData: Array<MockedCompany> = [
|
|||||||
accountOwnerId: null,
|
accountOwnerId: null,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
__typename: 'Company',
|
||||||
id: '9d162de6-cfbf-4156-a790-e39854dcd4eb',
|
id: '9d162de6-cfbf-4156-a790-e39854dcd4eb',
|
||||||
domainName: 'facebook.com',
|
domainName: 'facebook.com',
|
||||||
name: 'Facebook',
|
name: 'Facebook',
|
||||||
@ -156,6 +163,7 @@ export const mockedCompaniesData: Array<MockedCompany> = [
|
|||||||
accountOwnerId: null,
|
accountOwnerId: null,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
__typename: 'Company',
|
||||||
id: '9d162de6-cfbf-4156-a790-e39854dcd4ef',
|
id: '9d162de6-cfbf-4156-a790-e39854dcd4ef',
|
||||||
domainName: 'sequoia.com',
|
domainName: 'sequoia.com',
|
||||||
name: 'Sequoia',
|
name: 'Sequoia',
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
export const mockedClientConfig = {
|
import { ClientConfig } from '~/generated-metadata/graphql';
|
||||||
|
|
||||||
|
export const mockedClientConfig: ClientConfig = {
|
||||||
signInPrefilled: true,
|
signInPrefilled: true,
|
||||||
signUpDisabled: false,
|
signUpDisabled: false,
|
||||||
dataModelSettingsEnabled: true,
|
|
||||||
developersSettingsEnabled: true,
|
|
||||||
debugMode: false,
|
debugMode: false,
|
||||||
authProviders: {
|
authProviders: {
|
||||||
google: true,
|
google: true,
|
||||||
@ -20,6 +20,12 @@ export const mockedClientConfig = {
|
|||||||
supportFrontChatId: null,
|
supportFrontChatId: null,
|
||||||
__typename: 'Support',
|
__typename: 'Support',
|
||||||
},
|
},
|
||||||
|
sentry: {
|
||||||
|
dsn: 'MOCKED_DSN',
|
||||||
|
release: 'MOCKED_RELEASE',
|
||||||
|
environment: 'MOCKED_ENVIRONMENT',
|
||||||
|
__typename: 'Sentry',
|
||||||
|
},
|
||||||
billing: {
|
billing: {
|
||||||
isBillingEnabled: true,
|
isBillingEnabled: true,
|
||||||
billingUrl: '',
|
billingUrl: '',
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -14,6 +14,7 @@ type MockedUser = Pick<
|
|||||||
workspaceMember: WorkspaceMember | null;
|
workspaceMember: WorkspaceMember | null;
|
||||||
locale: string;
|
locale: string;
|
||||||
defaultWorkspace: Workspace;
|
defaultWorkspace: Workspace;
|
||||||
|
workspaces: Array<{ workspace: Workspace }>;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const avatarUrl =
|
export const avatarUrl =
|
||||||
@ -30,12 +31,39 @@ export const mockDefaultWorkspace: Workspace = {
|
|||||||
allowImpersonation: true,
|
allowImpersonation: true,
|
||||||
subscriptionStatus: 'active',
|
subscriptionStatus: 'active',
|
||||||
activationStatus: 'active',
|
activationStatus: 'active',
|
||||||
featureFlags: [],
|
featureFlags: [
|
||||||
|
{
|
||||||
|
id: '1492de61-5018-4368-8923-4f1eeaf988c4',
|
||||||
|
key: 'IS_AIRTABLE_INTEGRATION_ENABLED',
|
||||||
|
value: true,
|
||||||
|
workspaceId: '7dfbc3f7-6e5e-4128-957e-8d86808cdf6w',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '1492de61-5018-4368-8923-4f1eeaf988c5',
|
||||||
|
key: 'IS_POSTGRESQL_INTEGRATION_ENABLED',
|
||||||
|
value: true,
|
||||||
|
workspaceId: '7dfbc3f7-6e5e-4128-957e-8d86808cdf6w',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '1492de61-5018-4368-8923-4f1eeaf988c6',
|
||||||
|
key: 'IS_CALENDER_ENABLED',
|
||||||
|
value: true,
|
||||||
|
workspaceId: '7dfbc3f7-6e5e-4128-957e-8d86808cdf6w',
|
||||||
|
},
|
||||||
|
],
|
||||||
createdAt: '2023-04-26T10:23:42.33625+00:00',
|
createdAt: '2023-04-26T10:23:42.33625+00:00',
|
||||||
updatedAt: '2023-04-26T10:23:42.33625+00:00',
|
updatedAt: '2023-04-26T10:23:42.33625+00:00',
|
||||||
|
currentCacheVersion: '1',
|
||||||
|
currentBillingSubscription: {
|
||||||
|
__typename: 'BillingSubscription',
|
||||||
|
id: '7efbc3f7-6e5e-4128-957e-8d86808cdf6a',
|
||||||
|
interval: 'month',
|
||||||
|
status: 'active',
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export const mockedWorkspaceMemberData: WorkspaceMember = {
|
export const mockedWorkspaceMemberData: WorkspaceMember = {
|
||||||
|
__typename: 'WorkspaceMember',
|
||||||
id: '7dfbc3f7-6e5e-4128-957e-8d86808cdf6b',
|
id: '7dfbc3f7-6e5e-4128-957e-8d86808cdf6b',
|
||||||
colorScheme: 'Light',
|
colorScheme: 'Light',
|
||||||
avatarUrl,
|
avatarUrl,
|
||||||
@ -63,6 +91,7 @@ export const mockedUsersData: Array<MockedUser> = [
|
|||||||
workspaceMember: mockedWorkspaceMemberData,
|
workspaceMember: mockedWorkspaceMemberData,
|
||||||
defaultWorkspace: mockDefaultWorkspace,
|
defaultWorkspace: mockDefaultWorkspace,
|
||||||
locale: 'en',
|
locale: 'en',
|
||||||
|
workspaces: [{ workspace: mockDefaultWorkspace }],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: '7dfbc3f7-6e5e-4128-957e-8d86808cdf6c',
|
id: '7dfbc3f7-6e5e-4128-957e-8d86808cdf6c',
|
||||||
@ -84,6 +113,7 @@ export const mockedUsersData: Array<MockedUser> = [
|
|||||||
},
|
},
|
||||||
defaultWorkspace: mockDefaultWorkspace,
|
defaultWorkspace: mockDefaultWorkspace,
|
||||||
locale: 'en',
|
locale: 'en',
|
||||||
|
workspaces: [{ workspace: mockDefaultWorkspace }],
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -109,6 +139,7 @@ export const mockedOnboardingUsersData: Array<MockedUser> = [
|
|||||||
},
|
},
|
||||||
defaultWorkspace: mockDefaultWorkspace,
|
defaultWorkspace: mockDefaultWorkspace,
|
||||||
locale: 'en',
|
locale: 'en',
|
||||||
|
workspaces: [{ workspace: mockDefaultWorkspace }],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: '7dfbc3f7-6e5e-4128-957e-8d86808cdf6d',
|
id: '7dfbc3f7-6e5e-4128-957e-8d86808cdf6d',
|
||||||
@ -123,5 +154,6 @@ export const mockedOnboardingUsersData: Array<MockedUser> = [
|
|||||||
activationStatus: 'inactive',
|
activationStatus: 'inactive',
|
||||||
},
|
},
|
||||||
locale: 'en',
|
locale: 'en',
|
||||||
|
workspaces: [{ workspace: mockDefaultWorkspace }],
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|||||||
Reference in New Issue
Block a user