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,
+ });
+ });
+});