import React from 'react'; import {mount} from 'enzyme'; import {initializeOrg} from 'app-test/helpers/initializeOrg'; import {browserHistory} from 'react-router'; import EventDetails from 'app/views/eventsV2/eventDetails'; import {ALL_VIEWS, DEFAULT_EVENT_VIEW_V1} from 'app/views/eventsV2/data'; import EventView from 'app/views/eventsV2/eventView'; describe('EventsV2 > EventDetails', function() { const allEventsView = EventView.fromEventViewv1(DEFAULT_EVENT_VIEW_V1); const errorsView = EventView.fromEventViewv1( ALL_VIEWS.find(view => view.name === 'Errors') ); beforeEach(function() { MockApiClient.addMockResponse({ url: '/organizations/org-slug/eventsv2/', 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'}], }, }); 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]]], }, }); // Missing event MockApiClient.addMockResponse({ url: '/organizations/org-slug/events/project-slug:abad1/', method: 'GET', statusCode: 404, body: {}, }); // Error event MockApiClient.addMockResponse( { url: '/organizations/org-slug/events/latest/', method: 'GET', body: { id: '5678', size: 1200, projectSlug: 'project-slug', eventID: 'deadbeef', groupID: '123', type: 'error', title: 'Oh no something bad', message: 'It was not good', dateCreated: '2019-05-23T22:12:48+00:00', previousEventID: 'beefbeef', metadata: { type: 'Oh no something bad', }, entries: [ { type: 'message', message: 'bad stuff', data: {}, }, ], tags: [{key: 'browser', value: 'Firefox'}], }, }, { predicate: (_, options) => { const query = options.query.query; return ( query && (query.includes('event.type:error') || query.includes('issue.id')) ); }, } ); // Transaction event MockApiClient.addMockResponse( { url: '/organizations/org-slug/events/latest/', method: 'GET', body: { id: '5678', size: 1200, projectSlug: 'project-slug', eventID: 'deadbeef', type: 'transaction', title: 'Oh no something bad', location: '/users/login', message: 'It was not good', startTimestamp: 1564153693.2419, endTimestamp: 1564153694.4191, previousEventID: 'beefbeef', entries: [ { type: 'spans', data: [], }, ], tags: [{key: 'browser', value: 'Firefox'}], }, }, { predicate: (_, options) => { return options.query.query && options.query.query.includes('transaction'); }, } ); }); it('renders', function() { const wrapper = mount( , TestStubs.routerContext() ); const content = wrapper.find('EventHeader'); expect(content.text()).toContain('Oh no something bad'); const graph = wrapper.find('ModalLineGraph'); expect(graph).toHaveLength(0); }); it('renders a 404', function() { const wrapper = mount( , TestStubs.routerContext() ); const content = wrapper.find('NotFound'); expect(content).toHaveLength(1); }); it('renders a chart in grouped view', function() { const wrapper = mount( , TestStubs.routerContext() ); const content = wrapper.find('EventHeader'); expect(content.text()).toContain('Oh no something bad'); const graph = wrapper.find('ModalLineGraph'); expect(graph).toHaveLength(1); }); it('removes eventSlug when close button is clicked', function() { const wrapper = mount( , TestStubs.routerContext() ); const button = wrapper.find('DismissButton'); button.simulate('click'); expect(browserHistory.push).toHaveBeenCalledWith({ pathname: '/organizations/org-slug/events/', query: {}, }); }); it('navigates when tag values are clicked', async function() { const {organization, routerContext} = initializeOrg({ organization: TestStubs.Organization({projects: [TestStubs.Project()]}), router: { location: { pathname: '/organizations/org-slug/events/', query: { eventSlug: 'project-slug:deadbeef', }, }, }, }); const wrapper = mount( , routerContext ); await tick(); await wrapper.update(); // Get the first link as we wrap react-router's link const tagLink = wrapper.find('EventDetails TagsTable TagValue Link').first(); // Should remove eventSlug and append new tag value causing // the view to re-render expect(tagLink.props().to).toEqual({ pathname: '/organizations/org-slug/events/', query: {query: 'browser:"Firefox"'}, }); }); it('appends tag value to existing query when clicked', async function() { const {organization, routerContext} = initializeOrg({ organization: TestStubs.Organization({projects: [TestStubs.Project()]}), router: { location: { pathname: '/organizations/org-slug/events/', query: { query: 'Dumpster', eventSlug: 'project-slug:deadbeef', }, }, }, }); const wrapper = mount( , routerContext ); await tick(); await wrapper.update(); // Get the first link as we wrap react-router's link const tagLink = wrapper.find('EventDetails TagsTable TagValue Link').first(); // Should remove eventSlug and append new tag value causing // the view to re-render expect(tagLink.props().to).toEqual({ pathname: '/organizations/org-slug/events/', query: {query: 'Dumpster browser:"Firefox"'}, }); }); });