Browse Source

SONAR-21858 Fix project overall ratings tooltip text

tags/10.5.0.89998
Ismail Cherri 1 month ago
parent
commit
db209490bc

+ 10
- 2
server/sonar-web/src/main/js/apps/overview/branches/SoftwareImpactRatingTooltip.tsx View File



const intl = useIntl(); const intl = useIntl();


if (!rating || rating === 'A') {
if (rating === undefined) {
return null; return null;
} }


); );
} }


const maintainabilityMessageId =
softwareQuality === SoftwareQuality.Maintainability
? `.${SoftwareQuality.Maintainability}`
: '';

const softwareQualityLabel = intl.formatMessage({ const softwareQualityLabel = intl.formatMessage({
id: `software_quality.${softwareQuality}`, id: `software_quality.${softwareQuality}`,
}); });


return intl.formatMessage( return intl.formatMessage(
{ {
id: 'overview.measures.software_impact.improve_rating_tooltip',
id:
rating === 'A'
? `overview.measures.software_impact.improve_rating_tooltip${maintainabilityMessageId}.A`
: `overview.measures.software_impact.improve_rating_tooltip${maintainabilityMessageId}`,
}, },
{ {
softwareQuality: softwareQualityLabel, softwareQuality: softwareQualityLabel,

+ 21
- 10
server/sonar-web/src/main/js/apps/overview/branches/__tests__/BranchOverview-it.tsx View File

import { mockQualityGateProjectStatus } from '../../../../helpers/mocks/quality-gates'; import { mockQualityGateProjectStatus } from '../../../../helpers/mocks/quality-gates';
import { mockLoggedInUser, mockMeasure, mockPaging } from '../../../../helpers/testMocks'; import { mockLoggedInUser, mockMeasure, mockPaging } from '../../../../helpers/testMocks';
import { renderComponent } from '../../../../helpers/testReactTestingUtils'; import { renderComponent } from '../../../../helpers/testReactTestingUtils';
import { byLabelText, byRole, byText } from '../../../../helpers/testSelector';
import { byRole, byText } from '../../../../helpers/testSelector';
import { SoftwareImpactSeverity, SoftwareQuality } from '../../../../types/clean-code-taxonomy'; import { SoftwareImpactSeverity, SoftwareQuality } from '../../../../types/clean-code-taxonomy';
import { ComponentQualifier } from '../../../../types/component'; import { ComponentQualifier } from '../../../../types/component';
import { MetricKey } from '../../../../types/metrics'; import { MetricKey } from '../../../../types/metrics';
}, },
[false, true, false], [false, true, false],
); );
await ui.expectSoftwareImpactMeasureCardRatingTooltip(
SoftwareQuality.Security,
'B',
'overview.measures.software_impact.improve_rating_tooltip.software_quality.SECURITY.software_quality.security.B.overview.measures.software_impact.severity.LOW.improve_tooltip',
);

ui.expectSoftwareImpactMeasureCard( ui.expectSoftwareImpactMeasureCard(
SoftwareQuality.Reliability, SoftwareQuality.Reliability,
'A', 'A',
undefined, undefined,
true, true,
); );
await ui.expectSoftwareImpactMeasureCardRatingTooltip(
SoftwareQuality.Reliability,
'A',
'overview.measures.software_impact.improve_rating_tooltip.A.software_quality.RELIABILITY.software_quality.reliability.A.overview.measures.software_impact.severity.LOW.improve_tooltip',
);

ui.expectSoftwareImpactMeasureCard( ui.expectSoftwareImpactMeasureCard(
SoftwareQuality.Maintainability, SoftwareQuality.Maintainability,
'E', 'E',
}, },
[false, false, true], [false, false, true],
); );
await ui.expectSoftwareImpactMeasureCardRatingTooltip(
SoftwareQuality.Maintainability,
'E',
'overview.measures.software_impact.improve_rating_tooltip.MAINTAINABILITY.software_quality.MAINTAINABILITY.software_quality.maintainability.E.overview.measures.software_impact.severity.HIGH.improve_tooltip',
);
}); });


// eslint-disable-next-line jest/expect-expect // eslint-disable-next-line jest/expect-expect


ui.expectSoftwareImpactMeasureCard(SoftwareQuality.Security); ui.expectSoftwareImpactMeasureCard(SoftwareQuality.Security);
expect( expect(
byLabelText(
`overview.project.software_impact.has_rating.software_quality.${SoftwareQuality.Security}.B`,
).get(),
ui.softwareImpactMeasureCardRating(SoftwareQuality.Security, 'B').get(),
).toBeInTheDocument(); ).toBeInTheDocument();


ui.expectSoftwareImpactMeasureCard(SoftwareQuality.Reliability); ui.expectSoftwareImpactMeasureCard(SoftwareQuality.Reliability);
expect( expect(
byLabelText(
`overview.project.software_impact.has_rating.software_quality.${SoftwareQuality.Reliability}.A`,
).get(),
ui.softwareImpactMeasureCardRating(SoftwareQuality.Reliability, 'A').get(),
).toBeInTheDocument(); ).toBeInTheDocument();


ui.expectSoftwareImpactMeasureCard(SoftwareQuality.Maintainability); ui.expectSoftwareImpactMeasureCard(SoftwareQuality.Maintainability);
expect( expect(
byLabelText(
`overview.project.software_impact.has_rating.software_quality.${SoftwareQuality.Maintainability}.E`,
).get(),
ui.softwareImpactMeasureCardRating(SoftwareQuality.Maintainability, 'E').get(),
).toBeInTheDocument(); ).toBeInTheDocument();
}); });



+ 14
- 1
server/sonar-web/src/main/js/apps/overview/branches/test-utils.ts View File

* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/ */
import userEvent from '@testing-library/user-event'; import userEvent from '@testing-library/user-event';
import { byRole, byTestId, byText } from '../../../helpers/testSelector';
import { byLabelText, byRole, byTestId, byText } from '../../../helpers/testSelector';
import { import {
SoftwareImpactMeasureData, SoftwareImpactMeasureData,
SoftwareImpactSeverity, SoftwareImpactSeverity,
overallCodeButton: byRole('tab', { name: /overview.overall_code/ }), overallCodeButton: byRole('tab', { name: /overview.overall_code/ }),
softwareImpactMeasureCard: (softwareQuality: SoftwareQuality) => softwareImpactMeasureCard: (softwareQuality: SoftwareQuality) =>
byTestId(`overview__software-impact-card-${softwareQuality}`), byTestId(`overview__software-impact-card-${softwareQuality}`),
softwareImpactMeasureCardRating: (softwareQuality: SoftwareQuality, rating: string) =>
byLabelText(
`overview.project.software_impact.has_rating.software_quality.${softwareQuality}.${rating}`,
),
}; };
const ui = { const ui = {
...selectors, ...selectors,
expect(link).not.toHaveClass('active'); expect(link).not.toHaveClass('active');
} }
}, },
expectSoftwareImpactMeasureCardRatingTooltip: async (
softwareQuality: SoftwareQuality,
rating: string,
text: string,
) => {
await expect(
ui.softwareImpactMeasureCardRating(softwareQuality, rating).get(),
).toHaveATooltipWithContent(text);
},
}; };
return { user, ui }; return { user, ui };
}; };

+ 4
- 1
sonar-core/src/main/resources/org/sonar/l10n/core.properties View File

overview.measures.software_impact.severity.LOW=L overview.measures.software_impact.severity.LOW=L
overview.measures.software_impact.severity.LOW.tooltip=Low Impact overview.measures.software_impact.severity.LOW.tooltip=Low Impact
overview.measures.software_impact.severity.LOW.improve_tooltip=low overview.measures.software_impact.severity.LOW.improve_tooltip=low
overview.measures.software_impact.improve_rating_tooltip={softwareQuality} rating is a {ratingLabel} when there is at least one issue with {severity} impact on the {_softwareQuality} of your software.
overview.measures.software_impact.improve_rating_tooltip=The {softwareQuality} rating is {ratingLabel} when there is at least one issue with {severity} impact on the {_softwareQuality} of your software.
overview.measures.software_impact.improve_rating_tooltip.A=The {softwareQuality} rating is {ratingLabel} when there are no issues with impact on the {_softwareQuality} of your software.
overview.measures.software_impact.improve_rating_tooltip.MAINTAINABILITY=The Maintainability rating is {ratingLabel} if the code has a relatively higher level of technical debt when compared to the size of the codebase.
overview.measures.software_impact.improve_rating_tooltip.MAINTAINABILITY.A=The Maintainability rating is A if the code has a relatively lower level of technical debt when compared to the size of the codebase.


overview.project.no_lines_of_code=This project has no lines of code. overview.project.no_lines_of_code=This project has no lines of code.
overview.project.empty=This project is empty. overview.project.empty=This project is empty.

Loading…
Cancel
Save