Skip to content

Commit

Permalink
Improved design of results screens (#13)
Browse files Browse the repository at this point in the history
  • Loading branch information
LachlanMcKee authored Sep 1, 2020
1 parent f36631b commit 1840ec0
Show file tree
Hide file tree
Showing 13 changed files with 192 additions and 52 deletions.
27 changes: 25 additions & 2 deletions backend/src/main/resources/styles.css
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,36 @@ form {
}
.test-success {
color: white;
background-color: green;
background-color: darkgreen;
padding: 12px;
border: 2px solid black;
border-radius: 5px;
}
.test-failure {
color: white;
background-color: red;
background-color: darkred;
padding: 12px;
border: 2px solid black;
border-radius: 5px;
}
.test-in-progress {
color: white;
background-color: #CCCC00;
padding: 12px;
border: 2px solid black;
border-radius: 5px;
}

.test-success a {
color: white;
}

.test-failure a {
color: white;
}

.test-in-progress a {
color: white;
}

p {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,12 @@ internal class BuildsMapperImpl @Inject constructor() : BuildsMapper {
}
},
buildNumber = it.buildNumber,
buildSlug = it.slug
buildSlug = it.slug,
triggeredAt = it.triggeredAt,
finishedAt = it.finishedAt,
originalEnvironmentValueList = it.originalEnvironmentValueList.map { env ->
BuildsData.EnvironmentValue(env.mappedTo, env.value)
}
)
}
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,31 +28,45 @@ class BuildsMapperTest {
commitHash = "commit-hash-dev-1",
commitMessage = "commit-message-dev-1",
buildNumber = 1,
slug = "slug-dev-1"
slug = "slug-dev-1",
triggeredAt = "2020-09-01T16:00:00Z",
finishedAt = "2020-09-01T17:00:00Z",
originalEnvironmentValueList = listOf(
BuildsResponse.EnvironmentValue("ENV1", "VALUE1")
)
),
BuildsResponse.BuildData(
branch = "dev",
statusText = "status-text-dev-2",
commitHash = "commit-hash-dev-2",
commitMessage = "commit-message-dev-2\nSecond Line",
buildNumber = 2,
slug = "slug-dev-2"
slug = "slug-dev-2",
triggeredAt = "2020-09-01T16:00:00Z",
finishedAt = "2020-09-01T17:00:00Z",
originalEnvironmentValueList = emptyList()
),
BuildsResponse.BuildData(
branch = "dev",
statusText = "status-text-dev-3",
commitHash = "commit-hash-dev-3",
commitMessage = null,
buildNumber = 3,
slug = "slug-dev-3"
slug = "slug-dev-3",
triggeredAt = "2020-09-01T16:00:00Z",
finishedAt = "2020-09-01T17:00:00Z",
originalEnvironmentValueList = emptyList()
),
BuildsResponse.BuildData(
branch = "feature1",
statusText = "status-text-feature-1",
commitHash = "commit-hash-feature-1",
commitMessage = "commit-message-feature-1-that-will-exceed-50-characters",
buildNumber = 3,
slug = "slug-feature-1"
slug = "slug-feature-1",
triggeredAt = "2020-09-01T16:00:00Z",
finishedAt = "2020-09-01T17:00:00Z",
originalEnvironmentValueList = emptyList()
)
),
BuildsData(
Expand All @@ -64,21 +78,32 @@ class BuildsMapperTest {
commitHash = "commit-hash-dev-3",
commitMessage = null,
buildNumber = 3,
buildSlug = "slug-dev-3"
buildSlug = "slug-dev-3",
triggeredAt = "2020-09-01T16:00:00Z",
finishedAt = "2020-09-01T17:00:00Z",
originalEnvironmentValueList = emptyList()
),
BuildsData.Build(
status = "status-text-dev-2",
commitHash = "commit-hash-dev-2",
commitMessage = "commit-message-dev-2",
buildNumber = 2,
buildSlug = "slug-dev-2"
buildSlug = "slug-dev-2",
triggeredAt = "2020-09-01T16:00:00Z",
finishedAt = "2020-09-01T17:00:00Z",
originalEnvironmentValueList = emptyList()
),
BuildsData.Build(
status = "status-text-dev-1",
commitHash = "commit-hash-dev-1",
commitMessage = "commit-message-dev-1",
buildNumber = 1,
buildSlug = "slug-dev-1"
buildSlug = "slug-dev-1",
triggeredAt = "2020-09-01T16:00:00Z",
finishedAt = "2020-09-01T17:00:00Z",
originalEnvironmentValueList = listOf(
BuildsData.EnvironmentValue("ENV1", "VALUE1")
)
)
),
"feature1" to listOf(
Expand All @@ -87,7 +112,10 @@ class BuildsMapperTest {
commitHash = "commit-hash-feature-1",
commitMessage = "commit-message-feature-1-that-will-exceed-50-chara...",
buildNumber = 3,
buildSlug = "slug-feature-1"
buildSlug = "slug-feature-1",
triggeredAt = "2020-09-01T16:00:00Z",
finishedAt = "2020-09-01T17:00:00Z",
originalEnvironmentValueList = emptyList()
)
)
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,14 @@ data class BuildsData(
val commitHash: String,
val commitMessage: String?,
val buildNumber: Int,
val buildSlug: String
val buildSlug: String,
val triggeredAt: String,
val finishedAt: String,
val originalEnvironmentValueList: List<EnvironmentValue>
)

data class EnvironmentValue(
val name: String,
val value: String
)
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package net.lachlanmckee.bitrise.core.data.entity

import com.google.gson.FieldNamingPolicy
import com.google.gson.annotations.SerializedName
import gsonpath.GsonResultList
import gsonpath.annotation.AutoGsonAdapter

Expand All @@ -16,7 +17,11 @@ data class BuildsResponse(
val commitHash: String,
val commitMessage: String?,
val buildNumber: Int,
val slug: String
val slug: String,
val triggeredAt: String,
val finishedAt: String,
@SerializedName("original_build_params.environments")
val originalEnvironmentValueList: List<EnvironmentValue>
)

@AutoGsonAdapter(fieldNamingPolicy = [FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES])
Expand All @@ -25,4 +30,10 @@ data class BuildsResponse(
val pageItemLimit: Int,
val next: String
)

@AutoGsonAdapter(fieldNamingPolicy = [FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES])
data class EnvironmentValue(
val mappedTo: String,
val value: String
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package net.lachlanmckee.bitrise.results.domain.entity

internal data class TestResultDetailModel(
val cost: String,
val testSuites: TestSuites,
val matrixIds: String
)
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package net.lachlanmckee.bitrise.results.domain.entity

internal data class TestResultModel(
val cost: String,
val testSuites: TestSuites,
val matrixIds: String
val branch: String,
val status: String,
val commitHash: String,
val triggeredAt: String,
val finishedAt: String,
val buildSlug: String,
val jobName: String?
)
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,6 @@ internal data class TestCase(
val name: String,
val classname: String,
val time: String,
val webLink: String,
val webLink: String?,
val failure: String?
)
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,26 @@ package net.lachlanmckee.bitrise.results.domain.interactor

import net.lachlanmckee.bitrise.core.data.datasource.remote.BitriseDataSource
import net.lachlanmckee.bitrise.core.data.entity.BitriseArtifactsListResponse
import net.lachlanmckee.bitrise.results.domain.entity.TestResultModel
import net.lachlanmckee.bitrise.results.domain.entity.TestResultDetailModel
import net.lachlanmckee.bitrise.results.domain.mapper.TestSuitesMapper
import java.lang.IllegalStateException
import javax.inject.Inject

internal class TestResultInteractor @Inject constructor(
private val bitriseDataSource: BitriseDataSource,
private val testSuitesMapper: TestSuitesMapper
) {
suspend fun execute(buildSlug: String): Result<TestResultModel> {
suspend fun execute(buildSlug: String): Result<TestResultDetailModel> {
return bitriseDataSource
.getArtifactDetails(buildSlug)
.mapCatching { artifactDetails ->
println(artifactDetails)

TestResultModel(
if (artifactDetails.data.isEmpty()) {
throw IllegalStateException("No artifacts found. Perhaps the tests did not run?")
}

TestResultDetailModel(
cost = getArtifactText(artifactDetails, buildSlug, "CostReport.txt"),
testSuites = testSuitesMapper.mapTestSuites(
getArtifactText(
Expand All @@ -37,7 +42,8 @@ internal class TestResultInteractor @Inject constructor(
): String {
val artifactDetail = artifactDetails
.data
.first { it.title == fileName }
.firstOrNull { it.title == fileName }
?: throw IllegalStateException("Unable to find artifact with file name: $fileName")

val artifact = bitriseDataSource
.getArtifact(buildSlug, artifactDetail.slug)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,21 @@ package net.lachlanmckee.bitrise.results.domain.interactor

import net.lachlanmckee.bitrise.core.data.datasource.local.ConfigDataSource
import net.lachlanmckee.bitrise.core.data.datasource.remote.BitriseDataSource
import net.lachlanmckee.bitrise.core.data.entity.BuildsData
import net.lachlanmckee.bitrise.core.domain.mapper.BuildsMapper
import net.lachlanmckee.bitrise.results.domain.entity.TestResultModel
import net.lachlanmckee.bitrise.results.domain.mapper.TestResultsListMapper
import javax.inject.Inject

internal class TestResultsListInteractor @Inject constructor(
private val bitriseDataSource: BitriseDataSource,
private val configDataSource: ConfigDataSource,
private val buildsMapper: BuildsMapper
private val buildsMapper: BuildsMapper,
private val testResultsListMapper: TestResultsListMapper
) {
suspend fun execute(): Result<BuildsData> {
suspend fun execute(): Result<List<TestResultModel>> {
return bitriseDataSource
.getBuilds(configDataSource.getConfig().bitrise.testTriggerWorkflow)
.mapCatching(buildsMapper::mapBuilds)
.mapCatching(testResultsListMapper::mapToTestResultsList)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package net.lachlanmckee.bitrise.results.domain.mapper

import net.lachlanmckee.bitrise.core.data.entity.BuildsData
import net.lachlanmckee.bitrise.results.domain.entity.TestResultModel
import javax.inject.Inject

internal class TestResultsListMapper @Inject constructor() {
fun mapToTestResultsList(buildsData: BuildsData): List<TestResultModel> {
return buildsData.branchBuilds.entries.flatMap { (branch, builds) ->
builds.map { build ->
TestResultModel(
branch = branch,
status = build.status,
commitHash = build.commitHash,
triggeredAt = build.triggeredAt,
finishedAt = build.finishedAt,
buildSlug = build.buildSlug,
jobName = build.originalEnvironmentValueList
.find { envValue -> envValue.name == "JOB_NAME" }
?.value
)
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import io.ktor.application.ApplicationCall
import io.ktor.html.respondHtml
import kotlinx.html.*
import net.lachlanmckee.bitrise.core.presentation.ErrorScreenFactory
import net.lachlanmckee.bitrise.results.domain.entity.TestResultModel
import net.lachlanmckee.bitrise.results.domain.entity.TestResultDetailModel
import net.lachlanmckee.bitrise.results.domain.interactor.TestResultInteractor

internal class TestResultScreen(
Expand All @@ -20,7 +20,7 @@ internal class TestResultScreen(

private suspend fun render(
call: ApplicationCall,
resultModel: TestResultModel
resultDetailModel: TestResultDetailModel
) {
call.respondHtml {
head {
Expand All @@ -35,11 +35,11 @@ internal class TestResultScreen(
span {
classes = setOf("content")
b {
text(resultModel.cost)
text(resultDetailModel.cost)
}
}
}
resultModel.testSuites.testsuite.forEach { testSuite ->
resultDetailModel.testSuites.testsuite.forEach { testSuite ->
div {
p {
classes = setOf("heading")
Expand All @@ -62,16 +62,24 @@ internal class TestResultScreen(
}
}
span {
classes = if (testCase.failure != null) {
setOf("content", "test-failure")
} else {
setOf("content", "test-success")
classes = when {
testCase.failure != null -> {
setOf("content", "test-failure")
}
testCase.webLink == null -> {
setOf("content", "test-in-progress")
}
else -> {
setOf("content", "test-success")
}
}
text("${testCase.classname}#${testCase.name}")
br()
a(href = testCase.webLink) {
target = "_blank"
text("Open in Firebase")
if (testCase.webLink != null) {
a(href = testCase.webLink) {
target = "_blank"
text("Open in Firebase")
}
}
}
}
Expand Down
Loading

0 comments on commit 1840ec0

Please sign in to comment.