import {GroupFixture} from 'sentry-fixture/group';
import {OrganizationFixture} from 'sentry-fixture/organization';
import {ProjectFixture} from 'sentry-fixture/project';
import {TeamFixture} from 'sentry-fixture/team';
import {initializeOrg} from 'sentry-test/initializeOrg';
import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary';
import {IssueCategory, PriorityLevel} from 'sentry/types/group';
import GroupHeader from 'sentry/views/issueDetails/header';
import {ReprocessingStatus} from 'sentry/views/issueDetails/utils';
describe('GroupHeader', () => {
const baseUrl = 'BASE_URL/';
const organization = OrganizationFixture();
const {router} = initializeOrg();
const project = ProjectFixture({
teams: [TeamFixture()],
});
describe('issue category: error, js project', () => {
const defaultProps = {
organization,
baseUrl,
group: GroupFixture({issueCategory: IssueCategory.ERROR}),
groupReprocessingStatus: ReprocessingStatus.NO_STATUS,
project,
event: null,
};
it('displays the correct tabs with all features enabled', async () => {
const orgWithFeatures = OrganizationFixture({
features: ['similarity-view', 'event-attachments', 'session-replay'],
});
const jsProjectWithSimilarityView = ProjectFixture({
features: ['similarity-view'],
platform: 'javascript',
});
const MOCK_GROUP = GroupFixture();
MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/replay-count/`,
method: 'GET',
body: {
[MOCK_GROUP.id]: ['replay42', 'replay256'],
},
});
render(
,
{organization: orgWithFeatures, router}
);
await userEvent.click(screen.getByRole('tab', {name: /details/i}));
expect(router.push).toHaveBeenLastCalledWith(
expect.objectContaining({pathname: 'BASE_URL/'})
);
await userEvent.click(screen.getByRole('tab', {name: /activity/i}));
expect(router.push).toHaveBeenCalledWith({
pathname: 'BASE_URL/activity/',
query: {},
});
await userEvent.click(screen.getByRole('tab', {name: /user feedback/i}));
expect(router.push).toHaveBeenCalledWith({
pathname: 'BASE_URL/feedback/',
query: {},
});
await userEvent.click(screen.getByRole('tab', {name: /attachments/i}));
expect(router.push).toHaveBeenCalledWith({
pathname: 'BASE_URL/attachments/',
query: {},
});
await userEvent.click(screen.getByRole('tab', {name: /tags/i}));
expect(router.push).toHaveBeenCalledWith({
pathname: 'BASE_URL/tags/',
query: {},
});
await userEvent.click(screen.getByRole('tab', {name: /all events/i}));
expect(router.push).toHaveBeenCalledWith({
pathname: 'BASE_URL/events/',
query: {},
});
await userEvent.click(screen.getByRole('tab', {name: /merged issues/i}));
expect(router.push).toHaveBeenCalledWith({
pathname: 'BASE_URL/merged/',
query: {},
});
await userEvent.click(screen.getByRole('tab', {name: /replays/i}));
expect(router.push).toHaveBeenCalledWith({
pathname: 'BASE_URL/replays/',
query: {},
});
expect(screen.queryByRole('tab', {name: /replays/i})).toBeInTheDocument();
});
});
describe('issue category: error, mobile project', () => {
const defaultProps = {
organization,
baseUrl,
group: GroupFixture({issueCategory: IssueCategory.ERROR}),
groupReprocessingStatus: ReprocessingStatus.NO_STATUS,
project,
event: null,
};
it('displays the correct tabs with all features enabled', async () => {
const orgWithFeatures = OrganizationFixture({
features: ['similarity-view', 'event-attachments', 'session-replay'],
});
const mobileProjectWithSimilarityView = ProjectFixture({
features: ['similarity-view'],
platform: 'unity',
});
const MOCK_GROUP = GroupFixture();
MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/replay-count/`,
method: 'GET',
body: {
[MOCK_GROUP.id]: ['replay42', 'replay256'],
},
});
render(
,
{organization: orgWithFeatures, router}
);
await userEvent.click(screen.getByRole('tab', {name: /similar issues/i}));
expect(router.push).toHaveBeenCalledWith({
pathname: 'BASE_URL/similar/',
query: {},
});
expect(screen.queryByRole('tab', {name: /replays/i})).not.toBeInTheDocument();
});
});
describe('issue category: performance', () => {
const defaultProps = {
organization,
baseUrl,
group: GroupFixture({issueCategory: IssueCategory.PERFORMANCE}),
groupReprocessingStatus: ReprocessingStatus.NO_STATUS,
project,
event: null,
};
it('displays the correct tabs with all features enabled', async () => {
const orgWithFeatures = OrganizationFixture({
features: ['similarity-view', 'event-attachments', 'session-replay'],
});
const projectWithSimilarityView = ProjectFixture({
features: ['similarity-view'],
});
const MOCK_GROUP = GroupFixture({issueCategory: IssueCategory.PERFORMANCE});
MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/replay-count/`,
method: 'GET',
body: {
[MOCK_GROUP.id]: ['replay42', 'replay256'],
},
});
render(
,
{organization: orgWithFeatures, router}
);
await userEvent.click(screen.getByRole('tab', {name: /details/i}));
expect(router.push).toHaveBeenLastCalledWith(
expect.objectContaining({pathname: 'BASE_URL/'})
);
await userEvent.click(screen.getByRole('tab', {name: /tags/i}));
expect(router.push).toHaveBeenCalledWith({
pathname: 'BASE_URL/tags/',
query: {},
});
await userEvent.click(screen.getByRole('tab', {name: /sampled events/i}));
expect(router.push).toHaveBeenCalledWith({
pathname: 'BASE_URL/events/',
query: {},
});
expect(screen.queryByRole('tab', {name: /user feedback/i})).not.toBeInTheDocument();
expect(screen.queryByRole('tab', {name: /attachments/i})).not.toBeInTheDocument();
expect(screen.queryByRole('tab', {name: /merged issues/i})).not.toBeInTheDocument();
expect(
screen.queryByRole('tab', {name: /similar issues/i})
).not.toBeInTheDocument();
expect(screen.queryByRole('tab', {name: /replays/i})).not.toBeInTheDocument();
});
});
describe('priority', () => {
beforeEach(() => {
MockApiClient.addMockResponse({
url: '/organizations/org-slug/prompts-activity/',
body: {data: {dismissed_ts: null}},
});
MockApiClient.addMockResponse({
url: '/organizations/org-slug/replay-count/',
body: {},
});
});
it('shows priority even if stats is off', async () => {
render(
);
expect(await screen.findByText('Priority')).toBeInTheDocument();
expect(await screen.findByText('High')).toBeInTheDocument();
});
it('can change priority', async () => {
const mockModifyIssue = MockApiClient.addMockResponse({
url: `/organizations/org-slug/issues/`,
method: 'PUT',
body: {},
});
render(
);
await userEvent.click(screen.getByRole('button', {name: 'Modify issue priority'}));
await userEvent.click(screen.getByRole('menuitemradio', {name: 'High'}));
expect(mockModifyIssue).toHaveBeenCalledWith(
expect.anything(),
expect.objectContaining({
data: {priority: PriorityLevel.HIGH},
})
);
});
});
});