You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

test-utils.ts 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. /*
  2. * SonarQube
  3. * Copyright (C) 2009-2024 SonarSource SA
  4. * mailto:info AT sonarsource DOT com
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 3 of the License, or (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public License
  17. * along with this program; if not, write to the Free Software Foundation,
  18. * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  19. */
  20. import userEvent from '@testing-library/user-event';
  21. import { byLabelText, byRole, byTestId, byText } from '../../../helpers/testSelector';
  22. import {
  23. SoftwareImpactMeasureData,
  24. SoftwareImpactSeverity,
  25. SoftwareQuality,
  26. } from '../../../types/clean-code-taxonomy';
  27. export const getPageObjects = () => {
  28. const user = userEvent.setup();
  29. const selectors = {
  30. overallCodeButton: byRole('tab', { name: /overview.overall_code/ }),
  31. softwareImpactMeasureCard: (softwareQuality: SoftwareQuality) =>
  32. byTestId(`overview__software-impact-card-${softwareQuality}`),
  33. softwareImpactMeasureCardRating: (softwareQuality: SoftwareQuality, rating: string) =>
  34. byLabelText(
  35. `overview.project.software_impact.has_rating.software_quality.${softwareQuality}.${rating}`,
  36. ),
  37. };
  38. const ui = {
  39. ...selectors,
  40. expectSoftwareImpactMeasureCard: (
  41. softwareQuality: SoftwareQuality,
  42. rating?: string,
  43. data?: SoftwareImpactMeasureData,
  44. severitiesActiveState?: boolean[],
  45. branch = 'master',
  46. failed = false,
  47. ) => {
  48. if (failed) {
  49. expect(
  50. byTestId(`overview__software-impact-card-${softwareQuality}`)
  51. .byText('overview.measures.failed_badge')
  52. .get(),
  53. ).toBeInTheDocument();
  54. }
  55. if (typeof rating === 'string') {
  56. expect(
  57. byText(rating, { exact: true }).get(ui.softwareImpactMeasureCard(softwareQuality).get()),
  58. ).toBeInTheDocument();
  59. }
  60. if (data) {
  61. const branchQuery = branch ? `&branch=${branch}` : '';
  62. expect(
  63. byRole('link', {
  64. name: `overview.measures.software_impact.see_list_of_x_open_issues.${data.total}.software_quality.${softwareQuality}`,
  65. }).get(),
  66. ).toHaveAttribute(
  67. 'href',
  68. `/project/issues?issueStatuses=OPEN%2CCONFIRMED&impactSoftwareQualities=${softwareQuality}${branchQuery}&id=foo`,
  69. );
  70. expect(
  71. byRole('link', {
  72. name: `overview.measures.software_impact.severity.see_x_open_issues.${
  73. data[SoftwareImpactSeverity.High]
  74. }.software_quality.${softwareQuality}.overview.measures.software_impact.severity.HIGH.tooltip`,
  75. }).get(),
  76. ).toHaveAttribute(
  77. 'href',
  78. `/project/issues?issueStatuses=OPEN%2CCONFIRMED&impactSoftwareQualities=${softwareQuality}&impactSeverities=${SoftwareImpactSeverity.High}${branchQuery}&id=foo`,
  79. );
  80. expect(
  81. byRole('link', {
  82. name: `overview.measures.software_impact.severity.see_x_open_issues.${
  83. data[SoftwareImpactSeverity.Medium]
  84. }.software_quality.${softwareQuality}.overview.measures.software_impact.severity.MEDIUM.tooltip`,
  85. }).get(),
  86. ).toBeInTheDocument();
  87. expect(
  88. byRole('link', {
  89. name: `overview.measures.software_impact.severity.see_x_open_issues.${
  90. data[SoftwareImpactSeverity.Low]
  91. }.software_quality.${softwareQuality}.overview.measures.software_impact.severity.LOW.tooltip`,
  92. }).get(),
  93. ).toBeInTheDocument();
  94. }
  95. if (severitiesActiveState) {
  96. ui.expectSoftwareImpactMeasureBreakdownCard(
  97. softwareQuality,
  98. SoftwareImpactSeverity.High,
  99. severitiesActiveState[0],
  100. );
  101. ui.expectSoftwareImpactMeasureBreakdownCard(
  102. softwareQuality,
  103. SoftwareImpactSeverity.Medium,
  104. severitiesActiveState[1],
  105. );
  106. ui.expectSoftwareImpactMeasureBreakdownCard(
  107. softwareQuality,
  108. SoftwareImpactSeverity.Low,
  109. severitiesActiveState[2],
  110. );
  111. }
  112. },
  113. expectSoftwareImpactMeasureCardToHaveOldMeasures: (
  114. softwareQuality: SoftwareQuality,
  115. rating: string,
  116. total: number,
  117. oldMetric: string,
  118. branch = 'master',
  119. ) => {
  120. const branchQuery = branch ? `&branch=${branch}` : '';
  121. expect(
  122. byText(rating, { exact: true }).get(ui.softwareImpactMeasureCard(softwareQuality).get()),
  123. ).toBeInTheDocument();
  124. expect(
  125. byRole('link', {
  126. name: `overview.measures.software_impact.see_list_of_x_open_issues.${total}.software_quality.${softwareQuality}`,
  127. }).get(),
  128. ).toHaveAttribute(
  129. 'href',
  130. `/project/issues?issueStatuses=OPEN%2CCONFIRMED&types=${oldMetric}${branchQuery}&id=foo`,
  131. );
  132. },
  133. expectSoftwareImpactMeasureBreakdownCard: (
  134. softwareQuality: SoftwareQuality,
  135. severity: SoftwareImpactSeverity,
  136. active: boolean,
  137. ) => {
  138. const link = byTestId(
  139. `overview__software-impact-${softwareQuality}-severity-${severity}`,
  140. ).get(ui.softwareImpactMeasureCard(softwareQuality).get());
  141. if (active) {
  142. expect(link).toHaveClass('active');
  143. } else {
  144. expect(link).not.toHaveClass('active');
  145. }
  146. },
  147. expectSoftwareImpactMeasureCardRatingTooltip: async (
  148. softwareQuality: SoftwareQuality,
  149. rating: string,
  150. text: string,
  151. ) => {
  152. await expect(
  153. ui.softwareImpactMeasureCardRating(softwareQuality, rating).get(),
  154. ).toHaveATooltipWithContent(text);
  155. },
  156. };
  157. return { user, ui };
  158. };