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: './',