import {LocationFixture} from 'sentry-fixture/locationFixture'; import {OrganizationFixture} from 'sentry-fixture/organization'; import {initializeOrg} from 'sentry-test/initializeOrg'; import {render, screen, waitFor} from 'sentry-test/reactTestingLibrary'; import ProjectsStore from 'sentry/stores/projectsStore'; import {browserHistory} from 'sentry/utils/browserHistory'; import DashboardDetail from 'sentry/views/dashboards/detail'; import OrgDashboards from 'sentry/views/dashboards/orgDashboards'; import {DashboardState} from 'sentry/views/dashboards/types'; describe('OrgDashboards', () => { const api = new MockApiClient(); const organization = OrganizationFixture({ features: ['dashboards-basic', 'dashboards-edit'], }); let initialData; beforeEach(() => { initialData = initializeOrg({ organization, projects: [], router: { location: LocationFixture(), params: {orgId: 'org-slug'}, }, }); const mockDashboard = { dateCreated: '2021-08-10T21:20:46.798237Z', id: '1', title: 'Test Dashboard', widgets: [], projects: [], filters: {}, }; MockApiClient.addMockResponse({ url: `/organizations/org-slug/dashboards/1/`, method: 'GET', body: mockDashboard, }); MockApiClient.addMockResponse({ url: '/organizations/org-slug/dashboards/', body: [mockDashboard], }); ProjectsStore.loadInitialData(initialData.projects); }); afterEach(() => { MockApiClient.clearMockResponses(); jest.clearAllMocks(); }); it('redirects to add query params for page filters if any are saved', async () => { const mockDashboardWithFilters = { dateCreated: '2021-08-10T21:20:46.798237Z', id: '1', title: 'Test Dashboard', widgets: [], projects: [1, 2], environment: ['alpha'], period: '7d', filters: {}, }; MockApiClient.addMockResponse({ url: `/organizations/org-slug/dashboards/1/`, method: 'GET', body: mockDashboardWithFilters, }); MockApiClient.addMockResponse({ url: '/organizations/org-slug/dashboards/', body: [mockDashboardWithFilters], }); render( {({dashboard, dashboards}) => { return dashboard ? ( ) : (
loading
); }}
, {router: initialData.router} ); await waitFor(() => expect(browserHistory.replace).toHaveBeenCalledWith( expect.objectContaining({ query: expect.objectContaining({ project: [1, 2], environment: ['alpha'], statsPeriod: '7d', }), }) ) ); }); it('ignores query params that are not page filters for redirection', async () => { const mockDashboardWithFilters = { dateCreated: '2021-08-10T21:20:46.798237Z', id: '1', title: 'Test Dashboard', widgets: [], projects: [1, 2], environment: ['alpha'], period: '7d', filters: {}, }; MockApiClient.addMockResponse({ url: `/organizations/org-slug/dashboards/1/`, method: 'GET', body: mockDashboardWithFilters, }); MockApiClient.addMockResponse({ url: '/organizations/org-slug/dashboards/', body: [mockDashboardWithFilters], }); render( {({dashboard, dashboards}) => { return dashboard ? ( ) : (
loading
); }}
, {router: initialData.router} ); await waitFor(() => expect(browserHistory.replace).toHaveBeenCalledWith( expect.objectContaining({ query: expect.objectContaining({ project: [1, 2], environment: ['alpha'], statsPeriod: '7d', }), }) ) ); }); it('does not add query params for page filters if one of the filters is defined', () => { initialData = initializeOrg({ organization, projects: [], router: { location: { ...LocationFixture(), query: { // project is supplied in the URL, so we should avoid redirecting project: ['1'], }, }, params: {orgId: 'org-slug'}, }, }); const mockDashboardWithFilters = { dateCreated: '2021-08-10T21:20:46.798237Z', id: '1', title: 'Test Dashboard', widgets: [], projects: [1, 2], environment: ['alpha'], period: '7d', filters: {}, }; MockApiClient.addMockResponse({ url: `/organizations/org-slug/dashboards/1/`, method: 'GET', body: mockDashboardWithFilters, }); MockApiClient.addMockResponse({ url: '/organizations/org-slug/dashboards/', body: [mockDashboardWithFilters], }); render( {({dashboard, dashboards}) => { return dashboard ? ( ) : (
loading
); }}
, {router: initialData.router} ); expect(browserHistory.replace).not.toHaveBeenCalled(); }); it('does not add query params for page filters if none are saved', () => { render( {({dashboard, dashboards}) => { return dashboard ? ( ) : (
loading
); }}
, {router: initialData.router} ); expect(browserHistory.replace).not.toHaveBeenCalled(); }); it('does not redirect to add query params if location is cleared manually', async () => { const mockDashboardWithFilters = { dateCreated: '2021-08-10T21:20:46.798237Z', id: '1', title: 'Test Dashboard', widgets: [], projects: [1], filters: {}, }; MockApiClient.addMockResponse({ url: `/organizations/org-slug/dashboards/1/`, method: 'GET', body: mockDashboardWithFilters, }); MockApiClient.addMockResponse({ url: '/organizations/org-slug/dashboards/', body: [mockDashboardWithFilters], }); const {rerender} = render( {({dashboard, dashboards}) => { return dashboard ? ( ) : (
loading
); }}
, {router: initialData.router} ); await waitFor(() => expect(browserHistory.replace).toHaveBeenCalledTimes(1)); rerender( {({dashboard, dashboards}) => { return dashboard ? ( ) : (
loading
); }}
); expect(screen.queryByTestId('loading-indicator')).not.toBeInTheDocument(); expect(browserHistory.replace).toHaveBeenCalledTimes(1); }); });