recommendedStepsModal.spec.tsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary';
  2. import {textWithMarkupMatcher} from 'sentry-test/utils';
  3. import {openModal} from 'sentry/actionCreators/modal';
  4. import GlobalModal from 'sentry/components/globalModal';
  5. import {RecommendedStepsModal} from 'sentry/views/settings/project/server-side-sampling/modals/recommendedStepsModal';
  6. import {SERVER_SIDE_SAMPLING_DOC_LINK} from 'sentry/views/settings/project/server-side-sampling/utils';
  7. import {
  8. getMockData,
  9. mockedProjects,
  10. mockedSamplingSdkVersions,
  11. recommendedSdkUpgrades,
  12. uniformRule,
  13. } from '../testUtils';
  14. describe('Server-Side Sampling - Recommended Steps Modal', function () {
  15. beforeEach(function () {
  16. MockApiClient.addMockResponse({
  17. url: '/organizations/org-slug/tags/release/values/',
  18. method: 'GET',
  19. body: [{value: '1.2.3'}],
  20. });
  21. });
  22. it('render all recommended steps', function () {
  23. const {organization, project} = getMockData();
  24. render(<GlobalModal />);
  25. openModal(modalProps => (
  26. <RecommendedStepsModal
  27. {...modalProps}
  28. organization={organization}
  29. projectId={project.id}
  30. recommendedSdkUpgrades={recommendedSdkUpgrades}
  31. onReadDocs={jest.fn()}
  32. onSubmit={jest.fn()}
  33. clientSampleRate={0.5}
  34. />
  35. ));
  36. expect(screen.getByText('Next steps')).toBeInTheDocument();
  37. // First recommended step
  38. expect(
  39. screen.getByRole('heading', {
  40. name: 'Update the following SDK versions',
  41. })
  42. ).toBeInTheDocument();
  43. expect(
  44. screen.getByText(
  45. 'To activate server-side sampling rules, it’s a requirement to update the following project SDK(s):'
  46. )
  47. ).toBeInTheDocument();
  48. expect(screen.getByRole('link', {name: mockedProjects[1].slug})).toHaveAttribute(
  49. 'href',
  50. `/organizations/org-slug/projects/sentry/?project=${mockedProjects[1].id}`
  51. );
  52. expect(screen.getByTestId('platform-icon-python')).toBeInTheDocument();
  53. expect(
  54. screen.getByText(
  55. textWithMarkupMatcher(
  56. `This project is on ${mockedSamplingSdkVersions[1].latestSDKName}@v${mockedSamplingSdkVersions[1].latestSDKVersion}`
  57. )
  58. )
  59. ).toBeInTheDocument();
  60. // Second recommended step
  61. expect(
  62. screen.getByRole('heading', {
  63. name: 'Increase your client-side transaction sample rate',
  64. })
  65. ).toBeInTheDocument();
  66. expect(
  67. screen.getByText(
  68. 'Here’s your optimal client(SDK) sample rate based on your organization’s usage and quota. To make this change, find the tracesSampleRate option in your SDK Config, modify it’s value to what’s suggested below and re-deploy.'
  69. )
  70. ).toBeInTheDocument();
  71. expect(screen.getByText(textWithMarkupMatcher(/Sentry.init/))).toBeInTheDocument();
  72. expect(screen.getByText('0.5')).toBeInTheDocument();
  73. expect(screen.getByText('// 50%')).toBeInTheDocument();
  74. // Footer
  75. expect(screen.getByRole('button', {name: 'Read Docs'})).toHaveAttribute(
  76. 'href',
  77. SERVER_SIDE_SAMPLING_DOC_LINK
  78. );
  79. expect(screen.getByRole('button', {name: 'Cancel'})).toBeInTheDocument();
  80. expect(screen.getByRole('button', {name: 'Done'})).toBeInTheDocument();
  81. expect(screen.queryByText('Step 2 of 2')).not.toBeInTheDocument();
  82. expect(screen.queryByRole('button', {name: 'Back'})).not.toBeInTheDocument();
  83. });
  84. it('render only the last recommended step', function () {
  85. const {organization, project} = getMockData();
  86. render(<GlobalModal />);
  87. openModal(modalProps => (
  88. <RecommendedStepsModal
  89. {...modalProps}
  90. organization={organization}
  91. projectId={project.id}
  92. recommendedSdkUpgrades={[]}
  93. onSubmit={jest.fn()}
  94. onReadDocs={jest.fn()}
  95. clientSampleRate={uniformRule.sampleRate}
  96. />
  97. ));
  98. expect(
  99. screen.queryByRole('heading', {
  100. name: 'Update the following SDK versions',
  101. })
  102. ).not.toBeInTheDocument();
  103. expect(
  104. screen.getByRole('heading', {
  105. name: 'Increase your client-side transaction sample rate',
  106. })
  107. ).toBeInTheDocument();
  108. });
  109. it('render as a second step of a wizard', function () {
  110. const {organization, project} = getMockData();
  111. const onGoBack = jest.fn();
  112. render(<GlobalModal />);
  113. openModal(modalProps => (
  114. <RecommendedStepsModal
  115. {...modalProps}
  116. organization={organization}
  117. projectId={project.id}
  118. recommendedSdkUpgrades={[]}
  119. onGoBack={onGoBack}
  120. onSubmit={jest.fn()}
  121. onReadDocs={jest.fn()}
  122. clientSampleRate={uniformRule.sampleRate}
  123. />
  124. ));
  125. expect(screen.getByText('Step 2 of 2')).toBeInTheDocument();
  126. userEvent.click(screen.getByRole('button', {name: 'Back'}));
  127. expect(onGoBack).toHaveBeenCalled();
  128. });
  129. });