Skip to content

Commit 465bbee

Browse files
henryjuclaude
authored andcommitted
SONARPY-3821 Save ncloc metric on test files
Enable saving the NCLOC metric for test files in MeasuresRepository, skipped in SonarLint context, consistent with main file behavior. Co-Authored-By: Claude Sonnet 4.6 <[email protected]> GitOrigin-RevId: 844dc0115370b295c77bba31b24aabc835a3e378
1 parent 546a52e commit 465bbee

4 files changed

Lines changed: 44 additions & 5 deletions

File tree

its/plugin/it-python-plugin-test/src/test/java/com/sonar/python/it/plugin/MetricsTest.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,15 +75,23 @@ static void startServer() {
7575
@Test
7676
void project_level() {
7777
// Size
78-
assertThat(getProjectMeasureAsInt(NCLOC)).isEqualTo(6);
78+
assertThat(getProjectMeasureAsInt(NCLOC)).satisfiesAnyOf(
79+
nclocValue -> assertThat(nclocValue).isEqualTo(6),
80+
// FIXME SONAR-27110 Can be removed when ITs will be run with SQS 2026.2+
81+
nclocValue -> assertThat(nclocValue).isEqualTo(20)
82+
);
7983
assertThat(getProjectMeasureAsInt(LINES)).isEqualTo(13);
8084
assertThat(getProjectMeasureAsInt(FILES)).isEqualTo(2);
8185
assertThat(getProjectMeasureAsInt(STATEMENTS)).isEqualTo(6);
8286
assertThat(getProjectMeasureAsInt(FUNCTIONS)).isOne();
8387
assertThat(getProjectMeasureAsInt(CLASSES)).isZero();
8488
// Documentation
8589
assertThat(getProjectMeasureAsInt(COMMENT_LINES)).isOne();
86-
assertThat(getProjectMeasureAsDouble(COMMENT_LINES_DENSITY)).isEqualTo(14.3, OFFSET);
90+
assertThat(getProjectMeasureAsDouble(COMMENT_LINES_DENSITY))
91+
.satisfiesAnyOf(
92+
density -> assertThat(density).isEqualTo(14.3, OFFSET),
93+
// FIXME SONAR-27110 Can be removed when ITs will be run with SQS 2026.2+
94+
density -> assertThat(density).isEqualTo(4.8, OFFSET));
8795
// Complexity
8896
assertThat(getProjectMeasureAsDouble(COMPLEXITY)).isEqualTo(3.0, OFFSET);
8997
assertThat(getProjectMeasureAsDouble(COGNITIVE_COMPLEXITY)).isEqualTo(3.0, OFFSET);

python-commons/src/main/java/org/sonar/plugins/python/MeasuresRepository.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,14 @@ public void save(PythonInputFile inputFile, PythonVisitorContext visitorContext)
6161
}
6262
}
6363

64+
public void saveNclocForTestFile(PythonInputFile inputFile, PythonVisitorContext visitorContext) {
65+
if (!isInSonarLint) {
66+
FileMetrics fileMetrics = new FileMetrics(visitorContext, isNotebook(inputFile));
67+
int linesOfCode = fileMetrics.fileLinesVisitor().getLinesOfCode().size();
68+
saveMetricOnFile(inputFile, CoreMetrics.NCLOC, linesOfCode);
69+
}
70+
}
71+
6472
private void saveInternal(PythonInputFile inputFile, PythonVisitorContext visitorContext) {
6573
FileMetrics fileMetrics = new FileMetrics(visitorContext, isNotebook(inputFile));
6674
FileLinesVisitor fileLinesVisitor = fileMetrics.fileLinesVisitor();

python-commons/src/main/java/org/sonar/plugins/python/PythonScanner.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,9 +135,13 @@ protected void scanFile(PythonInputFile inputFile) throws IOException {
135135

136136
noSonarLineInfoCollector.collect(pythonFile.key(), visitorContext.rootTree());
137137

138-
if (fileType == InputFile.Type.MAIN && visitorContext.rootTree() != null) {
139-
pushTokens(inputFile, visitorContext);
140-
measuresRepository.save(inputFile, visitorContext);
138+
if (visitorContext.rootTree() != null) {
139+
if (fileType == InputFile.Type.MAIN) {
140+
pushTokens(inputFile, visitorContext);
141+
measuresRepository.save(inputFile, visitorContext);
142+
} else if (fileType == InputFile.Type.TEST) {
143+
measuresRepository.saveNclocForTestFile(inputFile, visitorContext);
144+
}
141145
}
142146

143147
var issues = visitorContext.getIssues();

python-commons/src/test/java/org/sonar/plugins/python/PythonSensorTest.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,25 @@ void test_issues_on_test_files() {
610610
assertThat(issue.ruleKey().rule()).isEqualTo("S5905");
611611
}
612612

613+
@Test
614+
void test_ncloc_metric_on_test_file() {
615+
activeRules = new ActiveRulesBuilder().build();
616+
PythonInputFile inputFile = inputFile(FILE_TEST_FILE, Type.TEST);
617+
sensor().execute(context);
618+
619+
assertThat(context.measure(inputFile.wrappedFile().key(), CoreMetrics.NCLOC).value()).isEqualTo(3);
620+
}
621+
622+
@Test
623+
void test_ncloc_metric_not_saved_on_test_file_in_sonarlint() {
624+
context.setRuntime(SONARLINT_RUNTIME);
625+
activeRules = new ActiveRulesBuilder().build();
626+
PythonInputFile inputFile = inputFile(FILE_TEST_FILE, Type.TEST);
627+
sensor().execute(context);
628+
629+
assertThat(context.measure(inputFile.wrappedFile().key(), CoreMetrics.NCLOC)).isNull();
630+
}
631+
613632
@Test
614633
void test_failFast_triggered_on_main_files() {
615634
activeRules = new ActiveRulesBuilder()

0 commit comments

Comments
 (0)