index.spec.jsx 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. import {Organization} from 'fixtures/js-stubs/organization';
  2. import {Environments} from 'fixtures/js-stubs/environments';
  3. import {UserFeedback} from 'fixtures/js-stubs/userFeedback';
  4. import {Project} from 'fixtures/js-stubs/project';
  5. import {initializeOrg} from 'sentry-test/initializeOrg';
  6. import {render, screen} from 'sentry-test/reactTestingLibrary';
  7. import ProjectsStore from 'sentry/stores/projectsStore';
  8. import {OrganizationContext} from 'sentry/views/organizationContext';
  9. import UserFeedback from 'sentry/views/userFeedback';
  10. describe('UserFeedback', function () {
  11. const {organization, routerContext} = initializeOrg();
  12. const pageLinks =
  13. '<https://sentry.io/api/0/organizations/sentry/user-feedback/?statsPeriod=14d&cursor=0:0:1>; rel="previous"; results="false"; cursor="0:0:1", ' +
  14. '<https://sentry.io/api/0/organizations/sentry/user-feedback/?statsPeriod=14d&cursor=0:100:0>; rel="next"; results="true"; cursor="0:100:0"';
  15. const project = Project({isMember: true});
  16. beforeEach(function () {
  17. ProjectsStore.loadInitialData([project]);
  18. MockApiClient.addMockResponse({
  19. url: '/organizations/org-slug/user-feedback/',
  20. body: [UserFeedback()],
  21. headers: {Link: pageLinks},
  22. });
  23. MockApiClient.addMockResponse({
  24. url: '/organizations/org-slug/environments/',
  25. body: Environments(),
  26. });
  27. });
  28. afterEach(function () {
  29. ProjectsStore.reset();
  30. });
  31. it('renders', function () {
  32. const params = {
  33. organization: Organization(),
  34. location: {query: {}, search: ''},
  35. params: {
  36. orgId: organization.slug,
  37. },
  38. };
  39. MockApiClient.addMockResponse({
  40. url: '/organizations/org-slug/projects/',
  41. body: [project],
  42. headers: {Link: pageLinks},
  43. });
  44. render(
  45. <OrganizationContext.Provider value={organization}>
  46. <UserFeedback {...params} />
  47. </OrganizationContext.Provider>,
  48. {context: routerContext}
  49. );
  50. expect(screen.getByText('Something bad happened')).toBeInTheDocument();
  51. });
  52. it('renders no project message', function () {
  53. ProjectsStore.loadInitialData([]);
  54. const params = {
  55. organization: Organization(),
  56. location: {query: {}, search: ''},
  57. params: {
  58. orgId: organization.slug,
  59. },
  60. };
  61. render(
  62. <OrganizationContext.Provider value={organization}>
  63. <UserFeedback {...params} />
  64. </OrganizationContext.Provider>,
  65. {context: routerContext}
  66. );
  67. expect(
  68. screen.getByText('You need at least one project to use this view')
  69. ).toBeInTheDocument();
  70. });
  71. it('renders empty state', function () {
  72. MockApiClient.addMockResponse({
  73. url: '/organizations/org-slug/user-feedback/',
  74. body: [],
  75. });
  76. const params = {
  77. organization: Organization({
  78. projects: [Project({isMember: true})],
  79. }),
  80. location: {query: {}, search: ''},
  81. params: {
  82. orgId: organization.slug,
  83. },
  84. };
  85. render(
  86. <OrganizationContext.Provider value={organization}>
  87. <UserFeedback {...params} />
  88. </OrganizationContext.Provider>,
  89. {context: routerContext}
  90. );
  91. expect(screen.getByTestId('user-feedback-empty')).toBeInTheDocument();
  92. });
  93. it('renders empty state with project query', function () {
  94. MockApiClient.addMockResponse({
  95. url: '/organizations/org-slug/user-feedback/',
  96. body: [],
  97. });
  98. const params = {
  99. organization: Organization({
  100. projects: [Project({isMember: true})],
  101. }),
  102. location: {pathname: 'sentry', query: {project: '112'}, search: ''},
  103. params: {
  104. orgId: organization.slug,
  105. },
  106. };
  107. render(
  108. <OrganizationContext.Provider value={organization}>
  109. <UserFeedback {...params} />
  110. </OrganizationContext.Provider>,
  111. {context: routerContext}
  112. );
  113. expect(screen.getByTestId('user-feedback-empty')).toBeInTheDocument();
  114. expect(screen.getByRole('button', {name: 'All Issues'})).toHaveAttribute(
  115. 'href',
  116. 'sentry?project=112&status='
  117. );
  118. });
  119. it('renders empty state with multi project query', function () {
  120. MockApiClient.addMockResponse({
  121. url: '/organizations/org-slug/user-feedback/',
  122. body: [],
  123. });
  124. const params = {
  125. organization: Organization({
  126. projects: [Project({isMember: true})],
  127. }),
  128. location: {pathname: 'sentry', query: {project: ['112', '113']}, search: ''},
  129. params: {
  130. orgId: organization.slug,
  131. },
  132. };
  133. render(
  134. <OrganizationContext.Provider value={organization}>
  135. <UserFeedback {...params} />
  136. </OrganizationContext.Provider>,
  137. {context: routerContext}
  138. );
  139. expect(screen.getByTestId('user-feedback-empty')).toBeInTheDocument();
  140. expect(screen.getByRole('button', {name: 'All Issues'})).toHaveAttribute(
  141. 'href',
  142. 'sentry?project=112&project=113&status='
  143. );
  144. });
  145. });