import {EventFixture} from 'sentry-fixture/event'; import {EventAttachmentFixture} from 'sentry-fixture/eventAttachment'; import {OrganizationFixture} from 'sentry-fixture/organization'; import {ProjectFixture} from 'sentry-fixture/project'; import {render, screen} from 'sentry-test/reactTestingLibrary'; import {EventViewHierarchy} from './eventViewHierarchy'; // Mocks for useVirtualizedTree hook class ResizeObserver { observe() {} unobserve() {} disconnect() {} } window.ResizeObserver = ResizeObserver; window.Element.prototype.scrollTo = jest.fn(); const DEFAULT_VALUES = {alpha: 1, height: 1, width: 1, x: 1, y: 1, visible: true}; const MOCK_DATA = JSON.stringify({ rendering_system: 'test-rendering-system', windows: [ { ...DEFAULT_VALUES, id: 'parent', type: 'Container', identifier: 'test_identifier', x: 200, children: [ { ...DEFAULT_VALUES, id: 'intermediate', type: 'Nested Container', identifier: 'nested', children: [ { ...DEFAULT_VALUES, id: 'leaf', type: 'Text', children: [], }, ], }, ], }, ], }); const organization = OrganizationFixture({ features: ['event-attachments'], }); const event = EventFixture(); describe('Event View Hierarchy', function () { let mockAttachment; let mockProject; beforeEach(function () { mockAttachment = EventAttachmentFixture({type: 'event.view_hierarchy'}); mockProject = ProjectFixture(); MockApiClient.addMockResponse({ url: `/projects/${organization.slug}/${mockProject.slug}/events/${event.id}/attachments/`, body: [mockAttachment], }); MockApiClient.addMockResponse({ url: `/projects/${organization.slug}/${mockProject.slug}/events/${mockAttachment.event_id}/attachments/${mockAttachment.id}/?download`, body: MOCK_DATA, }); }); it('renders nothing when no view_hierarchy attachments', async () => { MockApiClient.clearMockResponses(); MockApiClient.addMockResponse({ url: `/projects/org-slug/${mockProject.slug}/events/${event.id}/attachments/`, body: [EventAttachmentFixture()], }); const {container} = render( , { organization, } ); // No loading state so nothing to wait for await tick(); expect(container).toBeEmptyDOMElement(); }); it('does not collapse all nodes when update triggers re-render', async function () { const {rerender} = render( , { organization, } ); expect(await screen.findByText('Nested Container - nested')).toBeInTheDocument(); rerender(); expect(await screen.findByText('Nested Container - nested')).toBeInTheDocument(); }); });