|
1 | 1 | import type { Clerk } from '@clerk/clerk-js'; |
2 | 2 | import { beforeEach, describe, expect, test, vi } from 'vitest'; |
3 | 3 |
|
| 4 | +import type { TokenCache } from '../../../cache/types'; |
| 5 | +import { CLERK_CLIENT_JWT_KEY } from '../../../constants'; |
| 6 | + |
4 | 7 | const mocks = vi.hoisted(() => { |
5 | 8 | return { |
6 | 9 | constructorSpy: vi.fn(), |
@@ -239,4 +242,46 @@ describe('createClerkInstance', () => { |
239 | 242 | }), |
240 | 243 | ).toThrow(/`proxyUrl` must be a string/); |
241 | 244 | }); |
| 245 | + |
| 246 | + test('preserves tokenCache method context for class instances', async () => { |
| 247 | + class InstanceTokenCache implements TokenCache { |
| 248 | + private readonly tokens = new Map<string, string>(); |
| 249 | + |
| 250 | + getToken(key: string) { |
| 251 | + return Promise.resolve(this.tokens.get(key) ?? null); |
| 252 | + } |
| 253 | + |
| 254 | + saveToken(key: string, token: string) { |
| 255 | + this.tokens.set(key, token); |
| 256 | + return Promise.resolve(); |
| 257 | + } |
| 258 | + } |
| 259 | + |
| 260 | + const tokenCache = new InstanceTokenCache(); |
| 261 | + await tokenCache.saveToken(CLERK_CLIENT_JWT_KEY, 'cached-token'); |
| 262 | + |
| 263 | + const createClerkInstance = await loadCreateClerkInstance(); |
| 264 | + const getClerkInstance = createClerkInstance(MockClerk as unknown as typeof Clerk); |
| 265 | + const clerk = getClerkInstance({ |
| 266 | + publishableKey: 'pk_test_123', |
| 267 | + tokenCache, |
| 268 | + }) as unknown as MockClerk; |
| 269 | + |
| 270 | + const beforeRequest = clerk.__internal_onBeforeRequest.mock.calls[0][0]; |
| 271 | + const requestInit = { |
| 272 | + headers: new Headers(), |
| 273 | + url: new URL('https://clerk.example.com/v1/client'), |
| 274 | + }; |
| 275 | + await beforeRequest(requestInit); |
| 276 | + |
| 277 | + expect(requestInit.headers.get('authorization')).toBe('cached-token'); |
| 278 | + |
| 279 | + const afterResponse = clerk.__internal_onAfterResponse.mock.calls[0][0]; |
| 280 | + await afterResponse(requestInit, { |
| 281 | + headers: new Headers({ authorization: 'fresh-token' }), |
| 282 | + payload: null, |
| 283 | + }); |
| 284 | + |
| 285 | + await expect(tokenCache.getToken(CLERK_CLIENT_JWT_KEY)).resolves.toBe('fresh-token'); |
| 286 | + }); |
242 | 287 | }); |
0 commit comments