Skip to content

Commit 2933474

Browse files
authored
Add support for @CookieValue annotation (#2519)
1 parent 401da70 commit 2933474

File tree

1 file changed

+71
-1
lines changed

1 file changed

+71
-1
lines changed

utbot-framework-api/src/main/kotlin/org/utbot/framework/plugin/api/util/SpringModelUtils.kt

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ object SpringModelUtils {
125125
private val requestMappingClassId = ClassId("org.springframework.web.bind.annotation.RequestMapping")
126126
private val pathVariableClassId = ClassId("org.springframework.web.bind.annotation.PathVariable")
127127
private val requestHeaderClassId = ClassId("org.springframework.web.bind.annotation.RequestHeader")
128+
private val cookieValueClassId = ClassId("org.springframework.web.bind.annotation.CookieValue")
128129
private val requestBodyClassId = ClassId("org.springframework.web.bind.annotation.RequestBody")
129130
private val requestParamClassId = ClassId("org.springframework.web.bind.annotation.RequestParam")
130131
private val uriComponentsBuilderClassId = ClassId("org.springframework.web.util.UriComponentsBuilder")
@@ -148,6 +149,7 @@ object SpringModelUtils {
148149
private val httpHeaderClassId = ClassId("org.springframework.http.HttpHeaders")
149150

150151
private val objectMapperClassId = ClassId("com.fasterxml.jackson.databind.ObjectMapper")
152+
private val cookieClassId = ClassId("javax.servlet.http.Cookie")
151153

152154
val mockMvcPerformMethodId = MethodId(
153155
classId = mockMvcClassId,
@@ -323,10 +325,45 @@ object SpringModelUtils {
323325

324326
requestBuilderModel = addHeadersToRequestBuilderModel(headersContentModel, requestBuilderModel, idGenerator)
325327

326-
// TODO #2462 (support @CookieValue, @RequestAttribute, ...)
328+
val cookieClass = utContext.classLoader.loadClass(cookieClassId.name)
329+
val cookieArrayClassId = java.lang.reflect.Array.newInstance(cookieClass,0)::class.java.id
330+
val cookieValuesModel = createCookieValuesModel(cookieArrayClassId, methodId, arguments, idGenerator)
331+
332+
requestBuilderModel =
333+
addCookiesToRequestBuilderModel(cookieValuesModel, cookieArrayClassId, requestBuilderModel, idGenerator)
334+
327335
return addContentToRequestBuilderModel(methodId, arguments, requestBuilderModel, idGenerator)
328336
}
329337

338+
private fun addCookiesToRequestBuilderModel(
339+
cookieValuesModel: UtArrayModel,
340+
cookieArrayClassId: ClassId,
341+
requestBuilderModel: UtAssembleModel,
342+
idGenerator: () -> Int
343+
): UtAssembleModel {
344+
@Suppress("NAME_SHADOWING")
345+
var requestBuilderModel = requestBuilderModel
346+
347+
if(cookieValuesModel.length > 0) {
348+
requestBuilderModel = UtAssembleModel(
349+
id = idGenerator(),
350+
classId = mockHttpServletRequestBuilderClassId,
351+
modelName = "requestBuilder",
352+
instantiationCall = UtExecutableCallModel(
353+
instance = requestBuilderModel,
354+
executable = MethodId(
355+
classId = mockHttpServletRequestBuilderClassId,
356+
name = "cookie",
357+
returnType = mockHttpServletRequestBuilderClassId,
358+
parameters = listOf(cookieArrayClassId)
359+
),
360+
params = listOf(cookieValuesModel)
361+
)
362+
)
363+
}
364+
return requestBuilderModel
365+
}
366+
330367
private fun addHeadersToRequestBuilderModel(
331368
headersContentModel: UtAssembleModel,
332369
requestBuilderModel: UtAssembleModel,
@@ -467,6 +504,39 @@ object SpringModelUtils {
467504
return requestBuilderModel
468505
}
469506

507+
private fun createCookieValuesModel(
508+
cookieArrayClassId: ClassId,
509+
methodId: MethodId,
510+
arguments: List<UtModel>,
511+
idGenerator: () -> Int,
512+
): UtArrayModel {
513+
val cookieValues = collectArgumentsWithAnnotationModels(methodId, cookieValueClassId, arguments)
514+
.mapValues { (_, model) -> convertModelValueToString(model) }.toList()
515+
516+
// Creating an indexed Map for `UtArrayModel.stores`
517+
val indexedCookieValues = HashMap<Int, UtModel>()
518+
cookieValues.indices.forEach { ind ->
519+
indexedCookieValues[ind] = UtAssembleModel(
520+
id = idGenerator(),
521+
classId = cookieClassId,
522+
modelName = "cookie",
523+
instantiationCall = UtExecutableCallModel(
524+
instance = null,
525+
executable = constructorId(cookieClassId, stringClassId, stringClassId),
526+
params = listOf(UtPrimitiveModel(cookieValues[ind].first), cookieValues[ind].second),
527+
)
528+
)
529+
}
530+
531+
return UtArrayModel(
532+
id = idGenerator(),
533+
classId = cookieArrayClassId,
534+
length = cookieValues.size,
535+
constModel = UtNullModel(cookieClassId),
536+
stores = indexedCookieValues,
537+
)
538+
}
539+
470540
private fun createHeadersContentModel(
471541
methodId: MethodId,
472542
arguments: List<UtModel>,

0 commit comments

Comments
 (0)