Skip to content

Commit

Permalink
Improved the test result details screen layout (#44)
Browse files Browse the repository at this point in the history
  • Loading branch information
LachlanMcKee authored Oct 11, 2020
1 parent b7ae1b7 commit 80f51db
Show file tree
Hide file tree
Showing 8 changed files with 230 additions and 56 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,6 @@ data class TestSuites(
@JsonIgnoreProperties(ignoreUnknown = true)
data class TestSuite(
val name: String,
val tests: Int,
val failures: Int,
val time: String,
val testcase: List<TestCase>?
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,14 @@ internal data class TestSuiteModel(
val totalTests: Int,
val successfulTestCount: Int,
val time: String,
val resultType: TestResultType,
val testCases: List<TestModel>
)

internal data class TestModel(
val path: String,
val webLink: String?,
val resultType: TestResultType
val time: String
)

internal enum class TestResultType {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ internal class TestResultInteractor @Inject constructor(
testSuiteModelList = bitriseDataSource
.getTestResults(buildSlug)
.getOrThrow()
.map(testSuiteModelMapper::mapToTestSuiteModel)
.let(testSuiteModelMapper::mapToTestSuiteModelList)
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,28 +8,54 @@ import net.lachlanmckee.bitrise.results.domain.entity.TestSuiteModel
import javax.inject.Inject

internal class TestSuiteModelMapper @Inject constructor() {
fun mapToTestSuiteModel(testSuite: TestSuite): TestSuiteModel {
return TestSuiteModel(
name = testSuite.name,
totalTests = testSuite.tests,
successfulTestCount = testSuite.tests - testSuite.failures,
time = testSuite.time,
testCases = testSuite
.testcase
?.map(::mapToTestModel)
?: emptyList()
)
fun mapToTestSuiteModelList(testSuiteList: List<TestSuite>): List<TestSuiteModel> {
return testSuiteList
.fold(emptyMap<NameAndResultType, List<TestCase>>()) { acc1, testSuite ->
testSuite.testcase?.fold(acc1) { acc2, testCase ->
val resultType = when {
testCase.failure != null -> TestResultType.FAILURE
testCase.webLink == null -> TestResultType.SKIPPED
else -> TestResultType.SUCCESS
}

val groupKey = NameAndResultType(testSuite.name, resultType)

acc2.plus(
groupKey to acc2.getOrDefault(groupKey, emptyList())
.plus(testCase)
)
} ?: acc1
}
.map { testGroup: Map.Entry<NameAndResultType, List<TestCase>> ->
TestSuiteModel(
name = testGroup.key.name,
totalTests = testGroup.value.count(),
successfulTestCount = testGroup.value.count {
it.failure == null && it.webLink != null
},
time = String.format("%.2f", testGroup.value.sumByDouble { it.time.toDouble() }),
resultType = testGroup.key.resultType,
testCases = testGroup.value
.map(::mapToTestModel)
.sortedBy { it.path }
)
}
.sortedWith(
compareBy<TestSuiteModel> { it.resultType }
.thenBy { it.name }
)
}

private fun mapToTestModel(testCase: TestCase): TestModel {
return TestModel(
path = "${testCase.classname}#${testCase.name}",
webLink = testCase.webLink?.trim(),
resultType = when {
testCase.failure != null -> TestResultType.FAILURE
testCase.webLink == null -> TestResultType.SKIPPED
else -> TestResultType.SUCCESS
}
time = testCase.time
)
}

private data class NameAndResultType(
val name: String,
val resultType: TestResultType
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ internal class TestResultScreen(
p {
classes = setOf("content")
b {
text("${testSuite.name}. Success: ${testSuite.successfulTestCount}/${testSuite.totalTests}, Time: ${testSuite.time}")
text("${testSuite.name}. Tests: ${testSuite.totalTests}. Total Duration: ${testSuite.time}")
}
}
}
Expand All @@ -93,6 +93,10 @@ internal class TestResultScreen(
classes = setOf("mdl-data-table__cell--non-numeric")
text("Result")
}
th {
classes = setOf("mdl-data-table__cell--non-numeric")
text("Duration")
}
th {
classes = setOf("mdl-data-table__cell--non-numeric")
text("Test")
Expand All @@ -102,7 +106,7 @@ internal class TestResultScreen(
tbody {
testSuite.testCases.forEach { testCase ->
tr {
classes = when (testCase.resultType) {
classes = when (testSuite.resultType) {
TestResultType.FAILURE -> {
setOf("test-failure")
}
Expand All @@ -115,7 +119,7 @@ internal class TestResultScreen(
}
td {
text(
when (testCase.resultType) {
when (testSuite.resultType) {
TestResultType.FAILURE -> {
"Failure"
}
Expand All @@ -128,6 +132,9 @@ internal class TestResultScreen(
}
)
}
td {
text(testCase.time)
}
td {
text(testCase.path)
br()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
package net.lachlanmckee.bitrise.results.domain.mapper

import net.lachlanmckee.bitrise.core.data.entity.TestCase
import net.lachlanmckee.bitrise.core.data.entity.TestSuite
import net.lachlanmckee.bitrise.results.domain.entity.TestModel
import net.lachlanmckee.bitrise.results.domain.entity.TestResultType
import net.lachlanmckee.bitrise.results.domain.entity.TestSuiteModel
import org.junit.jupiter.api.Test
import kotlin.test.assertEquals

internal class TestSuiteModelMapperTest {
@Test
fun givenEmptyList_whenMap_thenExpectEmptyList() = test(
input = emptyList(),
output = emptyList()
)

@Test
fun givenNonEmptyList_whenMap_thenExpectTestSuiteModelList() = test(
input = listOf(
TestSuite(
name = "Device2",
testcase = listOf(
TestCase(
name = "testB",
classname = "com.example.TestClass2",
time = "5.00",
webLink = " link ",
failure = "failureReason"
),
TestCase(
name = "testA",
classname = "com.example.TestClass1",
time = "5.00",
webLink = " link ",
failure = null
)
)
),
TestSuite(
name = "Device1",
testcase = listOf(
TestCase(
name = "testC",
classname = "com.example.TestClass3",
time = "5.00",
webLink = " link ",
failure = "failureReason"
)
)
),
TestSuite(
name = "Device1",
testcase = listOf(
TestCase(
name = "testB",
classname = "com.example.TestClass2",
time = "5.00",
webLink = " link ",
failure = null
),
TestCase(
name = "testA",
classname = "com.example.TestClass1",
time = "5.00",
webLink = " link ",
failure = null
)
)
),
TestSuite(
name = "Device2",
testcase = listOf(
TestCase(
name = "testC",
classname = "com.example.TestClass3",
time = "5.00",
webLink = " link ",
failure = null
)
)
)
),
output = listOf(
TestSuiteModel(
name = "Device1",
totalTests = 1,
successfulTestCount = 0,
time = "5.00",
resultType = TestResultType.FAILURE,
testCases = listOf(
TestModel(
path = "com.example.TestClass3#testC",
webLink = "link",
time = "5.00"
)
)
),
TestSuiteModel(
name = "Device2",
totalTests = 1,
successfulTestCount = 0,
time = "5.00",
resultType = TestResultType.FAILURE,
testCases = listOf(
TestModel(
path = "com.example.TestClass2#testB",
webLink = "link",
time = "5.00"
)
)
),
TestSuiteModel(
name = "Device1",
totalTests = 2,
successfulTestCount = 2,
time = "10.00",
resultType = TestResultType.SUCCESS,
testCases = listOf(
TestModel(
path = "com.example.TestClass1#testA",
webLink = "link",
time = "5.00"
),
TestModel(
path = "com.example.TestClass2#testB",
webLink = "link",
time = "5.00"
)
)
),
TestSuiteModel(
name = "Device2",
totalTests = 2,
successfulTestCount = 2,
time = "10.00",
resultType = TestResultType.SUCCESS,
testCases = listOf(
TestModel(
path = "com.example.TestClass1#testA",
webLink = "link",
time = "5.00"
),
TestModel(
path = "com.example.TestClass3#testC",
webLink = "link",
time = "5.00"
)
)
)
)
)

private fun test(input: List<TestSuite>, output: List<TestSuiteModel>) {
assertEquals(output, TestSuiteModelMapper().mapToTestSuiteModelList(input))
}
}
44 changes: 18 additions & 26 deletions results/src/test/resources/output/test-result/expected.html
Original file line number Diff line number Diff line change
Expand Up @@ -16,59 +16,51 @@ <h1>Bitrise Test Result</h1>
</b></span></div>
<div>
<p class="heading"></p>
<p class="content"><b>Pixel2-28-en-portrait. Success: 1/1, Time: 5.000</b></p>
<p class="content"><b>Pixel2-28-en-portrait. Tests: 3. Total Duration: 18.00</b></p>
</div>
<table class="mdl-data-table mdl-js-data-table mdl-shadow--2dp">
<thead>
<tr>
<th class="mdl-data-table__cell--non-numeric">Result</th>
<th class="mdl-data-table__cell--non-numeric">Duration</th>
<th class="mdl-data-table__cell--non-numeric">Test</th>
</tr>
</thead>
<tbody>
<tr class="test-success">
<td>Success</td>
<td>com.example.TestClass1#testA<br><a href="https://console.firebase.google.com/project/fake-project-id/testlab/histories/history-id/matrices/matrices-id/executions/execution-1/testcases/1" target="_blank">Open in Firebase</a></td>
<tr class="test-failure">
<td>Failure</td>
<td>6.000</td>
<td>com.example.TestClass1#testB<br><a href="https://console.firebase.google.com/project/fake-project-id/testlab/histories/history-id/matrices/matrices-id/executions/execution-2/testcases/1" target="_blank">Open in Firebase</a></td>
</tr>
</tbody>
</table>
<div>
<p class="heading"></p>
<p class="content"><b>Pixel2-28-en-portrait. Success: 0/1, Time: 6.000</b></p>
</div>
<table class="mdl-data-table mdl-js-data-table mdl-shadow--2dp">
<thead>
<tr>
<th class="mdl-data-table__cell--non-numeric">Result</th>
<th class="mdl-data-table__cell--non-numeric">Test</th>
<tr class="test-failure">
<td>Failure</td>
<td>6.000</td>
<td>com.example.TestClass1#testB<br><a href="https://console.firebase.google.com/project/fake-project-id/testlab/histories/history-id/matrices/matrices-id/executions/execution-3/testcases/1" target="_blank">Open in Firebase</a></td>
</tr>
</thead>
<tbody>
<tr class="test-failure">
<td>Failure</td>
<td>com.example.TestClass1#testB<br><a href="https://console.firebase.google.com/project/fake-project-id/testlab/histories/history-id/matrices/matrices-id/executions/execution-2/testcases/1" target="_blank">Open in Firebase</a></td>
<td>6.000</td>
<td>com.example.TestClass2#testA<br><a href="https://console.firebase.google.com/project/fake-project-id/testlab/histories/history-id/matrices/matrices-id/executions/execution-3/testcases/2" target="_blank">Open in Firebase</a></td>
</tr>
</tbody>
</table>
<div>
<p class="heading"></p>
<p class="content"><b>Pixel2-28-en-portrait. Success: 0/2, Time: 7.000</b></p>
<p class="content"><b>Pixel2-28-en-portrait. Tests: 1. Total Duration: 5.00</b></p>
</div>
<table class="mdl-data-table mdl-js-data-table mdl-shadow--2dp">
<thead>
<tr>
<th class="mdl-data-table__cell--non-numeric">Result</th>
<th class="mdl-data-table__cell--non-numeric">Duration</th>
<th class="mdl-data-table__cell--non-numeric">Test</th>
</tr>
</thead>
<tbody>
<tr class="test-failure">
<td>Failure</td>
<td>com.example.TestClass1#testB<br><a href="https://console.firebase.google.com/project/fake-project-id/testlab/histories/history-id/matrices/matrices-id/executions/execution-3/testcases/1" target="_blank">Open in Firebase</a></td>
</tr>
<tr class="test-failure">
<td>Failure</td>
<td>com.example.TestClass2#testA<br><a href="https://console.firebase.google.com/project/fake-project-id/testlab/histories/history-id/matrices/matrices-id/executions/execution-3/testcases/2" target="_blank">Open in Firebase</a></td>
<tr class="test-success">
<td>Success</td>
<td>5.000</td>
<td>com.example.TestClass1#testA<br><a href="https://console.firebase.google.com/project/fake-project-id/testlab/histories/history-id/matrices/matrices-id/executions/execution-1/testcases/1" target="_blank">Open in Firebase</a></td>
</tr>
</tbody>
</table>
Expand Down
Loading

0 comments on commit 80f51db

Please sign in to comment.