import {GroupFixture} from 'sentry-fixture/group';
import {ProjectFixture} from 'sentry-fixture/project';
import {initializeOrg} from 'sentry-test/initializeOrg';
import {act, render, screen, userEvent, within} from 'sentry-test/reactTestingLibrary';
import StreamGroup from 'sentry/components/stream/group';
import GroupStore from 'sentry/stores/groupStore';
import GuideStore from 'sentry/stores/guideStore';
import {EventOrGroupType} from 'sentry/types/event';
import type {Group, GroupStatusResolution, MarkReviewed} from 'sentry/types/group';
import {GroupStatus, PriorityLevel} from 'sentry/types/group';
import {trackAnalytics} from 'sentry/utils/analytics';
jest.mock('sentry/utils/analytics');
describe('StreamGroup', function () {
let group1!: Group;
beforeEach(function () {
group1 = GroupFixture({
id: '1337',
project: ProjectFixture({
id: '13',
slug: 'foo-project',
}),
type: EventOrGroupType.ERROR,
inbox: {
date_added: '2020-11-24T13:17:42.248751Z',
reason: 0,
reason_details: null,
},
});
MockApiClient.addMockResponse({
url: '/organizations/org-slug/projects/',
body: [ProjectFixture({slug: 'foo-project'})],
});
GroupStore.loadInitialData([group1]);
});
afterEach(function () {
jest.mocked(trackAnalytics).mockClear();
GroupStore.reset();
});
it('renders with anchors', async function () {
const {router, organization} = initializeOrg();
render(, {
router,
organization,
});
expect(await screen.findByTestId('group')).toBeInTheDocument();
expect(GuideStore.state.anchors).toEqual(new Set(['dynamic_counts', 'issue_stream']));
});
it('marks as reviewed', async function () {
const {router, organization} = initializeOrg();
render(
,
{router, organization}
);
expect(await screen.findByTestId('group')).toHaveAttribute(
'data-test-reviewed',
'false'
);
const data: MarkReviewed = {inbox: false};
act(() => GroupStore.onUpdate('1337', undefined, data));
act(() => GroupStore.onUpdateSuccess('1337', undefined, data));
// Reviewed only applies styles, difficult to select with RTL
expect(screen.getByTestId('group')).toHaveAttribute('data-test-reviewed', 'true');
});
it('marks as resolved', async function () {
const {router, organization} = initializeOrg();
render(, {
router,
organization,
});
expect(await screen.findByTestId('group')).toBeInTheDocument();
expect(screen.queryByTestId('resolved-issue')).not.toBeInTheDocument();
const data: GroupStatusResolution = {
status: GroupStatus.RESOLVED,
statusDetails: {},
};
act(() => GroupStore.onUpdate('1337', undefined, data));
act(() => GroupStore.onUpdateSuccess('1337', undefined, data));
expect(screen.getByTestId('resolved-issue')).toBeInTheDocument();
});
it('can change priority', async function () {
MockApiClient.addMockResponse({
url: '/organizations/org-slug/prompts-activity/',
body: {data: {dismissed_ts: null}},
});
const mockModifyGroup = MockApiClient.addMockResponse({
url: '/organizations/org-slug/issues/',
method: 'PUT',
body: {priority: PriorityLevel.HIGH},
});
render();
const priorityDropdown = screen.getByRole('button', {name: 'Modify issue priority'});
expect(within(priorityDropdown).getByText('Med')).toBeInTheDocument();
await userEvent.click(priorityDropdown);
await userEvent.click(screen.getByRole('menuitemradio', {name: 'High'}));
expect(within(priorityDropdown).getByText('High')).toBeInTheDocument();
expect(mockModifyGroup).toHaveBeenCalledWith(
'/organizations/org-slug/issues/',
expect.objectContaining({
data: expect.objectContaining({
priority: 'high',
}),
})
);
});
it('tracks clicks from issues stream', async function () {
const {router, organization} = initializeOrg();
render(
,
{router, organization}
);
// skipHover - Prevent stacktrace preview from being rendered
await userEvent.click(screen.getByText('RequestError'), {skipHover: true});
});
it('can select row', async function () {
const {router, organization} = initializeOrg();
render(, {router, organization});
expect(await screen.findByTestId('group')).toBeInTheDocument();
const checkbox = screen.getByRole('checkbox', {name: 'Select Issue'});
expect(checkbox).not.toBeChecked();
await userEvent.click(checkbox);
expect(checkbox).toBeChecked();
await userEvent.click(checkbox);
expect(checkbox).not.toBeChecked();
});
it('does not error when group is not in GroupStore', function () {
const {router, organization} = initializeOrg();
GroupStore.reset();
const {container} = render(
,
{router, organization}
);
expect(container).toBeEmptyDOMElement();
});
});