import DocumentationLink from '../../components/common/DocumentationLink';
import { DocLink } from '../../helpers/doc-links';
import { translate } from '../../helpers/l10n';
-import { useIsLegacyCCTMode } from '../../queries/settings';
import { ComponentQualifier } from '../../sonar-aligned/types/component';
interface Props {
export default function ChangeInCalculation({ qualifier }: Readonly<Props>) {
const [isPopoverOpen, setIsPopoverOpen] = React.useState(false);
- const { data: isLegacy, isLoading } = useIsLegacyCCTMode();
+ // const { data: isLegacy, isLoading } = useIsLegacyCCTMode();
- if (isLegacy || isLoading) {
- return null;
- }
+ // if (isLegacy || isLoading) {
+ // return null;
+ // }
return (
<Popover
);
const filteredMetrics = difference(metricKeys, [
- ...(allComponentsHaveSoftwareQualityMeasures && !isLegacy
+ ...(allComponentsHaveSoftwareQualityMeasures
? OLD_TAXONOMY_METRICS
: CCT_SOFTWARE_QUALITY_METRICS),
...(allComponentsHaveRatings && !isLegacy
await user.click(ui.maintainabilityDomainBtn.get());
[
'component_measures.metric.new_maintainability_issues.name 5',
- 'Software Quality Maintainability Remediation Effort on new code work_duration.x_minutes.1',
- 'Software Quality Technical Debt Ratio on New Code 1.0%',
- 'Software Quality Maintainability Rating on New Code metric.has_rating_X.D metric.software_quality_maintainability_rating.tooltip.D.0.0%',
+ 'Added Technical Debt work_duration.x_minutes.1',
+ 'Technical Debt Ratio on New Code 1.0%',
+ 'Maintainability Rating on New Code metric.has_rating_X.E metric.sqale_rating.tooltip.E.0.0%',
'component_measures.metric.maintainability_issues.name 2',
- 'Software Quality Maintainability Remediation Effort work_duration.x_minutes.1',
- 'Software Quality Technical Debt Ratio 1.0%',
- 'Software Quality Maintainability Rating metric.has_rating_X.D metric.software_quality_maintainability_rating.tooltip.D.0.0%',
- 'Software Quality Effort to Reach Maintainability Rating A work_duration.x_minutes.1',
+ 'Technical Debt work_duration.x_minutes.1',
+ 'Technical Debt Ratio 1.0%',
+ 'Maintainability Rating metric.has_rating_X.E metric.sqale_rating.tooltip.E.0.0%',
+ 'Effort to Reach Maintainability Rating A work_duration.x_minutes.1',
].forEach((measure) => {
expect(ui.measureLink(measure).get()).toBeInTheDocument();
});
});
- it('should correctly render the default overview and navigation in legacy mode', async () => {
+ // eslint-disable-next-line jest/no-disabled-tests
+ it.skip('should correctly render the default overview and navigation in legacy mode', async () => {
settingsHandler.set(SettingsKey.LegacyMode, 'true');
const { ui, user } = getPageObject();
renderMeasuresApp();
].forEach((measure) => {
expect(ui.measureLink(measure).get()).toBeInTheDocument();
});
- expect(screen.getByText('overview.missing_project_dataTRK')).toBeInTheDocument();
+ // expect(screen.getByText('overview.missing_project_dataTRK')).toBeInTheDocument();
});
- it('should show old measures and no flag message if no rating measures and legacy mode', async () => {
+ // eslint-disable-next-line jest/no-disabled-tests
+ it.skip('should show old measures and no flag message if no rating measures and legacy mode', async () => {
settingsHandler.set(SettingsKey.LegacyMode, 'true');
measuresHandler.deleteComponentMeasure(
'foo',
await user.click(
ui
.measureLink(
- 'Software Quality Maintainability Rating metric.has_rating_X.D metric.software_quality_maintainability_rating.tooltip.D.0.0%',
+ 'Maintainability Rating on New Code metric.has_rating_X.E metric.sqale_rating.tooltip.E.0.0%',
)
.get(),
);
import '../../../components/search-navigator.css';
import AnalysisMissingInfoMessage from '../../../components/shared/AnalysisMissingInfoMessage';
import { translate } from '../../../helpers/l10n';
-import {
- areCCTMeasuresComputed,
- areSoftwareQualityRatingsComputed,
-} from '../../../helpers/measures';
+import { areCCTMeasuresComputed } from '../../../helpers/measures';
import { useCurrentBranchQuery } from '../../../queries/branch';
import { useMeasuresComponentQuery } from '../../../queries/measures';
/>
</FlagMessage>
)}
- {(!areCCTMeasuresComputed(measures) ||
- !areSoftwareQualityRatingsComputed(measures)) && (
+ {!areCCTMeasuresComputed(measures) && (
<AnalysisMissingInfoMessage
className="sw-mb-4"
qualifier={component?.qualifier as ComponentQualifier}
};
});
- if (!isLegacy && areLeakCCTMeasuresComputed(measures)) {
+ if (areLeakCCTMeasuresComputed(measures)) {
populatedMeasures = populatedMeasures.filter(
(measure) => !LEAK_OLD_TAXONOMY_METRICS.includes(measure.metric.key as MetricKey),
);
);
}
- if (!isLegacy && areCCTMeasuresComputed(measures)) {
+ if (areCCTMeasuresComputed(measures)) {
populatedMeasures = populatedMeasures.filter(
(measure) => !OLD_TAXONOMY_METRICS.includes(measure.metric.key as MetricKey),
);
import AnalysisMissingInfoMessage from '../../../components/shared/AnalysisMissingInfoMessage';
import { parseDate } from '../../../helpers/dates';
import { translate } from '../../../helpers/l10n';
-import {
- areCCTMeasuresComputed,
- areSoftwareQualityRatingsComputed,
- isDiffMetric,
-} from '../../../helpers/measures';
+import { areCCTMeasuresComputed, isDiffMetric } from '../../../helpers/measures';
import { CodeScope } from '../../../helpers/urls';
import { useDismissNoticeMutation } from '../../../queries/users';
import { ApplicationPeriod } from '../../../types/application';
const hasNewCodeMeasures = measures.some((m) => isDiffMetric(m.metric.key));
// Check if any potentially missing uncomputed measure is not present
- const isMissingMeasures =
- !areCCTMeasuresComputed(measures) || !areSoftwareQualityRatingsComputed(measures);
+ // const isMissingMeasures =
+ // !areCCTMeasuresComputed(measures) || !areSoftwareQualityRatingsComputed(measures);
+ const isMissingMeasures = !areCCTMeasuresComputed(measures);
const selectTab = (tab: CodeScope) => {
router.replace({ query: { ...query, codeScope: tab } });
getIssueTypeBySoftwareQuality,
} from '../../../helpers/issues';
import { isDefined } from '../../../helpers/types';
-import { useIsLegacyCCTMode } from '../../../queries/settings';
import { Branch } from '../../../types/branch-like';
import { SoftwareImpactMeasureData, SoftwareQuality } from '../../../types/clean-code-taxonomy';
import { QualityGateStatusConditionEnhanced } from '../../../types/quality-gates';
const { component, conditions, softwareQuality, ratingMetricKey, measures, branch } = props;
const intl = useIntl();
- const { data: isLegacy } = useIsLegacyCCTMode();
+ // const { data: isLegacy } = useIsLegacyCCTMode();
// Find measure for this software quality
const metricKey = softwareQualityToMeasure(softwareQuality);
const measureRaw = measures.find((m) => m.metric.key === metricKey);
- const measure = isLegacy
- ? undefined
- : (JSON.parse(measureRaw?.value ?? 'null') as SoftwareImpactMeasureData);
+ const measure = JSON.parse(measureRaw?.value ?? 'null') as SoftwareImpactMeasureData;
const alternativeMeasure = measures.find(
(m) => m.metric.key === SOFTWARE_QUALITIES_METRIC_KEYS_MAP[softwareQuality].deprecatedMetric,
);
'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(SoftwareQuality.Maintainability, 'D', 2);
+ ui.expectSoftwareImpactMeasureCard(SoftwareQuality.Maintainability, 'E', 2);
await ui.expectSoftwareImpactMeasureCardRatingTooltip(
SoftwareQuality.Maintainability,
- 'D',
- 'overview.measures.software_impact.improve_rating_tooltip.MAINTAINABILITY.software_quality.MAINTAINABILITY.software_quality.maintainability.D.overview.measures.software_impact.severity.HIGH.improve_tooltip',
+ 'E',
+ 'overview.measures.software_impact.improve_rating_tooltip.MAINTAINABILITY.software_quality.MAINTAINABILITY.software_quality.maintainability.E.overview.measures.software_impact.severity.HIGH.improve_tooltip',
);
});
await user.click(await ui.overallCodeButton.find());
- ui.expectSoftwareImpactMeasureCard(SoftwareQuality.Maintainability, 'D', 2, '');
+ ui.expectSoftwareImpactMeasureCard(SoftwareQuality.Maintainability, 'E', 2, '');
});
it('should render old measures if software impact are missing', async () => {
},
);
- it('should display info about missing analysis if a project did not compute ratings', async () => {
+ // eslint-disable-next-line jest/no-disabled-tests
+ it.skip('should display info about missing analysis if a project did not compute ratings', async () => {
measuresHandler.deleteComponentMeasure('foo', MetricKey.software_quality_security_rating);
measuresHandler.deleteComponentMeasure(
'foo',
).toBeInTheDocument();
});
- it('should display old measures if in legacy mode', async () => {
+ // eslint-disable-next-line jest/no-disabled-tests
+ it.skip('should display old measures if in legacy mode', async () => {
settingsHandler.set(SettingsKey.LegacyMode, 'true');
const { user, ui } = getPageObjects();
renderBranchOverview();
});
describe('ratings', () => {
- it('should combine old and new rating + gaps', async () => {
+ // eslint-disable-next-line jest/no-disabled-tests
+ it.skip('should combine old and new rating + gaps', async () => {
timeMachineHandler.setMeasureHistory([
mockMeasureHistory({
metric: MetricKey.reliability_rating,
expect(ui.gapInfoMessage.get()).toBeInTheDocument();
});
- it('should not show old rating if new one was always there', async () => {
+ // eslint-disable-next-line jest/no-disabled-tests
+ it.skip('should not show old rating if new one was always there', async () => {
timeMachineHandler.setMeasureHistory([
mockMeasureHistory({
metric: MetricKey.reliability_rating,
).toBeInTheDocument();
});
-it('should show non legacy filters', async () => {
+// eslint-disable-next-line jest/no-disabled-tests
+it.skip('should show non legacy filters', async () => {
settingsHandler.set(SettingsKey.LegacyMode, 'false');
renderPageSidebar();
MetricKey.maintainability_issues,
MetricKey.security_issues,
].every((key) => measures[key] === undefined);
- const noRatingMetrics = [
- MetricKey.software_quality_reliability_rating,
- MetricKey.software_quality_maintainability_rating,
- MetricKey.software_quality_security_rating,
- ].every((key) => measures[key] === undefined);
+ // const noRatingMetrics = [
+ // MetricKey.software_quality_reliability_rating,
+ // MetricKey.software_quality_maintainability_rating,
+ // MetricKey.software_quality_security_rating,
+ // ].every((key) => measures[key] === undefined);
const awaitingScan =
- (noSoftwareQualityMetrics || noRatingMetrics) &&
+ noSoftwareQualityMetrics &&
!isNewCode &&
!isEmpty(analysisDate) &&
measures.ncloc !== undefined;
import { duplicationRatingConverter } from '../../../../components/measure/utils';
import { translate } from '../../../../helpers/l10n';
import { isDefined } from '../../../../helpers/types';
-import { useIsLegacyCCTMode } from '../../../../queries/settings';
import { Dict } from '../../../../types/types';
import ProjectCardMeasure from './ProjectCardMeasure';
);
}
-function renderRatings(props: ProjectCardMeasuresProps, isLegacy: boolean) {
+function renderRatings(props: ProjectCardMeasuresProps) {
const { isNewCode, measures, componentKey } = props;
const measuresByCodeLeak = isNewCode
iconLabel: translate(`metric.${MetricKey.security_issues}.short_name`),
noShrink: true,
metricKey:
- isLegacy || measures[MetricKey.security_issues] === undefined
+ measures[MetricKey.security_issues] === undefined
? MetricKey.vulnerabilities
: MetricKey.security_issues,
metricRatingKey: MetricKey.security_rating,
{
iconLabel: translate(`metric.${MetricKey.reliability_issues}.short_name`),
metricKey:
- isLegacy || measures[MetricKey.reliability_issues] === undefined
+ measures[MetricKey.reliability_issues] === undefined
? MetricKey.bugs
: MetricKey.reliability_issues,
metricRatingKey: MetricKey.reliability_rating,
{
iconLabel: translate(`metric.${MetricKey.maintainability_issues}.short_name`),
metricKey:
- isLegacy || measures[MetricKey.maintainability_issues] === undefined
+ measures[MetricKey.maintainability_issues] === undefined
? MetricKey.code_smells
: MetricKey.maintainability_issues,
metricRatingKey: MetricKey.sqale_rating,
export default function ProjectCardMeasures(props: ProjectCardMeasuresProps) {
const { isNewCode, measures, componentQualifier } = props;
- const { data: isLegacy } = useIsLegacyCCTMode();
+ // const { data: isLegacy } = useIsLegacyCCTMode();
const { ncloc } = measures;
const measureList = [
renderNewIssues(props),
- ...renderRatings(props, !!isLegacy),
+ ...renderRatings(props),
renderCoverage(props),
renderDuplication(props),
].filter(isDefined);
value: '3',
}),
};
+
beforeEach(() => {
measuresHandler.setComponents({
component: mockComponent({ key: PROJECT.key }),
[PROJECT.key]: oldRatings,
});
});
+
it('should not display awaiting analysis badge and do not display old measures', async () => {
measuresHandler.registerComponentMeasures({
- [PROJECT.key]: newRatings,
+ [PROJECT.key]: {
+ ...newRatings,
+ ...oldRatings,
+ },
});
renderProjectCard({
...PROJECT,
expect(screen.getByText('1')).toBeInTheDocument();
expect(screen.getByText('2')).toBeInTheDocument();
expect(screen.getByText('3')).toBeInTheDocument();
- await waitFor(() => expect(screen.getAllByText('B')).toHaveLength(3));
+ await waitFor(() => expect(screen.getAllByText('A')).toHaveLength(3));
await waitFor(() => expect(screen.getAllByText('C')).toHaveLength(1));
expect(screen.queryByText('projects.awaiting_scan')).not.toBeInTheDocument();
expect(screen.queryByText('4')).not.toBeInTheDocument();
expect(screen.queryByText('5')).not.toBeInTheDocument();
expect(screen.queryByText('6')).not.toBeInTheDocument();
- expect(screen.queryByText('A')).not.toBeInTheDocument();
+ expect(screen.queryByText('B')).not.toBeInTheDocument();
});
it('should display awaiting analysis badge and show the old measures', async () => {
[MetricKey.vulnerabilities]: '6',
},
});
- expect(await screen.findByText('projects.awaiting_scan')).toBeInTheDocument();
- expect(screen.getByText('1')).toBeInTheDocument();
+ expect(await screen.findByText('1')).toBeInTheDocument();
+ expect(screen.queryByText('projects.awaiting_scan')).not.toBeInTheDocument();
+
expect(screen.getByText('2')).toBeInTheDocument();
expect(screen.getByText('3')).toBeInTheDocument();
expect(screen.queryByText('4')).not.toBeInTheDocument();
expect(screen.queryByText('projects.awaiting_scan')).not.toBeInTheDocument();
});
- it('should not display awaiting analysis badge if legacy mode is enabled', async () => {
+ // eslint-disable-next-line jest/no-disabled-tests
+ it.skip('should not display awaiting analysis badge if legacy mode is enabled', async () => {
settingsHandler.set(SettingsKey.LegacyMode, 'true');
renderProjectCard({
...PROJECT,
expect(screen.queryByText('projects.awaiting_scan')).not.toBeInTheDocument();
});
- it('should not display new values if legacy mode is enabled', async () => {
+ // eslint-disable-next-line jest/no-disabled-tests
+ it.skip('should not display new values if legacy mode is enabled', async () => {
settingsHandler.set(SettingsKey.LegacyMode, 'true');
measuresHandler.registerComponentMeasures({
[PROJECT.key]: {
import { IMPACT_SEVERITIES } from '../../helpers/constants';
import { DocLink } from '../../helpers/doc-links';
import { translate } from '../../helpers/l10n';
+import { SoftwareImpactSeverity } from '../../types/clean-code-taxonomy';
import DocumentationLink from '../common/DocumentationLink';
import SoftwareImpactSeverityIcon from '../icon-mappers/SoftwareImpactSeverityIcon';
import Facet, { BasicProps } from './Facet';
[],
);
+ const isNotBlockerOrInfo = (severity: string) =>
+ severity !== SoftwareImpactSeverity.Blocker && severity !== SoftwareImpactSeverity.Info;
+
return (
<Facet
{...props}
- options={IMPACT_SEVERITIES}
+ stats={Object.fromEntries(
+ Object.entries(props.stats ?? {})
+ .filter(([key]) => isNotBlockerOrInfo(key))
+ .map(([key, value]) => {
+ switch (key) {
+ case SoftwareImpactSeverity.Low:
+ return [key, value + (props.stats?.[SoftwareImpactSeverity.Info] ?? 0)];
+ case SoftwareImpactSeverity.High:
+ return [key, value + (props.stats?.[SoftwareImpactSeverity.Blocker] ?? 0)];
+ default:
+ return [key, value];
+ }
+ }),
+ )}
+ onChange={(values) => {
+ props.onChange({
+ ...values,
+ impactSeverities: (values.impactSeverities as string[] | undefined)
+ ?.map((s) => {
+ switch (s) {
+ case SoftwareImpactSeverity.Low:
+ return [SoftwareImpactSeverity.Info, SoftwareImpactSeverity.Low];
+ case SoftwareImpactSeverity.High:
+ return [SoftwareImpactSeverity.Blocker, SoftwareImpactSeverity.High];
+ default:
+ return s;
+ }
+ })
+ .flat(),
+ });
+ }}
+ values={props.values.filter(isNotBlockerOrInfo)}
+ options={IMPACT_SEVERITIES.filter(isNotBlockerOrInfo)}
property="impactSeverities"
renderName={renderName}
renderTextName={renderTextName}
import * as React from 'react';
import { FormattedMessage, useIntl } from 'react-intl';
import { DocLink } from '../../helpers/doc-links';
-import { useIsLegacyCCTMode } from '../../queries/settings';
import DocumentationLink from '../common/DocumentationLink';
interface AnalysisMissingInfoMessageProps {
qualifier,
className,
}: Readonly<AnalysisMissingInfoMessageProps>) {
- const { data: isLegacy, isLoading } = useIsLegacyCCTMode();
const intl = useIntl();
+ // const { data: isLegacy, isLoading } = useIsLegacyCCTMode();
- if (hide || isLoading || isLegacy) {
+ if (hide) {
return null;
}
import { addGlobalSuccessMessage } from 'design-system';
import { getValue, getValues, resetSettingValue, setSettingValue } from '../api/settings';
import { translate } from '../helpers/l10n';
-import { ExtendedSettingDefinition, SettingsKey } from '../types/settings';
+import { ExtendedSettingDefinition } from '../types/settings';
import { createQueryHook } from './common';
import { invalidateAllMeasures } from './measures';
);
export const useIsLegacyCCTMode = () => {
- return useGetValueQuery(
- { key: SettingsKey.LegacyMode },
- { staleTime: Infinity, select: (data) => data?.value === 'true' },
- );
+ return useQuery({
+ queryKey: ['mocked-legacy-mode'],
+ queryFn: () => Promise.resolve(true),
+ });
+ // return useGetValueQuery(
+ // { key: SettingsKey.LegacyMode },
+ // { staleTime: Infinity, select: (data) => data?.value === 'true' },
+ // );
};
export function useResetSettingsMutation() {
testImplementation 'com.github.spotbugs:spotbugs-annotations'
testImplementation 'com.tngtech.java:junit-dataprovider'
testImplementation 'org.junit.jupiter:junit-jupiter-api'
- testImplementation 'org.junit.jupiter:junit-jupiter-params'
testImplementation 'org.mockito:mockito-core'
testImplementation 'org.eclipse.jetty:jetty-server'
testImplementation 'org.eclipse.jetty:jetty-servlet'
import org.sonar.server.platform.db.CheckAnyonePermissionsAtStartup;
import org.sonar.server.platform.telemetry.ProjectCppAutoconfigTelemetryProvider;
import org.sonar.server.platform.telemetry.TelemetryFipsEnabledProvider;
-import org.sonar.server.platform.telemetry.TelemetryLegacyModePropertyProvider;
import org.sonar.server.platform.telemetry.TelemetryNclocProvider;
import org.sonar.server.platform.telemetry.TelemetryUserEnabledProvider;
import org.sonar.server.platform.telemetry.TelemetryVersionProvider;
// new telemetry metrics
ProjectCppAutoconfigTelemetryProvider.class,
TelemetryVersionProvider.class,
- TelemetryLegacyModePropertyProvider.class,
TelemetryNclocProvider.class,
TelemetryUserEnabledProvider.class,
TelemetryFipsEnabledProvider.class,
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2024 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.telemetry;
-
-import java.util.Optional;
-import org.sonar.db.DbClient;
-import org.sonar.db.property.PropertyDto;
-import org.sonar.telemetry.core.Dimension;
-import org.sonar.telemetry.core.Granularity;
-import org.sonar.telemetry.core.TelemetryDataProvider;
-import org.sonar.telemetry.core.TelemetryDataType;
-
-import static org.sonar.core.config.LegacyRatingConstants.LEGACY_RATING_MODE_ENABLED;
-import static org.sonar.telemetry.core.Dimension.INSTALLATION;
-import static org.sonar.telemetry.core.Granularity.WEEKLY;
-import static org.sonar.telemetry.core.TelemetryDataType.BOOLEAN;
-
-public class TelemetryLegacyModePropertyProvider implements TelemetryDataProvider<Boolean> {
- private final DbClient dbClient;
-
- public TelemetryLegacyModePropertyProvider(DbClient dbClient) {
- this.dbClient = dbClient;
- }
-
- @Override
- public String getMetricKey() {
- return "legacy_rating_mode_enabled";
- }
-
- @Override
- public Dimension getDimension() {
- return INSTALLATION;
- }
-
- @Override
- public Granularity getGranularity() {
- return WEEKLY;
- }
-
- @Override
- public TelemetryDataType getType() {
- return BOOLEAN;
- }
-
- @Override
- public Optional<Boolean> getValue() {
- PropertyDto property = dbClient.propertiesDao().selectGlobalProperty(LEGACY_RATING_MODE_ENABLED);
- return property == null ? Optional.of(false) : Optional.of(Boolean.valueOf(property.getValue()));
- }
-}
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2024 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.server.platform.telemetry;
-
-import java.util.Optional;
-import java.util.stream.Stream;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.Arguments;
-import org.junit.jupiter.params.provider.MethodSource;
-import org.sonar.db.DbClient;
-import org.sonar.db.property.PropertiesDao;
-import org.sonar.db.property.PropertyDto;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-import static org.sonar.core.config.LegacyRatingConstants.LEGACY_RATING_MODE_ENABLED;
-import static org.sonar.telemetry.core.Dimension.INSTALLATION;
-import static org.sonar.telemetry.core.Granularity.WEEKLY;
-import static org.sonar.telemetry.core.TelemetryDataType.BOOLEAN;
-
-class TelemetryLegacyModePropertyProviderTest {
- private final DbClient dbClient = mock();
- private final PropertiesDao propertiesDao = mock();
- private final TelemetryLegacyModePropertyProvider underTest = new TelemetryLegacyModePropertyProvider(dbClient);
-
- @ParameterizedTest
- @MethodSource("getValues")
- void getter_should_return_correct_values(Boolean value, Boolean expected) {
- when(dbClient.propertiesDao()).thenReturn(propertiesDao);
- if (value == null) {
- when(dbClient.propertiesDao().selectGlobalProperty(LEGACY_RATING_MODE_ENABLED))
- .thenReturn(null);
- } else {
- when(dbClient.propertiesDao().selectGlobalProperty(LEGACY_RATING_MODE_ENABLED))
- .thenReturn(new PropertyDto().setValue(value.toString()));
- }
-
- assertEquals("legacy_rating_mode_enabled", underTest.getMetricKey());
- assertEquals(INSTALLATION, underTest.getDimension());
- assertEquals(WEEKLY, underTest.getGranularity());
- assertEquals(BOOLEAN, underTest.getType());
- assertEquals(Optional.of(expected), underTest.getValue());
- }
-
- public static Stream<Arguments> getValues() {
- return Stream.of(
- Arguments.of(true, true),
- Arguments.of(false, false),
- Arguments.of(null, false)
- );
- }
-
-}
defs.addAll(PurgeProperties.all());
defs.addAll(EmailSettings.definitions());
defs.addAll(ScannerProperties.all());
- defs.addAll(LegacyRatingProperties.all());
defs.addAll(asList(
PropertyDefinition.builder(CoreProperties.MODULE_LEVEL_ARCHIVED_SETTINGS)
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2024 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.core.config;
-
-public class LegacyRatingConstants {
-
- public static final String LEGACY_RATING_CATEGORY = "Legacy rating mode";
- public static final String LEGACY_RATING_SUB_CATEGORY = "Legacy rating mode";
- public static final String LEGACY_RATING_MODE_ENABLED = "sonar.legacy.ratings.mode.enabled";
-
- private LegacyRatingConstants() {
- //class cannot be instantiated
- }
-}
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2024 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.core.config;
-
-import java.util.Collections;
-import java.util.List;
-import org.sonar.api.PropertyType;
-import org.sonar.api.config.PropertyDefinition;
-
-import static org.sonar.core.config.LegacyRatingConstants.LEGACY_RATING_CATEGORY;
-import static org.sonar.core.config.LegacyRatingConstants.LEGACY_RATING_MODE_ENABLED;
-import static org.sonar.core.config.LegacyRatingConstants.LEGACY_RATING_SUB_CATEGORY;
-
-public final class LegacyRatingProperties {
-
- private LegacyRatingProperties() {
- }
-
- public static List<PropertyDefinition> all() {
- return Collections.singletonList(
- PropertyDefinition.builder(LEGACY_RATING_MODE_ENABLED)
- .defaultValue(Boolean.FALSE.toString())
- .name("Enable legacy mode")
- .description("Ratings have updated logic and have grades ranging from A to D, while the old scale ranges from A to E." +
- "<br><br>" +
- "If you choose legacy mode, ratings and other counts will be calculated using the former logic. The old ratings scale (A-E) is " +
- "deprecated and is scheduled for replacement by the new scale (A-D) in the next LTA.")
- .type(PropertyType.BOOLEAN)
- .category(LEGACY_RATING_CATEGORY)
- .subCategory(LEGACY_RATING_SUB_CATEGORY)
- .index(1)
- .build()
- );
-
- }
-}
+++ /dev/null
-/*
- * SonarQube
- * Copyright (C) 2009-2024 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-package org.sonar.core.config;
-
-import org.junit.jupiter.api.Test;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-class LegacyRatingPropertiesTest {
- @Test
- void all_shouldGetProperties() {
- assertThat(LegacyRatingProperties.all()).hasSize(1);
- }
-}