Skip to content

Commit 4fc9240

Browse files
authored
chore(clerk-js): Add test coverage for memoizeStateListenerCallback (#7152)
1 parent 92fba5d commit 4fc9240

File tree

2 files changed

+143
-39
lines changed

2 files changed

+143
-39
lines changed

.changeset/slimy-maps-read.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
---
2+
---
Lines changed: 141 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,144 @@
1-
// TODO: jest fails because of a circular dependency on Client -> Base -> Client
2-
// This circular dep is a known issue we plan to address soon. Enable the tests then
3-
import { describe, it } from 'vitest';
1+
import type { Resources, UserJSON } from '@clerk/shared/types';
2+
import { describe, expect, it, vi } from 'vitest';
43

5-
describe.skip('memoizeStateListenerCallback', () => {
6-
it.skip('runs', () => {
7-
// TODO
4+
import { User } from '../../core/resources/User';
5+
import { memoizeListenerCallback } from '../memoizeStateListenerCallback';
6+
7+
function createTestUser(overrides: Partial<UserJSON> = {}): User {
8+
const defaultUserJSON: UserJSON = {
9+
email_addresses: [],
10+
external_accounts: [],
11+
first_name: 'clerk',
12+
id: 'u1',
13+
phone_numbers: [],
14+
updated_at: 1,
15+
web3_wallets: [],
16+
} as unknown as UserJSON;
17+
18+
return new User({ ...defaultUserJSON, ...overrides } as unknown as UserJSON);
19+
}
20+
21+
describe('memoizeStateListenerCallback', () => {
22+
it('returns same user ref if user obj state has not changed', () => {
23+
const user1 = createTestUser();
24+
const user2 = createTestUser();
25+
26+
let calledWith: Resources | undefined;
27+
const listener = memoizeListenerCallback(
28+
vi.fn((e: Resources) => {
29+
calledWith = e;
30+
}),
31+
);
32+
33+
listener({ client: null, organization: null, session: null, user: user1 });
34+
listener({ client: null, organization: null, session: null, user: user2 });
35+
36+
expect(calledWith?.user).toBe(user1);
837
});
9-
});
1038

11-
// import { Resources, UserJSON } from '@clerk/shared/types';
12-
//
13-
// const frontEndApi = '';
14-
// const path = '';
15-
//
16-
// describe('memoizeStateListenerCallback', () => {
17-
// it('returns same user ref if user obj state has not changed', () => {
18-
// const user1 = new User(frontEndApi, path, {
19-
// id: 'u1',
20-
// updated_at: 1,
21-
// first_name: 'clerk',
22-
// } as UserJSON);
23-
//
24-
// const user2 = new User(frontEndApi, path, {
25-
// id: 'u1',
26-
// updated_at: 1,
27-
// first_name: 'clerk',
28-
// } as UserJSON);
29-
//
30-
// let calledWith: any;
31-
// const listener = memoizeListenerCallback(
32-
// jest.fn((e: Resources) => {
33-
// console.log(e);
34-
// calledWith = e.user;
35-
// }),
36-
// );
37-
//
38-
// listener(({ user: user1 } as any) as Resources);
39-
// listener(({ user: user2 } as any) as Resources);
40-
// expect(calledWith).toBe(user1);
41-
// });
42-
// });
39+
it('returns new user ref if user obj state has changed', () => {
40+
const user1 = createTestUser();
41+
const user2 = createTestUser({ updated_at: 2 });
42+
43+
let calledWith: Resources | undefined;
44+
const listener = memoizeListenerCallback(
45+
vi.fn((e: Resources) => {
46+
calledWith = e;
47+
}),
48+
);
49+
50+
listener({ client: null, organization: null, session: null, user: user1 });
51+
listener({ client: null, organization: null, session: null, user: user2 });
52+
53+
expect(calledWith?.user).toBe(user2);
54+
});
55+
56+
it('returns new user ref if user id has changed', () => {
57+
const user1 = createTestUser();
58+
const user2 = createTestUser({ id: 'u2' });
59+
60+
let calledWith: Resources | undefined;
61+
const listener = memoizeListenerCallback(
62+
vi.fn((e: Resources) => {
63+
calledWith = e;
64+
}),
65+
);
66+
67+
listener({ client: null, organization: null, session: null, user: user1 });
68+
listener({ client: null, organization: null, session: null, user: user2 });
69+
70+
expect(calledWith?.user).toBe(user2);
71+
});
72+
73+
it('handles user becoming null', () => {
74+
const user1 = createTestUser();
75+
76+
let calledWith: Resources | undefined;
77+
const listener = memoizeListenerCallback(
78+
vi.fn((e: Resources) => {
79+
calledWith = e;
80+
}),
81+
);
82+
83+
listener({ client: null, organization: null, session: null, user: user1 });
84+
listener({ client: null, organization: null, session: null, user: null });
85+
86+
expect(calledWith?.user).toBe(null);
87+
});
88+
89+
it('handles user transitioning from null to defined', () => {
90+
const user1 = createTestUser();
91+
92+
let calledWith: Resources | undefined;
93+
const listener = memoizeListenerCallback(
94+
vi.fn((e: Resources) => {
95+
calledWith = e;
96+
}),
97+
);
98+
99+
listener({ client: null, organization: null, session: null, user: null });
100+
listener({ client: null, organization: null, session: null, user: user1 });
101+
102+
expect(calledWith?.user).toBe(user1);
103+
});
104+
105+
it('calls the callback function each time', () => {
106+
const user1 = createTestUser();
107+
108+
const mockCallback = vi.fn();
109+
const listener = memoizeListenerCallback(mockCallback);
110+
111+
listener({ client: null, organization: null, session: null, user: user1 });
112+
listener({ client: null, organization: null, session: null, user: user1 });
113+
114+
expect(mockCallback).toHaveBeenCalledTimes(2);
115+
});
116+
117+
it('treats null and undefined as different values (null to undefined)', () => {
118+
let calledWith: Resources | undefined;
119+
const listener = memoizeListenerCallback(
120+
vi.fn((e: Resources) => {
121+
calledWith = e;
122+
}),
123+
);
124+
125+
listener({ client: null, organization: null, session: null, user: null });
126+
listener({ client: null, organization: null, session: null, user: undefined });
127+
128+
expect(calledWith?.user).toBe(undefined);
129+
});
130+
131+
it('treats null and undefined as different values (undefined to null)', () => {
132+
let calledWith: Resources | undefined;
133+
const listener = memoizeListenerCallback(
134+
vi.fn((e: Resources) => {
135+
calledWith = e;
136+
}),
137+
);
138+
139+
listener({ client: null, organization: null, session: null, user: undefined });
140+
listener({ client: null, organization: null, session: null, user: null });
141+
142+
expect(calledWith?.user).toBe(null);
143+
});
144+
});

0 commit comments

Comments
 (0)