projectEnvironments.spec.jsx 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary';
  2. import recreateRoute from 'sentry/utils/recreateRoute';
  3. import ProjectEnvironments from 'sentry/views/settings/project/projectEnvironments';
  4. jest.mock('sentry/utils/recreateRoute');
  5. recreateRoute.mockReturnValue('/org-slug/project-slug/settings/environments/');
  6. function renderComponent(isHidden) {
  7. const org = TestStubs.Organization();
  8. const project = TestStubs.Project();
  9. const pathname = isHidden ? 'environments/hidden/' : 'environments/';
  10. return render(
  11. <ProjectEnvironments
  12. params={{
  13. orgId: org.slug,
  14. projectId: project.slug,
  15. }}
  16. location={{pathname}}
  17. organization={org}
  18. routes={[]}
  19. />
  20. );
  21. }
  22. describe('ProjectEnvironments', function () {
  23. let project;
  24. beforeEach(function () {
  25. project = TestStubs.Project({
  26. defaultEnvironment: 'production',
  27. });
  28. MockApiClient.addMockResponse({
  29. url: '/projects/org-slug/project-slug/',
  30. body: project,
  31. });
  32. });
  33. afterEach(function () {
  34. MockApiClient.clearMockResponses();
  35. });
  36. describe('render active', function () {
  37. it('renders empty message', function () {
  38. MockApiClient.addMockResponse({
  39. url: '/projects/org-slug/project-slug/environments/',
  40. body: [],
  41. });
  42. const {container} = renderComponent(false);
  43. expect(
  44. screen.getByText("You don't have any environments yet.")
  45. ).toBeInTheDocument();
  46. expect(container).toSnapshot();
  47. });
  48. it('renders environment list', function () {
  49. MockApiClient.addMockResponse({
  50. url: '/projects/org-slug/project-slug/environments/',
  51. body: TestStubs.Environments(false),
  52. });
  53. renderComponent(false);
  54. expect(screen.getByText('production')).toBeInTheDocument();
  55. expect(screen.getAllByRole('button', {name: 'Hide'})).toHaveLength(3);
  56. });
  57. });
  58. describe('render hidden', function () {
  59. it('renders empty message', function () {
  60. MockApiClient.addMockResponse({
  61. url: '/projects/org-slug/project-slug/environments/',
  62. body: [],
  63. });
  64. const {container} = renderComponent(true);
  65. expect(
  66. screen.getByText("You don't have any hidden environments.")
  67. ).toBeInTheDocument();
  68. expect(container).toSnapshot();
  69. });
  70. it('renders environment list', function () {
  71. MockApiClient.addMockResponse({
  72. url: '/projects/org-slug/project-slug/environments/',
  73. body: TestStubs.Environments(true),
  74. });
  75. const {container} = renderComponent(true);
  76. // Hidden buttons should not have "Set as default"
  77. expect(screen.getByRole('button', {name: 'Show'})).toBeInTheDocument();
  78. expect(container).toSnapshot();
  79. });
  80. });
  81. describe('toggle', function () {
  82. let hideMock, showMock;
  83. const baseUrl = '/projects/org-slug/project-slug/environments/';
  84. beforeEach(function () {
  85. hideMock = MockApiClient.addMockResponse({
  86. url: `${baseUrl}production/`,
  87. method: 'PUT',
  88. });
  89. showMock = MockApiClient.addMockResponse({
  90. url: `${baseUrl}zzz/`,
  91. method: 'PUT',
  92. });
  93. MockApiClient.addMockResponse({
  94. url: baseUrl,
  95. });
  96. });
  97. it('hides', function () {
  98. MockApiClient.addMockResponse({
  99. url: baseUrl,
  100. body: TestStubs.Environments(false),
  101. });
  102. renderComponent(false);
  103. // Click first row 'hide' (production)
  104. //
  105. // XXX(epurkhiser): In the future we should improve the accessability of
  106. // lists, because right now there's no way to associate the hide button
  107. // with it's environment
  108. userEvent.click(screen.getAllByRole('button', {name: 'Hide'})[0]);
  109. expect(hideMock).toHaveBeenCalledWith(
  110. `${baseUrl}production/`,
  111. expect.objectContaining({
  112. data: expect.objectContaining({isHidden: true}),
  113. })
  114. );
  115. });
  116. it('hides names requiring encoding', function () {
  117. MockApiClient.addMockResponse({
  118. url: baseUrl,
  119. body: [{id: '1', name: '%app_env%', isHidden: false}],
  120. });
  121. hideMock = MockApiClient.addMockResponse({
  122. url: `${baseUrl}%25app_env%25/`,
  123. method: 'PUT',
  124. });
  125. renderComponent(false);
  126. userEvent.click(screen.getByRole('button', {name: 'Hide'}));
  127. expect(hideMock).toHaveBeenCalledWith(
  128. `${baseUrl}%25app_env%25/`,
  129. expect.objectContaining({
  130. data: expect.objectContaining({isHidden: true}),
  131. })
  132. );
  133. });
  134. it('shows', function () {
  135. MockApiClient.addMockResponse({
  136. url: baseUrl,
  137. body: TestStubs.Environments(true),
  138. });
  139. renderComponent(true);
  140. userEvent.click(screen.getByRole('button', {name: 'Show'}));
  141. expect(showMock).toHaveBeenCalledWith(
  142. `${baseUrl}zzz/`,
  143. expect.objectContaining({
  144. data: expect.objectContaining({isHidden: false}),
  145. })
  146. );
  147. });
  148. it('does not have "All Environments" rows', function () {
  149. MockApiClient.addMockResponse({
  150. url: baseUrl,
  151. body: TestStubs.Environments(true),
  152. });
  153. renderComponent(true);
  154. expect(screen.queryByText('All Environments')).not.toBeInTheDocument();
  155. });
  156. });
  157. });