configcat.test.ts 2.5 KB

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