projectReleaseTracking.spec.jsx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import React from 'react';
  2. import {mount} from 'enzyme';
  3. import ProjectReleaseTrackingContainer, {
  4. ProjectReleaseTracking,
  5. } from 'app/views/settings/project/projectReleaseTracking';
  6. import {fetchPlugins} from 'app/actionCreators/plugins';
  7. jest.mock('app/actionCreators/plugins', () => ({
  8. fetchPlugins: jest.fn(),
  9. }));
  10. describe('ProjectReleaseTracking', function() {
  11. let org = TestStubs.Organization();
  12. let project = TestStubs.Project();
  13. let url = `/projects/${org.slug}/${project.slug}/releases/token/`;
  14. beforeEach(function() {
  15. MockApiClient.clearMockResponses();
  16. MockApiClient.addMockResponse({
  17. url: `/projects/${org.slug}/${project.slug}/plugins/`,
  18. method: 'GET',
  19. body: TestStubs.Plugins(),
  20. });
  21. MockApiClient.addMockResponse({
  22. url,
  23. method: 'GET',
  24. body: {
  25. webhookUrl: 'webhook-url',
  26. token: 'token token token',
  27. },
  28. });
  29. });
  30. it('renders with token', function() {
  31. let wrapper = mount(
  32. <ProjectReleaseTracking
  33. organization={org}
  34. project={project}
  35. plugins={{loading: false, plugins: TestStubs.Plugins()}}
  36. params={{orgId: org.slug, projectId: project.slug}}
  37. />,
  38. TestStubs.routerContext()
  39. );
  40. expect(wrapper.find('TextCopyInput').prop('children')).toBe('token token token');
  41. });
  42. it('can regenerate token', function(done) {
  43. let wrapper = mount(
  44. <ProjectReleaseTracking
  45. organization={org}
  46. project={project}
  47. plugins={{loading: false, plugins: TestStubs.Plugins()}}
  48. params={{orgId: org.slug, projectId: project.slug}}
  49. />,
  50. TestStubs.routerContext()
  51. );
  52. let mock = MockApiClient.addMockResponse({
  53. url,
  54. method: 'POST',
  55. });
  56. // Click Regenerate Token
  57. wrapper.find('Field[label="Regenerate Token"] Button').simulate('click');
  58. expect(wrapper.find('ModalDialog')).toHaveLength(1);
  59. expect(mock).not.toHaveBeenCalled();
  60. wrapper.find('ModalDialog Button[priority="danger"]').simulate('click');
  61. setTimeout(() => {
  62. expect(mock).toHaveBeenCalledWith(
  63. url,
  64. expect.objectContaining({
  65. method: 'POST',
  66. data: {
  67. project: project.slug,
  68. },
  69. })
  70. );
  71. done();
  72. }, 1);
  73. });
  74. it('fetches new plugins when project changes', function() {
  75. let wrapper = mount(
  76. <ProjectReleaseTrackingContainer
  77. organization={org}
  78. project={project}
  79. params={{orgId: org.slug, projectId: project.slug}}
  80. />,
  81. TestStubs.routerContext()
  82. );
  83. expect(fetchPlugins).toHaveBeenCalled();
  84. fetchPlugins.mockClear();
  85. // For example, this happens when we switch to a new project using settings breadcrumb
  86. wrapper.setProps({...wrapper.props(), project: {...project, slug: 'new-project'}});
  87. wrapper.update();
  88. expect(fetchPlugins).toHaveBeenCalledWith(
  89. expect.objectContaining({
  90. projectId: 'new-project',
  91. })
  92. );
  93. fetchPlugins.mockClear();
  94. // Does not call fetchPlugins if slug is the same
  95. wrapper.setProps({...wrapper.props(), project: {...project, slug: 'new-project'}});
  96. wrapper.update();
  97. expect(fetchPlugins).not.toHaveBeenCalled();
  98. });
  99. });