@@ -125,6 +125,7 @@ object SpringModelUtils {
125
125
private val requestMappingClassId = ClassId (" org.springframework.web.bind.annotation.RequestMapping" )
126
126
private val pathVariableClassId = ClassId (" org.springframework.web.bind.annotation.PathVariable" )
127
127
private val requestHeaderClassId = ClassId (" org.springframework.web.bind.annotation.RequestHeader" )
128
+ private val cookieValueClassId = ClassId (" org.springframework.web.bind.annotation.CookieValue" )
128
129
private val requestBodyClassId = ClassId (" org.springframework.web.bind.annotation.RequestBody" )
129
130
private val requestParamClassId = ClassId (" org.springframework.web.bind.annotation.RequestParam" )
130
131
private val uriComponentsBuilderClassId = ClassId (" org.springframework.web.util.UriComponentsBuilder" )
@@ -148,6 +149,7 @@ object SpringModelUtils {
148
149
private val httpHeaderClassId = ClassId (" org.springframework.http.HttpHeaders" )
149
150
150
151
private val objectMapperClassId = ClassId (" com.fasterxml.jackson.databind.ObjectMapper" )
152
+ private val cookieClassId = ClassId (" javax.servlet.http.Cookie" )
151
153
152
154
val mockMvcPerformMethodId = MethodId (
153
155
classId = mockMvcClassId,
@@ -323,10 +325,45 @@ object SpringModelUtils {
323
325
324
326
requestBuilderModel = addHeadersToRequestBuilderModel(headersContentModel, requestBuilderModel, idGenerator)
325
327
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
+
327
335
return addContentToRequestBuilderModel(methodId, arguments, requestBuilderModel, idGenerator)
328
336
}
329
337
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
+
330
367
private fun addHeadersToRequestBuilderModel (
331
368
headersContentModel : UtAssembleModel ,
332
369
requestBuilderModel : UtAssembleModel ,
@@ -467,6 +504,39 @@ object SpringModelUtils {
467
504
return requestBuilderModel
468
505
}
469
506
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
+
470
540
private fun createHeadersContentModel (
471
541
methodId : MethodId ,
472
542
arguments : List <UtModel >,
0 commit comments