datePageFilter.spec.tsx 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import {initializeOrg} from 'sentry-test/initializeOrg';
  2. import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary';
  3. import DatePageFilter from 'sentry/components/datePageFilter';
  4. import OrganizationStore from 'sentry/stores/organizationStore';
  5. import PageFiltersStore from 'sentry/stores/pageFiltersStore';
  6. const {organization, router, routerContext} = initializeOrg({
  7. organization: {},
  8. project: undefined,
  9. projects: undefined,
  10. router: {
  11. location: {
  12. query: {},
  13. pathname: '/test',
  14. },
  15. params: {orgId: 'org-slug'},
  16. },
  17. });
  18. describe('DatePageFilter', function () {
  19. beforeEach(() => {
  20. PageFiltersStore.init();
  21. OrganizationStore.init();
  22. OrganizationStore.onUpdate(organization, {replace: true});
  23. PageFiltersStore.onInitializeUrlState(
  24. {
  25. projects: [],
  26. environments: [],
  27. datetime: {
  28. period: '7d',
  29. start: null,
  30. end: null,
  31. utc: null,
  32. },
  33. },
  34. new Set()
  35. );
  36. });
  37. afterEach(() => {
  38. PageFiltersStore.teardown();
  39. OrganizationStore.teardown();
  40. });
  41. it('can change period', async function () {
  42. render(<DatePageFilter />, {
  43. context: routerContext,
  44. organization,
  45. });
  46. // Open time period dropdown
  47. expect(screen.getByText('7D')).toBeInTheDocument();
  48. userEvent.click(screen.getByText('7D'));
  49. // Click 30 day period
  50. userEvent.click(screen.getByText('Last 30 days'));
  51. // Confirm selection changed visible text and query params
  52. expect(await screen.findByText('30D')).toBeInTheDocument();
  53. expect(router.push).toHaveBeenCalledWith(
  54. expect.objectContaining({query: {statsPeriod: '30d'}})
  55. );
  56. expect(PageFiltersStore.getState()).toEqual({
  57. isReady: true,
  58. desyncedFilters: new Set(),
  59. pinnedFilters: new Set(),
  60. selection: {
  61. datetime: {period: '30d'},
  62. environments: [],
  63. projects: [],
  64. },
  65. });
  66. });
  67. it('can pin datetime', async function () {
  68. render(<DatePageFilter />, {
  69. context: routerContext,
  70. organization,
  71. });
  72. // Confirm no filters are pinned
  73. expect(PageFiltersStore.getState()).toEqual(
  74. expect.objectContaining({
  75. pinnedFilters: new Set(),
  76. })
  77. );
  78. // Open time period dropdown
  79. userEvent.click(screen.getByText('7D'));
  80. // Click the pin button
  81. const pinButton = screen.getByRole('button', {name: 'Lock filter'});
  82. userEvent.click(pinButton);
  83. await screen.findByRole('button', {name: 'Lock filter', pressed: true});
  84. // Check if the pin indicator has been added
  85. expect(screen.getByLabelText('Filter applied across pages')).toBeInTheDocument();
  86. expect(PageFiltersStore.getState()).toEqual(
  87. expect.objectContaining({
  88. pinnedFilters: new Set(['datetime']),
  89. })
  90. );
  91. });
  92. });