Skip to content

Commit 6da8819

Browse files
authored
test(shared,clerk-js): Improve coverage around fetcher params (#7218)
1 parent aa184a4 commit 6da8819

File tree

7 files changed

+188
-4
lines changed

7 files changed

+188
-4
lines changed

.changeset/many-pants-pump.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
---
2+
---

packages/clerk-js/src/ui/components/OrganizationSwitcher/__tests__/OrganizationSwitcher.test.tsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,11 @@ describe('OrganizationSwitcher', () => {
241241
props.setProps({ hidePersonal: false });
242242
const { getAllByText, getByText, getByRole, userEvent } = render(<OrganizationSwitcher />, { wrapper });
243243
await userEvent.click(getByRole('button'));
244+
expect(fixtures.clerk.user?.getOrganizationMemberships).toHaveBeenCalledTimes(1);
245+
expect(fixtures.clerk.user?.getOrganizationMemberships.mock.calls[0][0]).toStrictEqual({
246+
initialPage: 1,
247+
pageSize: 10,
248+
});
244249
expect(getAllByText('Org1')).not.toBeNull();
245250
expect(getByText('Personal account')).toBeInTheDocument();
246251
expect(getByText('Org2')).toBeInTheDocument();
@@ -471,6 +476,11 @@ describe('OrganizationSwitcher', () => {
471476
props.setProps({ hidePersonal: true });
472477
const { getByRole, getByText, userEvent } = render(<OrganizationSwitcher />, { wrapper });
473478
await userEvent.click(getByRole('button'));
479+
expect(fixtures.clerk.user?.getOrganizationMemberships).toHaveBeenCalledTimes(1);
480+
expect(fixtures.clerk.user?.getOrganizationMemberships.mock.calls[0][0]).toStrictEqual({
481+
initialPage: 1,
482+
pageSize: 10,
483+
});
474484
await userEvent.click(getByText('Org2'));
475485

476486
expect(fixtures.clerk.setActive).toHaveBeenCalledWith(
@@ -497,6 +507,11 @@ describe('OrganizationSwitcher', () => {
497507
fixtures.clerk.setActive.mockReturnValueOnce(Promise.resolve());
498508
const { getByRole, getByText, userEvent } = render(<OrganizationSwitcher />, { wrapper });
499509
await userEvent.click(getByRole('button'));
510+
expect(fixtures.clerk.user?.getOrganizationMemberships).toHaveBeenCalledTimes(1);
511+
expect(fixtures.clerk.user?.getOrganizationMemberships.mock.calls[0][0]).toStrictEqual({
512+
initialPage: 1,
513+
pageSize: 10,
514+
});
500515
await userEvent.click(getByText(/Personal account/i));
501516

502517
expect(fixtures.clerk.setActive).toHaveBeenCalledWith(

packages/clerk-js/src/ui/hooks/__tests__/useCoreOrganization.test.tsx

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,13 @@ describe('useOrganization', () => {
146146
expect(result.current.memberships?.count).toBe(0);
147147

148148
await waitFor(() => expect(result.current.memberships?.isLoading).toBe(false));
149+
expect(fixtures.clerk.organization?.getMemberships).toHaveBeenCalledTimes(1);
150+
expect(fixtures.clerk.organization?.getMemberships.mock.calls[0][0]).toStrictEqual({
151+
initialPage: 1,
152+
pageSize: 2,
153+
role: undefined,
154+
query: undefined,
155+
});
149156

150157
expect(result.current.memberships?.count).toBe(4);
151158
expect(result.current.memberships?.page).toBe(1);
@@ -198,6 +205,13 @@ describe('useOrganization', () => {
198205

199206
await waitFor(() => expect(result.current.memberships?.isLoading).toBe(true));
200207
await waitFor(() => expect(result.current.memberships?.isLoading).toBe(false));
208+
expect(fixtures.clerk.organization?.getMemberships).toHaveBeenCalledTimes(2);
209+
expect(fixtures.clerk.organization?.getMemberships.mock.calls[1][0]).toStrictEqual({
210+
initialPage: 2,
211+
pageSize: 2,
212+
role: undefined,
213+
query: undefined,
214+
});
201215

202216
expect(result.current.memberships?.page).toBe(2);
203217
expect(result.current.memberships?.hasNextPage).toBe(false);
@@ -257,6 +271,12 @@ describe('useOrganization', () => {
257271
expect(result.current.domains?.count).toBe(0);
258272

259273
await waitFor(() => expect(result.current.domains?.isLoading).toBe(false));
274+
expect(fixtures.clerk.organization?.getDomains).toHaveBeenCalledTimes(1);
275+
expect(fixtures.clerk.organization?.getDomains.mock.calls[0][0]).toStrictEqual({
276+
initialPage: 1,
277+
pageSize: 2,
278+
enrollmentMode: undefined,
279+
});
260280

261281
expect(result.current.domains?.isLoading).toBe(false);
262282
expect(result.current.domains?.count).toBe(4);
@@ -298,6 +318,12 @@ describe('useOrganization', () => {
298318

299319
await waitFor(() => expect(result.current.domains?.isLoading).toBe(true));
300320
await waitFor(() => expect(result.current.domains?.isLoading).toBe(false));
321+
expect(fixtures.clerk.organization?.getDomains).toHaveBeenCalledTimes(2);
322+
expect(fixtures.clerk.organization?.getDomains.mock.calls[1][0]).toStrictEqual({
323+
initialPage: 2,
324+
pageSize: 2,
325+
enrollmentMode: undefined,
326+
});
301327

302328
expect(result.current.domains?.page).toBe(2);
303329
expect(result.current.domains?.hasNextPage).toBe(false);
@@ -363,6 +389,12 @@ describe('useOrganization', () => {
363389
expect(result.current.membershipRequests?.count).toBe(0);
364390

365391
await waitFor(() => expect(result.current.membershipRequests?.isLoading).toBe(false));
392+
expect(fixtures.clerk.organization?.getMembershipRequests).toHaveBeenCalledTimes(1);
393+
expect(fixtures.clerk.organization?.getMembershipRequests.mock.calls[0][0]).toStrictEqual({
394+
initialPage: 1,
395+
pageSize: 2,
396+
status: 'pending',
397+
});
366398

367399
expect(result.current.membershipRequests?.isFetching).toBe(false);
368400
expect(result.current.membershipRequests?.count).toBe(4);
@@ -398,6 +430,12 @@ describe('useOrganization', () => {
398430

399431
await waitFor(() => expect(result.current.membershipRequests?.isLoading).toBe(true));
400432
await waitFor(() => expect(result.current.membershipRequests?.isLoading).toBe(false));
433+
expect(fixtures.clerk.organization?.getMembershipRequests).toHaveBeenCalledTimes(2);
434+
expect(fixtures.clerk.organization?.getMembershipRequests.mock.calls[1][0]).toStrictEqual({
435+
initialPage: 2,
436+
pageSize: 2,
437+
status: 'pending',
438+
});
401439

402440
expect(result.current.membershipRequests?.page).toBe(2);
403441
expect(result.current.membershipRequests?.hasNextPage).toBe(false);
@@ -467,6 +505,12 @@ describe('useOrganization', () => {
467505
expect(result.current.invitations?.count).toBe(0);
468506

469507
await waitFor(() => expect(result.current.invitations?.isLoading).toBe(false));
508+
expect(fixtures.clerk.organization?.getInvitations).toHaveBeenCalledTimes(1);
509+
expect(fixtures.clerk.organization?.getInvitations.mock.calls[0][0]).toStrictEqual({
510+
initialPage: 1,
511+
pageSize: 2,
512+
status: ['pending'],
513+
});
470514

471515
expect(result.current.invitations?.isFetching).toBe(false);
472516
expect(result.current.invitations?.count).toBe(4);
@@ -498,6 +542,12 @@ describe('useOrganization', () => {
498542

499543
await waitFor(() => expect(result.current.invitations?.isLoading).toBe(true));
500544
await waitFor(() => expect(result.current.invitations?.isLoading).toBe(false));
545+
expect(fixtures.clerk.organization?.getInvitations).toHaveBeenCalledTimes(2);
546+
expect(fixtures.clerk.organization?.getInvitations.mock.calls[1][0]).toStrictEqual({
547+
initialPage: 2,
548+
pageSize: 2,
549+
status: ['pending'],
550+
});
501551

502552
expect(result.current.invitations?.page).toBe(2);
503553
expect(result.current.invitations?.hasNextPage).toBe(false);
@@ -566,6 +616,12 @@ describe('useOrganization', () => {
566616

567617
await waitFor(() => expect(result.current.invitations?.isLoading).toBe(false));
568618
expect(result.current.invitations?.isFetching).toBe(false);
619+
expect(fixtures.clerk.organization?.getInvitations).toHaveBeenCalledTimes(1);
620+
expect(fixtures.clerk.organization?.getInvitations.mock.calls[0][0]).toStrictEqual({
621+
initialPage: 1,
622+
pageSize: 2,
623+
status: ['pending'],
624+
});
569625

570626
const deferred = createDeferredPromise();
571627

@@ -594,6 +650,15 @@ describe('useOrganization', () => {
594650
});
595651

596652
await waitFor(() => expect(result.current.invitations?.isFetching).toBe(false));
653+
const organizationInvitationParams = fixtures.clerk.organization?.getInvitations.mock.calls.map(
654+
([params]) => params,
655+
);
656+
organizationInvitationParams.forEach(params => {
657+
expect(Object.keys(params).sort()).toEqual(['initialPage', 'pageSize', 'status']);
658+
expect(params.pageSize).toBe(2);
659+
expect(params.status).toEqual(['pending']);
660+
});
661+
expect(organizationInvitationParams.some(params => params.initialPage === 2)).toBe(true);
597662

598663
expect(result.current.invitations?.data).toEqual(
599664
expect.arrayContaining([

packages/clerk-js/src/ui/hooks/__tests__/useCoreOrganizationList.test.tsx

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,11 @@ describe('useOrganizationList', () => {
108108
await waitFor(() => expect(result.current.userMemberships.isLoading).toBe(false));
109109
await waitFor(() => expect(fixtures.clerk.user?.getOrganizationInvitations).toHaveBeenCalled());
110110
await waitFor(() => expect(fixtures.clerk.user?.getOrganizationSuggestions).toHaveBeenCalled());
111+
expect(fixtures.clerk.user?.getOrganizationMemberships).toHaveBeenCalledTimes(1);
112+
expect(fixtures.clerk.user?.getOrganizationMemberships.mock.calls[0][0]).toStrictEqual({
113+
initialPage: 1,
114+
pageSize: 2,
115+
});
111116

112117
expect(result.current.userMemberships.count).toBe(4);
113118
expect(result.current.userMemberships.page).toBe(1);
@@ -150,6 +155,11 @@ describe('useOrganizationList', () => {
150155

151156
await waitFor(() => expect(result.current.userMemberships?.isLoading).toBe(true));
152157
await waitFor(() => expect(result.current.userMemberships?.isLoading).toBe(false));
158+
expect(fixtures.clerk.user?.getOrganizationMemberships).toHaveBeenCalledTimes(2);
159+
expect(fixtures.clerk.user?.getOrganizationMemberships.mock.calls[1][0]).toStrictEqual({
160+
initialPage: 2,
161+
pageSize: 2,
162+
});
153163

154164
expect(result.current.userMemberships.page).toBe(2);
155165
expect(result.current.userMemberships.hasNextPage).toBe(false);
@@ -226,6 +236,11 @@ describe('useOrganizationList', () => {
226236

227237
await waitFor(() => expect(result.current.userMemberships.isLoading).toBe(false));
228238
expect(result.current.userMemberships.isFetching).toBe(false);
239+
expect(fixtures.clerk.user?.getOrganizationMemberships).toHaveBeenCalledTimes(1);
240+
expect(fixtures.clerk.user?.getOrganizationMemberships.mock.calls[0][0]).toStrictEqual({
241+
initialPage: 1,
242+
pageSize: 2,
243+
});
229244

230245
const deferred = createDeferredPromise();
231246
fixtures.clerk.user?.getOrganizationMemberships.mockReturnValueOnce(deferred.promise);
@@ -321,6 +336,12 @@ describe('useOrganizationList', () => {
321336
expect(result.current.userInvitations.count).toBe(0);
322337

323338
await waitFor(() => expect(result.current.userInvitations.isLoading).toBe(false));
339+
expect(fixtures.clerk.user?.getOrganizationInvitations).toHaveBeenCalledTimes(1);
340+
expect(fixtures.clerk.user?.getOrganizationInvitations.mock.calls[0][0]).toStrictEqual({
341+
initialPage: 1,
342+
pageSize: 2,
343+
status: 'pending',
344+
});
324345

325346
expect(result.current.userInvitations.count).toBe(4);
326347
expect(result.current.userInvitations.page).toBe(1);
@@ -347,6 +368,12 @@ describe('useOrganizationList', () => {
347368

348369
await waitFor(() => expect(result.current.userInvitations?.isLoading).toBe(true));
349370
await waitFor(() => expect(result.current.userInvitations?.isLoading).toBe(false));
371+
expect(fixtures.clerk.user?.getOrganizationInvitations).toHaveBeenCalledTimes(2);
372+
expect(fixtures.clerk.user?.getOrganizationInvitations.mock.calls[1][0]).toStrictEqual({
373+
initialPage: 2,
374+
pageSize: 2,
375+
status: 'pending',
376+
});
350377

351378
expect(result.current.userInvitations.page).toBe(2);
352379
expect(result.current.userInvitations.hasNextPage).toBe(false);
@@ -408,6 +435,12 @@ describe('useOrganizationList', () => {
408435

409436
await waitFor(() => expect(result.current.userInvitations.isLoading).toBe(false));
410437
expect(result.current.userInvitations.isFetching).toBe(false);
438+
expect(fixtures.clerk.user?.getOrganizationInvitations).toHaveBeenCalledTimes(1);
439+
expect(fixtures.clerk.user?.getOrganizationInvitations.mock.calls[0][0]).toStrictEqual({
440+
initialPage: 1,
441+
pageSize: 2,
442+
status: 'pending',
443+
});
411444

412445
const deferred = createDeferredPromise();
413446
fixtures.clerk.user?.getOrganizationInvitations.mockReturnValueOnce(deferred.promise);
@@ -432,6 +465,13 @@ describe('useOrganizationList', () => {
432465
});
433466

434467
await waitFor(() => expect(result.current.userInvitations.isFetching).toBe(false));
468+
const invitationCallParams = fixtures.clerk.user?.getOrganizationInvitations.mock.calls.map(([params]) => params);
469+
invitationCallParams.forEach(params => {
470+
expect(Object.keys(params).sort()).toEqual(['initialPage', 'pageSize', 'status']);
471+
expect(params.pageSize).toBe(2);
472+
expect(params.status).toBe('pending');
473+
});
474+
expect(invitationCallParams.some(params => params.initialPage === 2)).toBe(true);
435475
expect(result.current.userInvitations.data).toEqual(
436476
expect.arrayContaining([
437477
expect.objectContaining({
@@ -485,6 +525,12 @@ describe('useOrganizationList', () => {
485525
expect(result.current.userSuggestions.count).toBe(0);
486526

487527
await waitFor(() => expect(result.current.userSuggestions.isLoading).toBe(false));
528+
expect(fixtures.clerk.user?.getOrganizationSuggestions).toHaveBeenCalledTimes(1);
529+
expect(fixtures.clerk.user?.getOrganizationSuggestions.mock.calls[0][0]).toStrictEqual({
530+
initialPage: 1,
531+
pageSize: 2,
532+
status: 'pending',
533+
});
488534

489535
expect(result.current.userSuggestions.count).toBe(4);
490536
expect(result.current.userSuggestions.page).toBe(1);
@@ -511,6 +557,12 @@ describe('useOrganizationList', () => {
511557

512558
await waitFor(() => expect(result.current.userSuggestions.isLoading).toBe(true));
513559
await waitFor(() => expect(result.current.userSuggestions.isLoading).toBe(false));
560+
expect(fixtures.clerk.user?.getOrganizationSuggestions).toHaveBeenCalledTimes(2);
561+
expect(fixtures.clerk.user?.getOrganizationSuggestions.mock.calls[1][0]).toStrictEqual({
562+
initialPage: 2,
563+
pageSize: 2,
564+
status: 'pending',
565+
});
514566

515567
expect(result.current.userSuggestions.page).toBe(2);
516568
expect(result.current.userSuggestions.hasNextPage).toBe(false);
@@ -571,6 +623,12 @@ describe('useOrganizationList', () => {
571623

572624
await waitFor(() => expect(result.current.userSuggestions.isLoading).toBe(false));
573625
expect(result.current.userSuggestions.isFetching).toBe(false);
626+
expect(fixtures.clerk.user?.getOrganizationSuggestions).toHaveBeenCalledTimes(1);
627+
expect(fixtures.clerk.user?.getOrganizationSuggestions.mock.calls[0][0]).toStrictEqual({
628+
initialPage: 1,
629+
pageSize: 2,
630+
status: 'pending',
631+
});
574632

575633
const deferred = createDeferredPromise();
576634

@@ -595,6 +653,13 @@ describe('useOrganizationList', () => {
595653
});
596654

597655
await waitFor(() => expect(result.current.userSuggestions.isFetching).toBe(false));
656+
const suggestionCallParams = fixtures.clerk.user?.getOrganizationSuggestions.mock.calls.map(([params]) => params);
657+
suggestionCallParams.forEach(params => {
658+
expect(Object.keys(params).sort()).toEqual(['initialPage', 'pageSize', 'status']);
659+
expect(params.pageSize).toBe(2);
660+
expect(params.status).toBe('pending');
661+
});
662+
expect(suggestionCallParams.some(params => params.initialPage === 2)).toBe(true);
598663
expect(result.current.userSuggestions.data).toEqual(
599664
expect.arrayContaining([
600665
expect.objectContaining({

packages/shared/src/react/hooks/__tests__/createBillingPaginatedHook.spec.tsx

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,12 @@ describe('createBillingPaginatedHook', () => {
250250
expect(result.current.page).toBe(1);
251251
expect(result.current.pageCount).toBe(3); // ceil(5/2)
252252

253+
expect(fetcherMock).toHaveBeenCalled();
254+
const paramsCalls = fetcherMock.mock.calls.map(([params]) => params);
255+
paramsCalls.forEach(params => {
256+
expect(params).toStrictEqual({ initialPage: 1, pageSize: 2 });
257+
});
258+
253259
// Simulate sign-out
254260
mockUser = null;
255261
rerender();
@@ -294,6 +300,12 @@ describe('createBillingPaginatedHook', () => {
294300
mockUser = null;
295301
rerender();
296302

303+
expect(fetcherMock).toHaveBeenCalled();
304+
const paramsCalls = fetcherMock.mock.calls.map(([params]) => params);
305+
paramsCalls.forEach(params => {
306+
expect(params).toStrictEqual({ initialPage: 1, pageSize: 5 });
307+
});
308+
297309
if (__CLERK_USE_RQ__) {
298310
expect(result.current.isLoading).toBe(false);
299311
} else {
@@ -336,6 +348,12 @@ describe('createBillingPaginatedHook', () => {
336348
mockUser = null;
337349
rerender();
338350

351+
expect(fetcherMock).toHaveBeenCalled();
352+
const paramsCalls = fetcherMock.mock.calls.map(([params]) => params);
353+
paramsCalls.forEach(params => {
354+
expect(params).toStrictEqual({ initialPage: 1, pageSize: 2 });
355+
});
356+
339357
await waitFor(() => expect(result.current.data).toEqual([]));
340358
expect(result.current.count).toBe(0);
341359
expect(result.current.page).toBe(1);
@@ -365,6 +383,12 @@ describe('createBillingPaginatedHook', () => {
365383
const originalData = [...result.current.data];
366384
const originalCount = result.current.count;
367385

386+
expect(fetcherMock).toHaveBeenCalled();
387+
const paramsCalls = fetcherMock.mock.calls.map(([params]) => params);
388+
paramsCalls.forEach(params => {
389+
expect(params).toStrictEqual({ initialPage: 1, pageSize: 2 });
390+
});
391+
368392
// Simulate sign-out
369393
mockUser = null;
370394
rerender();
@@ -411,6 +435,12 @@ describe('createBillingPaginatedHook', () => {
411435
mockUser = null;
412436
rerender();
413437

438+
expect(fetcherMock).toHaveBeenCalled();
439+
const paramsCalls = fetcherMock.mock.calls.map(([params]) => params);
440+
paramsCalls.forEach(params => {
441+
expect(params).toStrictEqual({ initialPage: 1, pageSize: 5 });
442+
});
443+
414444
// Data should persist for unauthenticated hooks even with keepPreviousData: true
415445
expect(result.current.data).toEqual(originalData);
416446
expect(result.current.count).toBe(20);
@@ -443,6 +473,12 @@ describe('createBillingPaginatedHook', () => {
443473
mockUser = null;
444474
rerender();
445475

476+
expect(fetcherMock).toHaveBeenCalled();
477+
const paramsCalls = fetcherMock.mock.calls.map(([params]) => params);
478+
paramsCalls.forEach(params => {
479+
expect(params).toStrictEqual({ initialPage: 1, pageSize: 2 });
480+
});
481+
446482
// Data should persist for unauthenticated hooks
447483
expect(result.current.data).toEqual(originalData);
448484
expect(result.current.count).toBe(originalCount);

0 commit comments

Comments
 (0)