overrides.test.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
  2. import { getEnabledFeaturesOverrideDisabledList } from './overrides'
  3. describe('getEnabledFeaturesOverrideDisabledList', () => {
  4. let warnSpy: ReturnType<typeof vi.spyOn>
  5. beforeEach(() => {
  6. warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {})
  7. })
  8. afterEach(() => {
  9. warnSpy.mockRestore()
  10. })
  11. it('returns empty list when no env vars are set', () => {
  12. expect(getEnabledFeaturesOverrideDisabledList({})).toEqual([])
  13. })
  14. it('disables a feature when its env var is "false"', () => {
  15. expect(
  16. getEnabledFeaturesOverrideDisabledList({ ENABLED_FEATURES_LOGS_TEMPLATES: 'false' })
  17. ).toEqual(['logs:templates'])
  18. })
  19. it('does not disable features whose env var is "true"', () => {
  20. expect(
  21. getEnabledFeaturesOverrideDisabledList({ ENABLED_FEATURES_LOGS_TEMPLATES: 'true' })
  22. ).toEqual([])
  23. })
  24. it('accepts booleans case-insensitively and trims whitespace', () => {
  25. const result = getEnabledFeaturesOverrideDisabledList({
  26. ENABLED_FEATURES_LOGS_TEMPLATES: 'FALSE',
  27. ENABLED_FEATURES_LOGS_METADATA: ' False ',
  28. })
  29. expect(result.sort()).toEqual(['logs:metadata', 'logs:templates'])
  30. })
  31. it('maps snake_case and kebab-case keys to the env name convention', () => {
  32. const result = getEnabledFeaturesOverrideDisabledList({
  33. ENABLED_FEATURES_BRANDING_LARGE_LOGO: 'false',
  34. ENABLED_FEATURES_DOCS_SELF_HOSTING: 'false',
  35. })
  36. expect(result.sort()).toEqual(['branding:large_logo', 'docs:self-hosting'])
  37. })
  38. it('warns and ignores non-boolean values', () => {
  39. expect(
  40. getEnabledFeaturesOverrideDisabledList({ ENABLED_FEATURES_LOGS_TEMPLATES: 'maybe' })
  41. ).toEqual([])
  42. expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('must be "true" or "false"'))
  43. })
  44. it('warns and ignores env vars prefixed but not matching a known feature', () => {
  45. expect(
  46. getEnabledFeaturesOverrideDisabledList({ ENABLED_FEATURES_NOT_A_FEATURE: 'false' })
  47. ).toEqual([])
  48. expect(warnSpy).toHaveBeenCalledWith(
  49. expect.stringContaining('does not match any known feature')
  50. )
  51. })
  52. it('does not warn for reserved ENABLED_FEATURES_OVERRIDE_DISABLE_ALL', () => {
  53. expect(
  54. getEnabledFeaturesOverrideDisabledList({ ENABLED_FEATURES_OVERRIDE_DISABLE_ALL: 'true' })
  55. ).toEqual([])
  56. expect(warnSpy).not.toHaveBeenCalled()
  57. })
  58. it('ignores env vars outside the prefix without warning', () => {
  59. expect(
  60. getEnabledFeaturesOverrideDisabledList({ NODE_ENV: 'production', PATH: '/usr/bin' })
  61. ).toEqual([])
  62. expect(warnSpy).not.toHaveBeenCalled()
  63. })
  64. it('treats an empty string value as unset', () => {
  65. expect(getEnabledFeaturesOverrideDisabledList({ ENABLED_FEATURES_LOGS_TEMPLATES: '' })).toEqual(
  66. []
  67. )
  68. expect(warnSpy).not.toHaveBeenCalled()
  69. })
  70. })