Skip to content

Commit

Permalink
Fix useSetNextOnboardingStatus
Browse files Browse the repository at this point in the history
  • Loading branch information
martmull committed Jun 27, 2024
1 parent 1756d11 commit a061b65
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 33 deletions.
Original file line number Diff line number Diff line change
@@ -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';
Expand All @@ -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);
});
});
Original file line number Diff line number Diff line change
@@ -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';
Expand Down Expand Up @@ -27,11 +27,11 @@ export const useSetNextOnboardingStatus = () => {
const { records: workspaceMembers } = useFindManyRecords<WorkspaceMember>({
objectNameSingular: CoreObjectNameSingular.WorkspaceMember,
});
const currentUser = useRecoilValue(currentUserState);

return useRecoilCallback(
({ snapshot, set }) =>
({ set }) =>
() => {
const currentUser = snapshot.getLoadable(currentUserState).getValue();
const nextOnboardingStatus = getNextOnboardingStatus(
currentUser,
workspaceMembers,
Expand All @@ -40,12 +40,12 @@ export const useSetNextOnboardingStatus = () => {
if (isDefined(current)) {
return {
...current,
onboardingStatus: nextOnboardingStatus as OnboardingStatus,
onboardingStatus: nextOnboardingStatus,
};
}
return current;
});
},
[workspaceMembers],
[workspaceMembers, currentUser],
);
};

0 comments on commit a061b65

Please sign in to comment.