diff --git a/packages/twenty-front/jest.config.ts b/packages/twenty-front/jest.config.ts
index 1c9504799..dd5c04409 100644
--- a/packages/twenty-front/jest.config.ts
+++ b/packages/twenty-front/jest.config.ts
@@ -5,9 +5,7 @@ const tsConfig = require('./tsconfig.spec.json');
process.env.TZ = 'GMT';
process.env.LC_ALL = 'en_US.UTF-8';
const jestConfig: JestConfigWithTsJest = {
- // to enable logs, comment out the following line
silent: true,
- verbose: false,
// For more information please have a look to official docs https://jestjs.io/docs/configuration/#prettierpath-string
// Prettier v3 will should be supported in jest v30 https://github.com/jestjs/jest/releases/tag/v30.0.0-alpha.1
prettierPath: null,
@@ -54,7 +52,7 @@ const jestConfig: JestConfigWithTsJest = {
extensionsToTreatAsEsm: ['.ts', '.tsx'],
coverageThreshold: {
global: {
- statements: 57,
+ statements: 56.9,
lines: 55,
functions: 46,
},
@@ -79,6 +77,7 @@ const jestConfig: JestConfigWithTsJest = {
'display/icon/index.ts',
],
coverageDirectory: './coverage',
+ errorOnDeprecated: true,
};
export default jestConfig;
diff --git a/packages/twenty-front/src/modules/activities/tasks/hooks/__tests__/useCompleteTask.test.tsx b/packages/twenty-front/src/modules/activities/tasks/hooks/__tests__/useCompleteTask.test.tsx
index 1f3e2f7c3..864afb8cc 100644
--- a/packages/twenty-front/src/modules/activities/tasks/hooks/__tests__/useCompleteTask.test.tsx
+++ b/packages/twenty-front/src/modules/activities/tasks/hooks/__tests__/useCompleteTask.test.tsx
@@ -178,17 +178,31 @@ const mocks: MockedResponse[] = [
data: {
updateTask: {
__typename: 'Task',
- createdAt: '2024-03-15T07:33:14.212Z',
- reminderAt: null,
- authorId: '123',
- title: 'Test',
- status: 'DONE',
- updatedAt: '2024-03-15T07:33:14.212Z',
- body: 'Test',
- dueAt: '2024-03-15T07:33:14.212Z',
- type: 'TASK',
- id: '123',
+ assignee: null,
assigneeId: '123',
+ attachments: { edges: [] },
+ body: 'Test',
+ bodyV2: {
+ blocknote: 'Test',
+ markdown: 'Test',
+ },
+ createdAt: '2024-03-15T07:33:14.212Z',
+ createdBy: {
+ source: 'MANUAL',
+ workspaceMemberId: '123',
+ name: 'Test User',
+ context: 'test',
+ },
+ deletedAt: null,
+ dueAt: '2024-03-15T07:33:14.212Z',
+ favorites: { edges: [] },
+ id: '123',
+ position: 1,
+ status: 'DONE',
+ taskTargets: { edges: [] },
+ timelineActivities: { edges: [] },
+ title: 'Test',
+ updatedAt: '2024-03-15T07:33:14.212Z',
},
},
})),
diff --git a/packages/twenty-front/src/modules/auth/hooks/__tests__/useIsLogged.test.ts b/packages/twenty-front/src/modules/auth/hooks/__tests__/useIsLogged.test.ts
index 2674f26d9..cd9487bad 100644
--- a/packages/twenty-front/src/modules/auth/hooks/__tests__/useIsLogged.test.ts
+++ b/packages/twenty-front/src/modules/auth/hooks/__tests__/useIsLogged.test.ts
@@ -1,5 +1,4 @@
-import { act } from 'react-dom/test-utils';
-import { renderHook } from '@testing-library/react';
+import { act, renderHook } from '@testing-library/react';
import { RecoilRoot, useSetRecoilState } from 'recoil';
import { useIsLogged } from '@/auth/hooks/useIsLogged';
diff --git a/packages/twenty-front/src/modules/auth/services/__tests__/AuthService.test.ts b/packages/twenty-front/src/modules/auth/services/__tests__/AuthService.test.ts
index 50a21a2be..d8c6a319d 100644
--- a/packages/twenty-front/src/modules/auth/services/__tests__/AuthService.test.ts
+++ b/packages/twenty-front/src/modules/auth/services/__tests__/AuthService.test.ts
@@ -1,5 +1,5 @@
-import { act } from 'react-dom/test-utils';
import { enableFetchMocks } from 'jest-fetch-mock';
+import { act } from 'react';
import { renewToken } from '@/auth/services/AuthService';
diff --git a/packages/twenty-front/src/modules/auth/sign-in-up/hooks/__tests__/useSignInUpForm.test.tsx b/packages/twenty-front/src/modules/auth/sign-in-up/hooks/__tests__/useSignInUpForm.test.tsx
index 5b8669a58..f9dc7b184 100644
--- a/packages/twenty-front/src/modules/auth/sign-in-up/hooks/__tests__/useSignInUpForm.test.tsx
+++ b/packages/twenty-front/src/modules/auth/sign-in-up/hooks/__tests__/useSignInUpForm.test.tsx
@@ -3,7 +3,30 @@ import { isDeveloperDefaultSignInPrefilledState } from '@/client-config/states/i
import { renderHook } from '@testing-library/react';
import { ReactNode } from 'react';
import { MemoryRouter } from 'react-router-dom';
-import { RecoilRoot, useSetRecoilState } from 'recoil';
+import { RecoilRoot } from 'recoil';
+
+const TestWrapper = ({
+ children,
+ initialEntry = '/',
+ isDeveloperDefaultSignInPrefilled = false,
+}: {
+ children: ReactNode;
+ initialEntry?: string;
+ isDeveloperDefaultSignInPrefilled?: boolean;
+}) => (
+
+ {
+ snapshot.set(
+ isDeveloperDefaultSignInPrefilledState,
+ isDeveloperDefaultSignInPrefilled,
+ );
+ }}
+ >
+ {children}
+
+
+);
describe('useSignInUpForm', () => {
beforeEach(() => {
@@ -12,21 +35,17 @@ describe('useSignInUpForm', () => {
it('should initialize the form with default values', async () => {
const { result } = renderHook(() => useSignInUpForm(), {
- wrapper: ({ children }: { children: ReactNode }) => (
-
- {children}
-
- ),
+ wrapper: ({ children }) => {children},
});
expect(result.current.form).toBeDefined();
});
it('should not prefill sign-in developer defaults when state is false', () => {
const { result } = renderHook(() => useSignInUpForm(), {
- wrapper: ({ children }: { children: ReactNode }) => (
-
- {children}
-
+ wrapper: ({ children }) => (
+
+ {children}
+
),
});
@@ -39,24 +58,16 @@ describe('useSignInUpForm', () => {
});
it('should prefill developer defaults when the state is true', () => {
- const { result } = renderHook(
- () => {
- const setIsDeveloperDefaultSignInPrefilledState = useSetRecoilState(
- isDeveloperDefaultSignInPrefilledState,
- );
-
- setIsDeveloperDefaultSignInPrefilledState(true);
-
- return useSignInUpForm();
- },
- {
- wrapper: ({ children }: { children: ReactNode }) => (
-
- {children}
-
- ),
- },
- );
+ const { result } = renderHook(() => useSignInUpForm(), {
+ wrapper: ({ children }) => (
+
+ {children}
+
+ ),
+ });
expect(result.current.form.getValues()).toEqual({
exist: false,
diff --git a/packages/twenty-front/src/modules/navigation/hooks/__tests__/useDefaultHomePagePath.test.ts b/packages/twenty-front/src/modules/navigation/hooks/__tests__/useDefaultHomePagePath.test.ts
index 15574875c..18756dd0b 100644
--- a/packages/twenty-front/src/modules/navigation/hooks/__tests__/useDefaultHomePagePath.test.ts
+++ b/packages/twenty-front/src/modules/navigation/hooks/__tests__/useDefaultHomePagePath.test.ts
@@ -1,4 +1,5 @@
-import { renderHook } from '@testing-library/react';
+import { renderHook, waitFor } from '@testing-library/react';
+import { useEffect } from 'react';
import { RecoilRoot, useSetRecoilState } from 'recoil';
import { currentUserState } from '@/auth/states/currentUserState';
@@ -36,39 +37,48 @@ const renderHooks = ({
arePrefetchViewsLoadedState,
);
- setObjectMetadataItems(generatedMockObjectMetadataItems);
- setArePrefetchViewsLoaded(true);
+ useEffect(() => {
+ setObjectMetadataItems(generatedMockObjectMetadataItems);
+ setArePrefetchViewsLoaded(true);
- if (withExistingView) {
- setPrefetchViews([
- {
- id: 'viewId',
- name: 'Test View',
- objectMetadataId: getMockCompanyObjectMetadataItem().id,
- type: ViewType.Table,
- key: null,
- isCompact: false,
- openRecordIn: ViewOpenRecordInType.SIDE_PANEL,
- viewFields: [],
- viewGroups: [],
- viewSorts: [],
- kanbanFieldMetadataId: '',
- kanbanAggregateOperation: AggregateOperations.COUNT,
- icon: '',
- kanbanAggregateOperationFieldMetadataId: '',
- position: 0,
- viewFilters: [],
- __typename: 'View',
- },
- ]);
- } else {
- setPrefetchViews([]);
- }
+ if (withExistingView) {
+ setPrefetchViews([
+ {
+ id: 'viewId',
+ name: 'Test View',
+ objectMetadataId: getMockCompanyObjectMetadataItem().id,
+ type: ViewType.Table,
+ key: null,
+ isCompact: false,
+ openRecordIn: ViewOpenRecordInType.SIDE_PANEL,
+ viewFields: [],
+ viewGroups: [],
+ viewSorts: [],
+ kanbanFieldMetadataId: '',
+ kanbanAggregateOperation: AggregateOperations.COUNT,
+ icon: '',
+ kanbanAggregateOperationFieldMetadataId: '',
+ position: 0,
+ viewFilters: [],
+ __typename: 'View',
+ },
+ ]);
+ } else {
+ setPrefetchViews([]);
+ }
+
+ if (withCurrentUser) {
+ setCurrentUser(mockedUserData);
+ setCurrentUserWorkspace(mockedUserData.currentUserWorkspace);
+ }
+ }, [
+ setCurrentUser,
+ setCurrentUserWorkspace,
+ setObjectMetadataItems,
+ setPrefetchViews,
+ setArePrefetchViewsLoaded,
+ ]);
- if (withCurrentUser) {
- setCurrentUser(mockedUserData);
- setCurrentUserWorkspace(mockedUserData.currentUserWorkspace);
- }
return useDefaultHomePagePath();
},
{
@@ -79,34 +89,46 @@ const renderHooks = ({
};
describe('useDefaultHomePagePath', () => {
- it('should return proper path when no currentUser', () => {
+ it('should return proper path when no currentUser', async () => {
const { result } = renderHooks({
withCurrentUser: false,
withExistingView: false,
});
- expect(result.current.defaultHomePagePath).toEqual(AppPath.SignInUp);
+
+ await waitFor(() => {
+ expect(result.current.defaultHomePagePath).toEqual(AppPath.SignInUp);
+ });
});
- it('should return proper path when no currentUser and existing view', () => {
+ it('should return proper path when no currentUser and existing view', async () => {
const { result } = renderHooks({
withCurrentUser: false,
withExistingView: true,
});
- expect(result.current.defaultHomePagePath).toEqual(AppPath.SignInUp);
+
+ await waitFor(() => {
+ expect(result.current.defaultHomePagePath).toEqual(AppPath.SignInUp);
+ });
});
- it('should return proper path when currentUser is defined', () => {
+ it('should return proper path when currentUser is defined', async () => {
const { result } = renderHooks({
withCurrentUser: true,
withExistingView: false,
});
- expect(result.current.defaultHomePagePath).toEqual('/objects/companies');
+
+ await waitFor(() => {
+ expect(result.current.defaultHomePagePath).toEqual('/objects/companies');
+ });
});
- it('should return proper path when currentUser is defined and view exists', () => {
+ it('should return proper path when currentUser is defined and view exists', async () => {
const { result } = renderHooks({
withCurrentUser: true,
withExistingView: true,
});
- expect(result.current.defaultHomePagePath).toEqual(
- '/objects/companies?viewId=viewId',
- );
+
+ await waitFor(() => {
+ expect(result.current.defaultHomePagePath).toEqual(
+ '/objects/companies?viewId=viewId',
+ );
+ });
});
});
diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useFilteredObjectMetadataItems.test.tsx b/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useFilteredObjectMetadataItems.test.tsx
index 461a0f8eb..1d0b94582 100644
--- a/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useFilteredObjectMetadataItems.test.tsx
+++ b/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useFilteredObjectMetadataItems.test.tsx
@@ -1,7 +1,7 @@
import { MockedProvider } from '@apollo/client/testing';
import { act, renderHook } from '@testing-library/react';
import { ReactNode } from 'react';
-import { RecoilRoot, useSetRecoilState } from 'recoil';
+import { RecoilRoot } from 'recoil';
import {
query,
@@ -27,7 +27,11 @@ const mocks = [
];
const Wrapper = ({ children }: { children: ReactNode }) => (
-
+
+ set(objectMetadataItemsState, generatedMockObjectMetadataItems)
+ }
+ >
{children}
@@ -36,17 +40,9 @@ const Wrapper = ({ children }: { children: ReactNode }) => (
describe('useFilteredObjectMetadataItems', () => {
it('should findActiveObjectMetadataItemByNamePlural', async () => {
- const { result } = renderHook(
- () => {
- const setMetadataItems = useSetRecoilState(objectMetadataItemsState);
- setMetadataItems(generatedMockObjectMetadataItems);
-
- return useFilteredObjectMetadataItems();
- },
- {
- wrapper: Wrapper,
- },
- );
+ const { result } = renderHook(useFilteredObjectMetadataItems, {
+ wrapper: Wrapper,
+ });
act(() => {
const res =
@@ -57,17 +53,9 @@ describe('useFilteredObjectMetadataItems', () => {
});
it('should findObjectMetadataItemByNamePlural', async () => {
- const { result } = renderHook(
- () => {
- const setMetadataItems = useSetRecoilState(objectMetadataItemsState);
- setMetadataItems(generatedMockObjectMetadataItems);
-
- return useFilteredObjectMetadataItems();
- },
- {
- wrapper: Wrapper,
- },
- );
+ const { result } = renderHook(useFilteredObjectMetadataItems, {
+ wrapper: Wrapper,
+ });
act(() => {
const res = result.current.findObjectMetadataItemByNamePlural('people');
@@ -81,17 +69,9 @@ describe('useFilteredObjectMetadataItems', () => {
(item) => item.namePlural === 'people',
);
- const { result } = renderHook(
- () => {
- const setMetadataItems = useSetRecoilState(objectMetadataItemsState);
- setMetadataItems(generatedMockObjectMetadataItems);
-
- return useFilteredObjectMetadataItems();
- },
- {
- wrapper: Wrapper,
- },
- );
+ const { result } = renderHook(useFilteredObjectMetadataItems, {
+ wrapper: Wrapper,
+ });
act(() => {
const res = result.current.findObjectMetadataItemById(
@@ -103,17 +83,9 @@ describe('useFilteredObjectMetadataItems', () => {
});
it('should findObjectMetadataItemByNamePlural', async () => {
- const { result } = renderHook(
- () => {
- const setMetadataItems = useSetRecoilState(objectMetadataItemsState);
- setMetadataItems(generatedMockObjectMetadataItems);
-
- return useFilteredObjectMetadataItems();
- },
- {
- wrapper: Wrapper,
- },
- );
+ const { result } = renderHook(useFilteredObjectMetadataItems, {
+ wrapper: Wrapper,
+ });
act(() => {
const res =
diff --git a/packages/twenty-front/src/modules/object-record/graphql/utils/__tests__/computeDepthOneRecordGqlFieldsFromRecord.test.ts b/packages/twenty-front/src/modules/object-record/graphql/utils/__tests__/computeDepthOneRecordGqlFieldsFromRecord.test.ts
index 87eb9c254..bfbd7b920 100644
--- a/packages/twenty-front/src/modules/object-record/graphql/utils/__tests__/computeDepthOneRecordGqlFieldsFromRecord.test.ts
+++ b/packages/twenty-front/src/modules/object-record/graphql/utils/__tests__/computeDepthOneRecordGqlFieldsFromRecord.test.ts
@@ -15,7 +15,7 @@ describe('computeDepthOneRecordGqlFieldsFromRecord', () => {
expect(result).toMatchInlineSnapshot(`
{
"attachments": false,
- "avatarUrl": false,
+ "avatarUrl": true,
"calendarEventParticipants": false,
"city": true,
"company": true,
@@ -23,25 +23,25 @@ describe('computeDepthOneRecordGqlFieldsFromRecord', () => {
"createdAt": true,
"createdBy": true,
"deletedAt": true,
- "emails": false,
+ "emails": true,
"favorites": false,
"id": true,
- "intro": false,
+ "intro": true,
"jobTitle": true,
"linkedinLink": true,
"messageParticipants": false,
"name": true,
"noteTargets": true,
- "performanceRating": false,
+ "performanceRating": true,
"phones": true,
"pointOfContactForOpportunities": false,
"position": true,
"searchVector": false,
"taskTargets": true,
"timelineActivities": false,
- "updatedAt": false,
- "whatsapp": false,
- "workPreference": false,
+ "updatedAt": true,
+ "whatsapp": true,
+ "workPreference": true,
"xLink": true,
}
`);
diff --git a/packages/twenty-front/src/modules/object-record/hooks/__tests__/__snapshots__/useDeleteOneRecord.test.tsx.snap b/packages/twenty-front/src/modules/object-record/hooks/__tests__/__snapshots__/useDeleteOneRecord.test.tsx.snap
index 643a7dd47..c8e1d356a 100644
--- a/packages/twenty-front/src/modules/object-record/hooks/__tests__/__snapshots__/useDeleteOneRecord.test.tsx.snap
+++ b/packages/twenty-front/src/modules/object-record/hooks/__tests__/__snapshots__/useDeleteOneRecord.test.tsx.snap
@@ -11,6 +11,7 @@ exports[`useDeleteOneRecord A. Starting from empty cache 1. Should successfully
exports[`useDeleteOneRecord B. Starting from filled cache 1. Should handle successfull record deletion 1`] = `
{
"__typename": "Person",
+ "avatarUrl": null,
"city": "ASd",
"company": {
"__typename": "Company",
@@ -54,12 +55,18 @@ exports[`useDeleteOneRecord B. Starting from filled cache 1. Should handle succe
"createdAt": "2025-01-02T09:52:46.814Z",
"createdBy": {
"__typename": "Actor",
+ "context": null,
"name": "Tim Apple",
"source": "MANUAL",
"workspaceMemberId": "20202020-0687-4c41-b707-ed1bfca972a7",
},
"deletedAt": "2024-02-14T09:45:00Z",
+ "emails": {
+ "additionalEmails": [],
+ "primaryEmail": "asd.com",
+ },
"id": "da3c2c4b-da01-4b81-9734-226069eb4cd0",
+ "intro": "",
"jobTitle": "",
"linkedinLink": {
"__typename": "Links",
@@ -73,13 +80,23 @@ exports[`useDeleteOneRecord B. Starting from filled cache 1. Should handle succe
"lastName": "Test",
},
"noteTargets": [],
+ "performanceRating": null,
"phones": {
+ "additionalPhones": [],
"primaryPhoneCallingCode": "+33",
"primaryPhoneCountryCode": "FR",
"primaryPhoneNumber": "781234562",
},
"position": 0,
"taskTargets": [],
+ "updatedAt": "2025-01-02T09:52:46.814Z",
+ "whatsapp": {
+ "additionalPhones": [],
+ "primaryPhoneCallingCode": "",
+ "primaryPhoneCountryCode": "",
+ "primaryPhoneNumber": "",
+ },
+ "workPreference": null,
"xLink": {
"__typename": "Links",
"primaryLinkLabel": "",
@@ -135,16 +152,23 @@ exports[`useDeleteOneRecord B. Starting from filled cache 1. Should handle succe
"people": [
{
"__typename": "Person",
+ "avatarUrl": null,
"city": "Seattle",
"createdAt": "2025-01-01T09:50:00.000Z",
"createdBy": {
"__typename": "Actor",
+ "context": null,
"name": "Tim Apple",
"source": "MANUAL",
"workspaceMemberId": "20202020-0687-4c41-b707-ed1bfca972a7",
},
"deletedAt": null,
+ "emails": {
+ "additionalEmails": [],
+ "primaryEmail": "christoph.calisto@linkedin.com",
+ },
"id": "20202020-1c0e-494c-a1b6-85b1c6fefaa5",
+ "intro": "",
"jobTitle": "",
"linkedinLink": {
"__typename": "Links",
@@ -157,12 +181,22 @@ exports[`useDeleteOneRecord B. Starting from filled cache 1. Should handle succe
"firstName": "Christoph",
"lastName": "Callisto",
},
+ "performanceRating": null,
"phones": {
+ "additionalPhones": [],
"primaryPhoneCallingCode": "+33",
"primaryPhoneCountryCode": "FR",
"primaryPhoneNumber": "781234562",
},
"position": 1,
+ "updatedAt": "2025-01-01T09:50:00.000Z",
+ "whatsapp": {
+ "additionalPhones": [],
+ "primaryPhoneCallingCode": "",
+ "primaryPhoneCountryCode": "",
+ "primaryPhoneNumber": "",
+ },
+ "workPreference": null,
"xLink": {
"__typename": "Links",
"primaryLinkLabel": "",
@@ -195,6 +229,7 @@ exports[`useDeleteOneRecord B. Starting from filled cache 1. Should handle succe
"lastName": "Palmer",
},
"phones": {
+ "additionalPhones": [],
"primaryPhoneCallingCode": "+33",
"primaryPhoneCountryCode": "FR",
"primaryPhoneNumber": "781234576",
@@ -216,6 +251,7 @@ exports[`useDeleteOneRecord B. Starting from filled cache 1. Should handle succe
exports[`useDeleteOneRecord B. Starting from filled cache 2. Should handle optimistic cache on record deletion 1`] = `
{
"__typename": "Person",
+ "avatarUrl": null,
"city": "ASd",
"company": {
"__typename": "Company",
@@ -259,12 +295,18 @@ exports[`useDeleteOneRecord B. Starting from filled cache 2. Should handle optim
"createdAt": "2025-01-02T09:52:46.814Z",
"createdBy": {
"__typename": "Actor",
+ "context": null,
"name": "Tim Apple",
"source": "MANUAL",
"workspaceMemberId": "20202020-0687-4c41-b707-ed1bfca972a7",
},
"deletedAt": Any,
+ "emails": {
+ "additionalEmails": [],
+ "primaryEmail": "asd.com",
+ },
"id": "da3c2c4b-da01-4b81-9734-226069eb4cd0",
+ "intro": "",
"jobTitle": "",
"linkedinLink": {
"__typename": "Links",
@@ -278,13 +320,23 @@ exports[`useDeleteOneRecord B. Starting from filled cache 2. Should handle optim
"lastName": "Test",
},
"noteTargets": [],
+ "performanceRating": null,
"phones": {
+ "additionalPhones": [],
"primaryPhoneCallingCode": "+33",
"primaryPhoneCountryCode": "FR",
"primaryPhoneNumber": "781234562",
},
"position": 0,
"taskTargets": [],
+ "updatedAt": "2025-01-02T09:52:46.814Z",
+ "whatsapp": {
+ "additionalPhones": [],
+ "primaryPhoneCallingCode": "",
+ "primaryPhoneCountryCode": "",
+ "primaryPhoneNumber": "",
+ },
+ "workPreference": null,
"xLink": {
"__typename": "Links",
"primaryLinkLabel": "",
@@ -340,16 +392,23 @@ exports[`useDeleteOneRecord B. Starting from filled cache 2. Should handle optim
"people": [
{
"__typename": "Person",
+ "avatarUrl": null,
"city": "Seattle",
"createdAt": "2025-01-01T09:50:00.000Z",
"createdBy": {
"__typename": "Actor",
+ "context": null,
"name": "Tim Apple",
"source": "MANUAL",
"workspaceMemberId": "20202020-0687-4c41-b707-ed1bfca972a7",
},
"deletedAt": null,
+ "emails": {
+ "additionalEmails": [],
+ "primaryEmail": "christoph.calisto@linkedin.com",
+ },
"id": "20202020-1c0e-494c-a1b6-85b1c6fefaa5",
+ "intro": "",
"jobTitle": "",
"linkedinLink": {
"__typename": "Links",
@@ -362,12 +421,22 @@ exports[`useDeleteOneRecord B. Starting from filled cache 2. Should handle optim
"firstName": "Christoph",
"lastName": "Callisto",
},
+ "performanceRating": null,
"phones": {
+ "additionalPhones": [],
"primaryPhoneCallingCode": "+33",
"primaryPhoneCountryCode": "FR",
"primaryPhoneNumber": "781234562",
},
"position": 1,
+ "updatedAt": "2025-01-01T09:50:00.000Z",
+ "whatsapp": {
+ "additionalPhones": [],
+ "primaryPhoneCallingCode": "",
+ "primaryPhoneCountryCode": "",
+ "primaryPhoneNumber": "",
+ },
+ "workPreference": null,
"xLink": {
"__typename": "Links",
"primaryLinkLabel": "",
@@ -400,6 +469,7 @@ exports[`useDeleteOneRecord B. Starting from filled cache 2. Should handle optim
"lastName": "Palmer",
},
"phones": {
+ "additionalPhones": [],
"primaryPhoneCallingCode": "+33",
"primaryPhoneCountryCode": "FR",
"primaryPhoneNumber": "781234576",
@@ -421,6 +491,7 @@ exports[`useDeleteOneRecord B. Starting from filled cache 2. Should handle optim
exports[`useDeleteOneRecord B. Starting from filled cache 3. Should handle optimistic cache rollback on record deletion failure 1`] = `
{
"__typename": "Person",
+ "avatarUrl": null,
"city": "ASd",
"company": {
"__typename": "Company",
@@ -464,12 +535,18 @@ exports[`useDeleteOneRecord B. Starting from filled cache 3. Should handle optim
"createdAt": "2025-01-02T09:52:46.814Z",
"createdBy": {
"__typename": "Actor",
+ "context": null,
"name": "Tim Apple",
"source": "MANUAL",
"workspaceMemberId": "20202020-0687-4c41-b707-ed1bfca972a7",
},
"deletedAt": null,
+ "emails": {
+ "additionalEmails": [],
+ "primaryEmail": "asd.com",
+ },
"id": "da3c2c4b-da01-4b81-9734-226069eb4cd0",
+ "intro": "",
"jobTitle": "",
"linkedinLink": {
"__typename": "Links",
@@ -483,13 +560,23 @@ exports[`useDeleteOneRecord B. Starting from filled cache 3. Should handle optim
"lastName": "Test",
},
"noteTargets": [],
+ "performanceRating": null,
"phones": {
+ "additionalPhones": [],
"primaryPhoneCallingCode": "+33",
"primaryPhoneCountryCode": "FR",
"primaryPhoneNumber": "781234562",
},
"position": 0,
"taskTargets": [],
+ "updatedAt": "2025-01-02T09:52:46.814Z",
+ "whatsapp": {
+ "additionalPhones": [],
+ "primaryPhoneCallingCode": "",
+ "primaryPhoneCountryCode": "",
+ "primaryPhoneNumber": "",
+ },
+ "workPreference": null,
"xLink": {
"__typename": "Links",
"primaryLinkLabel": "",
@@ -545,16 +632,23 @@ exports[`useDeleteOneRecord B. Starting from filled cache 3. Should handle optim
"people": [
{
"__typename": "Person",
+ "avatarUrl": null,
"city": "Seattle",
"createdAt": "2025-01-01T09:50:00.000Z",
"createdBy": {
"__typename": "Actor",
+ "context": null,
"name": "Tim Apple",
"source": "MANUAL",
"workspaceMemberId": "20202020-0687-4c41-b707-ed1bfca972a7",
},
"deletedAt": null,
+ "emails": {
+ "additionalEmails": [],
+ "primaryEmail": "christoph.calisto@linkedin.com",
+ },
"id": "20202020-1c0e-494c-a1b6-85b1c6fefaa5",
+ "intro": "",
"jobTitle": "",
"linkedinLink": {
"__typename": "Links",
@@ -567,12 +661,22 @@ exports[`useDeleteOneRecord B. Starting from filled cache 3. Should handle optim
"firstName": "Christoph",
"lastName": "Callisto",
},
+ "performanceRating": null,
"phones": {
+ "additionalPhones": [],
"primaryPhoneCallingCode": "+33",
"primaryPhoneCountryCode": "FR",
"primaryPhoneNumber": "781234562",
},
"position": 1,
+ "updatedAt": "2025-01-01T09:50:00.000Z",
+ "whatsapp": {
+ "additionalPhones": [],
+ "primaryPhoneCallingCode": "",
+ "primaryPhoneCountryCode": "",
+ "primaryPhoneNumber": "",
+ },
+ "workPreference": null,
"xLink": {
"__typename": "Links",
"primaryLinkLabel": "",
@@ -605,6 +709,7 @@ exports[`useDeleteOneRecord B. Starting from filled cache 3. Should handle optim
"lastName": "Palmer",
},
"phones": {
+ "additionalPhones": [],
"primaryPhoneCallingCode": "+33",
"primaryPhoneCountryCode": "FR",
"primaryPhoneNumber": "781234576",
diff --git a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFindManyRecords.test.tsx b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFindManyRecords.test.tsx
index 70deffd48..5226b3856 100644
--- a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFindManyRecords.test.tsx
+++ b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useFindManyRecords.test.tsx
@@ -1,58 +1,35 @@
import { renderHook } from '@testing-library/react';
-import { useSetRecoilState } from 'recoil';
import { currentWorkspaceMemberState } from '@/auth/states/currentWorkspaceMemberState';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
-import {
- query,
- responseData,
- variables,
-} from '@/object-record/hooks/__mocks__/useFindManyRecords';
import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords';
import { getJestMetadataAndApolloMocksWrapper } from '~/testing/jest/getJestMetadataAndApolloMocksWrapper';
import { generatedMockObjectMetadataItems } from '~/testing/mock-data/generatedMockObjectMetadataItems';
-const mocks = [
- {
- request: {
- query,
- variables,
- },
- result: jest.fn(() => ({
- data: {
- deletePeople: responseData,
- },
- })),
- },
-];
-
const Wrapper = getJestMetadataAndApolloMocksWrapper({
- apolloMocks: mocks,
+ apolloMocks: [],
+ onInitializeRecoilSnapshot: (snapshot) => {
+ snapshot.set(currentWorkspaceMemberState, {
+ id: '32219445-f587-4c40-b2b1-6d3205ed96da',
+ name: { firstName: 'John', lastName: 'Connor' },
+ locale: 'en',
+ colorScheme: 'Light',
+ userEmail: 'userEmail',
+ });
+ snapshot.set(objectMetadataItemsState, generatedMockObjectMetadataItems);
+ },
});
+
describe('useFindManyRecords', () => {
it('should work as expected', async () => {
const onCompleted = jest.fn();
const { result } = renderHook(
() => {
- const setCurrentWorkspaceMember = useSetRecoilState(
- currentWorkspaceMemberState,
- );
- setCurrentWorkspaceMember({
- id: '32219445-f587-4c40-b2b1-6d3205ed96da',
- name: { firstName: 'John', lastName: 'Connor' },
- locale: 'en',
- colorScheme: 'Light',
- userEmail: 'userEmail',
- });
-
- const setMetadataItems = useSetRecoilState(objectMetadataItemsState);
-
- setMetadataItems(generatedMockObjectMetadataItems);
-
return useFindManyRecords({
objectNameSingular: 'person',
onCompleted,
+ skip: true,
});
},
{
@@ -60,8 +37,9 @@ describe('useFindManyRecords', () => {
},
);
- expect(result.current.loading).toBe(true);
+ expect(result.current.loading).toBe(false);
expect(result.current.error).toBeUndefined();
expect(result.current.records.length).toBe(0);
+ expect(result.current.objectMetadataItem).toBeDefined();
});
});
diff --git a/packages/twenty-front/src/modules/object-record/record-field/hooks/__tests__/usePersistField.test.tsx b/packages/twenty-front/src/modules/object-record/record-field/hooks/__tests__/usePersistField.test.tsx
index 4d5b354d1..785531ecc 100644
--- a/packages/twenty-front/src/modules/object-record/record-field/hooks/__tests__/usePersistField.test.tsx
+++ b/packages/twenty-front/src/modules/object-record/record-field/hooks/__tests__/usePersistField.test.tsx
@@ -1,5 +1,6 @@
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { PERSON_FRAGMENT_WITH_DEPTH_ONE_RELATIONS } from '@/object-record/hooks/__mocks__/personFragments';
+import { responseData } from '@/object-record/hooks/__mocks__/useUpdateOneRecord';
import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord';
import {
phonesFieldDefinition,
@@ -36,6 +37,8 @@ const phoneMock = {
additionalPhones: [],
};
+const mockPersonResponse = { ...responseData, id: 'recordId' };
+
const mocks: MockedResponse[] = [
{
request: {
@@ -49,9 +52,7 @@ const mocks: MockedResponse[] = [
},
result: jest.fn(() => ({
data: {
- updatePerson: {
- id: 'recordId',
- },
+ updatePerson: mockPersonResponse,
},
})),
},
@@ -65,9 +66,7 @@ const mocks: MockedResponse[] = [
},
result: jest.fn(() => ({
data: {
- updatePerson: {
- id: 'recordId',
- },
+ updatePerson: mockPersonResponse,
},
})),
},
diff --git a/packages/twenty-front/src/modules/onboarding/hooks/__tests__/useOnboardingStatus.test.ts b/packages/twenty-front/src/modules/onboarding/hooks/__tests__/useOnboardingStatus.test.ts
index 3aaf64495..c9323829b 100644
--- a/packages/twenty-front/src/modules/onboarding/hooks/__tests__/useOnboardingStatus.test.ts
+++ b/packages/twenty-front/src/modules/onboarding/hooks/__tests__/useOnboardingStatus.test.ts
@@ -1,5 +1,5 @@
-import { act } from 'react-dom/test-utils';
import { renderHook } from '@testing-library/react';
+import { act } from 'react';
import { RecoilRoot, useSetRecoilState } from 'recoil';
import { CurrentUser, currentUserState } from '@/auth/states/currentUserState';
diff --git a/packages/twenty-front/src/modules/settings/developers/hooks/__tests__/useWebhookForm.test.tsx b/packages/twenty-front/src/modules/settings/developers/hooks/__tests__/useWebhookForm.test.tsx
index 3432239ff..f0aa63ab3 100644
--- a/packages/twenty-front/src/modules/settings/developers/hooks/__tests__/useWebhookForm.test.tsx
+++ b/packages/twenty-front/src/modules/settings/developers/hooks/__tests__/useWebhookForm.test.tsx
@@ -1,5 +1,5 @@
import { MockedProvider } from '@apollo/client/testing';
-import { renderHook } from '@testing-library/react';
+import { act, renderHook } from '@testing-library/react';
import { ReactNode } from 'react';
import { MemoryRouter } from 'react-router-dom';
import { RecoilRoot } from 'recoil';
@@ -99,7 +99,9 @@ describe('useWebhookForm', () => {
secret: 'test-secret',
};
- await result.current.handleSave(formData);
+ await act(async () => {
+ await result.current.handleSave(formData);
+ });
expect(mockCreateOneRecord).toHaveBeenCalledWith({
id: expect.any(String),
@@ -132,7 +134,9 @@ describe('useWebhookForm', () => {
secret: 'test-secret',
};
- await result.current.handleSave(formData);
+ await act(async () => {
+ await result.current.handleSave(formData);
+ });
expect(mockEnqueueErrorSnackBar).toHaveBeenCalledWith({
apolloError: error,
@@ -159,7 +163,9 @@ describe('useWebhookForm', () => {
secret: 'test-secret',
};
- await result.current.handleSave(formData);
+ await act(async () => {
+ await result.current.handleSave(formData);
+ });
expect(mockCreateOneRecord).toHaveBeenCalledWith({
id: expect.any(String),
@@ -206,7 +212,9 @@ describe('useWebhookForm', () => {
secret: 'updated-secret',
};
- await result.current.handleSave(formData);
+ await act(async () => {
+ await result.current.handleSave(formData);
+ });
expect(mockUpdateOneRecord).toHaveBeenCalledWith({
idToUpdate: webhookId,
@@ -241,7 +249,9 @@ describe('useWebhookForm', () => {
secret: 'test-secret',
};
- await result.current.handleSave(formData);
+ await act(async () => {
+ await result.current.handleSave(formData);
+ });
expect(mockEnqueueErrorSnackBar).toHaveBeenCalledWith({
apolloError: error,
@@ -256,7 +266,9 @@ describe('useWebhookForm', () => {
{ wrapper: Wrapper },
);
- result.current.updateOperation(0, 'object', 'person');
+ act(() => {
+ result.current.updateOperation(0, 'object', 'person');
+ });
const operations = result.current.formConfig.getValues('operations');
expect(operations[0].object).toBe('person');
@@ -268,16 +280,20 @@ describe('useWebhookForm', () => {
{ wrapper: Wrapper },
);
- result.current.formConfig.setValue('operations', [
- { object: 'person', action: 'created' },
- { object: 'company', action: 'updated' },
- ]);
+ act(() => {
+ result.current.formConfig.setValue('operations', [
+ { object: 'person', action: 'created' },
+ { object: 'company', action: 'updated' },
+ ]);
+ });
const initialOperations =
result.current.formConfig.getValues('operations');
const initialCount = initialOperations.length;
- result.current.removeOperation(0);
+ act(() => {
+ result.current.removeOperation(0);
+ });
const updatedOperations =
result.current.formConfig.getValues('operations');
@@ -300,7 +316,9 @@ describe('useWebhookForm', () => {
{ wrapper: Wrapper },
);
- await result.current.deleteWebhook();
+ await act(async () => {
+ await result.current.deleteWebhook();
+ });
expect(mockDeleteOneRecord).toHaveBeenCalledWith(webhookId);
expect(mockEnqueueSuccessSnackBar).toHaveBeenCalledWith({
@@ -314,7 +332,9 @@ describe('useWebhookForm', () => {
{ wrapper: Wrapper },
);
- await result.current.deleteWebhook();
+ await act(async () => {
+ await result.current.deleteWebhook();
+ });
expect(mockEnqueueErrorSnackBar).toHaveBeenCalledWith({
message: 'Webhook ID is required for deletion',
@@ -336,7 +356,9 @@ describe('useWebhookForm', () => {
{ wrapper: Wrapper },
);
- await result.current.deleteWebhook();
+ await act(async () => {
+ await result.current.deleteWebhook();
+ });
expect(mockEnqueueErrorSnackBar).toHaveBeenCalledWith({
apolloError: error,
diff --git a/packages/twenty-front/src/modules/ui/feedback/dialog-manager/hooks/__tests__/useDialogManager.test.tsx b/packages/twenty-front/src/modules/ui/feedback/dialog-manager/hooks/__tests__/useDialogManager.test.tsx
index f80d9b97d..a5d40c996 100644
--- a/packages/twenty-front/src/modules/ui/feedback/dialog-manager/hooks/__tests__/useDialogManager.test.tsx
+++ b/packages/twenty-front/src/modules/ui/feedback/dialog-manager/hooks/__tests__/useDialogManager.test.tsx
@@ -1,5 +1,4 @@
-import { act } from 'react-dom/test-utils';
-import { renderHook } from '@testing-library/react';
+import { act, renderHook } from '@testing-library/react';
import { RecoilRoot } from 'recoil';
import { v4 as uuidv4 } from 'uuid';
diff --git a/packages/twenty-front/src/modules/ui/feedback/dialog-manager/hooks/internal/__tests__/useDialogManagerScopedStates.test.tsx b/packages/twenty-front/src/modules/ui/feedback/dialog-manager/hooks/internal/__tests__/useDialogManagerScopedStates.test.tsx
index 611cca2b1..8f2d87824 100644
--- a/packages/twenty-front/src/modules/ui/feedback/dialog-manager/hooks/internal/__tests__/useDialogManagerScopedStates.test.tsx
+++ b/packages/twenty-front/src/modules/ui/feedback/dialog-manager/hooks/internal/__tests__/useDialogManagerScopedStates.test.tsx
@@ -1,5 +1,4 @@
-import { act } from 'react-dom/test-utils';
-import { renderHook } from '@testing-library/react';
+import { act, renderHook } from '@testing-library/react';
import { RecoilRoot } from 'recoil';
import { useDialogManagerScopedStates } from '@/ui/feedback/dialog-manager/hooks/internal/useDialogManagerScopedStates';
diff --git a/packages/twenty-front/src/modules/ui/feedback/snack-bar-manager/hooks/internal/__tests__/useSnackBarManagerScopedStates.test.tsx b/packages/twenty-front/src/modules/ui/feedback/snack-bar-manager/hooks/internal/__tests__/useSnackBarManagerScopedStates.test.tsx
index 3f383dd13..c67a6632f 100644
--- a/packages/twenty-front/src/modules/ui/feedback/snack-bar-manager/hooks/internal/__tests__/useSnackBarManagerScopedStates.test.tsx
+++ b/packages/twenty-front/src/modules/ui/feedback/snack-bar-manager/hooks/internal/__tests__/useSnackBarManagerScopedStates.test.tsx
@@ -1,5 +1,4 @@
-import { act } from 'react-dom/test-utils';
-import { renderHook } from '@testing-library/react';
+import { act, renderHook } from '@testing-library/react';
import { RecoilRoot } from 'recoil';
import { useSnackBarManagerScopedStates } from '@/ui/feedback/snack-bar-manager/hooks/internal/useSnackBarManagerScopedStates';
diff --git a/packages/twenty-front/src/modules/ui/input/hooks/__tests__/useIconPicker.test.tsx b/packages/twenty-front/src/modules/ui/input/hooks/__tests__/useIconPicker.test.tsx
index 22e4d7537..9c08c5a2e 100644
--- a/packages/twenty-front/src/modules/ui/input/hooks/__tests__/useIconPicker.test.tsx
+++ b/packages/twenty-front/src/modules/ui/input/hooks/__tests__/useIconPicker.test.tsx
@@ -1,5 +1,5 @@
-import { act } from 'react-dom/test-utils';
import { renderHook } from '@testing-library/react';
+import { act } from 'react';
import { RecoilRoot } from 'recoil';
import { useIconPicker } from '@/ui/input/hooks/useIconPicker';
diff --git a/packages/twenty-front/src/modules/ui/layout/selectable-list/hooks/__tests__/useSelectableList.test.ts b/packages/twenty-front/src/modules/ui/layout/selectable-list/hooks/__tests__/useSelectableList.test.ts
index 764735e93..f6a26777b 100644
--- a/packages/twenty-front/src/modules/ui/layout/selectable-list/hooks/__tests__/useSelectableList.test.ts
+++ b/packages/twenty-front/src/modules/ui/layout/selectable-list/hooks/__tests__/useSelectableList.test.ts
@@ -1,5 +1,5 @@
import { renderHook } from '@testing-library/react';
-import { act } from 'react-dom/test-utils';
+import { act } from 'react';
import { RecoilRoot } from 'recoil';
import { useSelectableList } from '@/ui/layout/selectable-list/hooks/useSelectableList';
diff --git a/packages/twenty-front/src/modules/ui/navigation/step-bar/hooks/__tests__/useStepBar.test.tsx b/packages/twenty-front/src/modules/ui/navigation/step-bar/hooks/__tests__/useStepBar.test.tsx
index 9acd228fb..b4d36aa11 100644
--- a/packages/twenty-front/src/modules/ui/navigation/step-bar/hooks/__tests__/useStepBar.test.tsx
+++ b/packages/twenty-front/src/modules/ui/navigation/step-bar/hooks/__tests__/useStepBar.test.tsx
@@ -1,5 +1,4 @@
-import { act } from 'react-dom/test-utils';
-import { renderHook } from '@testing-library/react';
+import { act, renderHook } from '@testing-library/react';
import { RecoilRoot, useRecoilValue } from 'recoil';
import { stepBarInternalState } from '../../states/stepBarInternalState';
diff --git a/packages/twenty-front/src/modules/ui/utilities/drag-select/components/__tests__/DragSelect.test.tsx b/packages/twenty-front/src/modules/ui/utilities/drag-select/components/__tests__/DragSelect.test.tsx
index 593904605..81c7b95a5 100644
--- a/packages/twenty-front/src/modules/ui/utilities/drag-select/components/__tests__/DragSelect.test.tsx
+++ b/packages/twenty-front/src/modules/ui/utilities/drag-select/components/__tests__/DragSelect.test.tsx
@@ -1,4 +1,5 @@
import { render } from '@testing-library/react';
+import { act } from 'react';
import { RecoilRoot } from 'recoil';
import { PointerEventListener } from '@/ui/utilities/pointer-event/types/PointerEventListener';
@@ -70,10 +71,12 @@ describe('DragSelect', () => {
preventDefault: jest.fn(),
};
- callbacks.onMouseDown({
- x: 150,
- y: 150,
- event: mockEvent,
+ act(() => {
+ callbacks.onMouseDown({
+ x: 150,
+ y: 150,
+ event: mockEvent,
+ });
});
expect(mockEvent.preventDefault).not.toHaveBeenCalled();
@@ -92,10 +95,12 @@ describe('DragSelect', () => {
preventDefault: jest.fn(),
};
- callbacks.onMouseDown({
- x: 150,
- y: 150,
- event: mockEvent,
+ act(() => {
+ callbacks.onMouseDown({
+ x: 150,
+ y: 150,
+ event: mockEvent,
+ });
});
expect(mockEvent.preventDefault).toHaveBeenCalled();
@@ -131,10 +136,12 @@ describe('DragSelect', () => {
.mockReturnValue(mockBoundaryElement);
mockBoundaryElement.contains = jest.fn().mockReturnValue(true);
- callbacks.onMouseDown({
- x: 150,
- y: 150,
- event: { target: mockTarget, preventDefault: jest.fn() },
+ act(() => {
+ callbacks.onMouseDown({
+ x: 150,
+ y: 150,
+ event: { target: mockTarget, preventDefault: jest.fn() },
+ });
});
expect(mockSelectableContainer.closest).toHaveBeenCalledWith(
@@ -160,10 +167,12 @@ describe('DragSelect', () => {
mockSelectableContainer.contains = jest.fn().mockReturnValue(true);
expect(() => {
- callbacks.onMouseDown({
- x: 150,
- y: 150,
- event: { target: mockTarget, preventDefault: jest.fn() },
+ act(() => {
+ callbacks.onMouseDown({
+ x: 150,
+ y: 150,
+ event: { target: mockTarget, preventDefault: jest.fn() },
+ });
});
}).not.toThrow();
});
diff --git a/packages/twenty-front/src/modules/ui/utilities/drag-select/hooks/__tests__/useDragSelect.test.tsx b/packages/twenty-front/src/modules/ui/utilities/drag-select/hooks/__tests__/useDragSelect.test.tsx
index 325e9212f..cbc62c02d 100644
--- a/packages/twenty-front/src/modules/ui/utilities/drag-select/hooks/__tests__/useDragSelect.test.tsx
+++ b/packages/twenty-front/src/modules/ui/utilities/drag-select/hooks/__tests__/useDragSelect.test.tsx
@@ -1,5 +1,5 @@
-import { act } from 'react-dom/test-utils';
import { renderHook } from '@testing-library/react';
+import { act } from 'react';
import { RecoilRoot } from 'recoil';
import { useDragSelect } from '../useDragSelect';
diff --git a/packages/twenty-front/src/modules/ui/utilities/hotkey/hooks/__tests__/useGoToHotkeys.test.tsx b/packages/twenty-front/src/modules/ui/utilities/hotkey/hooks/__tests__/useGoToHotkeys.test.tsx
index f7e478d2c..78cf9609c 100644
--- a/packages/twenty-front/src/modules/ui/utilities/hotkey/hooks/__tests__/useGoToHotkeys.test.tsx
+++ b/packages/twenty-front/src/modules/ui/utilities/hotkey/hooks/__tests__/useGoToHotkeys.test.tsx
@@ -1,5 +1,4 @@
-import { fireEvent, renderHook } from '@testing-library/react';
-import { act } from 'react-dom/test-utils';
+import { act, fireEvent, renderHook } from '@testing-library/react';
import { MemoryRouter, useLocation } from 'react-router-dom';
import { RecoilRoot } from 'recoil';
diff --git a/packages/twenty-front/src/modules/ui/utilities/recoil-scope/hooks/__tests__/useContextScopeId.test.tsx b/packages/twenty-front/src/modules/ui/utilities/recoil-scope/hooks/__tests__/useContextScopeId.test.tsx
index b14092d3b..810ba3fad 100644
--- a/packages/twenty-front/src/modules/ui/utilities/recoil-scope/hooks/__tests__/useContextScopeId.test.tsx
+++ b/packages/twenty-front/src/modules/ui/utilities/recoil-scope/hooks/__tests__/useContextScopeId.test.tsx
@@ -1,5 +1,5 @@
-import { createContext } from 'react';
import { renderHook } from '@testing-library/react';
+import { createContext } from 'react';
import { useContextScopeId } from '@/ui/utilities/recoil-scope/hooks/useContextScopeId';
@@ -25,8 +25,19 @@ describe('useContextScopeId', () => {
});
it('Should throw an error when used outside of the specified context', () => {
+ // Suppress console errors for this test since we're expecting an error
+ /* eslint-disable no-console */
+ const originalConsoleError = console.error;
+ console.error = jest.fn();
+ /* eslint-enable no-console */
+
expect(() => {
renderHook(() => useContextScopeId(nullContext));
}).toThrow(ERROR_MESSAGE);
+
+ // Restore console.error
+ /* eslint-disable no-console */
+ console.error = originalConsoleError;
+ /* eslint-enable no-console */
});
});
diff --git a/packages/twenty-front/src/modules/ui/utilities/recoil-scope/hooks/__tests__/useRecoilScopeId.test.tsx b/packages/twenty-front/src/modules/ui/utilities/recoil-scope/hooks/__tests__/useRecoilScopeId.test.tsx
index a8d5eafd1..9faa15c44 100644
--- a/packages/twenty-front/src/modules/ui/utilities/recoil-scope/hooks/__tests__/useRecoilScopeId.test.tsx
+++ b/packages/twenty-front/src/modules/ui/utilities/recoil-scope/hooks/__tests__/useRecoilScopeId.test.tsx
@@ -1,5 +1,5 @@
-import { createContext } from 'react';
import { renderHook } from '@testing-library/react';
+import { createContext } from 'react';
import { useRecoilScopeId } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopeId';
@@ -25,8 +25,19 @@ describe('useRecoilScopeId', () => {
});
it('Should throw an error when used outside of the specified context', () => {
+ // Suppress console errors for this test since we're expecting an error
+ /* eslint-disable no-console */
+ const originalConsoleError = console.error;
+ console.error = jest.fn();
+ /* eslint-enable no-console */
+
expect(() => {
renderHook(() => useRecoilScopeId(nullContext));
}).toThrow(ERROR_MESSAGE);
+
+ // Restore console.error
+ /* eslint-disable no-console */
+ console.error = originalConsoleError;
+ /* eslint-enable no-console */
});
});
diff --git a/packages/twenty-front/src/modules/workflow/workflow-steps/hooks/__tests__/useCreateStep.test.tsx b/packages/twenty-front/src/modules/workflow/workflow-steps/hooks/__tests__/useCreateStep.test.tsx
index b633921da..47ba9f99d 100644
--- a/packages/twenty-front/src/modules/workflow/workflow-steps/hooks/__tests__/useCreateStep.test.tsx
+++ b/packages/twenty-front/src/modules/workflow/workflow-steps/hooks/__tests__/useCreateStep.test.tsx
@@ -1,5 +1,5 @@
import { WorkflowWithCurrentVersion } from '@/workflow/types/Workflow';
-import { renderHook } from '@testing-library/react';
+import { act, renderHook } from '@testing-library/react';
import { RecoilRoot } from 'recoil';
import { WorkflowVisualizerComponentInstanceContext } from '../../../workflow-diagram/states/contexts/WorkflowVisualizerComponentInstanceContext';
import { useCreateStep } from '../useCreateStep';
@@ -63,10 +63,13 @@ describe('useCreateStep', () => {
wrapper,
},
);
- await result.current.createStep({
- newStepType: 'CODE',
- parentStepId: 'parent-step-id',
- nextStepId: undefined,
+
+ await act(async () => {
+ await result.current.createStep({
+ newStepType: 'CODE',
+ parentStepId: 'parent-step-id',
+ nextStepId: undefined,
+ });
});
expect(mockCreateWorkflowVersionStep).toHaveBeenCalled();
diff --git a/packages/twenty-front/src/modules/workspace/hooks/__tests__/useSubscriptionStatus.test.ts b/packages/twenty-front/src/modules/workspace/hooks/__tests__/useSubscriptionStatus.test.ts
index edc5af116..a6437bb06 100644
--- a/packages/twenty-front/src/modules/workspace/hooks/__tests__/useSubscriptionStatus.test.ts
+++ b/packages/twenty-front/src/modules/workspace/hooks/__tests__/useSubscriptionStatus.test.ts
@@ -1,5 +1,4 @@
-import { renderHook } from '@testing-library/react';
-import { act } from 'react-dom/test-utils';
+import { act, renderHook } from '@testing-library/react';
import { RecoilRoot, useSetRecoilState } from 'recoil';
import { v4 } from 'uuid';
diff --git a/packages/twenty-front/src/testing/mock-data/people.ts b/packages/twenty-front/src/testing/mock-data/people.ts
index d82079b8a..c58c26ff2 100644
--- a/packages/twenty-front/src/testing/mock-data/people.ts
+++ b/packages/twenty-front/src/testing/mock-data/people.ts
@@ -29,11 +29,27 @@ export const peopleQueryResult = {
primaryPhoneNumber: '781234562',
primaryPhoneCountryCode: 'FR',
primaryPhoneCallingCode: '+33',
+ additionalPhones: [],
},
id: 'da3c2c4b-da01-4b81-9734-226069eb4cd0',
jobTitle: '',
position: 0,
email: 'asd.com',
+ avatarUrl: null,
+ emails: {
+ primaryEmail: 'asd.com',
+ additionalEmails: [],
+ },
+ intro: '',
+ performanceRating: null,
+ updatedAt: '2025-01-02T09:52:46.814Z',
+ whatsapp: {
+ primaryPhoneNumber: '',
+ primaryPhoneCountryCode: '',
+ primaryPhoneCallingCode: '',
+ additionalPhones: [],
+ },
+ workPreference: null,
name: {
__typename: 'FullName',
firstName: 'Test',
@@ -58,6 +74,7 @@ export const peopleQueryResult = {
source: 'MANUAL',
workspaceMemberId: '20202020-0687-4c41-b707-ed1bfca972a7',
name: 'Tim Apple',
+ context: null,
},
xLink: {
__typename: 'Links',
@@ -161,11 +178,27 @@ export const peopleQueryResult = {
primaryPhoneNumber: '781234562',
primaryPhoneCountryCode: 'FR',
primaryPhoneCallingCode: '+33',
+ additionalPhones: [],
},
id: '20202020-1c0e-494c-a1b6-85b1c6fefaa5',
jobTitle: '',
position: 1,
email: 'christoph.calisto@linkedin.com',
+ avatarUrl: null,
+ emails: {
+ primaryEmail: 'christoph.calisto@linkedin.com',
+ additionalEmails: [],
+ },
+ intro: '',
+ performanceRating: null,
+ updatedAt: '2025-01-01T09:50:00.000Z',
+ whatsapp: {
+ primaryPhoneNumber: '',
+ primaryPhoneCountryCode: '',
+ primaryPhoneCallingCode: '',
+ additionalPhones: [],
+ },
+ workPreference: null,
name: {
__typename: 'FullName',
firstName: 'Christoph',
@@ -190,6 +223,7 @@ export const peopleQueryResult = {
source: 'MANUAL',
workspaceMemberId: '20202020-0687-4c41-b707-ed1bfca972a7',
name: 'Tim Apple',
+ context: null,
},
xLink: {
__typename: 'Links',
@@ -293,6 +327,7 @@ export const peopleQueryResult = {
primaryPhoneNumber: '781234576',
primaryPhoneCountryCode: 'FR',
primaryPhoneCallingCode: '+33',
+ additionalPhones: [],
},
id: '20202020-ac73-4797-824e-87a1f5aea9e0',
jobTitle: '',
@@ -394,6 +429,7 @@ export const peopleQueryResult = {
primaryPhoneNumber: '781234545',
primaryPhoneCountryCode: 'FR',
primaryPhoneCallingCode: '+33',
+ additionalPhones: [],
},
id: '20202020-f517-42fd-80ae-14173b3b70ae',
jobTitle: '',
@@ -495,6 +531,7 @@ export const peopleQueryResult = {
primaryPhoneNumber: '781234587',
primaryPhoneCountryCode: 'FR',
primaryPhoneCallingCode: '+33',
+ additionalPhones: [],
},
id: '20202020-eee1-4690-ad2c-8619e5b56a2e',
jobTitle: '',
@@ -596,6 +633,7 @@ export const peopleQueryResult = {
primaryPhoneNumber: '781234599',
primaryPhoneCountryCode: 'FR',
primaryPhoneCallingCode: '+33',
+ additionalPhones: [],
},
id: '20202020-6784-4449-afdf-dc62cb8702f2',
jobTitle: '',
@@ -697,6 +735,7 @@ export const peopleQueryResult = {
primaryPhoneNumber: '781234572',
primaryPhoneCountryCode: 'FR',
primaryPhoneCallingCode: '+33',
+ additionalPhones: [],
},
id: '20202020-490f-4466-8391-733cfd66a0c8',
jobTitle: '',
@@ -798,6 +837,7 @@ export const peopleQueryResult = {
primaryPhoneNumber: '781234582',
primaryPhoneCountryCode: 'FR',
primaryPhoneCallingCode: '+33',
+ additionalPhones: [],
},
id: '20202020-80f1-4dff-b570-a74942528de3',
jobTitle: '',
@@ -899,6 +939,7 @@ export const peopleQueryResult = {
primaryPhoneNumber: '781234569',
primaryPhoneCountryCode: 'FR',
primaryPhoneCallingCode: '+33',
+ additionalPhones: [],
},
id: '20202020-338b-46df-8811-fa08c7d19d35',
jobTitle: '',
@@ -1000,6 +1041,7 @@ export const peopleQueryResult = {
primaryPhoneNumber: '781234962',
primaryPhoneCountryCode: 'FR',
primaryPhoneCallingCode: '+33',
+ additionalPhones: [],
},
id: '20202020-64ad-4b0e-bbfd-e9fd795b7016',
jobTitle: '',
@@ -1101,6 +1143,7 @@ export const peopleQueryResult = {
primaryPhoneNumber: '781234502',
primaryPhoneCountryCode: 'FR',
primaryPhoneCallingCode: '+33',
+ additionalPhones: [],
},
id: '20202020-5d54-41b7-ba36-f0d20e1417ae',
jobTitle: '',
@@ -1202,6 +1245,7 @@ export const peopleQueryResult = {
primaryPhoneNumber: '781234563',
primaryPhoneCountryCode: 'FR',
primaryPhoneCallingCode: '+33',
+ additionalPhones: [],
},
id: '20202020-623d-41fe-92e7-dd45b7c568e1',
jobTitle: '',
@@ -1303,6 +1347,7 @@ export const peopleQueryResult = {
primaryPhoneNumber: '781234542',
primaryPhoneCountryCode: 'FR',
primaryPhoneCallingCode: '+33',
+ additionalPhones: [],
},
id: '20202020-2d40-4e49-8df4-9c6a049190ef',
jobTitle: '',
@@ -1404,6 +1449,7 @@ export const peopleQueryResult = {
primaryPhoneNumber: '782234562',
primaryPhoneCountryCode: 'FR',
primaryPhoneCallingCode: '+33',
+ additionalPhones: [],
},
id: '20202020-2d40-4e49-8df4-9c6a049190df',
jobTitle: '',
@@ -1505,6 +1551,7 @@ export const peopleQueryResult = {
primaryPhoneNumber: '781274562',
primaryPhoneCountryCode: 'FR',
primaryPhoneCallingCode: '+33',
+ additionalPhones: [],
},
id: '20202020-2d40-4e49-8df4-9c6a049191de',
jobTitle: '',
@@ -1606,6 +1653,7 @@ export const peopleQueryResult = {
primaryPhoneNumber: '781239562',
primaryPhoneCountryCode: 'FR',
primaryPhoneCallingCode: '+33',
+ additionalPhones: [],
},
id: '20202020-2d40-4e49-8df4-9c6a049191df',
jobTitle: '',
diff --git a/packages/twenty-server/jest-integration.config.ts b/packages/twenty-server/jest-integration.config.ts
index b8599f079..c19447766 100644
--- a/packages/twenty-server/jest-integration.config.ts
+++ b/packages/twenty-server/jest-integration.config.ts
@@ -21,7 +21,7 @@ const jestConfig: JestConfigWithTsJest = {
// Prettier v3 should be supported in jest v30 https://github.com/jestjs/jest/releases/tag/v30.0.0-alpha.1
prettierPath: null,
silent: false,
- verbose: true,
+ errorOnDeprecated: true,
moduleFileExtensions: ['js', 'json', 'ts'],
rootDir: '.',
testEnvironment: 'node',
diff --git a/packages/twenty-server/jest.config.ts b/packages/twenty-server/jest.config.ts
index 7f2226b33..ecdc5355c 100644
--- a/packages/twenty-server/jest.config.ts
+++ b/packages/twenty-server/jest.config.ts
@@ -4,6 +4,7 @@ const jestConfig = {
prettierPath: null,
// to enable logs, comment out the following line
silent: true,
+ errorOnDeprecated: true,
clearMocks: true,
displayName: 'twenty-server',
rootDir: './',