From a061b65659ce34ff0c95f995f9dab0c59c6d2bed Mon Sep 17 00:00:00 2001 From: martmull Date: Wed, 26 Jun 2024 20:09:09 +0200 Subject: [PATCH] Fix useSetNextOnboardingStatus --- .../useSetNextOnboardingStatus.test.ts | 73 ++++++++++++------- .../hooks/useSetNextOnboardingStatus.ts | 10 +-- 2 files changed, 50 insertions(+), 33 deletions(-) diff --git a/packages/twenty-front/src/modules/onboarding/hooks/__tests__/useSetNextOnboardingStatus.test.ts b/packages/twenty-front/src/modules/onboarding/hooks/__tests__/useSetNextOnboardingStatus.test.ts index 85b6b631af4..223370bce72 100644 --- a/packages/twenty-front/src/modules/onboarding/hooks/__tests__/useSetNextOnboardingStatus.test.ts +++ b/packages/twenty-front/src/modules/onboarding/hooks/__tests__/useSetNextOnboardingStatus.test.ts @@ -1,5 +1,5 @@ -import { renderHook } from '@testing-library/react'; -import { RecoilRoot, useRecoilValue, useSetRecoilState } from 'recoil'; +import { act, renderHook } from '@testing-library/react'; +import { RecoilRoot, useRecoilState, useSetRecoilState } from 'recoil'; import { v4 } from 'uuid'; import { currentUserState } from '@/auth/states/currentUserState'; @@ -14,57 +14,74 @@ import { jest.mock('@/object-record/hooks/useFindManyRecords', () => ({ useFindManyRecords: jest.fn(), })); +const setupMockWorkspaceMembers = (withManyWorkspaceMembers = false) => { + jest + .requireMock('@/object-record/hooks/useFindManyRecords') + .useFindManyRecords.mockReturnValue({ + records: withManyWorkspaceMembers ? [{}, {}] : [{}], + }); +}; const renderHooks = ( onboardingStatus: OnboardingStatus, withCurrentBillingSubscription: boolean, - withManyWorkspaceMembers: boolean, ) => { const { result } = renderHook( () => { - const useFindManyRecordsMock = jest.requireMock( - '@/object-record/hooks/useFindManyRecords', - ); - useFindManyRecordsMock.useFindManyRecords.mockReturnValue({ - records: withManyWorkspaceMembers ? [{}, {}] : [{}], - }); - const setCurrentUser = useSetRecoilState(currentUserState); + const [currentUser, setCurrentUser] = useRecoilState(currentUserState); const setCurrentWorkspace = useSetRecoilState(currentWorkspaceState); - setCurrentUser({ ...mockedUserData, onboardingStatus }); - setCurrentWorkspace({ - ...mockDefaultWorkspace, - currentBillingSubscription: withCurrentBillingSubscription - ? { id: v4(), status: SubscriptionStatus.Active } - : undefined, - }); - useSetNextOnboardingStatus()(); - return useRecoilValue(currentUserState)?.onboardingStatus; + const setNextOnboardingStatus = useSetNextOnboardingStatus(); + return { + currentUser, + setCurrentUser, + setCurrentWorkspace, + setNextOnboardingStatus, + }; }, { wrapper: RecoilRoot, }, ); - return result; + act(() => { + result.current.setCurrentUser({ ...mockedUserData, onboardingStatus }); + result.current.setCurrentWorkspace({ + ...mockDefaultWorkspace, + currentBillingSubscription: withCurrentBillingSubscription + ? { id: v4(), status: SubscriptionStatus.Active } + : undefined, + }); + }); + act(() => { + result.current.setNextOnboardingStatus(); + }); + return result.current.currentUser?.onboardingStatus; }; describe('useSetNextOnboardingStatus', () => { it('should set next onboarding status for ProfileCreation', () => { - const result = renderHooks(OnboardingStatus.ProfileCreation, false, false); - expect(result.current).toEqual(OnboardingStatus.SyncEmail); + setupMockWorkspaceMembers(); + const nextOnboardingStatus = renderHooks( + OnboardingStatus.ProfileCreation, + false, + ); + expect(nextOnboardingStatus).toEqual(OnboardingStatus.SyncEmail); }); it('should set next onboarding status for SyncEmail', () => { - const result = renderHooks(OnboardingStatus.SyncEmail, false, false); - expect(result.current).toEqual(OnboardingStatus.InviteTeam); + setupMockWorkspaceMembers(); + const nextOnboardingStatus = renderHooks(OnboardingStatus.SyncEmail, false); + expect(nextOnboardingStatus).toEqual(OnboardingStatus.InviteTeam); }); it('should skip invite when workspaceMembers exist', () => { - const result = renderHooks(OnboardingStatus.SyncEmail, true, true); - expect(result.current).toEqual(OnboardingStatus.Completed); + setupMockWorkspaceMembers(true); + const nextOnboardingStatus = renderHooks(OnboardingStatus.SyncEmail, true); + expect(nextOnboardingStatus).toEqual(OnboardingStatus.Completed); }); it('should set next onboarding status for Completed', () => { - const result = renderHooks(OnboardingStatus.InviteTeam, true, false); - expect(result.current).toEqual(OnboardingStatus.Completed); + setupMockWorkspaceMembers(); + const nextOnboardingStatus = renderHooks(OnboardingStatus.InviteTeam, true); + expect(nextOnboardingStatus).toEqual(OnboardingStatus.Completed); }); }); diff --git a/packages/twenty-front/src/modules/onboarding/hooks/useSetNextOnboardingStatus.ts b/packages/twenty-front/src/modules/onboarding/hooks/useSetNextOnboardingStatus.ts index a0875d03fd1..4e7353e8b68 100644 --- a/packages/twenty-front/src/modules/onboarding/hooks/useSetNextOnboardingStatus.ts +++ b/packages/twenty-front/src/modules/onboarding/hooks/useSetNextOnboardingStatus.ts @@ -1,4 +1,4 @@ -import { useRecoilCallback } from 'recoil'; +import { useRecoilCallback, useRecoilValue } from 'recoil'; import { CurrentUser, currentUserState } from '@/auth/states/currentUserState'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; @@ -27,11 +27,11 @@ export const useSetNextOnboardingStatus = () => { const { records: workspaceMembers } = useFindManyRecords({ objectNameSingular: CoreObjectNameSingular.WorkspaceMember, }); + const currentUser = useRecoilValue(currentUserState); return useRecoilCallback( - ({ snapshot, set }) => + ({ set }) => () => { - const currentUser = snapshot.getLoadable(currentUserState).getValue(); const nextOnboardingStatus = getNextOnboardingStatus( currentUser, workspaceMembers, @@ -40,12 +40,12 @@ export const useSetNextOnboardingStatus = () => { if (isDefined(current)) { return { ...current, - onboardingStatus: nextOnboardingStatus as OnboardingStatus, + onboardingStatus: nextOnboardingStatus, }; } return current; }); }, - [workspaceMembers], + [workspaceMembers, currentUser], ); };