projectContext.spec.jsx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. import React from 'react';
  2. import {mount} from 'enzyme';
  3. import {ProjectContext} from 'app/views/projects/projectContext';
  4. jest.unmock('app/utils/recreateRoute');
  5. jest.mock('app/actionCreators/modal', () => ({
  6. redirectToProject: jest.fn(),
  7. }));
  8. describe('projectContext component', function() {
  9. const routes = [
  10. {path: '/', childRoutes: []},
  11. {name: 'Organizations', path: ':orgId/', childRoutes: []},
  12. {name: 'Projects', path: ':projectId/', childRoutes: []},
  13. ];
  14. const location = {query: {}};
  15. const project = TestStubs.Project();
  16. const org = TestStubs.Organization();
  17. beforeEach(function() {
  18. MockApiClient.clearMockResponses();
  19. [project.slug, 'new-slug'].forEach(slug => {
  20. MockApiClient.addMockResponse({
  21. url: `/projects/${org.slug}/${slug}/members/`,
  22. method: 'GET',
  23. body: [],
  24. });
  25. MockApiClient.addMockResponse({
  26. url: `/projects/${org.slug}/${slug}/environments/`,
  27. method: 'GET',
  28. body: [],
  29. });
  30. });
  31. });
  32. it('displays error on 404s', async function() {
  33. const router = TestStubs.router();
  34. MockApiClient.addMockResponse({
  35. url: `/projects/${org.slug}/${project.slug}/`,
  36. method: 'GET',
  37. statusCode: 404,
  38. });
  39. const projectContext = (
  40. <ProjectContext
  41. api={new MockApiClient()}
  42. params={{orgId: org.slug, projectId: project.slug}}
  43. projects={[]}
  44. routes={routes}
  45. router={router}
  46. location={location}
  47. orgId={org.slug}
  48. projectId={project.slug}
  49. />
  50. );
  51. const wrapper = mount(projectContext);
  52. await tick();
  53. wrapper.update();
  54. expect(wrapper.state('error')).toBe(true);
  55. expect(wrapper.state('loading')).toBe(false);
  56. expect(wrapper.state('errorType')).toBe('PROJECT_NOT_FOUND');
  57. });
  58. it('fetches data again if projectId changes', function() {
  59. const router = TestStubs.router();
  60. let fetchMock = MockApiClient.addMockResponse({
  61. url: `/projects/${org.slug}/${project.slug}/`,
  62. method: 'GET',
  63. statusCode: 200,
  64. body: project,
  65. });
  66. const projectContext = (
  67. <ProjectContext
  68. api={new MockApiClient()}
  69. params={{orgId: org.slug, projectId: project.slug}}
  70. projects={[]}
  71. routes={routes}
  72. router={router}
  73. location={location}
  74. orgId={org.slug}
  75. projectId={project.slug}
  76. />
  77. );
  78. const wrapper = mount(projectContext);
  79. expect(fetchMock).toHaveBeenCalledTimes(1);
  80. // Nothing should happen if we update and projectId is the same
  81. wrapper.update();
  82. expect(fetchMock).toHaveBeenCalledTimes(1);
  83. fetchMock = MockApiClient.addMockResponse({
  84. url: `/projects/${org.slug}/new-slug/`,
  85. method: 'GET',
  86. statusCode: 200,
  87. body: TestStubs.Project({slug: 'new-slug'}),
  88. });
  89. wrapper.setProps({
  90. projectId: 'new-slug',
  91. });
  92. wrapper.update();
  93. expect(fetchMock).toHaveBeenCalled();
  94. });
  95. it('fetches data again if projects list changes', function() {
  96. const router = TestStubs.router();
  97. const fetchMock = MockApiClient.addMockResponse({
  98. url: `/projects/${org.slug}/${project.slug}/`,
  99. method: 'GET',
  100. statusCode: 200,
  101. body: project,
  102. });
  103. const projectContext = (
  104. <ProjectContext
  105. api={new MockApiClient()}
  106. params={{orgId: org.slug, projectId: project.slug}}
  107. projects={[]}
  108. routes={routes}
  109. router={router}
  110. location={location}
  111. orgId={org.slug}
  112. projectId={project.slug}
  113. />
  114. );
  115. const wrapper = mount(projectContext);
  116. expect(fetchMock).toHaveBeenCalledTimes(1);
  117. // The project will become active, thus requesting org members
  118. MockApiClient.addMockResponse({
  119. url: `/organizations/${org.slug}/users/`,
  120. method: 'GET',
  121. statusCode: 200,
  122. body: [],
  123. });
  124. wrapper.setProps({projects: [project]});
  125. wrapper.update();
  126. expect(fetchMock).toHaveBeenCalledTimes(2);
  127. });
  128. });