pageFiltersStore.spec.tsx 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. import {waitFor} from 'sentry-test/reactTestingLibrary';
  2. import {
  3. pinFilter,
  4. updateDateTime,
  5. updateEnvironments,
  6. updatePersistence,
  7. updateProjects,
  8. } from 'sentry/actionCreators/pageFilters';
  9. import PageFiltersStore from 'sentry/stores/pageFiltersStore';
  10. jest.mock('sentry/utils/localStorage', () => ({
  11. getItem: () => JSON.stringify({projects: [5], environments: ['staging']}),
  12. setItem: jest.fn(),
  13. }));
  14. describe('PageFiltersStore', function () {
  15. beforeEach(() => {
  16. PageFiltersStore.init();
  17. });
  18. afterEach(function () {
  19. PageFiltersStore.reset();
  20. });
  21. it('getState()', function () {
  22. expect(PageFiltersStore.getState()).toEqual({
  23. isReady: false,
  24. shouldPersist: true,
  25. desyncedFilters: new Set(),
  26. pinnedFilters: new Set(),
  27. selection: {
  28. projects: [],
  29. environments: [],
  30. datetime: {period: '14d', start: null, end: null, utc: null},
  31. },
  32. });
  33. });
  34. it('returns a stable reference with getState', () => {
  35. PageFiltersStore.updateProjects([1], []);
  36. const state = PageFiltersStore.getState();
  37. expect(Object.is(state, PageFiltersStore.getState())).toBe(true);
  38. });
  39. it('updateProjects()', async function () {
  40. expect(PageFiltersStore.getState().selection.projects).toEqual([]);
  41. updateProjects([1]);
  42. await tick();
  43. expect(PageFiltersStore.getState().selection.projects).toEqual([1]);
  44. });
  45. it('does not update if projects has same value', async function () {
  46. const triggerSpy = jest.spyOn(PageFiltersStore, 'trigger');
  47. PageFiltersStore.updateProjects([1], []);
  48. await waitFor(() => PageFiltersStore.getState().selection.projects[0] === 1);
  49. PageFiltersStore.updateProjects([1], []);
  50. await tick();
  51. expect(triggerSpy).toHaveBeenCalledTimes(1);
  52. });
  53. it('updateDateTime()', async function () {
  54. expect(PageFiltersStore.getState().selection.datetime).toEqual({
  55. period: '14d',
  56. start: null,
  57. end: null,
  58. utc: null,
  59. });
  60. updateDateTime({period: '2h', start: null, end: null});
  61. await tick();
  62. expect(PageFiltersStore.getState().selection.datetime).toEqual({
  63. period: '2h',
  64. start: null,
  65. end: null,
  66. utc: null,
  67. });
  68. updateDateTime({
  69. period: null,
  70. start: '2018-08-08T00:00:00',
  71. end: '2018-09-08T00:00:00',
  72. utc: true,
  73. });
  74. await tick();
  75. expect(PageFiltersStore.getState().selection.datetime).toEqual({
  76. period: null,
  77. start: '2018-08-08T00:00:00',
  78. end: '2018-09-08T00:00:00',
  79. utc: true,
  80. });
  81. updateDateTime({
  82. period: null,
  83. start: null,
  84. end: null,
  85. utc: null,
  86. });
  87. await tick();
  88. expect(PageFiltersStore.getState().selection.datetime).toEqual({
  89. period: null,
  90. start: null,
  91. end: null,
  92. utc: null,
  93. });
  94. });
  95. it('does not update if datetime has same value', async function () {
  96. const now = Date.now();
  97. const start = new Date(now);
  98. const end = new Date(now + 1000);
  99. const triggerSpy = jest.spyOn(PageFiltersStore, 'trigger');
  100. PageFiltersStore.updateDateTime({end, start, period: null, utc: null});
  101. await waitFor(() => PageFiltersStore.getState().selection.datetime.start === start);
  102. PageFiltersStore.updateDateTime({
  103. end: new Date(end.getTime()),
  104. start: new Date(start.getTime()),
  105. period: null,
  106. utc: null,
  107. });
  108. await tick();
  109. expect(triggerSpy).toHaveBeenCalledTimes(1);
  110. });
  111. it('updateEnvironments()', async function () {
  112. expect(PageFiltersStore.getState().selection.environments).toEqual([]);
  113. updateEnvironments(['alpha']);
  114. await tick();
  115. expect(PageFiltersStore.getState().selection.environments).toEqual(['alpha']);
  116. });
  117. it('does not update if environments has same value', async function () {
  118. PageFiltersStore.updateEnvironments(['alpha']);
  119. const triggerSpy = jest.spyOn(PageFiltersStore, 'trigger');
  120. await waitFor(
  121. () => PageFiltersStore.getState().selection.environments[0] === 'alpha'
  122. );
  123. expect(triggerSpy).toHaveBeenCalledTimes(1);
  124. PageFiltersStore.updateEnvironments(['alpha']);
  125. await tick();
  126. expect(triggerSpy).toHaveBeenCalledTimes(1);
  127. });
  128. it('updatePersistence()', async function () {
  129. expect(PageFiltersStore.getState().shouldPersist).toEqual(true);
  130. updatePersistence(false);
  131. await tick();
  132. expect(PageFiltersStore.getState().shouldPersist).toEqual(false);
  133. });
  134. it('can mark filters as pinned', async function () {
  135. expect(PageFiltersStore.getState().pinnedFilters).toEqual(new Set());
  136. pinFilter('projects', true);
  137. await tick();
  138. expect(PageFiltersStore.getState().pinnedFilters).toEqual(new Set(['projects']));
  139. pinFilter('environments', true);
  140. await tick();
  141. expect(PageFiltersStore.getState().pinnedFilters).toEqual(
  142. new Set(['projects', 'environments'])
  143. );
  144. pinFilter('projects', false);
  145. await tick();
  146. expect(PageFiltersStore.getState().pinnedFilters).toEqual(new Set(['environments']));
  147. });
  148. });