Skip to content

Commit

Permalink
Add redirect to latest test run in badge (#1217)
Browse files Browse the repository at this point in the history
  • Loading branch information
craigatk authored Apr 1, 2024
1 parent b0fa30a commit 25c8a01
Show file tree
Hide file tree
Showing 4 changed files with 122 additions and 7 deletions.
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
# Projektor

| Project | Tests | Coverage |
|------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Server & Gradle plugin | [![Test results](https://projektorlive.herokuapp.com/repo/craigatk/projektor/badge/tests)](https://projektorlive.herokuapp.com/repository/craigatk/projektor/) | [![Code coverage percentage](https://projektorlive.herokuapp.com/repo/craigatk/projektor/badge/coverage)](https://projektorlive.herokuapp.com/repository/craigatk/projektor/coverage) |
| UI | [![Test results](https://projektorlive.herokuapp.com/repo/craigatk/projektor/project/ui-jest/badge/tests)](https://projektorlive.herokuapp.com/repository/craigatk/projektor/project/ui-jest/) | [![Code coverage percentage](https://projektorlive.herokuapp.com/repo/craigatk/projektor/project/ui-jest/badge/coverage)](https://projektorlive.herokuapp.com/repository/craigatk/projektor/project/ui-jest/coverage) |
| Node publisher | [![Test results](https://projektorlive.herokuapp.com/repo/craigatk/projektor/project/node-script/badge/tests)](https://projektorlive.herokuapp.com/repository/craigatk/projektor/project/node-script/) | [![Code coverage percentage](https://projektorlive.herokuapp.com/repo/craigatk/projektor/project/node-script/badge/coverage)](https://projektorlive.herokuapp.com/repository/craigatk/projektor/project/node-script/coverage) |
| Project | Tests | Coverage |
|------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Server & Gradle plugin | [![Test results](https://projektorlive.herokuapp.com/repo/craigatk/projektor/badge/tests)](https://projektorlive.herokuapp.com/repo/craigatk/projektor/run/latest) | [![Code coverage percentage](https://projektorlive.herokuapp.com/repo/craigatk/projektor/badge/coverage)](https://projektorlive.herokuapp.com/repository/craigatk/projektor/coverage) |
| UI | [![Test results](https://projektorlive.herokuapp.com/repo/craigatk/projektor/project/ui-jest/badge/tests)](https://projektorlive.herokuapp.com/repo/craigatk/projektor/project/ui-jest/run/latest) | [![Code coverage percentage](https://projektorlive.herokuapp.com/repo/craigatk/projektor/project/ui-jest/badge/coverage)](https://projektorlive.herokuapp.com/repository/craigatk/projektor/project/ui-jest/coverage) |
| Node publisher | [![Test results](https://projektorlive.herokuapp.com/repo/craigatk/projektor/project/node-script/badge/tests)](https://projektorlive.herokuapp.com/repo/craigatk/projektor/project/node-script/run/latest) | [![Code coverage percentage](https://projektorlive.herokuapp.com/repo/craigatk/projektor/project/node-script/badge/coverage)](https://projektorlive.herokuapp.com/repository/craigatk/projektor/project/node-script/coverage) |

For detailed instructions to get started with Projektor, please see the full project documentation at https://projektor.dev

Expand Down
2 changes: 1 addition & 1 deletion server/server-app/src/main/kotlin/projektor/Application.kt
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ fun Application.main(meterRegistry: MeterRegistry? = null) {
organization(organizationCoverageService)
performance(performanceResultsService)
previousRuns(previousTestRunService)
repository(repositoryTestRunService)
repository(previousTestRunService, repositoryTestRunService)
repositoryCoverage(repositoryCoverageService)
repositoryPerformance(repositoryPerformanceService)
results(testResultsService, groupedTestResultsService, testResultsProcessingService, authService, metricRegistry, metricsService)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,18 @@ package projektor.route
import io.ktor.http.HttpStatusCode
import io.ktor.server.application.ApplicationCall
import io.ktor.server.application.call
import io.ktor.server.response.respond
import io.ktor.server.response.*
import io.ktor.server.routing.Route
import io.ktor.server.routing.get
import io.ktor.server.util.getOrFail
import projektor.compare.PreviousTestRunService
import projektor.repository.testrun.RepositoryTestRunService
import projektor.server.api.repository.BranchSearch
import projektor.server.api.repository.BranchType
import projektor.server.api.repository.RepositoryFlakyTests

fun Route.repository(
previousTestRunService: PreviousTestRunService,
repositoryTestRunService: RepositoryTestRunService
) {
get("/repo/{orgPart}/{repoPart}/timeline") {
Expand Down Expand Up @@ -106,4 +109,35 @@ fun Route.repository(
call
)
}

get("/repo/{orgPart}/{repoPart}/run/latest") {
val orgPart = call.parameters.getOrFail("orgPart")
val repoPart = call.parameters.getOrFail("repoPart")
val fullRepoName = "$orgPart/$repoPart"

val latestTestRun = previousTestRunService.findMostRecentRun(
fullRepoName,
null,
BranchSearch(branchType = BranchType.MAINLINE)
)

latestTestRun?.let { call.respondRedirect("/tests/${latestTestRun.publicId.id}", permanent = false) }
?: call.respond(HttpStatusCode.NoContent)
}

get("/repo/{orgPart}/{repoPart}/project/{projectName}/run/latest") {
val orgPart = call.parameters.getOrFail("orgPart")
val repoPart = call.parameters.getOrFail("repoPart")
val projectName = call.parameters.getOrFail("projectName")
val fullRepoName = "$orgPart/$repoPart"

val latestTestRun = previousTestRunService.findMostRecentRun(
fullRepoName,
projectName,
BranchSearch(branchType = BranchType.MAINLINE)
)

latestTestRun?.let { call.respondRedirect("/tests/${latestTestRun.publicId.id}", permanent = false) }
?: call.respond(HttpStatusCode.NoContent)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package projektor.repository.testrun

import io.ktor.http.*
import io.ktor.server.testing.*
import org.apache.commons.lang3.RandomStringUtils
import org.junit.jupiter.api.Test
import projektor.ApplicationTestCase
import projektor.incomingresults.randomPublicId
import strikt.api.expectThat
import strikt.assertions.isEqualTo

class RepositoryLatestRunApplicationTest : ApplicationTestCase() {
@Test
fun `when repo with no project has test run should redirect to latest test run`() {
val orgName = RandomStringUtils.randomAlphabetic(12)
val repoName = "$orgName/repo"
val projectName = null

val olderRunPublicId = randomPublicId()
val newerRunPublicId = randomPublicId()

withTestApplication(::createTestApplication) {
handleRequest(HttpMethod.Get, "/repo/$repoName/run/latest") {
testRunDBGenerator.createSimpleTestRunInRepo(olderRunPublicId, repoName, true, projectName)
testRunDBGenerator.createSimpleTestRunInRepo(newerRunPublicId, repoName, true, projectName)
}.apply {
expectThat(response.status()).isEqualTo(HttpStatusCode.Found)

expectThat(response.headers["Location"]).isEqualTo("/tests/$newerRunPublicId")
}
}
}

@Test
fun `when repo with with project has test run should redirect to latest test run`() {
val orgName = RandomStringUtils.randomAlphabetic(12)
val repoName = "$orgName/repo"
val projectName = "my-proj"

val olderRunPublicId = randomPublicId()
val newerRunPublicId = randomPublicId()

withTestApplication(::createTestApplication) {
handleRequest(HttpMethod.Get, "/repo/$repoName/project/$projectName/run/latest") {
testRunDBGenerator.createSimpleTestRunInRepo(olderRunPublicId, repoName, true, projectName)
testRunDBGenerator.createSimpleTestRunInRepo(newerRunPublicId, repoName, true, projectName)
}.apply {
expectThat(response.status()).isEqualTo(HttpStatusCode.Found)

expectThat(response.headers["Location"]).isEqualTo("/tests/$newerRunPublicId")
}
}
}

@Test
fun `when repo with no project has no test runs should return no-content response`() {
val orgName = RandomStringUtils.randomAlphabetic(12)
val repoName = "$orgName/repo"

withTestApplication(::createTestApplication) {
handleRequest(HttpMethod.Get, "/repo/$repoName/run/latest") {
}.apply {
expectThat(response.status()).isEqualTo(HttpStatusCode.NoContent)
}
}
}

@Test
fun `when repo with project has no test runs should return no-content response`() {
val orgName = RandomStringUtils.randomAlphabetic(12)
val repoName = "$orgName/repo"
val projectName = "my-proj"

withTestApplication(::createTestApplication) {
handleRequest(HttpMethod.Get, "/repo/$repoName/project/$projectName/run/latest") {
}.apply {
expectThat(response.status()).isEqualTo(HttpStatusCode.NoContent)
}
}
}
}

0 comments on commit 25c8a01

Please sign in to comment.