import {initializeOrg} from 'sentry-test/initializeOrg'; import {act, render, screen, userEvent} from 'sentry-test/reactTestingLibrary'; import GroupStore from 'sentry/stores/groupStore'; import MemberListStore from 'sentry/stores/memberListStore'; import ProjectsStore from 'sentry/stores/projectsStore'; import {getIssueFieldRenderer} from 'sentry/utils/dashboards/issueFieldRenderers'; describe('getIssueFieldRenderer', function () { let location, context, project, organization, data, user; beforeEach(function () { context = initializeOrg({ organization, router: {}, project: TestStubs.Project(), projects: [TestStubs.Project()], }); organization = context.organization; project = context.project; act(() => ProjectsStore.loadInitialData([project])); user = 'email:text@example.com'; location = { pathname: '/events', query: {}, }; data = { id: '1', team_key_transaction: 1, title: 'ValueError: something bad', transaction: 'api.do_things', boolValue: 1, numeric: 1.23, createdAt: new Date(2019, 9, 3, 12, 13, 14), url: '/example', project: project.slug, release: 'F2520C43515BD1F0E8A6BD46233324641A370BF6', user, 'span_ops_breakdown.relative': '', 'spans.browser': 10, 'spans.db': 30, 'spans.http': 15, 'spans.resource': 20, 'spans.total.time': 75, 'transaction.duration': 75, 'timestamp.to_day': '2021-09-05T00:00:00+00:00', lifetimeEvents: 10000, filteredEvents: 3000, events: 6000, period: '7d', links: ['ANNO-123'], }; MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/projects/${project.slug}/`, body: project, }); MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/key-transactions/`, method: 'POST', }); MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/key-transactions/`, method: 'DELETE', }); }); describe('Issue fields', () => { it('can render assignee', async function () { MemberListStore.loadInitialData([ TestStubs.User({ name: 'Test User', email: 'test@sentry.io', avatar: { avatarType: 'letter_avatar', avatarUuid: null, }, }), ]); const group = TestStubs.Group({project}); GroupStore.add([ { ...group, owners: [{owner: 'user:1', type: 'suspectCommit'}], assignedTo: { email: 'test@sentry.io', type: 'user', id: '1', name: 'Test User', }, }, ]); const renderer = getIssueFieldRenderer('assignee'); render( renderer!(data, { location, organization, }) as React.ReactElement ); expect(screen.getByText('TU')).toBeInTheDocument(); userEvent.hover(screen.getByText('TU')); expect(await screen.findByText('Assigned to')).toBeInTheDocument(); expect(screen.getByText('Test User')).toBeInTheDocument(); expect(screen.getByText('Based on')).toBeInTheDocument(); expect(screen.getByText('commit data')).toBeInTheDocument(); }); it('can render counts', async function () { const renderer = getIssueFieldRenderer('events'); render( renderer!(data, { location, organization, }) as React.ReactElement ); expect(screen.getByText('3k')).toBeInTheDocument(); expect(screen.getByText('6k')).toBeInTheDocument(); userEvent.hover(screen.getByText('3k')); expect(await screen.findByText('Total in last 7 days')).toBeInTheDocument(); expect(screen.getByText('Matching search filters')).toBeInTheDocument(); expect(screen.getByText('Since issue began')).toBeInTheDocument(); }); }); it('can render links', function () { const renderer = getIssueFieldRenderer('links'); render( renderer!(data, { location, organization, }) as React.ReactElement ); expect(screen.getByText('ANNO-123')).toBeInTheDocument(); }); it('can render multiple links', function () { const renderer = getIssueFieldRenderer('links'); render( renderer!( { data, ...{ links: [ 'ANNO-123', 'ANNO-456', ], }, }, { location, organization, } ) as React.ReactElement ); expect(screen.getByText('ANNO-123')).toBeInTheDocument(); expect(screen.getByText('ANNO-456')).toBeInTheDocument(); }); });