Files
2024-02-15 17:01:50 +00:00

253 lines
6.5 KiB
TypeScript

import {browserHistory} from 'react-router';
import type {Location} from 'history';
import {LocationFixture} from 'sentry-fixture/locationFixture';
import {OrganizationFixture} from 'sentry-fixture/organization';
import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary';
import type {EventData} from 'sentry/utils/discover/eventView';
import EventView from 'sentry/utils/discover/eventView';
import ActionDropDown, {ContextValueType} from './actionDropdown';
const dataRow: EventData = {
id: '6b43e285de834ec5b5fe30d62d549b20',
issue: 'SENTRY-VVY',
release: '[email protected]+aaf33944f93dc8fa4234ca046a8d88fb1dccfb76',
'issue.id': 3512441874,
'project.name': 'sentry',
};
const mockEventView = EventView.fromSavedQuery({
id: '',
name: 'test query',
version: 2,
fields: ['title', 'issue'],
query: 'event.type:error',
projects: [1],
});
const mockedLocation = LocationFixture({
query: {
field: 'title',
},
});
const renderActionDropdown = (
location: Location,
eventView: EventView,
queryKey: string,
value: React.ReactText | string[],
contextValueType: ContextValueType
) => {
const organization = OrganizationFixture();
render(
<ActionDropDown
dataRow={dataRow}
organization={organization}
location={location}
eventView={eventView}
queryKey={queryKey}
value={value}
contextValueType={contextValueType}
/>,
{organization}
);
};
describe('Quick Context Actions', function () {
afterEach(() => {
MockApiClient.clearMockResponses();
});
it('Renders correct options for string context value', async () => {
renderActionDropdown(
mockedLocation,
mockEventView,
'title',
'Undefined: Error',
ContextValueType.STRING
);
const trigger = await screen.findByTestId('quick-context-action-trigger');
expect(trigger).toBeInTheDocument();
await userEvent.click(trigger);
const menuOptions = await screen.findAllByRole('menuitemradio');
expect(menuOptions.map(e => e.textContent)).toEqual([
'Add as column',
'Add to filter',
'Exclude from filter',
]);
});
it('Renders correct options for non-string context value', async () => {
renderActionDropdown(
mockedLocation,
mockEventView,
'transaction.duration',
'14.00ms',
ContextValueType.DURATION
);
const trigger = await screen.findByTestId('quick-context-action-trigger');
expect(trigger).toBeInTheDocument();
await userEvent.click(trigger);
const menuOptions = await screen.findAllByRole('menuitemradio');
expect(menuOptions.map(e => e.textContent)).toEqual([
'Add as column',
'Show values greater than',
'Show values less than',
]);
});
it('Adds context as column', async () => {
renderActionDropdown(
mockedLocation,
mockEventView,
'transaction.duration',
'14.00ms',
ContextValueType.DURATION
);
const trigger = await screen.findByTestId('quick-context-action-trigger');
expect(trigger).toBeInTheDocument();
await userEvent.click(trigger);
const addAsColumn = await screen.findByRole('menuitemradio', {name: 'Add as column'});
await userEvent.click(addAsColumn);
expect(browserHistory.push).toHaveBeenCalledWith(
expect.objectContaining({
pathname: '/mock-pathname/',
query: expect.objectContaining({
field: ['title', 'issue', 'transaction.duration'],
}),
})
);
});
it('Adds context to filter', async () => {
renderActionDropdown(
mockedLocation,
mockEventView,
'title',
'Undefined: Error',
ContextValueType.STRING
);
const trigger = await screen.findByTestId('quick-context-action-trigger');
expect(trigger).toBeInTheDocument();
await userEvent.click(trigger);
const addToFilter = await screen.findByRole('menuitemradio', {name: 'Add to filter'});
await userEvent.click(addToFilter);
expect(browserHistory.push).toHaveBeenCalledWith(
expect.objectContaining({
pathname: '/mock-pathname/',
query: expect.objectContaining({
query: 'event.type:error title:"Undefined: Error"',
}),
})
);
});
it('Excludes context from filter', async () => {
renderActionDropdown(
mockedLocation,
mockEventView,
'title',
'Undefined: Error',
ContextValueType.STRING
);
const trigger = await screen.findByTestId('quick-context-action-trigger');
expect(trigger).toBeInTheDocument();
await userEvent.click(trigger);
const addToFilter = await screen.findByRole('menuitemradio', {
name: 'Exclude from filter',
});
await userEvent.click(addToFilter);
expect(browserHistory.push).toHaveBeenCalledWith(
expect.objectContaining({
pathname: '/mock-pathname/',
query: expect.objectContaining({
query: 'event.type:error !title:"Undefined: Error"',
}),
})
);
});
it('Filters by values greater than', async () => {
renderActionDropdown(
mockedLocation,
mockEventView,
'transaction.duration',
'14.00ms',
ContextValueType.DURATION
);
const trigger = await screen.findByTestId('quick-context-action-trigger');
expect(trigger).toBeInTheDocument();
await userEvent.click(trigger);
const showGreaterThanBtn = await screen.findByRole('menuitemradio', {
name: 'Show values greater than',
});
await userEvent.click(showGreaterThanBtn);
expect(browserHistory.push).toHaveBeenCalledWith(
expect.objectContaining({
pathname: '/mock-pathname/',
query: expect.objectContaining({
query: 'event.type:error transaction.duration:>14.00ms',
}),
})
);
});
it('Filters by values less than', async () => {
renderActionDropdown(
mockedLocation,
mockEventView,
'transaction.duration',
'14.00ms',
ContextValueType.DURATION
);
const trigger = await screen.findByTestId('quick-context-action-trigger');
expect(trigger).toBeInTheDocument();
await userEvent.click(trigger);
const showLessThanBtn = await screen.findByRole('menuitemradio', {
name: 'Show values less than',
});
await userEvent.click(showLessThanBtn);
expect(browserHistory.push).toHaveBeenCalledWith(
expect.objectContaining({
pathname: '/mock-pathname/',
query: expect.objectContaining({
query: 'event.type:error transaction.duration:<14.00ms',
}),
})
);
});
});