From c679356f7206c4674a904d1271ff94dda7291eb2 Mon Sep 17 00:00:00 2001 From: Alexander Ryabokon Date: Thu, 4 Apr 2024 16:52:28 +0300 Subject: [PATCH] Add request parameters to service client + tests (#7) --- .../org/octopusden/task/MigrateMockData.kt | 9 +++- .../client/ReleaseManagementServiceClient.kt | 4 +- .../ClassicReleaseManagementServiceClient.kt | 6 ++- .../client/common/dto/BuildFilterDTO.kt | 2 +- .../BuildControllerTest.kt | 5 +- .../legacy/LegacyRelengConfig.kt | 4 +- .../controller/ActuatorTest.kt | 2 +- .../controller/BaseControllerTest.kt | 28 +++++++++-- .../controller/BuildControllerTest.kt | 5 +- .../src/test/resources/application-test.yml | 2 +- .../BaseBuildControllerTest.kt | 48 ++++++++++++++----- .../{build_1.0.2.json => build_2.0.1.json} | 2 +- test-data/releng/builds-2.0.json | 3 ++ test-data/releng/builds-descending.json | 4 ++ test-data/releng/builds-limit.json | 3 ++ test-data/releng/builds-release.json | 3 ++ test-data/releng/builds.json | 2 +- 17 files changed, 101 insertions(+), 31 deletions(-) rename test-data/releng/{build_1.0.2.json => build_2.0.1.json} (92%) create mode 100644 test-data/releng/builds-2.0.json create mode 100644 test-data/releng/builds-descending.json create mode 100644 test-data/releng/builds-limit.json create mode 100644 test-data/releng/builds-release.json diff --git a/buildSrc/src/main/kotlin/org/octopusden/task/MigrateMockData.kt b/buildSrc/src/main/kotlin/org/octopusden/task/MigrateMockData.kt index 4b4ec85..4286007 100644 --- a/buildSrc/src/main/kotlin/org/octopusden/task/MigrateMockData.kt +++ b/buildSrc/src/main/kotlin/org/octopusden/task/MigrateMockData.kt @@ -57,10 +57,15 @@ open class MigrateMockData : DefaultTask() { } companion object { + private val defaultParams = mapOf("descending" to "false") private val endpointToResponseFileName = mapOf( - "/rest/release-engineering/3/component/ReleaseManagementService/builds" to emptyMap() to "releng/builds.json", + "/rest/release-engineering/3/component/ReleaseManagementService/builds" to defaultParams + mapOf("limit" to "10")to "releng/builds.json", + "/rest/release-engineering/3/component/ReleaseManagementService/builds" to defaultParams + mapOf("limit" to "1") to "releng/builds-limit.json", + "/rest/release-engineering/3/component/ReleaseManagementService/builds" to defaultParams + mapOf("descending" to "true") to "releng/builds-descending.json", + "/rest/release-engineering/3/component/ReleaseManagementService/builds" to defaultParams + mapOf("minors" to "2.0") to "releng/builds-2.0.json", + "/rest/release-engineering/3/component/ReleaseManagementService/builds" to defaultParams + mapOf("statuses" to "RELEASE") to "releng/builds-release.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", + "/rest/release-engineering/3/component/ReleaseManagementService/version/2.0.1/build" to emptyMap() to "releng/build_2.0.1.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/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/ReleaseManagementServiceClient.kt b/client/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/ReleaseManagementServiceClient.kt index 2d3fd68..7f3f886 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,8 +1,10 @@ package org.octopusden.octopus.releasemanagementservice.client import feign.Param +import feign.QueryMap import feign.RequestLine import org.octopusden.octopus.releasemanagementservice.client.common.dto.BuildDTO +import org.octopusden.octopus.releasemanagementservice.client.common.dto.BuildFilterDTO import org.octopusden.octopus.releasemanagementservice.client.common.dto.ServiceInfoDTO import org.octopusden.octopus.releasemanagementservice.client.common.dto.ShortBuildDTO @@ -12,7 +14,7 @@ interface ReleaseManagementServiceClient { fun getServiceInfo(): ServiceInfoDTO @RequestLine("GET /rest/api/1/builds/component/{component}") - fun getBuilds(@Param("component") component: String): Collection + fun getBuilds(@Param("component") component: String, @QueryMap filter: BuildFilterDTO = BuildFilterDTO()): Collection @RequestLine("GET /rest/api/1/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/impl/ClassicReleaseManagementServiceClient.kt b/client/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/impl/ClassicReleaseManagementServiceClient.kt index afb6914..2765bde 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 @@ -10,13 +10,14 @@ import feign.httpclient.ApacheHttpClient import feign.jackson.JacksonDecoder import feign.jackson.JacksonEncoder import feign.slf4j.Slf4jLogger +import java.util.concurrent.TimeUnit 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.BuildFilterDTO 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( apiParametersProvider: ReleaseManagementServiceClientParametersProvider, @@ -30,7 +31,8 @@ class ClassicReleaseManagementServiceClient( getMapper() ) - override fun getBuilds(component: String): Collection = client.getBuilds(component) + override fun getBuilds(component: String, filter: BuildFilterDTO): Collection = + client.getBuilds(component, filter) override fun getBuild(component: String, version: String): BuildDTO = client.getBuild(component, version) diff --git a/common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/BuildFilterDTO.kt b/common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/BuildFilterDTO.kt index 611145d..dffcb5c 100644 --- a/common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/BuildFilterDTO.kt +++ b/common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/BuildFilterDTO.kt @@ -4,5 +4,5 @@ data class BuildFilterDTO( val statuses: Set = emptySet(), val minors: Set = emptySet(), val descending: Boolean = false, - val limit: Int? + val limit: Int? = null ) \ No newline at end of file diff --git a/ft/src/ft/kotlin/org/octopusden/octopus/releasemanagementservice/BuildControllerTest.kt b/ft/src/ft/kotlin/org/octopusden/octopus/releasemanagementservice/BuildControllerTest.kt index bb25838..0f16b35 100644 --- a/ft/src/ft/kotlin/org/octopusden/octopus/releasemanagementservice/BuildControllerTest.kt +++ b/ft/src/ft/kotlin/org/octopusden/octopus/releasemanagementservice/BuildControllerTest.kt @@ -3,6 +3,7 @@ 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.BuildDTO +import org.octopusden.octopus.releasemanagementservice.client.common.dto.BuildFilterDTO import org.octopusden.octopus.releasemanagementservice.client.common.dto.ErrorResponse import org.octopusden.octopus.releasemanagementservice.client.common.dto.ReleaseManagementServiceErrorCode import org.octopusden.octopus.releasemanagementservice.client.common.dto.ShortBuildDTO @@ -14,8 +15,8 @@ class BuildControllerTest : BaseBuildControllerTest(), BaseReleaseManagementServ override fun getObjectMapper(): ObjectMapper = mapper - override fun getBuilds(component: String): Collection { - return client.getBuilds(component) + override fun getBuilds(component: String, params: Map): Collection { + return client.getBuilds(component, mapper.convertValue(params, BuildFilterDTO::class.java)) } override fun getBuild(component: String, version: String): BuildDTO { 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 index 0f651a6..d6e60da 100644 --- a/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengConfig.kt +++ b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengConfig.kt @@ -8,10 +8,10 @@ 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 import org.slf4j.LoggerFactory +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration @Configuration 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 2fc0501..6df5632 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 @@ -32,7 +32,7 @@ class ActuatorTest : BaseControllerTest, BaseActuatorTest() { protected lateinit var mapper: ObjectMapper override fun getServiceInfo(): ServiceInfoDTO { - return get(HttpStatus.OK.value(), object : TypeReference() {}, "/actuator/info") + return get(HttpStatus.OK.value(), object : TypeReference() {}, "/actuator/info", emptyMap()) } override fun getMockMvc(): MockMvc = mvc 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 4868504..dcd6173 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,31 +1,49 @@ package org.octopusden.octopus.releasemanagementservice.controller import com.fasterxml.jackson.core.type.TypeReference +import java.time.ZoneId +import java.time.format.DateTimeFormatter import org.octopusden.octopus.releasemanagementservice.BaseReleaseManagementServiceTest import org.springframework.http.MediaType import org.springframework.mock.web.MockHttpServletResponse 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 org.springframework.util.LinkedMultiValueMap private const val ISO_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX" interface BaseControllerTest : BaseReleaseManagementServiceTest { fun getMockMvc(): MockMvc - fun get(code: Int, typeReference: TypeReference, path: String, vararg uriVars: String) = - getMockMvc().perform( + fun get( + code: Int, + typeReference: TypeReference, + path: String, + params: Map, + vararg uriVars: String + ): T { + val mockMvcParams = LinkedMultiValueMap() + params.entries + .flatMap { (param, rawValue) -> + when (rawValue) { + is Collection<*> -> rawValue.map { value -> param to value } + else -> listOf(param to rawValue) + } + }.forEach { (k, v) -> mockMvcParams[k] = v.toString() } + + return getMockMvc().perform( MockMvcRequestBuilders.get(path, *uriVars) + .params(mockMvcParams) .contentType(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON) ) .andExpect(MockMvcResultMatchers.status().`is`(code)) .andReturn() .response.toObject(typeReference) + } - fun MockHttpServletResponse.toObject(typeReference: TypeReference): T = + fun MockHttpServletResponse.toObject(typeReference: TypeReference): T = getObjectMapper().readValue(this.contentAsByteArray, typeReference) companion object { 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 index 1b9d75f..8432fdc 100644 --- a/server/src/test/kotlin/org/octopusden/octopus/releasemanagementservice/controller/BuildControllerTest.kt +++ b/server/src/test/kotlin/org/octopusden/octopus/releasemanagementservice/controller/BuildControllerTest.kt @@ -35,11 +35,12 @@ class BuildControllerTest : BaseBuildControllerTest(), BaseControllerTest { override fun getMockMvc(): MockMvc = mvc override fun getObjectMapper(): ObjectMapper = mapper - override fun getBuilds(component: String): Collection { + override fun getBuilds(component: String, params: Map): Collection { return get( HttpStatus.OK.value(), object : TypeReference>() {}, "/rest/api/1/builds/component/{component}", + params, component ) } @@ -49,6 +50,7 @@ class BuildControllerTest : BaseBuildControllerTest(), BaseControllerTest { HttpStatus.OK.value(), object : TypeReference() {}, "/rest/api/1/builds/component/{component}/version/{version}", + emptyMap(), component, version ) @@ -59,6 +61,7 @@ class BuildControllerTest : BaseBuildControllerTest(), BaseControllerTest { HttpStatus.NOT_FOUND.value(), object : TypeReference() {}, "/rest/api/1/builds/component/{component}/version/{version}", + emptyMap(), component, version ) diff --git a/server/src/test/resources/application-test.yml b/server/src/test/resources/application-test.yml index 79668bd..4e998ec 100644 --- a/server/src/test/resources/application-test.yml +++ b/server/src/test/resources/application-test.yml @@ -9,4 +9,4 @@ management: logging: level: - org.octopusden.octopus.releasemanagementservice.controller: trace + org.octopusden.octopus.releasemanagementservice.*: trace 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 index b570b79..9dc971d 100644 --- a/test-common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/BaseBuildControllerTest.kt +++ b/test-common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/BaseBuildControllerTest.kt @@ -13,21 +13,19 @@ import java.util.stream.Stream abstract class BaseBuildControllerTest : BaseReleaseManagementServiceTest { - abstract fun getBuilds(component: String): Collection + abstract fun getBuilds(component: String, params: Map): 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 getBuildsTest(params: Map, expectedBuilds: Collection) { + val builds = getBuilds("ReleaseManagementService", params) + Assertions.assertEquals(expectedBuilds, builds) } @ParameterizedTest - @MethodSource("builds") + @MethodSource("build") fun getBuildTest(version: String, expected: BuildDTO) { Assertions.assertEquals(expected, getBuild("ReleaseManagementService", version)) } @@ -43,8 +41,36 @@ abstract class BaseBuildControllerTest : BaseReleaseManagementServiceTest { 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() {}) + mapOf("descending" to false, "limit" to 10), + loadObject("../test-data/releng/builds.json", object : TypeReference>() {}) + ), + Arguments.of( + mapOf("limit" to 1), + loadObject("../test-data/releng/builds-limit.json", object : TypeReference>() {}) + ), + Arguments.of( + mapOf("descending" to true), + loadObject( + "../test-data/releng/builds-descending.json", + object : TypeReference>() {}) + ), + Arguments.of( + mapOf("minors" to listOf("2.0")), + loadObject("../test-data/releng/builds-2.0.json", object : TypeReference>() {}) + ), + Arguments.of( + mapOf("statuses" to listOf("RELEASE")), + loadObject( + "../test-data/releng/builds-release.json", + object : TypeReference>() {}) ) ) + + private fun build(): Stream = Stream.of( + Arguments.of( + "1.0.1", + loadObject("../test-data/releng/build_1.0.1.json", object : TypeReference() {}) + ), + Arguments.of("2.0.1", loadObject("../test-data/releng/build_2.0.1.json", object : TypeReference() {})) + ) } \ No newline at end of file diff --git a/test-data/releng/build_1.0.2.json b/test-data/releng/build_2.0.1.json similarity index 92% rename from test-data/releng/build_1.0.2.json rename to test-data/releng/build_2.0.1.json index 50870b3..d44fed6 100644 --- a/test-data/releng/build_1.0.2.json +++ b/test-data/releng/build_2.0.1.json @@ -1,6 +1,6 @@ { "component": "ReleaseManagementService", - "version": "1.0.2", + "version": "2.0.1", "status": "RELEASE", "dependencies": [], "commits": [ diff --git a/test-data/releng/builds-2.0.json b/test-data/releng/builds-2.0.json new file mode 100644 index 0000000..0c62602 --- /dev/null +++ b/test-data/releng/builds-2.0.json @@ -0,0 +1,3 @@ +[ + {"component":"ReleaseManagementService","version":"2.0.1","status":"RELEASE"} +] \ No newline at end of file diff --git a/test-data/releng/builds-descending.json b/test-data/releng/builds-descending.json new file mode 100644 index 0000000..1ae6976 --- /dev/null +++ b/test-data/releng/builds-descending.json @@ -0,0 +1,4 @@ +[ + {"component":"ReleaseManagementService","version":"2.0.1","status":"RELEASE"}, + {"component":"ReleaseManagementService","version":"1.0.1","status":"BUILD"} +] \ No newline at end of file diff --git a/test-data/releng/builds-limit.json b/test-data/releng/builds-limit.json new file mode 100644 index 0000000..81f36a2 --- /dev/null +++ b/test-data/releng/builds-limit.json @@ -0,0 +1,3 @@ +[ + {"component":"ReleaseManagementService","version":"1.0.1","status":"BUILD"} +] \ No newline at end of file diff --git a/test-data/releng/builds-release.json b/test-data/releng/builds-release.json new file mode 100644 index 0000000..0c62602 --- /dev/null +++ b/test-data/releng/builds-release.json @@ -0,0 +1,3 @@ +[ + {"component":"ReleaseManagementService","version":"2.0.1","status":"RELEASE"} +] \ No newline at end of file diff --git a/test-data/releng/builds.json b/test-data/releng/builds.json index 3950bf5..8a304de 100644 --- a/test-data/releng/builds.json +++ b/test-data/releng/builds.json @@ -1,4 +1,4 @@ [ {"component":"ReleaseManagementService","version":"1.0.1","status":"BUILD"}, - {"component":"ReleaseManagementService","version":"1.0.2","status":"RELEASE"} + {"component":"ReleaseManagementService","version":"2.0.1","status":"RELEASE"} ] \ No newline at end of file