import {mountWithTheme} from 'sentry-test/enzyme';
import {initializeOrg} from 'sentry-test/initializeOrg';
import {act} from 'sentry-test/reactTestingLibrary';
import ProjectsStore from 'sentry/stores/projectsStore';
import EventView from 'sentry/utils/discover/eventView';
import {ALL_VIEWS, DEFAULT_EVENT_VIEW} from 'sentry/views/eventsV2/data';
import EventDetails from 'sentry/views/eventsV2/eventDetails';
import {OrganizationContext} from 'sentry/views/organizationContext';
const WrappedEventDetails = ({organization, ...rest}) => {
return (
);
};
describe('EventsV2 > EventDetails', function () {
const allEventsView = EventView.fromSavedQuery(DEFAULT_EVENT_VIEW);
const errorsView = EventView.fromSavedQuery(
ALL_VIEWS.find(view => view.name === 'Errors by Title')
);
beforeEach(function () {
act(() => ProjectsStore.loadInitialData([TestStubs.Project()]));
MockApiClient.addMockResponse({
url: '/organizations/org-slug/projects/',
body: [],
});
MockApiClient.addMockResponse({
url: '/organizations/org-slug/discover/',
body: {
meta: {
id: 'string',
title: 'string',
'project.name': 'string',
timestamp: 'date',
},
data: [
{
id: 'deadbeef',
title: 'Oh no something bad',
'project.name': 'project-slug',
timestamp: '2019-05-23T22:12:48+00:00',
},
],
},
});
MockApiClient.addMockResponse({
url: '/organizations/org-slug/events/project-slug:deadbeef/',
method: 'GET',
body: {
id: '1234',
size: 1200,
projectSlug: 'project-slug',
eventID: 'deadbeef',
groupID: '123',
title: 'Oh no something bad',
location: '/users/login',
message: 'It was not good',
dateCreated: '2019-05-23T22:12:48+00:00',
entries: [
{
type: 'message',
message: 'bad stuff',
data: {},
},
],
tags: [
{key: 'browser', value: 'Firefox'},
{key: 'device.uuid', value: 'test-uuid'},
{key: 'release', value: '82ebf297206a'},
],
},
});
MockApiClient.addMockResponse({
url: '/issues/123/',
method: 'GET',
body: TestStubs.Group({id: '123'}),
});
MockApiClient.addMockResponse({
url: '/organizations/org-slug/events-stats/',
method: 'GET',
body: {
data: [
[1234561700, [1]],
[1234561800, [1]],
],
},
});
MockApiClient.addMockResponse({
url: '/projects/org-slug/project-slug/events/1234/committers/',
method: 'GET',
statusCode: 404,
body: {},
});
MockApiClient.addMockResponse({
url: '/projects/org-slug/project-slug/events/1234/grouping-info/',
body: {},
});
// Missing event
MockApiClient.addMockResponse({
url: '/organizations/org-slug/events/project-slug:abad1/',
method: 'GET',
statusCode: 404,
body: {},
});
});
it('renders', function () {
const wrapper = mountWithTheme(
);
const content = wrapper.find('EventHeader');
expect(content.text()).toContain('Oh no something bad');
});
it('renders a 404', function () {
const wrapper = mountWithTheme(
);
const content = wrapper.find('NotFound');
expect(content).toHaveLength(1);
});
it('renders a chart in grouped view', async function () {
const wrapper = mountWithTheme(
);
// loading state
await tick();
wrapper.update();
const content = wrapper.find('EventHeader');
expect(content.text()).toContain('Oh no something bad');
});
it('renders an alert when linked issues are missing', function () {
MockApiClient.addMockResponse({
url: '/issues/123/',
statusCode: 404,
method: 'GET',
body: {},
});
const wrapper = mountWithTheme(
);
const alert = wrapper.find('Alert');
expect(alert).toHaveLength(1);
expect(alert.text()).toContain('linked issue cannot be found');
});
it('navigates when tag values are clicked', async function () {
const {organization, routerContext} = initializeOrg({
organization: TestStubs.Organization(),
router: {
location: {
pathname: '/organizations/org-slug/discover/project-slug:deadbeef',
query: {},
},
},
});
const wrapper = mountWithTheme(
,
routerContext
);
await tick();
wrapper.update();
// Get the first link as we wrap react-router's link
const browserTagLink = wrapper
.find('WrappedEventDetails KeyValueTable Value Link')
.first();
// Should append tag value and other event attributes to results view query.
const browserTagTarget = browserTagLink.props().to;
expect(browserTagTarget.pathname).toEqual(
'/organizations/org-slug/discover/results/'
);
expect(browserTagTarget.query.query).toEqual(
'browser:Firefox title:"Oh no something bad"'
);
// Get the second link
const deviceUUIDTagLink = wrapper
.find('WrappedEventDetails KeyValueTable Value Link')
.at(2);
// Should append tag value wrapped with tags[] as device.uuid is part of our fields
const deviceUUIDTagTarget = deviceUUIDTagLink.props().to;
expect(deviceUUIDTagTarget.pathname).toEqual(
'/organizations/org-slug/discover/results/'
);
expect(deviceUUIDTagTarget.query.query).toEqual(
'tags[device.uuid]:test-uuid title:"Oh no something bad"'
);
// Get the third link
const releaseTagLink = wrapper
.find('WrappedEventDetails KeyValueTable Value Link')
.at(4);
// Should append raw tag value without tags[] as release is exempt from being wrapped
const releaseTagTarget = releaseTagLink.props().to;
expect(releaseTagTarget.pathname).toEqual(
'/organizations/org-slug/discover/results/'
);
expect(releaseTagTarget.query.query).toEqual(
'release:82ebf297206a title:"Oh no something bad"'
);
});
it('appends tag value to existing query when clicked', async function () {
const {organization, routerContext} = initializeOrg({
organization: TestStubs.Organization(),
router: {
location: {
pathname: '/organizations/org-slug/discover/project-slug:deadbeef',
query: {},
},
},
});
const wrapper = mountWithTheme(
,
routerContext
);
await tick();
wrapper.update();
// Get the first link as we wrap react-router's link
const browserTagLink = wrapper
.find('WrappedEventDetails KeyValueTable Value Link')
.first();
// Should append tag value and other event attributes to results view query.
const browserTagTarget = browserTagLink.props().to;
expect(browserTagTarget.pathname).toEqual(
'/organizations/org-slug/discover/results/'
);
expect(browserTagTarget.query.query).toEqual(
'Dumpster browser:Firefox title:"Oh no something bad"'
);
// Get the second link
const deviceUUIDTagLink = wrapper
.find('WrappedEventDetails KeyValueTable Value Link')
.at(2);
// Should append tag value wrapped with tags[] as device.uuid is part of our fields
const deviceUUIDTagTarget = deviceUUIDTagLink.props().to;
expect(deviceUUIDTagTarget.pathname).toEqual(
'/organizations/org-slug/discover/results/'
);
expect(deviceUUIDTagTarget.query.query).toEqual(
'Dumpster tags[device.uuid]:test-uuid title:"Oh no something bad"'
);
// Get the third link
const releaseTagLink = wrapper
.find('WrappedEventDetails KeyValueTable Value Link')
.at(4);
// Should append raw tag value without tags[] as release is exempt from being wrapped
const releaseTagTarget = releaseTagLink.props().to;
expect(releaseTagTarget.pathname).toEqual(
'/organizations/org-slug/discover/results/'
);
expect(releaseTagTarget.query.query).toEqual(
'Dumpster release:82ebf297206a title:"Oh no something bad"'
);
});
});