configcat.test.ts80 lines · main
1import * as configcat from 'configcat-js'
2import { beforeEach, describe, expect, it, vi } from 'vitest'
3
4vi.mock('configcat-js', () => ({
5 getClient: vi.fn(),
6 PollingMode: {
7 AutoPoll: 'AutoPoll',
8 },
9 ClientCacheState: {
10 NoFlagData: 0,
11 HasLocalOverrideFlagDataOnly: 1,
12 HasCachedFlagDataOnly: 2,
13 HasUpToDateFlagData: 3,
14 },
15 User: vi.fn(),
16}))
17
18describe('configcat', () => {
19 const mockClient = {
20 getAllValuesAsync: vi.fn(),
21 waitForReady: vi.fn().mockResolvedValue(3), // HasUpToDateFlagData
22 dispose: vi.fn(),
23 }
24
25 beforeEach(() => {
26 vi.clearAllMocks()
27 vi.resetModules()
28 vi.unstubAllEnvs()
29 ;(configcat.getClient as any).mockReturnValue(mockClient)
30 })
31
32 it('should return empty array when no email is provided', async () => {
33 const { getFlags } = await import('./configcat')
34 const result = await getFlags()
35 expect(result).toEqual([])
36 })
37
38 it('should call getAllValuesAsync with user when email is provided', async () => {
39 vi.stubEnv('NEXT_PUBLIC_CONFIGCAT_PROXY_URL', 'https://proxy.example.com')
40
41 const { getFlags } = await import('./configcat')
42
43 const email = 'test@example.com'
44 const mockValues = { flag1: true, flag2: false }
45 mockClient.getAllValuesAsync.mockResolvedValue(mockValues)
46
47 const result = await getFlags(email)
48
49 expect(configcat.User).toHaveBeenCalledWith(email, undefined, undefined, expect.any(Object))
50 expect(mockClient.getAllValuesAsync).toHaveBeenCalled()
51 expect(result).toEqual(mockValues)
52 })
53
54 it('should fall back to SDK key client when proxy returns NoFlagData', async () => {
55 vi.stubEnv('NEXT_PUBLIC_CONFIGCAT_PROXY_URL', 'https://proxy.example.com')
56 vi.stubEnv('NEXT_PUBLIC_CONFIGCAT_SDK_KEY', 'test-sdk-key')
57
58 const proxyClient = {
59 getAllValuesAsync: vi.fn(),
60 waitForReady: vi.fn().mockResolvedValue(0), // NoFlagData
61 dispose: vi.fn(),
62 }
63 const sdkClient = {
64 getAllValuesAsync: vi.fn().mockResolvedValue([]),
65 waitForReady: vi.fn().mockResolvedValue(3), // HasUpToDateFlagData
66 dispose: vi.fn(),
67 }
68
69 ;(configcat.getClient as any).mockReturnValueOnce(proxyClient).mockReturnValueOnce(sdkClient)
70
71 const { getFlags } = await import('./configcat')
72 await getFlags()
73
74 expect(configcat.getClient).toHaveBeenCalledTimes(2)
75 expect(proxyClient.dispose).toHaveBeenCalled()
76 expect(configcat.getClient).toHaveBeenNthCalledWith(2, 'test-sdk-key', 'AutoPoll', {
77 pollIntervalSeconds: 7 * 60,
78 })
79 })
80})