Skip to content

Commit

Permalink
Add request parameters to service client + tests (#7)
Browse files Browse the repository at this point in the history
  • Loading branch information
aryabokon committed Apr 4, 2024
1 parent c803661 commit c679356
Show file tree
Hide file tree
Showing 17 changed files with 101 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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<String, String>() 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<String, String>() to "releng/build_1.0.1.json",
"/rest/release-engineering/3/component/ReleaseManagementService/version/1.0.2/build" to emptyMap<String, String>() to "releng/build_1.0.2.json",
"/rest/release-engineering/3/component/ReleaseManagementService/version/2.0.1/build" to emptyMap<String, String>() to "releng/build_2.0.1.json",
)
private val endpointNotFoundToResponseFileName = mapOf(
"/rest/release-engineering/3/component/ReleaseManagementService/version/1.0.3/build" to emptyMap<String, String>() to "releng/build-not-exist-error.json"
Expand Down
Original file line number Diff line number Diff line change
@@ -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

Expand All @@ -12,7 +14,7 @@ interface ReleaseManagementServiceClient {
fun getServiceInfo(): ServiceInfoDTO

@RequestLine("GET /rest/api/1/builds/component/{component}")
fun getBuilds(@Param("component") component: String): Collection<ShortBuildDTO>
fun getBuilds(@Param("component") component: String, @QueryMap filter: BuildFilterDTO = BuildFilterDTO()): Collection<ShortBuildDTO>

@RequestLine("GET /rest/api/1/builds/component/{component}/version/{version}")
fun getBuild(@Param("component") component: String, @Param("version") version: String): BuildDTO
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -30,7 +31,8 @@ class ClassicReleaseManagementServiceClient(
getMapper()
)

override fun getBuilds(component: String): Collection<ShortBuildDTO> = client.getBuilds(component)
override fun getBuilds(component: String, filter: BuildFilterDTO): Collection<ShortBuildDTO> =
client.getBuilds(component, filter)

override fun getBuild(component: String, version: String): BuildDTO = client.getBuild(component, version)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@ data class BuildFilterDTO(
val statuses: Set<BuildStatus> = emptySet(),
val minors: Set<String> = emptySet(),
val descending: Boolean = false,
val limit: Int?
val limit: Int? = null
)
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -14,8 +15,8 @@ class BuildControllerTest : BaseBuildControllerTest(), BaseReleaseManagementServ

override fun getObjectMapper(): ObjectMapper = mapper

override fun getBuilds(component: String): Collection<ShortBuildDTO> {
return client.getBuilds(component)
override fun getBuilds(component: String, params: Map<String, Any>): Collection<ShortBuildDTO> {
return client.getBuilds(component, mapper.convertValue(params, BuildFilterDTO::class.java))
}

override fun getBuild(component: String, version: String): BuildDTO {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ class ActuatorTest : BaseControllerTest, BaseActuatorTest() {
protected lateinit var mapper: ObjectMapper

override fun getServiceInfo(): ServiceInfoDTO {
return get(HttpStatus.OK.value(), object : TypeReference<ServiceInfoDTO>() {}, "/actuator/info")
return get(HttpStatus.OK.value(), object : TypeReference<ServiceInfoDTO>() {}, "/actuator/info", emptyMap())
}

override fun getMockMvc(): MockMvc = mvc
Expand Down
Original file line number Diff line number Diff line change
@@ -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 <T : Any> get(code: Int, typeReference: TypeReference<T>, path: String, vararg uriVars: String) =
getMockMvc().perform(
fun <T : Any> get(
code: Int,
typeReference: TypeReference<T>,
path: String,
params: Map<String, Any>,
vararg uriVars: String
): T {
val mockMvcParams = LinkedMultiValueMap<String, String>()
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 <T> MockHttpServletResponse.toObject(typeReference: TypeReference<T>): T =
fun <T> MockHttpServletResponse.toObject(typeReference: TypeReference<T>): T =
getObjectMapper().readValue(this.contentAsByteArray, typeReference)

companion object {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,12 @@ class BuildControllerTest : BaseBuildControllerTest(), BaseControllerTest {
override fun getMockMvc(): MockMvc = mvc
override fun getObjectMapper(): ObjectMapper = mapper

override fun getBuilds(component: String): Collection<ShortBuildDTO> {
override fun getBuilds(component: String, params: Map<String, Any>): Collection<ShortBuildDTO> {
return get(
HttpStatus.OK.value(),
object : TypeReference<Collection<ShortBuildDTO>>() {},
"/rest/api/1/builds/component/{component}",
params,
component
)
}
Expand All @@ -49,6 +50,7 @@ class BuildControllerTest : BaseBuildControllerTest(), BaseControllerTest {
HttpStatus.OK.value(),
object : TypeReference<BuildDTO>() {},
"/rest/api/1/builds/component/{component}/version/{version}",
emptyMap(),
component,
version
)
Expand All @@ -59,6 +61,7 @@ class BuildControllerTest : BaseBuildControllerTest(), BaseControllerTest {
HttpStatus.NOT_FOUND.value(),
object : TypeReference<ErrorResponse>() {},
"/rest/api/1/builds/component/{component}/version/{version}",
emptyMap(),
component,
version
)
Expand Down
2 changes: 1 addition & 1 deletion server/src/test/resources/application-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,4 @@ management:

logging:
level:
org.octopusden.octopus.releasemanagementservice.controller: trace
org.octopusden.octopus.releasemanagementservice.*: trace
Original file line number Diff line number Diff line change
Expand Up @@ -13,21 +13,19 @@ import java.util.stream.Stream

abstract class BaseBuildControllerTest : BaseReleaseManagementServiceTest {

abstract fun getBuilds(component: String): Collection<ShortBuildDTO>
abstract fun getBuilds(component: String, params: Map<String, Any>): Collection<ShortBuildDTO>
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<Collection<ShortBuildDTO>>() {}), builds
)
@ParameterizedTest
@MethodSource("builds")
fun getBuildsTest(params: Map<String, Any>, expectedBuilds: Collection<ShortBuildDTO>) {
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))
}
Expand All @@ -43,8 +41,36 @@ abstract class BaseBuildControllerTest : BaseReleaseManagementServiceTest {

private fun builds(): Stream<Arguments> = Stream.of(
Arguments.of(
"1.0.1", loadObject("../test-data/releng/build_1.0.1.json", object : TypeReference<BuildDTO>() {}),
"1.0.2", loadObject("../test-data/releng/build_1.0.2.json", object : TypeReference<BuildDTO>() {})
mapOf("descending" to false, "limit" to 10),
loadObject("../test-data/releng/builds.json", object : TypeReference<Collection<ShortBuildDTO>>() {})
),
Arguments.of(
mapOf("limit" to 1),
loadObject("../test-data/releng/builds-limit.json", object : TypeReference<Collection<ShortBuildDTO>>() {})
),
Arguments.of(
mapOf("descending" to true),
loadObject(
"../test-data/releng/builds-descending.json",
object : TypeReference<Collection<ShortBuildDTO>>() {})
),
Arguments.of(
mapOf("minors" to listOf("2.0")),
loadObject("../test-data/releng/builds-2.0.json", object : TypeReference<Collection<ShortBuildDTO>>() {})
),
Arguments.of(
mapOf("statuses" to listOf("RELEASE")),
loadObject(
"../test-data/releng/builds-release.json",
object : TypeReference<Collection<ShortBuildDTO>>() {})
)
)

private fun build(): Stream<Arguments> = Stream.of(
Arguments.of(
"1.0.1",
loadObject("../test-data/releng/build_1.0.1.json", object : TypeReference<BuildDTO>() {})
),
Arguments.of("2.0.1", loadObject("../test-data/releng/build_2.0.1.json", object : TypeReference<BuildDTO>() {}))
)
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"component": "ReleaseManagementService",
"version": "1.0.2",
"version": "2.0.1",
"status": "RELEASE",
"dependencies": [],
"commits": [
Expand Down
3 changes: 3 additions & 0 deletions test-data/releng/builds-2.0.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[
{"component":"ReleaseManagementService","version":"2.0.1","status":"RELEASE"}
]
4 changes: 4 additions & 0 deletions test-data/releng/builds-descending.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
[
{"component":"ReleaseManagementService","version":"2.0.1","status":"RELEASE"},
{"component":"ReleaseManagementService","version":"1.0.1","status":"BUILD"}
]
3 changes: 3 additions & 0 deletions test-data/releng/builds-limit.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[
{"component":"ReleaseManagementService","version":"1.0.1","status":"BUILD"}
]
3 changes: 3 additions & 0 deletions test-data/releng/builds-release.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[
{"component":"ReleaseManagementService","version":"2.0.1","status":"RELEASE"}
]
2 changes: 1 addition & 1 deletion test-data/releng/builds.json
Original file line number Diff line number Diff line change
@@ -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"}
]

0 comments on commit c679356

Please sign in to comment.