From 3e49df2bfa118bacb728d75c4a77d1cf6096835a Mon Sep 17 00:00:00 2001 From: Alexander Ryabokon Date: Thu, 14 Mar 2024 14:08:57 +0300 Subject: [PATCH] BuildController, LegacyRelengClient, tests (#2) * BuildController, LegacyRelengClient, tests * Fix FT * releng.host -> releng.url * Replace hardcoded status codes with HttpStatusCode.* --- .run/FT.run.xml | 2 +- ...eleaseManagementServiceApplication.run.xml | 13 ++-- .run/UT.run.xml | 2 +- build.gradle.kts | 5 ++ buildSrc/build.gradle.kts | 13 ++++ .../org/octopusden/task/MigrateMockData.kt | 69 +++++++++++++++++ client/build.gradle.kts | 2 + .../client/ReleaseManagementServiceClient.kt | 10 +++ .../ReleaseManagementServiceErrorDecoder.kt | 2 +- .../ClassicReleaseManagementServiceClient.kt | 12 ++- common/build.gradle.kts | 11 +++ .../client/common/dto/BuildDTO.kt | 3 + .../client/common/dto/BuildStatus.kt | 7 ++ .../client/common/dto/CommitDTO.kt | 3 + .../client/common/dto/ShortBuildDTO.kt | 3 + ft/build.gradle.kts | 8 ++ ft/docker/application-ft.yml | 3 + ft/docker/docker-compose.yml | 5 ++ .../releasemanagementservice/ActuatorTest.kt | 19 ++++- .../BaseReleaseManagementServiceFuncTest.kt | 14 +--- .../BuildControllerTest.kt | 41 ++++++++++ server/build.gradle.kts | 4 + server/dev/application-dev.yml | 5 +- .../controller/BuildController.kt | 33 ++++++++ .../controller/ExceptionInfoHandler.kt | 3 + .../legacy/LegacyRelengBuildService.kt | 39 ++++++++++ .../legacy/LegacyRelengClient.kt | 15 ++++ .../legacy/LegacyRelengClientException.kt | 3 + .../legacy/LegacyRelengConfig.kt | 29 +++++++ .../legacy/LegacyRelengErrorDecoder.kt | 24 ++++++ .../legacy/LegacyRelengProperties.kt | 6 ++ .../service/BuildService.kt | 9 +++ .../controller/ActuatorTest.kt | 46 ++++++++---- .../controller/BaseControllerTest.kt | 75 +++++-------------- .../controller/BuildControllerTest.kt | 65 ++++++++++++++++ .../src/test/resources/application-test.yml | 3 + .../BaseActuatorTest.kt | 19 +++++ .../BaseBuildControllerTest.kt | 50 +++++++++++++ .../BaseReleaseManagementServiceTest.kt | 19 ++--- test-data/releng/build-not-exist-error.json | 4 + test-data/releng/build_1.0.1.json | 12 +++ test-data/releng/build_1.0.2.json | 12 +++ test-data/releng/builds.json | 4 + 43 files changed, 617 insertions(+), 109 deletions(-) create mode 100644 buildSrc/build.gradle.kts create mode 100644 buildSrc/src/main/kotlin/org/octopusden/task/MigrateMockData.kt create mode 100644 common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/BuildDTO.kt create mode 100644 common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/BuildStatus.kt create mode 100644 common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/CommitDTO.kt create mode 100644 common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/ShortBuildDTO.kt create mode 100644 ft/src/ft/kotlin/org/octopusden/octopus/releasemanagementservice/BuildControllerTest.kt create mode 100644 server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/controller/BuildController.kt create mode 100644 server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengBuildService.kt create mode 100644 server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengClient.kt create mode 100644 server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengClientException.kt create mode 100644 server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengConfig.kt create mode 100644 server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengErrorDecoder.kt create mode 100644 server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengProperties.kt create mode 100644 server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/service/BuildService.kt create mode 100644 server/src/test/kotlin/org/octopusden/octopus/releasemanagementservice/controller/BuildControllerTest.kt create mode 100644 test-common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/BaseActuatorTest.kt create mode 100644 test-common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/BaseBuildControllerTest.kt create mode 100644 test-data/releng/build-not-exist-error.json create mode 100644 test-data/releng/build_1.0.1.json create mode 100644 test-data/releng/build_1.0.2.json create mode 100644 test-data/releng/builds.json diff --git a/.run/FT.run.xml b/.run/FT.run.xml index fc34c1b..fe05ff0 100644 --- a/.run/FT.run.xml +++ b/.run/FT.run.xml @@ -4,7 +4,7 @@ diff --git a/.run/ReleaseManagementServiceApplication.run.xml b/.run/ReleaseManagementServiceApplication.run.xml index 9957c04..e1f4fbb 100644 --- a/.run/ReleaseManagementServiceApplication.run.xml +++ b/.run/ReleaseManagementServiceApplication.run.xml @@ -11,17 +11,18 @@ diff --git a/build.gradle.kts b/build.gradle.kts index a68be8b..eae8d66 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,5 +1,6 @@ import org.gradle.api.tasks.testing.logging.TestLogEvent import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import org.octopusden.task.MigrateMockData plugins { java @@ -65,6 +66,10 @@ subprojects { } } + val migrateMockData by tasks.creating(MigrateMockData::class) { + this.testDataDir = rootDir.toString() + File.separator + "test-data" + } + dependencyManagement { imports { mavenBom("org.springframework.boot:spring-boot-dependencies:${project.properties["spring-boot.version"]}") diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts new file mode 100644 index 0000000..d50805f --- /dev/null +++ b/buildSrc/build.gradle.kts @@ -0,0 +1,13 @@ +plugins { + kotlin("jvm") version "1.9.23" + groovy +} + +repositories { + mavenCentral() +} + +dependencies { + implementation(gradleApi()) + implementation("org.mock-server:mockserver-client-java:5.15.0") +} diff --git a/buildSrc/src/main/kotlin/org/octopusden/task/MigrateMockData.kt b/buildSrc/src/main/kotlin/org/octopusden/task/MigrateMockData.kt new file mode 100644 index 0000000..4b4ec85 --- /dev/null +++ b/buildSrc/src/main/kotlin/org/octopusden/task/MigrateMockData.kt @@ -0,0 +1,69 @@ +package org.octopusden.task + +import com.google.common.io.Files +import com.google.common.net.HttpHeaders +import org.apache.http.entity.ContentType +import org.gradle.api.DefaultTask +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.TaskAction +import org.mockserver.client.MockServerClient +import org.mockserver.model.HttpRequest +import org.mockserver.model.HttpResponse +import org.mockserver.model.HttpStatusCode +import java.io.File +import java.nio.charset.Charset + + +open class MigrateMockData : DefaultTask() { + + private val mockServerClient = MockServerClient("localhost", 1080) + + @get:Input + lateinit var testDataDir: String + + @TaskAction + fun startMockServer() { + mockServerClient.reset() + endpointToResponseFileName.forEach { + generateMockserverData(it.key.first, it.key.second, testDataDir + File.separator + it.value, HttpStatusCode.OK_200.code()) + } + endpointNotFoundToResponseFileName.forEach { + generateMockserverData(it.key.first, it.key.second, testDataDir + File.separator + it.value, HttpStatusCode.NOT_FOUND_404.code()) + } + } + + private fun generateMockserverData(endpoint: String, params: Map, filename: String, status: Int) { + val body = Files.asCharSource(File(filename), Charset.defaultCharset()).read() + val request = HttpRequest.request() + .withMethod("GET") + .withPath(endpoint) + params.forEach { + request.withQueryStringParameter(it.key, it.value) + } + mockServerClient.`when`(request) + .respond { + logger.debug( + "MockServer request: ${it.method} ${it.path} ${it.queryStringParameterList.joinToString(",")} ${ + it.pathParameterList.joinToString( + "," + ) + }" + ) + HttpResponse.response() + .withHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.mimeType) + .withBody(body) + .withStatusCode(status) + } + } + + companion object { + private val endpointToResponseFileName = mapOf( + "/rest/release-engineering/3/component/ReleaseManagementService/builds" to emptyMap() to "releng/builds.json", + "/rest/release-engineering/3/component/ReleaseManagementService/version/1.0.1/build" to emptyMap() to "releng/build_1.0.1.json", + "/rest/release-engineering/3/component/ReleaseManagementService/version/1.0.2/build" to emptyMap() to "releng/build_1.0.2.json", + ) + private val endpointNotFoundToResponseFileName = mapOf( + "/rest/release-engineering/3/component/ReleaseManagementService/version/1.0.3/build" to emptyMap() to "releng/build-not-exist-error.json" + ) + } +} diff --git a/client/build.gradle.kts b/client/build.gradle.kts index 9d9e40c..ffc6007 100644 --- a/client/build.gradle.kts +++ b/client/build.gradle.kts @@ -59,9 +59,11 @@ dependencyManagement { dependencies { api(project(":common")) + /* These dependencies are added to :common due to there are usages at server side api("io.github.openfeign:feign-httpclient") api("io.github.openfeign:feign-jackson") api("io.github.openfeign:feign-slf4j") + */ api("com.fasterxml.jackson.module:jackson-module-kotlin") api("com.fasterxml.jackson.core:jackson-databind") } diff --git a/client/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/ReleaseManagementServiceClient.kt b/client/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/ReleaseManagementServiceClient.kt index b133e46..820216f 100644 --- a/client/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/ReleaseManagementServiceClient.kt +++ b/client/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/ReleaseManagementServiceClient.kt @@ -1,9 +1,19 @@ package org.octopusden.octopus.releasemanagementservice.client +import feign.Param import feign.RequestLine +import org.octopusden.octopus.releasemanagementservice.client.common.dto.BuildDTO import org.octopusden.octopus.releasemanagementservice.client.common.dto.ServiceInfoDTO +import org.octopusden.octopus.releasemanagementservice.client.common.dto.ShortBuildDTO interface ReleaseManagementServiceClient { + @RequestLine("GET /actuator/info") fun getServiceInfo(): ServiceInfoDTO + + @RequestLine("GET /builds/component/{component}") + fun getBuilds(@Param("component") component: String): Collection + + @RequestLine("GET /builds/component/{component}/version/{version}") + fun getBuild(@Param("component") component: String, @Param("version") version: String): BuildDTO } diff --git a/client/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/ReleaseManagementServiceErrorDecoder.kt b/client/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/ReleaseManagementServiceErrorDecoder.kt index 7dc6d4c..2be7f69 100644 --- a/client/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/ReleaseManagementServiceErrorDecoder.kt +++ b/client/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/ReleaseManagementServiceErrorDecoder.kt @@ -36,7 +36,7 @@ class ReleaseManagementServiceErrorDecoder(private val objectMapper: ObjectMappe private val errorResponseFunction = { errorResponse: ErrorResponse -> errorResponse.errorCode.getException(errorResponse.errorMessage) } private val ERROR_RESPONSE_CODES: Map Exception> = mapOf( - 400 to errorResponseFunction, + 404 to errorResponseFunction, 500 to errorResponseFunction ) } diff --git a/client/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/impl/ClassicReleaseManagementServiceClient.kt b/client/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/impl/ClassicReleaseManagementServiceClient.kt index 0ded4fd..afb6914 100644 --- a/client/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/impl/ClassicReleaseManagementServiceClient.kt +++ b/client/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/impl/ClassicReleaseManagementServiceClient.kt @@ -13,7 +13,9 @@ import feign.slf4j.Slf4jLogger import org.octopusden.octopus.releasemanagementservice.client.ReleaseManagementServiceClient import org.octopusden.octopus.releasemanagementservice.client.ReleaseManagementServiceErrorDecoder import org.octopusden.octopus.releasemanagementservice.client.ReleaseManagementServiceRetry +import org.octopusden.octopus.releasemanagementservice.client.common.dto.BuildDTO import org.octopusden.octopus.releasemanagementservice.client.common.dto.ServiceInfoDTO +import org.octopusden.octopus.releasemanagementservice.client.common.dto.ShortBuildDTO import java.util.concurrent.TimeUnit class ClassicReleaseManagementServiceClient( @@ -28,6 +30,10 @@ class ClassicReleaseManagementServiceClient( getMapper() ) + override fun getBuilds(component: String): Collection = client.getBuilds(component) + + override fun getBuild(component: String, version: String): BuildDTO = client.getBuild(component, version) + fun setUrl(apiUrl: String, timeRetryInMillis: Int) { client = createClient(apiUrl, mapper, timeRetryInMillis) } @@ -35,10 +41,8 @@ class ClassicReleaseManagementServiceClient( override fun getServiceInfo(): ServiceInfoDTO = client.getServiceInfo() companion object { - private fun getMapper(): ObjectMapper { - val objectMapper = jacksonObjectMapper() - objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) - return objectMapper + private fun getMapper(): ObjectMapper = with(jacksonObjectMapper()) { + configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) } private fun createClient( diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 7268102..7e5f13c 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -51,6 +51,17 @@ tasks.withType().configureEach { } } +dependencyManagement { + imports { + mavenBom("io.github.openfeign:feign-bom:${project.properties["openfeign.version"]}") + } +} + dependencies { implementation("com.fasterxml.jackson.core:jackson-annotations") + + api("io.github.openfeign:feign-httpclient") + api("io.github.openfeign:feign-jackson") + api("io.github.openfeign:feign-slf4j") + api("org.apache.httpcomponents:httpclient:4.5.13") } diff --git a/common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/BuildDTO.kt b/common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/BuildDTO.kt new file mode 100644 index 0000000..5b62ce8 --- /dev/null +++ b/common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/BuildDTO.kt @@ -0,0 +1,3 @@ +package org.octopusden.octopus.releasemanagementservice.client.common.dto + +data class BuildDTO(val component: String, val version: String, val status: BuildStatus, val dependencies: Collection, val commits: Collection) diff --git a/common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/BuildStatus.kt b/common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/BuildStatus.kt new file mode 100644 index 0000000..426ce3f --- /dev/null +++ b/common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/BuildStatus.kt @@ -0,0 +1,7 @@ +package org.octopusden.octopus.releasemanagementservice.client.common.dto + +enum class BuildStatus { + BUILD, + RC, + RELEASE +} diff --git a/common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/CommitDTO.kt b/common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/CommitDTO.kt new file mode 100644 index 0000000..34a7b59 --- /dev/null +++ b/common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/CommitDTO.kt @@ -0,0 +1,3 @@ +package org.octopusden.octopus.releasemanagementservice.client.common.dto + +data class CommitDTO(val repository: String, val sha: String) diff --git a/common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/ShortBuildDTO.kt b/common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/ShortBuildDTO.kt new file mode 100644 index 0000000..306989b --- /dev/null +++ b/common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/ShortBuildDTO.kt @@ -0,0 +1,3 @@ +package org.octopusden.octopus.releasemanagementservice.client.common.dto + +data class ShortBuildDTO(val component: String, val version: String, val status: BuildStatus) diff --git a/ft/build.gradle.kts b/ft/build.gradle.kts index 5201dec..7aa60fa 100644 --- a/ft/build.gradle.kts +++ b/ft/build.gradle.kts @@ -53,6 +53,14 @@ tasks.named("composeUp") { dependsOn(":release-management-service:dockerBuildImage") } +tasks.named("migrateMockData") { + dependsOn("composeUp") +} + +tasks.named("ft") { + dependsOn("migrateMockData") +} + idea.module { scopes["PROVIDED"]?.get("plus")?.add(configurations["ftImplementation"]) } diff --git a/ft/docker/application-ft.yml b/ft/docker/application-ft.yml index 75fe6e0..75b993c 100644 --- a/ft/docker/application-ft.yml +++ b/ft/docker/application-ft.yml @@ -1,3 +1,6 @@ +releng: + url: http://mockserver:1080 + management: endpoints: web: diff --git a/ft/docker/docker-compose.yml b/ft/docker/docker-compose.yml index 717460e..5b5d3fe 100644 --- a/ft/docker/docker-compose.yml +++ b/ft/docker/docker-compose.yml @@ -13,3 +13,8 @@ services: - SPRING_CONFIG_ADDITIONAL_LOCATION=/ - SPRING_PROFILES_ACTIVE=ft + mockserver: + container_name: release-management-service-ft-mockserver + image: ${DOCKER_REGISTRY}/mockserver/mockserver:mockserver-5.15.0 + ports: + - "1080:1080" diff --git a/ft/src/ft/kotlin/org/octopusden/octopus/releasemanagementservice/ActuatorTest.kt b/ft/src/ft/kotlin/org/octopusden/octopus/releasemanagementservice/ActuatorTest.kt index 76b22de..e5b3589 100644 --- a/ft/src/ft/kotlin/org/octopusden/octopus/releasemanagementservice/ActuatorTest.kt +++ b/ft/src/ft/kotlin/org/octopusden/octopus/releasemanagementservice/ActuatorTest.kt @@ -1,8 +1,25 @@ package org.octopusden.octopus.releasemanagementservice +import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import org.octopusden.octopus.releasemanagementservice.client.common.dto.ServiceInfoDTO +import org.octopusden.octopus.releasemanagementservice.client.impl.ClassicReleaseManagementServiceClient +import org.octopusden.octopus.releasemanagementservice.client.impl.ReleaseManagementServiceClientParametersProvider -class ActuatorTest : BaseReleaseManagementServiceFuncTest() { +class ActuatorTest : BaseActuatorTest(), BaseReleaseManagementServiceFuncTest { + + override fun getObjectMapper(): ObjectMapper = mapper override fun getServiceInfo(): ServiceInfoDTO = client.getServiceInfo() + + companion object { + @JvmStatic + private val mapper = jacksonObjectMapper() + @JvmStatic + private val client = + ClassicReleaseManagementServiceClient(object : ReleaseManagementServiceClientParametersProvider { + override fun getApiUrl() = "http://localhost:8080" + override fun getTimeRetryInMillis() = 180000 + }) + } } diff --git a/ft/src/ft/kotlin/org/octopusden/octopus/releasemanagementservice/BaseReleaseManagementServiceFuncTest.kt b/ft/src/ft/kotlin/org/octopusden/octopus/releasemanagementservice/BaseReleaseManagementServiceFuncTest.kt index 93c7282..224e696 100644 --- a/ft/src/ft/kotlin/org/octopusden/octopus/releasemanagementservice/BaseReleaseManagementServiceFuncTest.kt +++ b/ft/src/ft/kotlin/org/octopusden/octopus/releasemanagementservice/BaseReleaseManagementServiceFuncTest.kt @@ -1,15 +1,3 @@ package org.octopusden.octopus.releasemanagementservice -import org.octopusden.octopus.releasemanagementservice.client.impl.ClassicReleaseManagementServiceClient -import org.octopusden.octopus.releasemanagementservice.client.impl.ReleaseManagementServiceClientParametersProvider - -abstract class BaseReleaseManagementServiceFuncTest : BaseReleaseManagementServiceTest() { - companion object { - @JvmStatic - protected val client = - ClassicReleaseManagementServiceClient(object : ReleaseManagementServiceClientParametersProvider { - override fun getApiUrl() = "http://localhost:8080" - override fun getTimeRetryInMillis() = 180000 - }) - } -} +interface BaseReleaseManagementServiceFuncTest : BaseReleaseManagementServiceTest diff --git a/ft/src/ft/kotlin/org/octopusden/octopus/releasemanagementservice/BuildControllerTest.kt b/ft/src/ft/kotlin/org/octopusden/octopus/releasemanagementservice/BuildControllerTest.kt new file mode 100644 index 0000000..a769d12 --- /dev/null +++ b/ft/src/ft/kotlin/org/octopusden/octopus/releasemanagementservice/BuildControllerTest.kt @@ -0,0 +1,41 @@ +package org.octopusden.octopus.releasemanagementservice + +import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import org.octopusden.octopus.releasemanagementservice.client.common.dto.* +import org.octopusden.octopus.releasemanagementservice.client.common.exception.NotFoundException +import org.octopusden.octopus.releasemanagementservice.client.impl.ClassicReleaseManagementServiceClient +import org.octopusden.octopus.releasemanagementservice.client.impl.ReleaseManagementServiceClientParametersProvider + +class BuildControllerTest : BaseBuildControllerTest(), BaseReleaseManagementServiceFuncTest { + + override fun getObjectMapper(): ObjectMapper = mapper + + override fun getBuilds(component: String): Collection { + return client.getBuilds(component) + } + + override fun getBuild(component: String, version: String): BuildDTO { + return client.getBuild(component, version) + } + + override fun getNotExistedBuildErrorResponse(component: String, version: String): ErrorResponse { + try { + client.getBuild(component, version) + return ErrorResponse(ReleaseManagementServiceErrorCode.OTHER, "Failure expected") + } catch (e: NotFoundException) { + return ErrorResponse(ReleaseManagementServiceErrorCode.NOT_FOUND, e.message!!) + } + } + + companion object { + @JvmStatic + private val mapper = jacksonObjectMapper() + @JvmStatic + private val client = + ClassicReleaseManagementServiceClient(object : ReleaseManagementServiceClientParametersProvider { + override fun getApiUrl() = "http://localhost:8080" + override fun getTimeRetryInMillis() = 180000 + }) + } +} diff --git a/server/build.gradle.kts b/server/build.gradle.kts index 26de65a..0ea38e1 100644 --- a/server/build.gradle.kts +++ b/server/build.gradle.kts @@ -76,6 +76,10 @@ tasks.getByName("dockerBuildImage").doFirst { } tasks.withType { + dependsOn("migrateMockData") +} + +tasks.named("migrateMockData") { dependsOn("composeUp") } diff --git a/server/dev/application-dev.yml b/server/dev/application-dev.yml index 75fe6e0..3ec5d4a 100644 --- a/server/dev/application-dev.yml +++ b/server/dev/application-dev.yml @@ -1,3 +1,6 @@ +releng: + url: # set via EnvFile + management: endpoints: web: @@ -6,4 +9,4 @@ management: logging: level: - org.octopusden.octopus.releasemanagement.controller: trace + org.octopusden.octopus.releasemanagementservice.controller: trace diff --git a/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/controller/BuildController.kt b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/controller/BuildController.kt new file mode 100644 index 0000000..42fa35e --- /dev/null +++ b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/controller/BuildController.kt @@ -0,0 +1,33 @@ +package org.octopusden.octopus.releasemanagementservice.controller + +import org.octopusden.octopus.releasemanagementservice.client.common.dto.BuildDTO +import org.octopusden.octopus.releasemanagementservice.client.common.dto.ShortBuildDTO +import org.octopusden.octopus.releasemanagementservice.service.BuildService +import org.slf4j.LoggerFactory +import org.springframework.http.MediaType +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + + +@RestController +@RequestMapping("builds") +class BuildController(private val buildService: BuildService) { + + @GetMapping("component/{component}", produces = [MediaType.APPLICATION_JSON_VALUE]) + fun getComponentBuilds(@PathVariable("component") component: String): Collection { + log.debug("Get all Builds of '{}'", component) + return buildService.getBuilds(component) + } + + @GetMapping("component/{component}/version/{version}", produces = [MediaType.APPLICATION_JSON_VALUE]) + fun getBuild(@PathVariable("component") component: String, @PathVariable("version") version: String): BuildDTO { + log.debug("Get Build '{}:{}'", component, version) + return buildService.getBuild(component, version) + } + + companion object { + private val log = LoggerFactory.getLogger(BuildController::class.java) + } +} diff --git a/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/controller/ExceptionInfoHandler.kt b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/controller/ExceptionInfoHandler.kt index 8c4d8b7..e244eb9 100644 --- a/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/controller/ExceptionInfoHandler.kt +++ b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/controller/ExceptionInfoHandler.kt @@ -21,6 +21,9 @@ class ExceptionInfoHandler { @ResponseStatus(HttpStatus.NOT_FOUND) @ResponseBody fun handleNotFound(exception: ReleaseManagementServiceException) = getErrorResponse(exception) + .also { + log.error(exception.message) + } @ExceptionHandler(ArgumentsNotCompatibleException::class) @ResponseStatus(HttpStatus.BAD_REQUEST) diff --git a/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengBuildService.kt b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengBuildService.kt new file mode 100644 index 0000000..1a45b89 --- /dev/null +++ b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengBuildService.kt @@ -0,0 +1,39 @@ +package org.octopusden.octopus.releasemanagementservice.legacy + +import org.octopusden.octopus.releasemanagementservice.client.common.dto.BuildDTO +import org.octopusden.octopus.releasemanagementservice.client.common.dto.ShortBuildDTO +import org.octopusden.octopus.releasemanagementservice.client.common.exception.NotFoundException +import org.octopusden.octopus.releasemanagementservice.client.common.exception.ReleaseManagementServiceException +import org.octopusden.octopus.releasemanagementservice.service.BuildService +import org.slf4j.LoggerFactory +import org.springframework.stereotype.Service + +@Service +class LegacyRelengBuildService(private val client: LegacyRelengClient) : BuildService { + + private val codeMapping = mapOf + ReleaseManagementServiceException>(404 to { e: LegacyRelengClientException -> NotFoundException(e.message!!) }) + + override fun getBuilds(component: String): Collection { + return execute { client.getBuilds(component) } + } + + override fun getBuild(component: String, version: String): BuildDTO { + return execute { client.getBuild(component, version) } + } + + private fun execute(func: () -> T): T { + return try { + func() + } catch (e: LegacyRelengClientException) { + log.error(e.message) + throw codeMapping[e.code] + ?.invoke(e) + ?: IllegalStateException(e) + } + } + + companion object { + private val log = LoggerFactory.getLogger(LegacyRelengBuildService::class.java) + } +} diff --git a/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengClient.kt b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengClient.kt new file mode 100644 index 0000000..c7958f6 --- /dev/null +++ b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengClient.kt @@ -0,0 +1,15 @@ +package org.octopusden.octopus.releasemanagementservice.legacy + +import feign.Param +import feign.RequestLine +import org.octopusden.octopus.releasemanagementservice.client.common.dto.BuildDTO +import org.octopusden.octopus.releasemanagementservice.client.common.dto.ShortBuildDTO + +interface LegacyRelengClient { + + @RequestLine("GET rest/release-engineering/3/component/{component}/builds") + fun getBuilds(@Param("component") component: String): Collection + + @RequestLine("GET rest/release-engineering/3/component/{component}/version/{version}/build") + fun getBuild(@Param("component") component: String, @Param("version") version: String): BuildDTO +} diff --git a/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengClientException.kt b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengClientException.kt new file mode 100644 index 0000000..d47fd70 --- /dev/null +++ b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengClientException.kt @@ -0,0 +1,3 @@ +package org.octopusden.octopus.releasemanagementservice.legacy + +class LegacyRelengClientException(val code: Int, message: String): RuntimeException(message) diff --git a/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengConfig.kt b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengConfig.kt new file mode 100644 index 0000000..6d7f36e --- /dev/null +++ b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengConfig.kt @@ -0,0 +1,29 @@ +package org.octopusden.octopus.releasemanagementservice.legacy + +import com.fasterxml.jackson.databind.ObjectMapper +import feign.Feign.Builder +import feign.Logger +import feign.Request +import feign.httpclient.ApacheHttpClient +import feign.jackson.JacksonDecoder +import feign.jackson.JacksonEncoder +import feign.slf4j.Slf4jLogger +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import java.util.concurrent.TimeUnit + + +@Configuration +class LegacyRelengConfig(private val relengProperties: LegacyRelengProperties, private val objectMapper: ObjectMapper) { + + @Bean + fun legacyRelengClient(): LegacyRelengClient = Builder() + .client(ApacheHttpClient()) + .options(Request.Options(5, TimeUnit.MINUTES, 5, TimeUnit.MINUTES, true)) + .encoder(JacksonEncoder(objectMapper)) + .decoder(JacksonDecoder(objectMapper)) + .errorDecoder(LegacyRelengErrorDecoder(objectMapper)) + .logger(Slf4jLogger(LegacyRelengClient::class.java)) + .logLevel(Logger.Level.BASIC) + .target(LegacyRelengClient::class.java, relengProperties.url) +} diff --git a/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengErrorDecoder.kt b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengErrorDecoder.kt new file mode 100644 index 0000000..cbe0a55 --- /dev/null +++ b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengErrorDecoder.kt @@ -0,0 +1,24 @@ +package org.octopusden.octopus.releasemanagementservice.legacy + +import com.fasterxml.jackson.databind.ObjectMapper +import feign.Response +import feign.codec.ErrorDecoder +import org.octopusden.octopus.releasemanagementservice.client.common.dto.ErrorResponse +import org.slf4j.LoggerFactory + +class LegacyRelengErrorDecoder(private val objectMapper: ObjectMapper) : ErrorDecoder { + override fun decode(methodKey: String, response: Response): Exception { + val responseBody = response.body().asInputStream().readAllBytes() + return try { + val errorResponse = objectMapper.readValue(responseBody, ErrorResponse::class.java) + errorResponse.errorCode.getException(errorResponse.errorMessage) + } catch (e: Exception) { + log.error("ErrorResponse decode error", e) + LegacyRelengClientException(response.status(), String(responseBody)) + } + } + + companion object { + private val log = LoggerFactory.getLogger(LegacyRelengErrorDecoder::class.java) + } +} diff --git a/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengProperties.kt b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengProperties.kt new file mode 100644 index 0000000..57bbbbf --- /dev/null +++ b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengProperties.kt @@ -0,0 +1,6 @@ +package org.octopusden.octopus.releasemanagementservice.legacy + +import org.springframework.boot.context.properties.ConfigurationProperties + +@ConfigurationProperties("releng") +data class LegacyRelengProperties(val url: String) diff --git a/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/service/BuildService.kt b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/service/BuildService.kt new file mode 100644 index 0000000..7da8a97 --- /dev/null +++ b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/service/BuildService.kt @@ -0,0 +1,9 @@ +package org.octopusden.octopus.releasemanagementservice.service + +import org.octopusden.octopus.releasemanagementservice.client.common.dto.BuildDTO +import org.octopusden.octopus.releasemanagementservice.client.common.dto.ShortBuildDTO + +interface BuildService { + fun getBuilds(component: String): Collection + fun getBuild(component: String, version: String): BuildDTO +} diff --git a/server/src/test/kotlin/org/octopusden/octopus/releasemanagementservice/controller/ActuatorTest.kt b/server/src/test/kotlin/org/octopusden/octopus/releasemanagementservice/controller/ActuatorTest.kt index 9a31a31..a9dac0a 100644 --- a/server/src/test/kotlin/org/octopusden/octopus/releasemanagementservice/controller/ActuatorTest.kt +++ b/server/src/test/kotlin/org/octopusden/octopus/releasemanagementservice/controller/ActuatorTest.kt @@ -1,20 +1,40 @@ package org.octopusden.octopus.releasemanagementservice.controller import com.fasterxml.jackson.core.type.TypeReference +import com.fasterxml.jackson.databind.ObjectMapper +import org.junit.jupiter.api.TestInstance +import org.junit.jupiter.api.extension.ExtendWith +import org.octopusden.octopus.releasemanagementservice.BaseActuatorTest +import org.octopusden.octopus.releasemanagementservice.ReleaseManagementServiceApplication import org.octopusden.octopus.releasemanagementservice.client.common.dto.ServiceInfoDTO -import org.springframework.http.MediaType -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders -import org.springframework.test.web.servlet.result.MockMvcResultMatchers +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.test.context.ActiveProfiles +import org.springframework.test.context.junit.jupiter.SpringExtension +import org.springframework.test.web.servlet.MockMvc -class ActuatorTest : BaseControllerTest() { +@AutoConfigureMockMvc +@ExtendWith(SpringExtension::class) +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@SpringBootTest( + classes = [ReleaseManagementServiceApplication::class], + webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT +) +@ActiveProfiles("test") +class ActuatorTest : BaseControllerTest, BaseActuatorTest() { - override fun getServiceInfo(): ServiceInfoDTO = - mvc.perform( - MockMvcRequestBuilders.get("/actuator/info") - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON) - ) - .andExpect(MockMvcResultMatchers.status().`is`(200)) - .andReturn() - .response.toObject(object : TypeReference() {}) + @Autowired + protected lateinit var mvc: MockMvc + + @Autowired + protected lateinit var mapper: ObjectMapper + + override fun getServiceInfo(): ServiceInfoDTO { + return get(200, object : TypeReference() {}, "/actuator/info") + } + + override fun getMockMvc(): MockMvc = mvc + + override fun getObjectMapper(): ObjectMapper = mapper } diff --git a/server/src/test/kotlin/org/octopusden/octopus/releasemanagementservice/controller/BaseControllerTest.kt b/server/src/test/kotlin/org/octopusden/octopus/releasemanagementservice/controller/BaseControllerTest.kt index d676818..4868504 100644 --- a/server/src/test/kotlin/org/octopusden/octopus/releasemanagementservice/controller/BaseControllerTest.kt +++ b/server/src/test/kotlin/org/octopusden/octopus/releasemanagementservice/controller/BaseControllerTest.kt @@ -1,71 +1,32 @@ package org.octopusden.octopus.releasemanagementservice.controller import com.fasterxml.jackson.core.type.TypeReference -import com.fasterxml.jackson.databind.ObjectMapper -import org.junit.jupiter.api.BeforeAll -import org.junit.jupiter.api.TestInstance -import org.junit.jupiter.api.extension.ExtendWith import org.octopusden.octopus.releasemanagementservice.BaseReleaseManagementServiceTest -import org.octopusden.octopus.releasemanagementservice.ReleaseManagementServiceApplication -import org.octopusden.octopus.releasemanagementservice.client.common.dto.ErrorResponse -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc -import org.springframework.boot.test.context.SpringBootTest -import org.springframework.http.HttpStatus +import org.springframework.http.MediaType import org.springframework.mock.web.MockHttpServletResponse -import org.springframework.test.context.ActiveProfiles -import org.springframework.test.context.junit.jupiter.SpringExtension import org.springframework.test.web.servlet.MockMvc +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders +import org.springframework.test.web.servlet.result.MockMvcResultMatchers import java.time.ZoneId import java.time.format.DateTimeFormatter -import java.util.Date -import java.util.Locale private const val ISO_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX" -typealias CheckError = (Pair) -> Unit -@AutoConfigureMockMvc -@ExtendWith(SpringExtension::class) -@TestInstance(TestInstance.Lifecycle.PER_CLASS) -@SpringBootTest( - classes = [ReleaseManagementServiceApplication::class], - webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT -) -@ActiveProfiles("test") -abstract class BaseControllerTest : BaseReleaseManagementServiceTest() { - - @Autowired - protected lateinit var mvc: MockMvc - - @Autowired - protected lateinit var mapper: ObjectMapper - - @BeforeAll - fun beforeAllRepositoryControllerTests() { - mapper.setLocale(Locale.ENGLISH) - } - - protected fun checkResponse( - response: MockHttpServletResponse, - status: Int, - typeReference: TypeReference, - checkSuccess: (T) -> Unit, - checkError: CheckError - ) { - if (HttpStatus.OK == HttpStatus.valueOf(status)) { - checkSuccess(response.toObject(typeReference)) - } else { - val err = response.toObject(object : TypeReference() {}) - checkError(Pair(response.status, err.errorMessage)) - } - } - - protected fun MockHttpServletResponse.toObject(typeReference: TypeReference): T = - mapper.readValue(this.contentAsByteArray, typeReference) - - protected fun Date.toReleaseManagementServiceFormat(): String { - return FORMATTER.format(toInstant()) - } +interface BaseControllerTest : BaseReleaseManagementServiceTest { + + fun getMockMvc(): MockMvc + fun get(code: Int, typeReference: TypeReference, path: String, vararg uriVars: String) = + getMockMvc().perform( + MockMvcRequestBuilders.get(path, *uriVars) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON) + ) + .andExpect(MockMvcResultMatchers.status().`is`(code)) + .andReturn() + .response.toObject(typeReference) + + fun MockHttpServletResponse.toObject(typeReference: TypeReference): T = + getObjectMapper().readValue(this.contentAsByteArray, typeReference) companion object { private val FORMATTER = DateTimeFormatter.ofPattern(ISO_PATTERN) diff --git a/server/src/test/kotlin/org/octopusden/octopus/releasemanagementservice/controller/BuildControllerTest.kt b/server/src/test/kotlin/org/octopusden/octopus/releasemanagementservice/controller/BuildControllerTest.kt new file mode 100644 index 0000000..62a5fd0 --- /dev/null +++ b/server/src/test/kotlin/org/octopusden/octopus/releasemanagementservice/controller/BuildControllerTest.kt @@ -0,0 +1,65 @@ +package org.octopusden.octopus.releasemanagementservice.controller + +import com.fasterxml.jackson.core.type.TypeReference +import com.fasterxml.jackson.databind.ObjectMapper +import org.junit.jupiter.api.TestInstance +import org.junit.jupiter.api.extension.ExtendWith +import org.octopusden.octopus.releasemanagementservice.BaseBuildControllerTest +import org.octopusden.octopus.releasemanagementservice.ReleaseManagementServiceApplication +import org.octopusden.octopus.releasemanagementservice.client.common.dto.BuildDTO +import org.octopusden.octopus.releasemanagementservice.client.common.dto.ErrorResponse +import org.octopusden.octopus.releasemanagementservice.client.common.dto.ShortBuildDTO +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.test.context.ActiveProfiles +import org.springframework.test.context.junit.jupiter.SpringExtension +import org.springframework.test.web.servlet.MockMvc + +@AutoConfigureMockMvc +@ExtendWith(SpringExtension::class) +@TestInstance(TestInstance.Lifecycle.PER_CLASS) +@SpringBootTest( + classes = [ReleaseManagementServiceApplication::class], + webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT +) +@ActiveProfiles("test") +class BuildControllerTest : BaseBuildControllerTest(), BaseControllerTest { + + @Autowired + protected lateinit var mvc: MockMvc + + @Autowired + protected lateinit var mapper: ObjectMapper + override fun getMockMvc(): MockMvc = mvc + override fun getObjectMapper(): ObjectMapper = mapper + + override fun getBuilds(component: String): Collection { + return get( + 200, + object : TypeReference>() {}, + "/builds/component/{component}", + component + ) + } + + override fun getBuild(component: String, version: String): BuildDTO { + return get( + 200, + object : TypeReference() {}, + "/builds/component/{component}/version/{version}", + component, + version + ) + } + + override fun getNotExistedBuildErrorResponse(component: String, version: String): ErrorResponse { + return get( + 404, + object : TypeReference() {}, + "/builds/component/{component}/version/{version}", + component, + version + ) + } +} \ No newline at end of file diff --git a/server/src/test/resources/application-test.yml b/server/src/test/resources/application-test.yml index 81ccf82..79668bd 100644 --- a/server/src/test/resources/application-test.yml +++ b/server/src/test/resources/application-test.yml @@ -1,3 +1,6 @@ +releng: + url: http://localhost:1080 + management: endpoints: web: diff --git a/test-common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/BaseActuatorTest.kt b/test-common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/BaseActuatorTest.kt new file mode 100644 index 0000000..82a157f --- /dev/null +++ b/test-common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/BaseActuatorTest.kt @@ -0,0 +1,19 @@ +package org.octopusden.octopus.releasemanagementservice + +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.Test +import org.octopusden.octopus.releasemanagementservice.client.common.dto.ServiceInfoDTO + +abstract class BaseActuatorTest : BaseReleaseManagementServiceTest { + + private val releaseManagementServiceVersion: String = System.getenv("release-management-service.version") + ?: throw IllegalStateException("Environment variable 'release-management-service.version' must be provided") + + abstract fun getServiceInfo(): ServiceInfoDTO + + @Test + fun serviceInfoTest() { + val expected = ServiceInfoDTO(ServiceInfoDTO.Build(releaseManagementServiceVersion)) + Assertions.assertEquals(expected, getServiceInfo()) + } +} \ No newline at end of file diff --git a/test-common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/BaseBuildControllerTest.kt b/test-common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/BaseBuildControllerTest.kt new file mode 100644 index 0000000..b570b79 --- /dev/null +++ b/test-common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/BaseBuildControllerTest.kt @@ -0,0 +1,50 @@ +package org.octopusden.octopus.releasemanagementservice + +import com.fasterxml.jackson.core.type.TypeReference +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.Test +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.Arguments +import org.junit.jupiter.params.provider.MethodSource +import org.octopusden.octopus.releasemanagementservice.client.common.dto.BuildDTO +import org.octopusden.octopus.releasemanagementservice.client.common.dto.ErrorResponse +import org.octopusden.octopus.releasemanagementservice.client.common.dto.ShortBuildDTO +import java.util.stream.Stream + +abstract class BaseBuildControllerTest : BaseReleaseManagementServiceTest { + + abstract fun getBuilds(component: String): Collection + abstract fun getBuild(component: String, version: String): BuildDTO + abstract fun getNotExistedBuildErrorResponse(component: String, version: String): ErrorResponse + + @Test + fun getBuildsTest() { + val builds = getBuilds("ReleaseManagementService") + Assertions.assertEquals( + loadObject("../test-data/releng/builds.json", + object : TypeReference>() {}), builds + ) + } + + @ParameterizedTest + @MethodSource("builds") + fun getBuildTest(version: String, expected: BuildDTO) { + Assertions.assertEquals(expected, getBuild("ReleaseManagementService", version)) + } + + @Test + fun getNotExistedBuildTest() { + val errorResponse = getNotExistedBuildErrorResponse("ReleaseManagementService", "1.0.3") + val expected = loadObject( + "../test-data/releng/build-not-exist-error.json", + object : TypeReference() {}) + Assertions.assertEquals(expected, errorResponse) + } + + private fun builds(): Stream = Stream.of( + Arguments.of( + "1.0.1", loadObject("../test-data/releng/build_1.0.1.json", object : TypeReference() {}), + "1.0.2", loadObject("../test-data/releng/build_1.0.2.json", object : TypeReference() {}) + ) + ) +} \ No newline at end of file diff --git a/test-common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/BaseReleaseManagementServiceTest.kt b/test-common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/BaseReleaseManagementServiceTest.kt index 53b5c42..915a7a2 100644 --- a/test-common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/BaseReleaseManagementServiceTest.kt +++ b/test-common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/BaseReleaseManagementServiceTest.kt @@ -1,18 +1,15 @@ package org.octopusden.octopus.releasemanagementservice -import org.junit.jupiter.api.Assertions -import org.junit.jupiter.api.Test +import com.fasterxml.jackson.core.type.TypeReference +import com.fasterxml.jackson.databind.ObjectMapper import org.junit.jupiter.api.TestInstance -import org.octopusden.octopus.releasemanagementservice.client.common.dto.ServiceInfoDTO +import java.io.File @TestInstance(TestInstance.Lifecycle.PER_CLASS) -abstract class BaseReleaseManagementServiceTest { +interface BaseReleaseManagementServiceTest { - private val releaseManagementServiceVersion = System.getenv("release-management-service.version") - abstract fun getServiceInfo(): ServiceInfoDTO - @Test - fun serviceInfoTest() { - val expected = ServiceInfoDTO(ServiceInfoDTO.Build(releaseManagementServiceVersion)) - Assertions.assertEquals(expected, getServiceInfo()) - } + fun getObjectMapper(): ObjectMapper + + fun loadObject(file: String, typeReference: TypeReference): T = + getObjectMapper().readValue(File(file), typeReference) } diff --git a/test-data/releng/build-not-exist-error.json b/test-data/releng/build-not-exist-error.json new file mode 100644 index 0000000..8ebb44a --- /dev/null +++ b/test-data/releng/build-not-exist-error.json @@ -0,0 +1,4 @@ +{ + "errorCode": "NOT_FOUND", + "errorMessage": "Build ReleaseManagementService:1.0.3 is not found" +} \ No newline at end of file diff --git a/test-data/releng/build_1.0.1.json b/test-data/releng/build_1.0.1.json new file mode 100644 index 0000000..d9d5f45 --- /dev/null +++ b/test-data/releng/build_1.0.1.json @@ -0,0 +1,12 @@ +{ + "component": "ReleaseManagementService", + "version": "1.0.1", + "status": "BUILD", + "dependencies": [], + "commits": [ + { + "repository": "ssh://git@github.com:octopusden/octopus-release-management-service.git", + "sha": "0da242ad739a01e7c50aeb522fd17e1eece77bb3" + } + ] +} \ No newline at end of file diff --git a/test-data/releng/build_1.0.2.json b/test-data/releng/build_1.0.2.json new file mode 100644 index 0000000..50870b3 --- /dev/null +++ b/test-data/releng/build_1.0.2.json @@ -0,0 +1,12 @@ +{ + "component": "ReleaseManagementService", + "version": "1.0.2", + "status": "RELEASE", + "dependencies": [], + "commits": [ + { + "repository": "ssh://git@github.com:octopusden/octopus-release-management-service.git", + "sha": "0da242ad739a01e7c50aeb522fd17e1eece77bb3" + } + ] +} \ No newline at end of file diff --git a/test-data/releng/builds.json b/test-data/releng/builds.json new file mode 100644 index 0000000..3950bf5 --- /dev/null +++ b/test-data/releng/builds.json @@ -0,0 +1,4 @@ +[ + {"component":"ReleaseManagementService","version":"1.0.1","status":"BUILD"}, + {"component":"ReleaseManagementService","version":"1.0.2","status":"RELEASE"} +] \ No newline at end of file