import {createMemoryHistory, Route, Router, RouterContext} from 'react-router';
import {render, screen, userEvent, within} from 'sentry-test/reactTestingLibrary';
import {useResultMode} from 'sentry/views/explore/hooks/useResultsMode';
import {useSampleFields} from 'sentry/views/explore/hooks/useSampleFields';
import {useSorts} from 'sentry/views/explore/hooks/useSorts';
import {ExploreToolbar} from 'sentry/views/explore/toolbar';
import {RouteContext} from 'sentry/views/routeContext';
function renderWithRouter(component) {
const memoryHistory = createMemoryHistory();
render(
{
return (
);
}}
>
);
}
describe('ExploreToolbar', function () {
beforeEach(function () {
// without this the `CompactSelect` component errors with a bunch of async updates
jest.spyOn(console, 'error').mockImplementation();
});
it('allows changing results mode', async function () {
let resultMode;
function Component() {
[resultMode] = useResultMode();
return ;
}
renderWithRouter(Component);
const section = screen.getByTestId('section-result-mode');
const samples = within(section).getByRole('radio', {name: 'Samples'});
const aggregates = within(section).getByRole('radio', {name: 'Aggregate'});
expect(samples).toBeChecked();
expect(aggregates).not.toBeChecked();
expect(resultMode).toEqual('samples');
await userEvent.click(aggregates);
expect(samples).not.toBeChecked();
expect(aggregates).toBeChecked();
expect(resultMode).toEqual('aggregate');
await userEvent.click(samples);
expect(samples).toBeChecked();
expect(aggregates).not.toBeChecked();
expect(resultMode).toEqual('samples');
// TODO: check other parts of page reflects this
});
it('allows changing sort by', async function () {
let sorts;
function Component() {
const [sampleFields] = useSampleFields();
[sorts] = useSorts({fields: sampleFields});
return ;
}
renderWithRouter(Component);
const section = screen.getByTestId('section-sort-by');
// this is the default
expect(within(section).getByRole('button', {name: 'timestamp'})).toBeInTheDocument();
expect(within(section).getByRole('button', {name: 'Descending'})).toBeInTheDocument();
expect(sorts).toEqual([{field: 'timestamp', kind: 'desc'}]);
// check the default field options
const fields = [
'project',
'id',
'span.op',
'span.description',
'span.duration',
'timestamp',
];
await userEvent.click(within(section).getByRole('button', {name: 'timestamp'}));
const fieldOptions = await within(section).findAllByRole('option');
expect(fieldOptions).toHaveLength(fields.length);
fieldOptions.forEach((option, i) => {
expect(option).toHaveTextContent(fields[i]);
});
// try changing the field
await userEvent.click(within(section).getByRole('option', {name: 'span.op'}));
expect(within(section).getByRole('button', {name: 'span.op'})).toBeInTheDocument();
expect(within(section).getByRole('button', {name: 'Descending'})).toBeInTheDocument();
expect(sorts).toEqual([{field: 'span.op', kind: 'desc'}]);
// check the kind options
await userEvent.click(within(section).getByRole('button', {name: 'Descending'}));
const kindOptions = await within(section).findAllByRole('option');
expect(kindOptions).toHaveLength(2);
expect(kindOptions[0]).toHaveTextContent('Descending');
expect(kindOptions[1]).toHaveTextContent('Ascending');
// try changing the kind
await userEvent.click(within(section).getByRole('option', {name: 'Ascending'}));
expect(within(section).getByRole('button', {name: 'span.op'})).toBeInTheDocument();
expect(within(section).getByRole('button', {name: 'Ascending'})).toBeInTheDocument();
expect(sorts).toEqual([{field: 'span.op', kind: 'asc'}]);
});
});