import {GroupFixture} from 'sentry-fixture/group';
import {LocationFixture} from 'sentry-fixture/locationFixture';
import {OrganizationFixture} from 'sentry-fixture/organization';
import {ProjectFixture} from 'sentry-fixture/project';
import {ReleaseFixture} from 'sentry-fixture/release';
import {TeamFixture} from 'sentry-fixture/team';
import {UserFixture} from 'sentry-fixture/user';
import {render, screen} from 'sentry-test/reactTestingLibrary';
import {textWithMarkupMatcher} from 'sentry-test/utils';
import type {TeamParticipant, UserParticipant} from 'sentry/types/group';
import {IssueCategory} from 'sentry/types/group';
import StreamlinedGroupHeader from 'sentry/views/issueDetails/streamline/header';
import {ReprocessingStatus} from 'sentry/views/issueDetails/utils';
describe('UpdatedGroupHeader', () => {
const baseUrl = 'BASE_URL/';
const organization = OrganizationFixture();
const project = ProjectFixture({
platform: 'javascript',
teams: [TeamFixture()],
});
const group = GroupFixture({issueCategory: IssueCategory.ERROR, isUnhandled: true});
const location = LocationFixture({query: {streamline: '1'}});
describe('JS Project Error Issue', () => {
const defaultProps = {
organization,
baseUrl,
groupReprocessingStatus: ReprocessingStatus.NO_STATUS,
project,
};
const firstRelease = ReleaseFixture({id: '1'});
const lastRelease = ReleaseFixture({id: '2'});
beforeEach(() => {
MockApiClient.addMockResponse({
url: '/organizations/org-slug/replay-count/',
body: {},
});
MockApiClient.addMockResponse({
url: `/organizations/org-slug/repos/`,
body: {},
});
MockApiClient.addMockResponse({
url: `/projects/org-slug/project-slug/releases/${encodeURIComponent(firstRelease.version)}/`,
body: {},
});
MockApiClient.addMockResponse({
url: `/organizations/org-slug/releases/${encodeURIComponent(firstRelease.version)}/deploys/`,
body: {},
});
});
it('shows all elements of header', async () => {
MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/issues/${group.id}/first-last-release/`,
method: 'GET',
body: {firstRelease, lastRelease},
});
const teams: TeamParticipant[] = [{...TeamFixture(), type: 'team'}];
const users: UserParticipant[] = [
{
...UserFixture({
id: '2',
name: 'John Smith',
email: 'johnsmith@example.com',
}),
type: 'user',
},
{
...UserFixture({
id: '3',
name: 'Sohn Jmith',
email: 'sohnjmith@example.com',
}),
type: 'user',
},
];
const participantGroup = {
...group,
participants: [...teams, ...users],
seenBy: users,
};
render(
,
{
organization,
router: {location},
}
);
expect(screen.getByText('RequestError')).toBeInTheDocument();
expect(screen.getByText('Warning')).toBeInTheDocument();
expect(screen.getByText('Unhandled')).toBeInTheDocument();
expect(
await screen.findByText(textWithMarkupMatcher('Releases'))
).toBeInTheDocument();
expect(
screen.getByRole('button', {name: 'Modify issue priority'})
).toBeInTheDocument();
expect(
screen.getByRole('button', {name: 'Modify issue assignee'})
).toBeInTheDocument();
expect(screen.getByText('Participants')).toBeInTheDocument();
expect(screen.getByText('Viewers')).toBeInTheDocument();
expect(
screen.queryByRole('button', {name: 'Switch to the old issue experience'})
).not.toBeInTheDocument();
expect(screen.getByRole('button', {name: 'Resolve'})).toBeInTheDocument();
expect(screen.getByRole('button', {name: 'Archive'})).toBeInTheDocument();
});
it('only shows one release if possible', async function () {
MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/issues/${group.id}/first-last-release/`,
method: 'GET',
// First and last release match
body: {firstRelease, lastRelease: firstRelease},
});
render(
,
{
organization,
router: {location},
}
);
expect(
await screen.findByText(textWithMarkupMatcher('Release'))
).toBeInTheDocument();
});
it('displays new experience button if flag is set', async () => {
MockApiClient.addMockResponse({
url: `/organizations/${organization.slug}/issues/${group.id}/first-last-release/`,
method: 'GET',
body: {firstRelease, lastRelease},
});
const flaggedOrganization = OrganizationFixture({
features: ['issue-details-streamline'],
});
render(
,
{
organization: flaggedOrganization,
router: {location},
}
);
expect(
await screen.findByRole('button', {name: 'Switch to the old issue experience'})
).toBeInTheDocument();
});
});
});