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 new file mode 100644 index 000000000..889770635 --- /dev/null +++ b/packages/twenty-front/src/modules/activities/tasks/hooks/__tests__/useCompleteTask.test.tsx @@ -0,0 +1,85 @@ +import { ReactNode } from 'react'; +import { MockedProvider, MockedResponse } from '@apollo/client/testing'; +import { act, renderHook } from '@testing-library/react'; +import gql from 'graphql-tag'; +import { RecoilRoot } from 'recoil'; + +import { useCompleteTask } from '@/activities/tasks/hooks/useCompleteTask'; + +const task = { id: '123', completedAt: '2024-03-15T07:33:14.212Z' }; + +const mockedDate = task.completedAt; +const toISOStringMock = jest.fn(() => mockedDate); +global.Date.prototype.toISOString = toISOStringMock; + +const mocks: MockedResponse[] = [ + { + request: { + query: gql` + mutation UpdateOneActivity( + $idToUpdate: ID! + $input: ActivityUpdateInput! + ) { + updateActivity(id: $idToUpdate, data: $input) { + __typename + createdAt + reminderAt + authorId + title + completedAt + updatedAt + body + dueAt + type + id + assigneeId + } + } + `, + variables: { + idToUpdate: task.id, + input: { completedAt: task.completedAt }, + }, + }, + result: jest.fn(() => ({ + data: { + updateActivity: { + __typename: 'Activity', + createdAt: '2024-03-15T07:33:14.212Z', + reminderAt: null, + authorId: '123', + title: 'Test', + completedAt: '2024-03-15T07:33:14.212Z', + updatedAt: '2024-03-15T07:33:14.212Z', + body: 'Test', + dueAt: '2024-03-15T07:33:14.212Z', + type: 'Task', + id: '123', + assigneeId: '123', + }, + }, + })), + }, +]; + +const Wrapper = ({ children }: { children: ReactNode }) => ( + + + {children} + + +); + +describe('useCompleteTask', () => { + it('should complete task', async () => { + const { result } = renderHook(() => useCompleteTask(task), { + wrapper: Wrapper, + }); + + await act(async () => { + await result.current.completeTask(true); + }); + + expect(mocks[0].result).toHaveBeenCalled(); + }); +}); diff --git a/packages/twenty-front/src/modules/activities/tasks/hooks/__tests__/useCurrentUserTaskCount.test.tsx b/packages/twenty-front/src/modules/activities/tasks/hooks/__tests__/useCurrentUserTaskCount.test.tsx new file mode 100644 index 000000000..7d035958c --- /dev/null +++ b/packages/twenty-front/src/modules/activities/tasks/hooks/__tests__/useCurrentUserTaskCount.test.tsx @@ -0,0 +1,31 @@ +import { ReactNode } from 'react'; +import { renderHook } from '@testing-library/react'; +import { RecoilRoot } from 'recoil'; + +import { useCurrentUserTaskCount } from '@/activities/tasks/hooks/useCurrentUserDueTaskCount'; +import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords'; +import { mockedActivities } from '~/testing/mock-data/activities'; + +const useFindManyRecordsMock = jest.fn(() => ({ + records: [...mockedActivities, { id: '2' }], +})); + +jest.mock('@/object-record/hooks/useFindManyRecords', () => ({ + useFindManyRecords: jest.fn(), +})); + +(useFindManyRecords as jest.Mock).mockImplementation(useFindManyRecordsMock); + +const Wrapper = ({ children }: { children: ReactNode }) => ( + {children} +); + +describe('useCurrentUserTaskCount', () => { + it('should return the current user task count', async () => { + const { result } = renderHook(() => useCurrentUserTaskCount(), { + wrapper: Wrapper, + }); + + expect(result.current.currentUserDueTaskCount).toBe(1); + }); +}); diff --git a/packages/twenty-front/src/modules/activities/tasks/hooks/__tests__/useTasks.test.tsx b/packages/twenty-front/src/modules/activities/tasks/hooks/__tests__/useTasks.test.tsx new file mode 100644 index 000000000..c7171a76a --- /dev/null +++ b/packages/twenty-front/src/modules/activities/tasks/hooks/__tests__/useTasks.test.tsx @@ -0,0 +1,85 @@ +import { ReactNode } from 'react'; +import { renderHook } from '@testing-library/react'; +import { RecoilRoot } from 'recoil'; + +import { useActivities } from '@/activities/hooks/useActivities'; +import { useTasks } from '@/activities/tasks/hooks/useTasks'; +import { ObjectFilterDropdownScope } from '@/object-record/object-filter-dropdown/scopes/ObjectFilterDropdownScope'; + +const completedTasks = [ + { + id: '1', + completedAt: '2024-03-15T07:33:14.212Z', + }, + { + id: '2', + completedAt: '2024-03-15T07:33:14.212Z', + }, + { + id: '3', + completedAt: '2024-03-15T07:33:14.212Z', + }, +]; + +const unscheduledTasks = [ + { + id: '4', + }, +]; + +const todayOrPreviousTasks = [ + { + id: '5', + dueAt: '2024-03-15T07:33:14.212Z', + }, + { + id: '6', + dueAt: '2024-03-15T07:33:14.212Z', + }, +]; + +const useActivitiesMock = jest.fn( + ({ + activitiesFilters, + }: { + activitiesFilters: { completedAt: { is: 'NULL' | 'NOT_NULL' } }; + }) => { + const isCompletedFilter = activitiesFilters.completedAt.is === 'NOT_NULL'; + return { + activities: isCompletedFilter + ? completedTasks + : [...todayOrPreviousTasks, ...unscheduledTasks], + initialized: true, + }; + }, +); + +jest.mock('@/activities/hooks/useActivities', () => ({ + useActivities: jest.fn(), +})); + +(useActivities as jest.Mock).mockImplementation(useActivitiesMock); + +const Wrapper = ({ children }: { children: ReactNode }) => ( + + + {children} + + +); + +describe('useTasks', () => { + it("should return a user's tasks", () => { + const { result } = renderHook(() => useTasks({ targetableObjects: [] }), { + wrapper: Wrapper, + }); + + expect(result.current).toEqual({ + todayOrPreviousTasks, + upcomingTasks: [], + unscheduledTasks, + completedTasks, + initialized: true, + }); + }); +});