diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 29a632c949f3753b0ea1f7c6ef31c5a9dfbb9307..cd22bc5731e73d917286e7688d51654664f771cb 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -44,10 +44,12 @@ test: when: always - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH' when: always + - if: '$CI_COMMIT_BRANCH' + when: always script: - ./gradlew test jacocoDebugReport -PtestAccountName="$testAccountName" -PtestAccountPwd="$testAccountPwd" -PtestServerUrl="$testServerUrl" - python3 scripts/print_instruction_coverage.py app/build/reports/jacoco/jacocoDebugReport/jacocoDebugReport.xml - coverage: '/INSTRUCTION_COVERAGE\\s+([0-9]{1,3}\\.?[0-9]*)%/' + coverage: '/Total.*?([0-9]{1,3}(?:\\.[0-9]+)?)%/' artifacts: when: always paths: diff --git a/app/src/test/java/foundation/e/apps/data/ResultSupremeTest.kt b/app/src/test/java/foundation/e/apps/data/ResultSupremeTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..00aa857f87b2a96e5b0dc0a6275273a8d71a2741 --- /dev/null +++ b/app/src/test/java/foundation/e/apps/data/ResultSupremeTest.kt @@ -0,0 +1,67 @@ +package foundation.e.apps.data + +import foundation.e.apps.data.enums.ResultStatus +import java.util.concurrent.TimeoutException +import org.junit.Assert.assertEquals +import org.junit.Assert.assertSame +import org.junit.Assert.assertTrue +import org.junit.Test + +class ResultSupremeTest { + + @Test + fun successHoldsDataAndStatus() { + val result = ResultSupreme.Success("value") + + assertTrue(result.isSuccess()) + assertEquals("value", result.data) + assertEquals(ResultStatus.OK, result.getResultStatus()) + assertEquals("", result.message) + } + + @Test + fun timeoutPreservesDataAndException() { + val exception = TimeoutException("late") + val result = ResultSupreme.Timeout(listOf(1, 2, 3), exception) + + assertTrue(result.isTimeout()) + assertEquals(listOf(1, 2, 3), result.data) + assertSame(exception, result.exception) + assertEquals(ResultStatus.TIMEOUT, result.getResultStatus()) + } + + @Test + fun createBuildsUnknownErrorWithDataAndMessage() { + val exception = IllegalStateException("fail") + val result = ResultSupreme.create( + status = ResultStatus.UNKNOWN, + data = "raw", + message = "bad", + exception = exception + ) + + assertTrue(result.isUnknownError()) + assertEquals("raw", result.data) + assertEquals("bad", result.message) + assertSame(exception, result.exception) + } + + @Test + fun replicateCarriesStatusAndOverridesData() { + val base = ResultSupreme.Timeout(listOf("stale")) + base.message = "original" + base.exception = IllegalStateException("timeout") + + val copy = ResultSupreme.replicate( + result = base, + newData = "fresh", + message = "override", + exception = base.exception + ) + + assertTrue(copy.isTimeout()) + assertEquals("fresh", copy.data) + assertEquals("override", copy.message) + assertSame(base.exception, copy.exception) + } +} diff --git a/app/src/test/java/foundation/e/apps/data/fdroid/models/FdroidModelsTest.kt b/app/src/test/java/foundation/e/apps/data/fdroid/models/FdroidModelsTest.kt new file mode 100644 index 0000000000000000000000000000000000000000..f8a98fce8229de41d6dd29b373bbd86637b87e13 --- /dev/null +++ b/app/src/test/java/foundation/e/apps/data/fdroid/models/FdroidModelsTest.kt @@ -0,0 +1,63 @@ +package foundation.e.apps.data.fdroid.models + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Test + +class FdroidModelsTest { + + @Test + fun buildInfoDefaultConstructorSetsEmptyValues() { + val buildInfo = BuildInfo() + + assertEquals("", buildInfo.versionCode) + assertEquals("", buildInfo.versionName) + } + + @Test + fun buildInfoConstructorUsesFallbacksForNulls() { + val buildInfo = BuildInfo(null, null) + + assertEquals("", buildInfo.versionCode) + assertEquals("", buildInfo.versionName) + } + + @Test + fun buildInfoConstructorAssignsProvidedValues() { + val buildInfo = BuildInfo("123", "1.2.3") + + assertEquals("123", buildInfo.versionCode) + assertEquals("1.2.3", buildInfo.versionName) + } + + @Test + fun fdroidApiModelDefaultsToEmptyValues() { + val apiModel = FdroidApiModel() + + assertEquals("", apiModel.authorName) + assertTrue(apiModel.builds.isEmpty()) + } + + @Test + fun fdroidApiModelConstructorSetsProperties() { + val build = BuildInfo("10", "1.0.0") + val apiModel = FdroidApiModel("Author", listOf(build)) + + assertEquals("Author", apiModel.authorName) + assertEquals(listOf(build), apiModel.builds) + } + + @Test + fun fdroidEntityFallsBackToDefaultAuthor() { + val entity = FdroidEntity("pkg", "") + + assertEquals(FdroidEntity.DEFAULT_FDROID_AUTHOR_NAME, entity.authorName) + } + + @Test + fun fdroidEntityKeepsProvidedAuthor() { + val entity = FdroidEntity("pkg", "Author") + + assertEquals("Author", entity.authorName) + } +} diff --git a/scripts/print_instruction_coverage.py b/scripts/print_instruction_coverage.py index fbbd6c7d61b145c3ec46b3d8d69920a4cc97e207..9c71a0e843e9d646316d39af27541ae3710cadbf 100644 --- a/scripts/print_instruction_coverage.py +++ b/scripts/print_instruction_coverage.py @@ -12,7 +12,7 @@ def main() -> None: covered_count = int(instruction_counter.attrib["covered"]) total_instructions = covered_count + missed_count coverage_pct = covered_count / total_instructions * 100 if total_instructions else 0 - print(f"INSTRUCTION_COVERAGE {coverage_pct:.2f}%") + print(f"Total {coverage_pct:.2f}%") if __name__ == "__main__":