import {browserHistory} from 'react-router';
import {mountWithTheme} from 'sentry-test/enzyme';
import QueryList from 'app/views/eventsV2/queryList';
function openContextMenu(card) {
card.find('DropdownMenu MoreOptions svg').simulate('click');
}
function clickMenuItem(card, selector) {
card.find(`DropdownMenu MenuItem[data-test-id="${selector}"]`).simulate('click');
}
describe('EventsV2 > QueryList', function () {
let location, savedQueries, organization, deleteMock, duplicateMock, queryChangeMock;
beforeEach(function () {
organization = TestStubs.Organization();
savedQueries = [
TestStubs.DiscoverSavedQuery(),
TestStubs.DiscoverSavedQuery({name: 'saved query 2', id: '2'}),
];
MockApiClient.addMockResponse({
url: '/organizations/org-slug/events-stats/',
method: 'GET',
statusCode: 200,
body: {data: []},
});
deleteMock = MockApiClient.addMockResponse({
url: '/organizations/org-slug/discover/saved/2/',
method: 'DELETE',
statusCode: 200,
body: {},
});
duplicateMock = MockApiClient.addMockResponse({
url: '/organizations/org-slug/discover/saved/',
method: 'POST',
body: {
id: '3',
name: 'Saved query copy',
},
});
location = {
pathname: '/organizations/org-slug/discover/queries/',
query: {cursor: '0:1:1', statsPeriod: '14d'},
};
queryChangeMock = jest.fn();
});
it('renders an empty list', function () {
const wrapper = mountWithTheme(
,
TestStubs.routerContext()
);
const content = wrapper.find('QueryCard');
// No queries
expect(content).toHaveLength(0);
expect(wrapper.find('EmptyStateWarning')).toHaveLength(1);
});
it('renders pre-built queries and saved ones', function () {
const wrapper = mountWithTheme(
,
TestStubs.routerContext()
);
const content = wrapper.find('QueryCard');
// pre built + saved queries
expect(content).toHaveLength(5);
});
it('can duplicate and trigger change callback', async function () {
const wrapper = mountWithTheme(
,
TestStubs.routerContext()
);
let card = wrapper.find('QueryCard').last();
expect(card.find('QueryCardContent').text()).toEqual(savedQueries[1].name);
openContextMenu(card);
wrapper.update();
// Get a fresh node
card = wrapper.find('QueryCard').last();
clickMenuItem(card, 'duplicate-query');
// wait for request
await wrapper.update();
expect(duplicateMock).toHaveBeenCalled();
expect(queryChangeMock).toHaveBeenCalled();
});
it('can delete and trigger change callback', async function () {
const wrapper = mountWithTheme(
,
TestStubs.routerContext()
);
let card = wrapper.find('QueryCard').last();
expect(card.find('QueryCardContent').text()).toEqual(savedQueries[1].name);
openContextMenu(card);
wrapper.update();
card = wrapper.find('QueryCard').last();
clickMenuItem(card, 'delete-query');
// wait for request
await wrapper.update();
expect(deleteMock).toHaveBeenCalled();
expect(queryChangeMock).toHaveBeenCalled();
});
it('returns short url location for saved query', async function () {
const wrapper = mountWithTheme(
,
TestStubs.routerContext()
);
const card = wrapper.find('QueryCard').last();
const link = card.find('Link').last().prop('to');
expect(link.pathname).toEqual('/organizations/org-slug/discover/results/');
expect(link.query).toEqual({
id: '2',
statsPeriod: '14d',
user: '1',
});
});
it('can redirect on last query deletion', async function () {
const wrapper = mountWithTheme(
,
TestStubs.routerContext()
);
let card = wrapper.find('QueryCard').last();
expect(card.find('QueryCardContent').text()).toEqual(savedQueries[1].name);
// Open the context menu
openContextMenu(card);
wrapper.update();
card = wrapper.find('QueryCard').last();
clickMenuItem(card, 'delete-query');
// wait for request
await wrapper.update();
expect(deleteMock).toHaveBeenCalled();
expect(queryChangeMock).not.toHaveBeenCalled();
expect(browserHistory.push).toHaveBeenCalledWith({
pathname: location.pathname,
query: {cursor: undefined, statsPeriod: '14d'},
});
});
});