import {Groups} from 'sentry-fixture/groups';
import RouterContextFixture from 'sentry-fixture/routerContextFixture';
import {
render,
renderGlobalModal,
screen,
userEvent,
waitFor,
} from 'sentry-test/reactTestingLibrary';
import GroupSimilarIssues from 'sentry/views/issueDetails/groupSimilarIssues';
const MockNavigate = jest.fn();
jest.mock('sentry/utils/useNavigate', () => ({
useNavigate: () => MockNavigate,
}));
describe('Issues Similar View', function () {
let mock;
const project = TestStubs.Project({
features: ['similarity-view'],
});
const routerContext = RouterContextFixture([
{
router: {
...TestStubs.router(),
params: {orgId: 'org-slug', projectId: 'project-slug', groupId: 'group-id'},
},
},
]);
const scores = [
{'exception:stacktrace:pairs': 0.375},
{'exception:stacktrace:pairs': 0.01264},
{'exception:stacktrace:pairs': 0.875},
{'exception:stacktrace:pairs': 0.001488},
];
const mockData = {
similar: Groups().map((issue, i) => [issue, scores[i]]),
};
const router = TestStubs.router();
beforeEach(function () {
mock = MockApiClient.addMockResponse({
url: '/organizations/org-slug/issues/group-id/similar/?limit=50',
body: mockData.similar,
});
});
afterEach(() => {
MockApiClient.clearMockResponses();
jest.clearAllMocks();
});
it('renders with mocked data', async function () {
render(
,
{context: routerContext}
);
expect(screen.getByTestId('loading-indicator')).toBeInTheDocument();
await waitFor(() => expect(mock).toHaveBeenCalled());
});
it('can merge and redirect to new parent', async function () {
const merge = MockApiClient.addMockResponse({
method: 'PUT',
url: '/projects/org-slug/project-slug/issues/',
body: {
merge: {children: ['123'], parent: '321'},
},
});
render(
,
{context: routerContext}
);
renderGlobalModal();
await userEvent.click(await screen.findByTestId('similar-item-row'));
await userEvent.click(await screen.findByRole('button', {name: 'Merge (1)'}));
await userEvent.click(screen.getByRole('button', {name: 'Confirm'}));
await waitFor(() => {
expect(merge).toHaveBeenCalledWith(
'/projects/org-slug/project-slug/issues/',
expect.objectContaining({
data: {merge: 1},
})
);
});
expect(MockNavigate).toHaveBeenCalledWith(
'/organizations/org-slug/issues/321/similar/'
);
});
});