addCodeOwnerModal.spec.jsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import {mountWithTheme} from 'sentry-test/enzyme';
  2. import {selectByValue} from 'sentry-test/select-new';
  3. import {Client} from 'app/api';
  4. import {AddCodeOwnerModal} from 'app/views/settings/project/projectOwnership/addCodeOwnerModal';
  5. describe('AddCodeOwnerModal', function () {
  6. const modalProps = {
  7. Body: p => p.children,
  8. Header: p => p.children,
  9. Footer: p => p.children,
  10. closeModal: jest.fn(() => null),
  11. };
  12. const org = TestStubs.Organization({features: ['integrations-codeowners']});
  13. const project = TestStubs.ProjectDetails();
  14. const integration = TestStubs.GitHubIntegration();
  15. const repo = TestStubs.Repository({
  16. integrationId: integration.id,
  17. id: '5',
  18. name: 'example/hello-there',
  19. });
  20. const codeMapping = TestStubs.RepositoryProjectPathConfig(project, repo, integration, {
  21. stackRoot: 'stack/root',
  22. sourceRoot: 'source/root',
  23. });
  24. beforeEach(function () {
  25. Client.clearMockResponses();
  26. });
  27. it('renders', function () {
  28. const wrapper = mountWithTheme(
  29. <AddCodeOwnerModal
  30. {...modalProps}
  31. api={new Client()}
  32. organization={org}
  33. project={project}
  34. codeMappings={[codeMapping]}
  35. onSave={() => {}}
  36. />,
  37. TestStubs.routerContext()
  38. );
  39. expect(wrapper.find('Button').prop('disabled')).toBe(true);
  40. });
  41. it('renders codeowner file', async function () {
  42. Client.addMockResponse({
  43. url: `/organizations/${org.slug}/code-mappings/${codeMapping.id}/codeowners/`,
  44. method: 'GET',
  45. body: {html_url: 'blah', filepath: 'CODEOWNERS', raw: '* @MeredithAnya\n'},
  46. });
  47. const wrapper = mountWithTheme(
  48. <AddCodeOwnerModal
  49. {...modalProps}
  50. api={new Client()}
  51. organization={org}
  52. project={project}
  53. codeMappings={[codeMapping]}
  54. onSave={() => {}}
  55. />,
  56. TestStubs.routerContext()
  57. );
  58. selectByValue(wrapper, codeMapping.id, {name: 'codeMappingId'});
  59. await tick();
  60. wrapper.update();
  61. expect(wrapper.find('IconCheckmark').exists()).toBe(true);
  62. expect(wrapper.find('SourceFileBody').find('Button').prop('href')).toEqual('blah');
  63. expect(wrapper.find('SourceFileBody').text()).toContain('CODEOWNERS');
  64. expect(wrapper.state('codeownersFile').raw).toEqual('* @MeredithAnya\n');
  65. });
  66. it('renders no codeowner file found', async function () {
  67. Client.addMockResponse({
  68. url: `/organizations/${org.slug}/code-mappings/${codeMapping.id}/codeowners/`,
  69. method: 'GET',
  70. statusCode: 404,
  71. });
  72. const wrapper = mountWithTheme(
  73. <AddCodeOwnerModal
  74. {...modalProps}
  75. api={new Client()}
  76. organization={org}
  77. project={project}
  78. codeMappings={[codeMapping]}
  79. onSave={() => {}}
  80. />,
  81. TestStubs.routerContext()
  82. );
  83. selectByValue(wrapper, codeMapping.id, {name: 'codeMappingId'});
  84. await tick();
  85. wrapper.update();
  86. expect(wrapper.find('IconNot').exists()).toBe(true);
  87. expect(wrapper.find('NoSourceFileBody').text()).toEqual('No codeowner file found.');
  88. expect(wrapper.state('codeownersFile')).toBe(null);
  89. });
  90. it('adds codeowner file', async function () {
  91. Client.addMockResponse({
  92. url: `/organizations/${org.slug}/code-mappings/${codeMapping.id}/codeowners/`,
  93. method: 'GET',
  94. body: {html_url: 'blah', filepath: 'CODEOWNERS', raw: '* @MeredithAnya\n'},
  95. });
  96. const addFileRequest = Client.addMockResponse({
  97. url: `/projects/${org.slug}/${project.slug}/codeowners/`,
  98. method: 'POST',
  99. body: {},
  100. });
  101. const wrapper = mountWithTheme(
  102. <AddCodeOwnerModal
  103. {...modalProps}
  104. api={new Client()}
  105. organization={org}
  106. project={project}
  107. codeMappings={[codeMapping]}
  108. onSave={() => {}}
  109. />,
  110. TestStubs.routerContext()
  111. );
  112. selectByValue(wrapper, codeMapping.id, {name: 'codeMappingId'});
  113. await tick();
  114. wrapper.update();
  115. wrapper.find('Footer').find('Button').simulate('click');
  116. await tick();
  117. wrapper.update();
  118. expect(addFileRequest).toHaveBeenCalledWith(
  119. `/projects/${org.slug}/${project.slug}/codeowners/`,
  120. expect.objectContaining({
  121. data: {raw: '* @MeredithAnya\n', codeMappingId: codeMapping.id},
  122. })
  123. );
  124. const closeModal = wrapper.prop('closeModal');
  125. expect(closeModal).toHaveBeenCalled();
  126. });
  127. });