Skip to content

Commit a9df03b

Browse files
committed
improve mocks
1 parent 6f27804 commit a9df03b

File tree

6 files changed

+96
-131
lines changed

6 files changed

+96
-131
lines changed

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

Lines changed: 10 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,19 @@
1-
import { QueryClient } from '@tanstack/query-core';
21
import { renderHook, waitFor } from '@testing-library/react';
32
import { beforeEach, describe, expect, it, vi } from 'vitest';
43

54
import type { ClerkResource } from '../../../types';
65
import { createBillingPaginatedHook } from '../createBillingPaginatedHook';
6+
import { createMockClerk, createMockOrganization, createMockQueryClient, createMockUser } from './mocks/clerk';
77
import { wrapper } from './wrapper';
88

99
// Mocks for contexts
10-
let mockUser: any = { id: 'user_1' };
11-
let mockOrganization: any = { id: 'org_1' };
12-
13-
const defaultQueryClient = {
14-
__tag: 'clerk-rq-client' as const,
15-
client: new QueryClient({
16-
defaultOptions: {
17-
queries: {
18-
retry: false,
19-
staleTime: Infinity,
20-
refetchOnWindowFocus: false,
21-
refetchOnReconnect: false,
22-
refetchOnMount: false,
23-
},
24-
},
25-
}),
26-
};
27-
28-
const mockClerk = {
29-
loaded: true,
30-
telemetry: { record: vi.fn() },
31-
__unstable__environment: {
32-
commerceSettings: {
33-
billing: {
34-
user: { enabled: true },
35-
organization: { enabled: true },
36-
},
37-
},
38-
},
39-
on: vi.fn(),
40-
off: vi.fn(),
41-
};
42-
43-
Object.defineProperty(mockClerk, '__internal_queryClient', {
44-
configurable: true,
45-
get: vi.fn(() => defaultQueryClient),
10+
let mockUser: any = createMockUser();
11+
let mockOrganization: any = createMockOrganization();
12+
13+
const defaultQueryClient = createMockQueryClient();
14+
15+
const mockClerk = createMockClerk({
16+
queryClient: defaultQueryClient,
4617
});
4718

4819
vi.mock('../../contexts', () => {
@@ -85,8 +56,8 @@ describe('createBillingPaginatedHook', () => {
8556
mockClerk.loaded = true;
8657
mockClerk.__unstable__environment.commerceSettings.billing.user.enabled = true;
8758
mockClerk.__unstable__environment.commerceSettings.billing.organization.enabled = true;
88-
mockUser = { id: 'user_1' };
89-
mockOrganization = { id: 'org_1' };
59+
mockUser = createMockUser();
60+
mockOrganization = createMockOrganization();
9061
defaultQueryClient.client.clear();
9162
});
9263

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import { QueryClient } from '@tanstack/query-core';
2+
import { vi } from 'vitest';
3+
4+
/**
5+
* Shared query client configuration for tests
6+
*/
7+
export function createMockQueryClient() {
8+
return {
9+
__tag: 'clerk-rq-client' as const,
10+
client: new QueryClient({
11+
defaultOptions: {
12+
queries: {
13+
retry: false,
14+
staleTime: Infinity,
15+
refetchOnWindowFocus: false,
16+
refetchOnReconnect: false,
17+
refetchOnMount: false,
18+
},
19+
},
20+
}),
21+
};
22+
}
23+
24+
/**
25+
* Simple mock Clerk factory with common properties
26+
*/
27+
export function createMockClerk(overrides: any = {}) {
28+
const queryClient = overrides.queryClient || createMockQueryClient();
29+
30+
const mockClerk: any = {
31+
loaded: true,
32+
telemetry: { record: vi.fn() },
33+
on: vi.fn(),
34+
off: vi.fn(),
35+
__unstable__environment: {
36+
commerceSettings: {
37+
billing: {
38+
user: { enabled: true },
39+
organization: { enabled: true },
40+
},
41+
},
42+
},
43+
...overrides,
44+
};
45+
46+
// Add query client as getter if not already set
47+
if (!Object.getOwnPropertyDescriptor(mockClerk, '__internal_queryClient')) {
48+
Object.defineProperty(mockClerk, '__internal_queryClient', {
49+
get: vi.fn(() => queryClient),
50+
configurable: true,
51+
});
52+
}
53+
54+
return mockClerk;
55+
}
56+
57+
export function createMockUser(overrides: any = {}) {
58+
return { id: 'user_1', ...overrides };
59+
}
60+
61+
export function createMockOrganization(overrides: any = {}) {
62+
return { id: 'org_1', ...overrides };
63+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { createMockClerk, createMockOrganization, createMockQueryClient, createMockUser } from './clerk';

packages/shared/src/react/hooks/__tests__/usePagesOrInfinite.spec.ts

Lines changed: 5 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,15 @@
1-
import { QueryClient } from '@tanstack/query-core';
21
import { act, renderHook, waitFor } from '@testing-library/react';
32
import { beforeEach, describe, expect, it, vi } from 'vitest';
43

54
import { createDeferredPromise } from '../../../utils/createDeferredPromise';
65
import { usePagesOrInfinite } from '../usePagesOrInfinite';
6+
import { createMockClerk, createMockQueryClient } from './mocks/clerk';
77
import { wrapper } from './wrapper';
88

9-
const defaultQueryClient = {
10-
__tag: 'clerk-rq-client' as const,
11-
client: new QueryClient({
12-
defaultOptions: {
13-
queries: {
14-
retry: false,
15-
staleTime: Infinity,
16-
refetchOnWindowFocus: false,
17-
refetchOnReconnect: false,
18-
refetchOnMount: false,
19-
},
20-
},
21-
}),
22-
};
23-
24-
const mockClerk = {
25-
loaded: true,
26-
telemetry: { record: vi.fn() },
27-
on: vi.fn(),
28-
off: vi.fn(),
29-
};
30-
31-
Object.defineProperty(mockClerk, '__internal_queryClient', {
32-
configurable: true,
33-
get: vi.fn(() => defaultQueryClient),
9+
const defaultQueryClient = createMockQueryClient();
10+
11+
const mockClerk = createMockClerk({
12+
queryClient: defaultQueryClient,
3413
});
3514

3615
vi.mock('../../contexts', () => {

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

Lines changed: 7 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
import { QueryClient } from '@tanstack/query-core';
21
import { render, renderHook, screen, waitFor } from '@testing-library/react';
32
import React from 'react';
43
import { beforeEach, describe, expect, it, vi } from 'vitest';
54

6-
const mockUser: any = { id: 'user_1' };
7-
const mockOrganization: any = { id: 'org_1' };
5+
import { createMockClerk, createMockOrganization, createMockQueryClient, createMockUser } from './mocks/clerk';
6+
7+
const mockUser: any = createMockUser();
8+
const mockOrganization: any = createMockOrganization();
89

910
const getPlansSpy = vi.fn((args: any) =>
1011
Promise.resolve({
@@ -17,42 +18,13 @@ const getPlansSpy = vi.fn((args: any) =>
1718
}),
1819
);
1920

20-
const defaultQueryClient = {
21-
__tag: 'clerk-rq-client' as const,
22-
client: new QueryClient({
23-
defaultOptions: {
24-
queries: {
25-
retry: false,
26-
staleTime: Infinity,
27-
refetchOnWindowFocus: false,
28-
refetchOnReconnect: false,
29-
refetchOnMount: false,
30-
},
31-
},
32-
}),
33-
};
21+
const defaultQueryClient = createMockQueryClient();
3422

35-
const mockClerk = {
36-
loaded: true,
23+
const mockClerk = createMockClerk({
3724
billing: {
3825
getPlans: getPlansSpy,
3926
},
40-
telemetry: { record: vi.fn() },
41-
__unstable__environment: {
42-
commerceSettings: {
43-
billing: {
44-
user: { enabled: true },
45-
organization: { enabled: true },
46-
},
47-
},
48-
},
49-
on: vi.fn(),
50-
off: vi.fn(),
51-
};
52-
53-
Object.defineProperty(mockClerk, '__internal_queryClient', {
54-
configurable: true,
55-
get: vi.fn(() => defaultQueryClient),
27+
queryClient: defaultQueryClient,
5628
});
5729

5830
vi.mock('../../contexts', () => {

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

Lines changed: 10 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
import { QueryClient } from '@tanstack/query-core';
21
import { renderHook, waitFor } from '@testing-library/react';
32
import { beforeEach, describe, expect, it, vi } from 'vitest';
43

54
import { useSubscription } from '../useSubscription';
5+
import { createMockClerk, createMockOrganization, createMockQueryClient, createMockUser } from './mocks/clerk';
66
import { wrapper } from './wrapper';
77

88
// Dynamic mock state for contexts
9-
let mockUser: any = { id: 'user_1' };
10-
let mockOrganization: any = { id: 'org_1' };
9+
let mockUser: any = createMockUser();
10+
let mockOrganization: any = createMockOrganization();
1111
let userBillingEnabled = true;
1212
let orgBillingEnabled = true;
1313

@@ -16,42 +16,21 @@ const getSubscriptionSpy = vi.fn((args?: { orgId?: string }) =>
1616
Promise.resolve({ id: args?.orgId ? `sub_org_${args.orgId}` : 'sub_user_user_1' }),
1717
);
1818

19-
const mockClerk = {
20-
loaded: true,
19+
const defaultQueryClient = createMockQueryClient();
20+
21+
const mockClerk = createMockClerk({
2122
billing: {
2223
getSubscription: getSubscriptionSpy,
2324
},
24-
telemetry: { record: vi.fn() },
25-
__unstable__environment: {
25+
environment: {
2626
commerceSettings: {
2727
billing: {
2828
user: { enabled: userBillingEnabled },
2929
organization: { enabled: orgBillingEnabled },
3030
},
3131
},
3232
},
33-
on: vi.fn(),
34-
off: vi.fn(),
35-
};
36-
37-
const defaultQueryClient = {
38-
__tag: 'clerk-rq-client' as const,
39-
client: new QueryClient({
40-
defaultOptions: {
41-
queries: {
42-
retry: false,
43-
staleTime: Infinity,
44-
refetchOnWindowFocus: false,
45-
refetchOnReconnect: false,
46-
refetchOnMount: false,
47-
},
48-
},
49-
}),
50-
};
51-
52-
Object.defineProperty(mockClerk, '__internal_queryClient', {
53-
get: vi.fn(() => defaultQueryClient),
54-
configurable: true,
33+
queryClient: defaultQueryClient,
5534
});
5635

5736
vi.mock('../../contexts', () => {
@@ -69,8 +48,8 @@ describe('useSubscription', () => {
6948
// Reset environment flags and state
7049
userBillingEnabled = true;
7150
orgBillingEnabled = true;
72-
mockUser = { id: 'user_1' };
73-
mockOrganization = { id: 'org_1' };
51+
mockUser = createMockUser();
52+
mockOrganization = createMockOrganization();
7453
mockClerk.__unstable__environment.commerceSettings.billing.user.enabled = userBillingEnabled;
7554
mockClerk.__unstable__environment.commerceSettings.billing.organization.enabled = orgBillingEnabled;
7655
defaultQueryClient.client.clear();

0 commit comments

Comments
 (0)