@@ -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