stacktraceLinkModal.spec.jsx 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import {mountWithTheme} from 'sentry-test/enzyme';
  2. import StacktraceLinkModal from 'sentry/components/events/interfaces/frame/stacktraceLinkModal';
  3. describe('StacktraceLinkModal', function () {
  4. const org = TestStubs.Organization();
  5. const project = TestStubs.Project();
  6. const integration = TestStubs.GitHubIntegration();
  7. const filename = '/sentry/app.py';
  8. const repo = TestStubs.Repository({integrationId: integration.id});
  9. const config = TestStubs.RepositoryProjectPathConfig(project, repo, integration);
  10. const sourceUrl = 'https://github.com/getsentry/sentry/blob/master/src/sentry/app.py';
  11. const closeModal = jest.fn();
  12. const modalElements = {
  13. Header: p => p.children,
  14. Body: p => p.children,
  15. Footer: p => p.children,
  16. };
  17. const createWrapper = (statusCode = 200) => {
  18. const configData = {
  19. stackRoot: '',
  20. sourceRoot: 'src/',
  21. integrationId: integration.id,
  22. repositoryId: repo.id,
  23. defaultBranch: 'master',
  24. };
  25. MockApiClient.addMockResponse({
  26. url: `/projects/${org.slug}/${project.slug}/repo-path-parsing/`,
  27. method: 'POST',
  28. body: {...configData},
  29. });
  30. MockApiClient.addMockResponse({
  31. url: `/organizations/${org.slug}/code-mappings/`,
  32. method: 'POST',
  33. statusCode,
  34. });
  35. MockApiClient.addMockResponse({
  36. url: `/projects/${org.slug}/${project.slug}/stacktrace-link/`,
  37. query: {file: filename, commitId: 'master', platform: 'python'},
  38. body: {config, sourceUrl, integrations: [integration]},
  39. });
  40. return mountWithTheme(
  41. <StacktraceLinkModal
  42. {...modalElements}
  43. closeModal={closeModal}
  44. filename={filename}
  45. integrations={[integration]}
  46. organization={org}
  47. project={project}
  48. />
  49. );
  50. };
  51. const submitQuickSetupInput = async wrapper => {
  52. wrapper.find('input').simulate('change', {target: {value: sourceUrl}});
  53. wrapper.find('Button[data-test-id="quick-setup-button"]').simulate('click');
  54. await tick();
  55. wrapper.update();
  56. };
  57. beforeEach(function () {
  58. closeModal.mockReset();
  59. MockApiClient.clearMockResponses();
  60. });
  61. it('renders manual setup option', function () {
  62. const wrapper = createWrapper();
  63. expect(wrapper.find('IntegrationName').text()).toEqual('Test Integration');
  64. });
  65. it('closes modal after successful quick setup', async function () {
  66. const wrapper = createWrapper();
  67. await submitQuickSetupInput(wrapper);
  68. expect(closeModal).toHaveBeenCalled();
  69. });
  70. it('keeps modal open on unsuccessful quick setup', async function () {
  71. const wrapper = createWrapper(400);
  72. await submitQuickSetupInput(wrapper);
  73. expect(closeModal).not.toHaveBeenCalled();
  74. });
  75. });