import {browserHistory} from 'react-router'; import selectEvent from 'react-select-event'; import {Organization} from 'sentry-fixture/organization'; import {act, render, screen, userEvent, waitFor} from 'sentry-test/reactTestingLibrary'; import ProjectsStore from 'sentry/stores/projectsStore'; import ManageDashboards from 'sentry/views/dashboards/manage'; const FEATURES = [ 'global-views', 'dashboards-basic', 'dashboards-edit', 'discover-query', ]; describe('Dashboards > Detail', function () { const mockUnauthorizedOrg = Organization({ features: ['global-views', 'dashboards-basic', 'discover-query'], }); const mockAuthorizedOrg = Organization({ features: FEATURES, }); beforeEach(function () { act(() => ProjectsStore.loadInitialData([TestStubs.Project()])); MockApiClient.addMockResponse({ url: '/organizations/org-slug/projects/', body: [], }); MockApiClient.addMockResponse({ url: '/organizations/org-slug/dashboards/', body: [], }); MockApiClient.addMockResponse({ url: '/organizations/org-slug/dashboards/?sort=name&per_page=9', body: [], }); }); afterEach(function () { MockApiClient.clearMockResponses(); }); it('denies access on missing feature', function () { render( ); expect(screen.getByText("You don't have access to this feature")).toBeInTheDocument(); }); it('denies access on no projects', function () { act(() => ProjectsStore.loadInitialData([])); render( ); expect( screen.getByText('You need at least one project to use this view') ).toBeInTheDocument(); }); it('creates new dashboard', async function () { const org = Organization({features: FEATURES}); render(); await userEvent.click(screen.getByTestId('dashboard-create')); expect(browserHistory.push).toHaveBeenCalledWith({ pathname: '/organizations/org-slug/dashboards/new/', query: {}, }); }); it('can sort', async function () { const org = Organization({features: FEATURES}); render(); await selectEvent.select( screen.getByRole('button', {name: /sort by/i}), 'Dashboard Name (A-Z)' ); await waitFor(() => { expect(browserHistory.push).toHaveBeenCalledWith( expect.objectContaining({query: {sort: 'title'}}) ); }); }); });