featureFlagOverrides.spec.ts 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. import {OrganizationFixture} from 'sentry-fixture/organization';
  2. import FeatureFlagOverrides from 'sentry/utils/featureFlagOverrides';
  3. import localStorageWrapper from 'sentry/utils/localStorage';
  4. const LOCALSTORAGE_KEY = 'feature-flag-overrides';
  5. describe('FeatureFlagOverrides', () => {
  6. let organization;
  7. beforeEach(() => {
  8. localStorage.clear();
  9. organization = OrganizationFixture({
  10. features: ['enable-issues', 'enable-profiling', 'enable-replay'],
  11. });
  12. });
  13. describe('setStoredOverride', () => {
  14. it('should insert new flag names into localstorage', () => {
  15. expect(localStorageWrapper.getItem(LOCALSTORAGE_KEY)).toBeNull();
  16. const inst = new FeatureFlagOverrides();
  17. inst.setStoredOverride('enable-issues', false);
  18. expect(localStorageWrapper.getItem(LOCALSTORAGE_KEY)).toBe(
  19. '{"enable-issues":false}'
  20. );
  21. inst.setStoredOverride('enable-issues', true);
  22. expect(localStorageWrapper.getItem(LOCALSTORAGE_KEY)).toBe(
  23. '{"enable-issues":true}'
  24. );
  25. });
  26. it('should preserve other flag overrides in localstorage', () => {
  27. localStorageWrapper.setItem(
  28. LOCALSTORAGE_KEY,
  29. '{"enable-issues":true,"enable-profiling":false}'
  30. );
  31. const inst = new FeatureFlagOverrides();
  32. inst.setStoredOverride('enable-replay', false);
  33. expect(localStorageWrapper.getItem(LOCALSTORAGE_KEY)).toEqual(
  34. '{"enable-issues":true,"enable-profiling":false,"enable-replay":false}'
  35. );
  36. inst.setStoredOverride('enable-replay', true);
  37. expect(localStorageWrapper.getItem(LOCALSTORAGE_KEY)).toEqual(
  38. '{"enable-issues":true,"enable-profiling":false,"enable-replay":true}'
  39. );
  40. });
  41. it('should set localstorage, even if the original value is malformed', () => {
  42. localStorageWrapper.setItem(LOCALSTORAGE_KEY, 'this is not an object {}');
  43. const inst = new FeatureFlagOverrides();
  44. inst.setStoredOverride('enable-issues', false);
  45. expect(localStorageWrapper.getItem(LOCALSTORAGE_KEY)).toEqual(
  46. '{"enable-issues":false}'
  47. );
  48. });
  49. });
  50. describe('getFeatureFlagMap', () => {
  51. it('should combine & remove features that are disabled locally', () => {
  52. localStorageWrapper.setItem(
  53. LOCALSTORAGE_KEY,
  54. '{"enable-issues":false,"enable-profiling":true}'
  55. );
  56. const inst = new FeatureFlagOverrides();
  57. expect(inst.getFeatureFlagMap(organization)).toEqual({
  58. 'enable-issues': {value: true, override: false},
  59. 'enable-profiling': {value: true, override: true},
  60. 'enable-replay': {value: true, override: undefined},
  61. });
  62. });
  63. it('should combine & add features that are listed locally, but not in the org', () => {
  64. localStorageWrapper.setItem(
  65. LOCALSTORAGE_KEY,
  66. '{"enable-issues":false,"secret-new-feature":true,"local-only-feature":false}'
  67. );
  68. const inst = new FeatureFlagOverrides();
  69. expect(inst.getFeatureFlagMap(organization)).toEqual({
  70. 'enable-issues': {value: true, override: false},
  71. 'enable-profiling': {value: true, override: undefined},
  72. 'enable-replay': {value: true, override: undefined},
  73. 'secret-new-feature': {value: undefined, override: true},
  74. 'local-only-feature': {value: undefined, override: false},
  75. });
  76. });
  77. });
  78. describe('getEnabledFeatureFlagList', () => {
  79. it('should combine & remove features that are disabled locally', () => {
  80. localStorageWrapper.setItem(
  81. LOCALSTORAGE_KEY,
  82. '{"enable-issues":false,"enable-profiling":true}'
  83. );
  84. const inst = new FeatureFlagOverrides();
  85. expect(inst.getEnabledFeatureFlagList(organization)).toEqual([
  86. 'enable-profiling',
  87. 'enable-replay',
  88. ]);
  89. });
  90. it('should combine & add features that are listed locally, but not in the org', () => {
  91. localStorageWrapper.setItem(
  92. LOCALSTORAGE_KEY,
  93. '{"enable-issues":false,"secret-new-feature":true,"local-only-feature":false}'
  94. );
  95. const inst = new FeatureFlagOverrides();
  96. expect(inst.getEnabledFeatureFlagList(organization)).toEqual([
  97. 'enable-profiling',
  98. 'enable-replay',
  99. 'secret-new-feature',
  100. ]);
  101. });
  102. });
  103. describe('loadOrg', () => {
  104. it('should override the features on an org with the combined list', () => {
  105. localStorageWrapper.setItem(
  106. LOCALSTORAGE_KEY,
  107. '{"enable-issues":false,"secret-new-feature":true,"local-only-feature":false}'
  108. );
  109. const inst = new FeatureFlagOverrides();
  110. expect(organization.features).toEqual([
  111. 'enable-issues',
  112. 'enable-profiling',
  113. 'enable-replay',
  114. ]);
  115. inst.loadOrg(organization);
  116. expect(organization.features).toEqual([
  117. 'enable-profiling',
  118. 'enable-replay',
  119. 'secret-new-feature',
  120. ]);
  121. expect(inst.getFeatureFlagMap(organization)).toEqual({
  122. 'enable-issues': {value: true, override: false},
  123. 'enable-profiling': {value: true, override: undefined},
  124. 'enable-replay': {value: true, override: undefined},
  125. 'secret-new-feature': {value: undefined, override: true},
  126. 'local-only-feature': {value: undefined, override: false},
  127. });
  128. expect(inst.getEnabledFeatureFlagList(organization)).toEqual([
  129. 'enable-profiling',
  130. 'enable-replay',
  131. 'secret-new-feature',
  132. ]);
  133. });
  134. });
  135. });