dynamicSampling.spec.tsx 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. import {initializeOrg} from 'sentry-test/initializeOrg';
  2. import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary';
  3. import {Organization, Project} from 'sentry/types';
  4. import {DynamicSamplingBiasType} from 'sentry/types/sampling';
  5. import DynamicSampling from '.';
  6. const ORG_FEATURES = ['dynamic-sampling'];
  7. const dynamicSamplingBiases = [
  8. {id: DynamicSamplingBiasType.BOOST_LATEST_RELEASES, active: true},
  9. {id: DynamicSamplingBiasType.BOOST_ENVIRONMENTS, active: true},
  10. {id: DynamicSamplingBiasType.BOOST_KEY_TRANSACTIONS, active: true},
  11. {id: DynamicSamplingBiasType.IGNORE_HEALTH_CHECKS, active: true},
  12. ];
  13. function renderMockRequests(
  14. organizationSlug: Organization['slug'],
  15. projectSlug: Project['slug']
  16. ) {
  17. const projectDetails = MockApiClient.addMockResponse({
  18. url: `/projects/${organizationSlug}/${projectSlug}/`,
  19. method: 'PUT',
  20. body: {},
  21. });
  22. return {projectDetails};
  23. }
  24. describe('Dynamic Sampling', function () {
  25. it('renders default ui', function () {
  26. const {project, organization} = initializeOrg({
  27. ...initializeOrg(),
  28. projects: [
  29. TestStubs.Project({
  30. dynamicSamplingBiases,
  31. }),
  32. ],
  33. organization: {
  34. ...initializeOrg().organization,
  35. features: ORG_FEATURES,
  36. },
  37. });
  38. renderMockRequests(organization.slug, project.slug);
  39. render(<DynamicSampling project={project} />, {organization});
  40. expect(screen.getByRole('heading', {name: /Dynamic Sampling/})).toBeInTheDocument();
  41. expect(screen.getAllByRole('checkbox')).toHaveLength(4);
  42. expect(screen.queryByTestId('more-information')).not.toBeInTheDocument();
  43. const prioritizenewReleases = screen.getByRole('checkbox', {
  44. name: 'Prioritize new releases',
  45. });
  46. expect(prioritizenewReleases).toBeEnabled();
  47. expect(prioritizenewReleases).toBeChecked();
  48. const prioritizeDevEnvironments = screen.getByRole('checkbox', {
  49. name: 'Prioritize dev environments',
  50. });
  51. expect(prioritizeDevEnvironments).toBeEnabled();
  52. expect(prioritizeDevEnvironments).toBeChecked();
  53. const prioritizeKeyTransactions = screen.getByRole('checkbox', {
  54. name: 'Prioritize key transactions',
  55. });
  56. expect(prioritizeKeyTransactions).toBeEnabled();
  57. expect(prioritizeKeyTransactions).toBeChecked();
  58. const ignoreHealthChecks = screen.getByRole('checkbox', {
  59. name: 'Ignore health checks',
  60. });
  61. expect(ignoreHealthChecks).toBeEnabled();
  62. expect(ignoreHealthChecks).toBeChecked();
  63. });
  64. it('renders disabled default UI, when user has not permission to edit', async function () {
  65. const {project, organization} = initializeOrg({
  66. ...initializeOrg(),
  67. projects: [
  68. TestStubs.Project({
  69. dynamicSamplingBiases,
  70. }),
  71. ],
  72. organization: {
  73. ...initializeOrg().organization,
  74. features: ORG_FEATURES,
  75. access: [],
  76. },
  77. });
  78. renderMockRequests(organization.slug, project.slug);
  79. render(<DynamicSampling project={project} />, {organization});
  80. expect(
  81. screen.getByText(
  82. /These settings can only be edited by users with the organization owner, manager, or admin role/
  83. )
  84. ).toBeInTheDocument();
  85. const prioritizenewReleases = screen.getByRole('checkbox', {
  86. name: 'Prioritize new releases',
  87. });
  88. expect(prioritizenewReleases).toBeDisabled();
  89. expect(prioritizenewReleases).toBeChecked();
  90. userEvent.hover(prioritizenewReleases);
  91. expect(
  92. await screen.findByText('You do not have permission to edit this setting')
  93. ).toBeInTheDocument();
  94. const prioritizeDevEnvironments = screen.getByRole('checkbox', {
  95. name: 'Prioritize dev environments',
  96. });
  97. expect(prioritizeDevEnvironments).toBeDisabled();
  98. expect(prioritizeDevEnvironments).toBeChecked();
  99. const prioritizeKeyTransactions = screen.getByRole('checkbox', {
  100. name: 'Prioritize key transactions',
  101. });
  102. expect(prioritizeKeyTransactions).toBeDisabled();
  103. expect(prioritizeKeyTransactions).toBeChecked();
  104. const ignoreHealthChecks = screen.getByRole('checkbox', {
  105. name: 'Ignore health checks',
  106. });
  107. expect(ignoreHealthChecks).toBeDisabled();
  108. expect(ignoreHealthChecks).toBeChecked();
  109. });
  110. it('user can toggle option', function () {
  111. const {project, organization} = initializeOrg({
  112. ...initializeOrg(),
  113. projects: [
  114. TestStubs.Project({
  115. dynamicSamplingBiases,
  116. }),
  117. ],
  118. organization: {
  119. ...initializeOrg().organization,
  120. features: ORG_FEATURES,
  121. },
  122. });
  123. const mockRequests = renderMockRequests(organization.slug, project.slug);
  124. render(<DynamicSampling project={project} />, {organization});
  125. userEvent.click(screen.getByRole('checkbox', {name: 'Prioritize new releases'}));
  126. expect(mockRequests.projectDetails).toHaveBeenCalledWith(
  127. `/projects/${organization.slug}/${project.slug}/`,
  128. expect.objectContaining({
  129. data: {
  130. dynamicSamplingBiases: [
  131. {id: DynamicSamplingBiasType.BOOST_LATEST_RELEASES, active: false},
  132. {id: DynamicSamplingBiasType.BOOST_ENVIRONMENTS, active: true},
  133. {id: DynamicSamplingBiasType.BOOST_KEY_TRANSACTIONS, active: true},
  134. {id: DynamicSamplingBiasType.IGNORE_HEALTH_CHECKS, active: true},
  135. ],
  136. },
  137. })
  138. );
  139. });
  140. });