Skip to content

Commit 3996ba1

Browse files
committed
Add custom asserts for MockMvc.perform() result
1 parent 2e7f158 commit 3996ba1

File tree

4 files changed

+133
-1
lines changed

4 files changed

+133
-1
lines changed

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

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ object SpringModelUtils {
2424
val dirtiesContextClassModeClassId = ClassId("org.springframework.test.annotation.DirtiesContext\$ClassMode")
2525
val transactionalClassId = ClassId("org.springframework.transaction.annotation.Transactional")
2626
val autoConfigureTestDbClassId = ClassId("org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase")
27+
val autoConfigureMockMvcClassId = ClassId("org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc")
2728

2829
val runWithClassId = ClassId("org.junit.runner.RunWith")
2930
val springRunnerClassId = ClassId("org.springframework.test.context.junit4.SpringRunner")
@@ -110,6 +111,13 @@ object SpringModelUtils {
110111
val resultActionsClassId = ClassId("org.springframework.test.web.servlet.ResultActions")
111112
private val mockMvcClassId = ClassId("org.springframework.test.web.servlet.MockMvc")
112113
private val mvcResultClassId = ClassId("org.springframework.test.web.servlet.MvcResult")
114+
private val resultHandlerClassId = ClassId("org.springframework.test.web.servlet.ResultHandler")
115+
val mockMvcResultHandlersClassId = ClassId("org.springframework.test.web.servlet.result.MockMvcResultHandlers")
116+
private val resultMatcherClassId = ClassId("org.springframework.test.web.servlet.ResultMatcher")
117+
val mockMvcResultMatchersClassId = ClassId("org.springframework.test.web.servlet.result.MockMvcResultMatchers")
118+
private val statusResultMatchersClassId = ClassId("org.springframework.test.web.servlet.result.StatusResultMatchers")
119+
private val contentResultMatchersClassId = ClassId("org.springframework.test.web.servlet.result.ContentResultMatchers")
120+
private val viewResultMatchersClassId = ClassId("org.springframework.test.web.servlet.result.ViewResultMatchers")
113121
private val mockHttpServletRequestBuilderClassId = ClassId("org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder")
114122
private val modelAndViewClassId = ClassId("org.springframework.web.servlet.ModelAndView")
115123

@@ -178,6 +186,69 @@ object SpringModelUtils {
178186
returnType = stringClassId
179187
)
180188

189+
val resultActionsAndDoMethodId = MethodId(
190+
classId = resultActionsClassId,
191+
name = "andDo",
192+
parameters = listOf(resultHandlerClassId),
193+
returnType = resultActionsClassId
194+
)
195+
196+
val resultHandlersPrintMethodId = MethodId(
197+
classId = mockMvcResultHandlersClassId,
198+
name = "print",
199+
parameters = listOf(),
200+
returnType = resultHandlerClassId
201+
)
202+
203+
val resultActionsAndExpectMethodId = MethodId(
204+
classId = resultActionsClassId,
205+
name = "andExpect",
206+
parameters = listOf(resultMatcherClassId),
207+
returnType = resultActionsClassId
208+
)
209+
210+
val resultMatchersStatusMethodId = MethodId(
211+
classId = mockMvcResultMatchersClassId,
212+
name = "status",
213+
parameters = listOf(),
214+
returnType = statusResultMatchersClassId
215+
)
216+
217+
val statusMatchersIsMethodId = MethodId(
218+
classId = statusResultMatchersClassId,
219+
name = "is",
220+
parameters = listOf(intClassId),
221+
returnType = resultMatcherClassId
222+
)
223+
224+
val resultMatchersContentMethodId = MethodId(
225+
classId = mockMvcResultMatchersClassId,
226+
name = "content",
227+
parameters = listOf(),
228+
returnType = contentResultMatchersClassId
229+
)
230+
231+
val contentMatchersStringMethodId = MethodId(
232+
classId = contentResultMatchersClassId,
233+
name = "string",
234+
parameters = listOf(stringClassId),
235+
returnType = resultMatcherClassId
236+
)
237+
238+
val resultMatchersViewMethodId = MethodId(
239+
classId = contentResultMatchersClassId,
240+
name = "view",
241+
parameters = listOf(),
242+
returnType = viewResultMatchersClassId
243+
)
244+
245+
val viewMatchersNameMethodId = MethodId(
246+
classId = viewResultMatchersClassId,
247+
name = "name",
248+
parameters = listOf(stringClassId),
249+
returnType = resultMatcherClassId
250+
)
251+
181252
fun createMockMvcModel(idGenerator: () -> Int) =
182253
createBeanModel("mockMvc", idGenerator(), mockMvcClassId)
183254

utbot-framework/src/main/kotlin/org/utbot/framework/codegen/domain/models/CgElement.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,7 @@ class CgSingleArgAnnotation(
405405
* NOTE: use `StatementConstructor.addAnnotation`
406406
* instead of explicit constructor call.
407407
*/
408-
class CgMultipleArgsAnnotation(
408+
data class CgMultipleArgsAnnotation(
409409
override val classId: ClassId,
410410
val arguments: MutableList<CgNamedAnnotationArgument>,
411411
override val target: AnnotationTarget,

utbot-framework/src/main/kotlin/org/utbot/framework/codegen/generator/SpringCodeGenerator.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ import org.utbot.framework.codegen.domain.context.CgContext
44
import org.utbot.framework.codegen.domain.models.CgMethodTestSet
55
import org.utbot.framework.codegen.domain.models.builders.SpringTestClassModelBuilder
66
import org.utbot.framework.codegen.services.language.CgLanguageAssistant
7+
import org.utbot.framework.codegen.tree.CgCustomAssertConstructor
78
import org.utbot.framework.codegen.tree.CgSpringIntegrationTestClassConstructor
89
import org.utbot.framework.codegen.tree.CgSpringUnitTestClassConstructor
910
import org.utbot.framework.codegen.tree.CgSpringVariableConstructor
1011
import org.utbot.framework.codegen.tree.CgVariableConstructor
1112
import org.utbot.framework.codegen.tree.ututils.UtilClassKind
13+
import org.utbot.framework.codegen.tree.withCustomAssertForMockMvcResultActions
1214
import org.utbot.framework.plugin.api.ClassId
1315
import org.utbot.framework.plugin.api.ConcreteContextLoadingResult
1416
import org.utbot.framework.plugin.api.SpringSettings
@@ -27,6 +29,10 @@ class SpringCodeGenerator(
2729
override fun getVariableConstructorBy(context: CgContext): CgVariableConstructor =
2830
// TODO decorate original `params.cgLanguageAssistant.getVariableConstructorBy(context)`
2931
CgSpringVariableConstructor(context)
32+
33+
override fun getCustomAssertConstructorBy(context: CgContext): CgCustomAssertConstructor =
34+
params.cgLanguageAssistant.getCustomAssertConstructorBy(context)
35+
.withCustomAssertForMockMvcResultActions()
3036
}
3137
)
3238
) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package org.utbot.framework.codegen.tree
2+
3+
import org.utbot.framework.codegen.domain.context.CgContext
4+
import org.utbot.framework.codegen.domain.context.CgContextOwner
5+
import org.utbot.framework.codegen.domain.models.AnnotationTarget
6+
import org.utbot.framework.codegen.domain.models.CgVariable
7+
import org.utbot.framework.codegen.services.access.CgCallableAccessManager
8+
import org.utbot.framework.codegen.services.access.CgCallableAccessManagerImpl
9+
import org.utbot.framework.codegen.tree.CgComponents.getStatementConstructorBy
10+
import org.utbot.framework.plugin.api.UtCustomModel
11+
import org.utbot.framework.plugin.api.UtSpringMockMvcResultActionsModel
12+
import org.utbot.framework.plugin.api.util.SpringModelUtils.autoConfigureMockMvcClassId
13+
import org.utbot.framework.plugin.api.util.SpringModelUtils.contentMatchersStringMethodId
14+
import org.utbot.framework.plugin.api.util.SpringModelUtils.mockMvcResultHandlersClassId
15+
import org.utbot.framework.plugin.api.util.SpringModelUtils.mockMvcResultMatchersClassId
16+
import org.utbot.framework.plugin.api.util.SpringModelUtils.resultActionsAndDoMethodId
17+
import org.utbot.framework.plugin.api.util.SpringModelUtils.resultActionsAndExpectMethodId
18+
import org.utbot.framework.plugin.api.util.SpringModelUtils.resultHandlersPrintMethodId
19+
import org.utbot.framework.plugin.api.util.SpringModelUtils.resultMatchersContentMethodId
20+
import org.utbot.framework.plugin.api.util.SpringModelUtils.resultMatchersStatusMethodId
21+
import org.utbot.framework.plugin.api.util.SpringModelUtils.resultMatchersViewMethodId
22+
import org.utbot.framework.plugin.api.util.SpringModelUtils.statusMatchersIsMethodId
23+
import org.utbot.framework.plugin.api.util.SpringModelUtils.viewMatchersNameMethodId
24+
25+
fun CgCustomAssertConstructor.withCustomAssertForMockMvcResultActions() =
26+
CgMockMvcResultActionsAssertConstructor(context, this)
27+
28+
class CgMockMvcResultActionsAssertConstructor(
29+
context: CgContext,
30+
private val delegateAssertConstructor: CgCustomAssertConstructor
31+
) : CgCustomAssertConstructor by delegateAssertConstructor,
32+
CgContextOwner by context,
33+
CgStatementConstructor by getStatementConstructorBy(context),
34+
CgCallableAccessManager by CgCallableAccessManagerImpl(context) {
35+
override fun tryConstructCustomAssert(expected: UtCustomModel, actual: CgVariable): Boolean {
36+
if (expected is UtSpringMockMvcResultActionsModel) {
37+
addAnnotation(autoConfigureMockMvcClassId, AnnotationTarget.Class)
38+
var expr = actual[resultActionsAndDoMethodId](mockMvcResultHandlersClassId[resultHandlersPrintMethodId]())
39+
expr = expr[resultActionsAndExpectMethodId](
40+
mockMvcResultMatchersClassId[resultMatchersStatusMethodId]()[statusMatchersIsMethodId](expected.status)
41+
)
42+
expected.viewName?.let { viewName ->
43+
expr = expr[resultActionsAndExpectMethodId](
44+
mockMvcResultMatchersClassId[resultMatchersViewMethodId]()[viewMatchersNameMethodId](viewName)
45+
)
46+
}
47+
expr = expr[resultActionsAndExpectMethodId](
48+
mockMvcResultMatchersClassId[resultMatchersContentMethodId]()[contentMatchersStringMethodId](expected.contentAsString)
49+
)
50+
+expr
51+
return true
52+
} else
53+
return delegateAssertConstructor.tryConstructCustomAssert(expected, actual)
54+
}
55+
}

0 commit comments

Comments
 (0)