useDeploymentMode.test.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import { renderHook } from '@testing-library/react'
  2. import { beforeEach, describe, expect, test, vi } from 'vitest'
  3. import { useDeploymentMode } from '../useDeploymentMode'
  4. const { mockIsPlatform, mockUseDeploymentModeQuery } = vi.hoisted(() => ({
  5. mockIsPlatform: { value: false },
  6. mockUseDeploymentModeQuery: vi.fn(),
  7. }))
  8. vi.mock('@/lib/constants', async () => {
  9. const actual = await vi.importActual<Record<string, unknown>>('@/lib/constants')
  10. return {
  11. ...actual,
  12. get IS_PLATFORM() {
  13. return mockIsPlatform.value
  14. },
  15. }
  16. })
  17. vi.mock('@/data/config/deployment-mode-query', () => ({
  18. useDeploymentModeQuery: mockUseDeploymentModeQuery,
  19. }))
  20. describe('useDeploymentMode', () => {
  21. beforeEach(() => {
  22. mockIsPlatform.value = false
  23. mockUseDeploymentModeQuery.mockReset()
  24. })
  25. test('platform build: returns isPlatform regardless of query state', () => {
  26. mockIsPlatform.value = true
  27. mockUseDeploymentModeQuery.mockReturnValue({ data: undefined })
  28. const { result } = renderHook(() => useDeploymentMode())
  29. expect(result.current).toEqual({
  30. isPlatform: true,
  31. isCli: false,
  32. isSelfHosted: false,
  33. })
  34. })
  35. test('non-platform, loading window (data undefined): defaults to CLI', () => {
  36. // `?? true` flip — see useDeploymentMode for the asymmetry rationale.
  37. // `'direct'` is the only universally-valid method, so CLI-during-loading
  38. // is the safe guess that avoids pinning an invalid `connectionMethod`.
  39. mockUseDeploymentModeQuery.mockReturnValue({ data: undefined })
  40. const { result } = renderHook(() => useDeploymentMode())
  41. expect(result.current).toEqual({
  42. isPlatform: false,
  43. isCli: true,
  44. isSelfHosted: false,
  45. })
  46. })
  47. test('non-platform, resolved is_cli_mode=true: CLI', () => {
  48. mockUseDeploymentModeQuery.mockReturnValue({ data: { is_cli_mode: true } })
  49. const { result } = renderHook(() => useDeploymentMode())
  50. expect(result.current).toEqual({
  51. isPlatform: false,
  52. isCli: true,
  53. isSelfHosted: false,
  54. })
  55. })
  56. test('non-platform, resolved is_cli_mode=false: self-hosted', () => {
  57. mockUseDeploymentModeQuery.mockReturnValue({ data: { is_cli_mode: false } })
  58. const { result } = renderHook(() => useDeploymentMode())
  59. expect(result.current).toEqual({
  60. isPlatform: false,
  61. isCli: false,
  62. isSelfHosted: true,
  63. })
  64. })
  65. test('returns a stable reference across renders when primitive flags do not change', () => {
  66. // Distinct `data` object refs with equal contents — pins memoization on the
  67. // primitive flags (`[isCli, isSelfHosted]`), not on the `data` reference.
  68. mockUseDeploymentModeQuery
  69. .mockReturnValueOnce({ data: { is_cli_mode: false } })
  70. .mockReturnValueOnce({ data: { is_cli_mode: false } })
  71. const { result, rerender } = renderHook(() => useDeploymentMode())
  72. const first = result.current
  73. rerender()
  74. expect(result.current).toBe(first)
  75. })
  76. })