pageFiltersStore.spec.tsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  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('updateProjects()', async function () {
  35. expect(PageFiltersStore.getState().selection.projects).toEqual([]);
  36. updateProjects([1]);
  37. await tick();
  38. expect(PageFiltersStore.getState().selection.projects).toEqual([1]);
  39. });
  40. it('does not update if projects has same value', async function () {
  41. const triggerSpy = jest.spyOn(PageFiltersStore, 'trigger');
  42. PageFiltersStore.updateProjects([1], []);
  43. await waitFor(() => PageFiltersStore.getState().selection.projects[0] === 1);
  44. PageFiltersStore.updateProjects([1], []);
  45. await tick();
  46. expect(triggerSpy).toHaveBeenCalledTimes(1);
  47. });
  48. it('updateDateTime()', async function () {
  49. expect(PageFiltersStore.getState().selection.datetime).toEqual({
  50. period: '14d',
  51. start: null,
  52. end: null,
  53. utc: null,
  54. });
  55. updateDateTime({period: '2h', start: null, end: null});
  56. await tick();
  57. expect(PageFiltersStore.getState().selection.datetime).toEqual({
  58. period: '2h',
  59. start: null,
  60. end: null,
  61. utc: null,
  62. });
  63. updateDateTime({
  64. period: null,
  65. start: '2018-08-08T00:00:00',
  66. end: '2018-09-08T00:00:00',
  67. utc: true,
  68. });
  69. await tick();
  70. expect(PageFiltersStore.getState().selection.datetime).toEqual({
  71. period: null,
  72. start: '2018-08-08T00:00:00',
  73. end: '2018-09-08T00:00:00',
  74. utc: true,
  75. });
  76. updateDateTime({
  77. period: null,
  78. start: null,
  79. end: null,
  80. utc: null,
  81. });
  82. await tick();
  83. expect(PageFiltersStore.getState().selection.datetime).toEqual({
  84. period: null,
  85. start: null,
  86. end: null,
  87. utc: null,
  88. });
  89. });
  90. it('does not update if datetime has same value', async function () {
  91. const now = Date.now();
  92. const start = new Date(now);
  93. const end = new Date(now + 1000);
  94. const triggerSpy = jest.spyOn(PageFiltersStore, 'trigger');
  95. PageFiltersStore.updateDateTime({end, start, period: null, utc: null});
  96. await waitFor(() => PageFiltersStore.getState().selection.datetime.start === start);
  97. PageFiltersStore.updateDateTime({
  98. end: new Date(end.getTime()),
  99. start: new Date(start.getTime()),
  100. period: null,
  101. utc: null,
  102. });
  103. await tick();
  104. expect(triggerSpy).toHaveBeenCalledTimes(1);
  105. });
  106. it('updateEnvironments()', async function () {
  107. expect(PageFiltersStore.getState().selection.environments).toEqual([]);
  108. updateEnvironments(['alpha']);
  109. await tick();
  110. expect(PageFiltersStore.getState().selection.environments).toEqual(['alpha']);
  111. });
  112. it('does not update if environments has same value', async function () {
  113. PageFiltersStore.updateEnvironments(['alpha']);
  114. const triggerSpy = jest.spyOn(PageFiltersStore, 'trigger');
  115. await waitFor(
  116. () => PageFiltersStore.getState().selection.environments[0] === 'alpha'
  117. );
  118. expect(triggerSpy).toHaveBeenCalledTimes(1);
  119. PageFiltersStore.updateEnvironments(['alpha']);
  120. await tick();
  121. expect(triggerSpy).toHaveBeenCalledTimes(1);
  122. });
  123. it('updatePersistence()', async function () {
  124. expect(PageFiltersStore.getState().shouldPersist).toEqual(true);
  125. updatePersistence(false);
  126. await tick();
  127. expect(PageFiltersStore.getState().shouldPersist).toEqual(false);
  128. });
  129. it('can mark filters as pinned', async function () {
  130. expect(PageFiltersStore.getState().pinnedFilters).toEqual(new Set());
  131. pinFilter('projects', true);
  132. await tick();
  133. expect(PageFiltersStore.getState().pinnedFilters).toEqual(new Set(['projects']));
  134. pinFilter('environments', true);
  135. await tick();
  136. expect(PageFiltersStore.getState().pinnedFilters).toEqual(
  137. new Set(['projects', 'environments'])
  138. );
  139. pinFilter('projects', false);
  140. await tick();
  141. expect(PageFiltersStore.getState().pinnedFilters).toEqual(new Set(['environments']));
  142. });
  143. });