diff --git a/server/parsing/coverage-parser/src/main/kotlin/projektor/parser/coverage/CloverCoverageReportParser.kt b/server/parsing/coverage-parser/src/main/kotlin/projektor/parser/coverage/CloverCoverageReportParser.kt index 1a769821c..f59036714 100644 --- a/server/parsing/coverage-parser/src/main/kotlin/projektor/parser/coverage/CloverCoverageReportParser.kt +++ b/server/parsing/coverage-parser/src/main/kotlin/projektor/parser/coverage/CloverCoverageReportParser.kt @@ -1,6 +1,8 @@ package projektor.parser.coverage import projektor.parser.coverage.clover.CloverXmlReportParser +import projektor.parser.coverage.clover.model.CoverageFile +import projektor.parser.coverage.clover.model.CoveragePackage import projektor.parser.coverage.clover.model.LineType import projektor.parser.coverage.clover.model.Metrics import projektor.parser.coverage.model.CoverageReport @@ -12,21 +14,12 @@ class CloverCoverageReportParser : CoverageReportParser { override fun parseReport(reportXml: String, baseDirectoryPath: String?): CoverageReport { val parsedReport = CloverXmlReportParser().parseReport(reportXml) - val files = parsedReport.project.packages.flatMap { pkg -> - pkg.files.map { sourceFile -> - val directoryName = pkg.name.replace(".", "/") - val fileName = sourceFile.name - val filePath = if (baseDirectoryPath != null) "$baseDirectoryPath/$directoryName/$fileName" else "$directoryName/$fileName" - - CoverageReportFile( - directoryName = directoryName, - fileName = fileName, - filePath = filePath, - missedLines = sourceFile.lines?.filter { it.lineCoverageType() == LineType.MISSED }?.map { it.number } ?: listOf(), - partialLines = listOf(), // Clover partial lines from Jest coverage reports is not accurate so don't show anything rather than inaccurate data - stats = createStats(sourceFile.metrics) - ) + val files = if (parsedReport.project.packages != null) { + parsedReport.project.packages.flatMap { pkg -> + pkg.files.map { sourceFile -> createCoverageReportFile(sourceFile, pkg, baseDirectoryPath) } } + } else { + parsedReport.project.files.map { sourceFile -> createCoverageReportFile(sourceFile, null, baseDirectoryPath) } } return CoverageReport( @@ -49,5 +42,20 @@ class CloverCoverageReportParser : CoverageReportParser { ), statementStat = CoverageReportStat(covered = 0, missed = 0) ) + + private fun createCoverageReportFile(sourceFile: CoverageFile, pkg: CoveragePackage?, baseDirectoryPath: String?): CoverageReportFile { + val directoryName = pkg?.name?.replace(".", "/") ?: "" + val fileName = sourceFile.name + val filePath = if (baseDirectoryPath != null) "$baseDirectoryPath/$directoryName/$fileName" else "$directoryName/$fileName" + + return CoverageReportFile( + directoryName = directoryName, + fileName = fileName, + filePath = filePath, + missedLines = sourceFile.lines?.filter { it.lineCoverageType() == LineType.MISSED }?.map { it.number } ?: listOf(), + partialLines = listOf(), // Clover partial lines from Jest coverage reports is not accurate so don't show anything rather than inaccurate data + stats = createStats(sourceFile.metrics) + ) + } } } diff --git a/server/parsing/coverage-parser/src/test/kotlin/projektor/parser/coverage/CoverageParserFileSpec.kt b/server/parsing/coverage-parser/src/test/kotlin/projektor/parser/coverage/CoverageParserFileSpec.kt index 849aed5e4..3ca847aa4 100644 --- a/server/parsing/coverage-parser/src/test/kotlin/projektor/parser/coverage/CoverageParserFileSpec.kt +++ b/server/parsing/coverage-parser/src/test/kotlin/projektor/parser/coverage/CoverageParserFileSpec.kt @@ -138,4 +138,22 @@ class CoverageParserFileSpec : StringSpec({ get { partialLines }.hasSize(0) } } + + "should parse Jest Clover report with no package" { + val reportXml = CloverXmlLoader().noPackage() + + val coverageReport = CoverageParser.parseReport(reportXml, null) + assertNotNull(coverageReport) + + val coverageReportFiles = coverageReport.files + assertNotNull(coverageReportFiles) + expectThat(coverageReportFiles).hasSize(1) + + val actionFile = coverageReportFiles.find { it.fileName == "projektor-action.js" } + expectThat(actionFile).isNotNull().and { + get { directoryName }.isEqualTo("") + get { filePath }.isEqualTo("/projektor-action.js") + get { stats }.get { lineStat }.get { percentCovered }.isEqualTo(BigDecimal("100.00")) + } + } }) diff --git a/server/parsing/jest-xml-parser/src/main/java/projektor/parser/coverage/clover/model/Project.java b/server/parsing/jest-xml-parser/src/main/java/projektor/parser/coverage/clover/model/Project.java index a515fe65b..6dd609aaa 100644 --- a/server/parsing/jest-xml-parser/src/main/java/projektor/parser/coverage/clover/model/Project.java +++ b/server/parsing/jest-xml-parser/src/main/java/projektor/parser/coverage/clover/model/Project.java @@ -17,4 +17,9 @@ public class Project { @JsonProperty("package") @JacksonXmlElementWrapper(useWrapping = false) public List packages; + + // Used if there are no packages + @JsonProperty("file") + @JacksonXmlElementWrapper(useWrapping = false) + public List files; } diff --git a/server/parsing/jest-xml-parser/src/test/groovy/projektor/parser/coverage/clover/CloverXmlReportParserSpec.groovy b/server/parsing/jest-xml-parser/src/test/groovy/projektor/parser/coverage/clover/CloverXmlReportParserSpec.groovy index 1c3897cf0..66c7f0f4a 100644 --- a/server/parsing/jest-xml-parser/src/test/groovy/projektor/parser/coverage/clover/CloverXmlReportParserSpec.groovy +++ b/server/parsing/jest-xml-parser/src/test/groovy/projektor/parser/coverage/clover/CloverXmlReportParserSpec.groovy @@ -1,6 +1,6 @@ package projektor.parser.coverage.clover - +import projektor.parser.coverage.clover.model.Coverage import projektor.server.example.coverage.JacocoXmlLoader import projektor.server.example.coverage.CloverXmlLoader import spock.lang.Specification @@ -12,7 +12,7 @@ class CloverXmlReportParserSpec extends Specification { String reportXml = new CloverXmlLoader().uiClover() when: - projektor.parser.coverage.clover.model.Coverage report = new CloverXmlReportParser().parseReport(reportXml) + Coverage report = new CloverXmlReportParser().parseReport(reportXml) then: report.project != null @@ -29,6 +29,30 @@ class CloverXmlReportParserSpec extends Specification { report.project.metrics.coveredConditionals == 158 } + def "should parse Jest coverage XML report without a package"() { + given: + String reportXml = new CloverXmlLoader().noPackage() + + when: + Coverage report = new CloverXmlReportParser().parseReport(reportXml) + + then: + report.project != null + report.project.metrics != null + + report.project.packages == null + + report.project.name == "All files" + + // + + report.project.metrics.statements == 44 + report.project.metrics.coveredStatements == 44 + + report.project.metrics.conditionals == 24 + report.project.metrics.coveredConditionals == 24 + } + @Unroll def "should determine if report is Jest report #shouldBeJest"() { expect: @@ -36,7 +60,7 @@ class CloverXmlReportParserSpec extends Specification { where: reportXml || shouldBeJest - new CloverXmlLoader().uiClover() || true + new CloverXmlLoader().uiClover() || true new JacocoXmlLoader().jacocoXmlParser() || false } } diff --git a/server/test/coverage-fixtures/src/main/kotlin/projektor/server/example/coverage/CloverXmlLoader.kt b/server/test/coverage-fixtures/src/main/kotlin/projektor/server/example/coverage/CloverXmlLoader.kt index 8261eba5a..b8c3f7723 100644 --- a/server/test/coverage-fixtures/src/main/kotlin/projektor/server/example/coverage/CloverXmlLoader.kt +++ b/server/test/coverage-fixtures/src/main/kotlin/projektor/server/example/coverage/CloverXmlLoader.kt @@ -5,6 +5,7 @@ class CloverXmlLoader : CoverageXmlLoader() { fun uiClover2() = loadTextFromFile("ui-clover-2.xml") fun uiCloverLarge() = loadTextFromFile("ui-clover-large.xml") fun uiCloverManyMissedLines() = loadTextFromFile("ui-clover-many-missed-lines.xml") + fun noPackage() = loadTextFromFile("clover-no-package.xml") fun coverageFilesTable() = loadTextFromFile("clover-append/CoverageFilesTable-clover.xml") fun coverageGraph() = loadTextFromFile("clover-append/CoverageGraph-clover.xml") diff --git a/server/test/coverage-fixtures/src/main/resources/clover-no-package.xml b/server/test/coverage-fixtures/src/main/resources/clover-no-package.xml new file mode 100644 index 000000000..a1f55df9e --- /dev/null +++ b/server/test/coverage-fixtures/src/main/resources/clover-no-package.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file