В настоящее время я испытываю трудности с созданием значимых контрактов из тестов restdocs с использованием rest-assured. Проблема в том, что я не могу найти способ генерировать сопоставления регулярных выражений, кажется, генерируется только byEquality
сопоставитель. В документации вообще нет упоминания об уверенности, так что, возможно, его набор функций еще не соответствует mock mvc. Можно ли генерировать контракты из restdocs, используя гарантированный отдых и настроенные сопоставители?
Моя текущая настройка выглядит как
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ExtendWith(value = [RestDocumentationExtension::class, SpringExtension::class])
class MasterplanResourceTest(
@LocalServerPort val port: Int,
@Autowired val mapper: ObjectMapper
) {
private val defaultDocument = document("{method_name}", SpringCloudContractRestDocs.dslContract())
lateinit var spec: RequestSpecification
@BeforeEach
internal fun setUp(restDocumentationContextProvider: RestDocumentationContextProvider) {
RestAssured.port = port
spec = RequestSpecBuilder()
.setConfig(
RestAssuredConfig.config()
.objectMapperConfig(
ObjectMapperConfig.objectMapperConfig()
.jackson2ObjectMapperFactory { _, _ -> mapper }
)
)
.addHeader("X-Forwarded-Host", "gateway-host")
.addFilter(
documentationConfiguration(restDocumentationContextProvider)
.operationPreprocessors()
.withResponseDefaults(
Preprocessors.removeMatchingHeaders("Date")
)
)
.addFilter(defaultDocument)
.addFilter(ResponseLoggingFilter())
.log(LogDetail.ALL)
.build()
}
@Test
fun createMasterplan() {
RestAssured.given(spec)
.contentType(ContentType.JSON)
.filter(
defaultDocument.document(
links(
linkWithRel("self").description("Link to the generated masterplan")
),
requestFields(
fieldWithPath("file.file_uid").description("File id used to retrieve file information from upload service"),
fieldWithPath("description").description("Description")
.attributes(Attributes.key("contract.jsonPaths").value("link"))
),
responseFields(
fieldWithPath("created_by").description("File name"),
fieldWithPath("description").description("Description"),
fieldWithPath("file").description("File linked to the masterplan"),
fieldWithPath("file.file_uid").description("File unique identifier"),
fieldWithPath("file.name").description("File name"),
fieldWithPath("file.size").description("File size in bytes"),
fieldWithPath("file.href").description("File download link"),
fieldWithPath("file.uploaded_by").description("File uploader")
).and(
subsectionWithPath("_links").ignored()
)
)
)
.body("""{"description":"something","file":{"file_uid":"fileUid"}}""")
.`when`().post("/projects/project/masterplans")
.then().assertThat()
.statusCode(`is`(200))
.body("description", equalTo("something"))
.body("created_by", equalTo("me"))
.body("file.size", equalTo(100))
.body("file.file_uid", equalTo("fileUid"))
.body("file.name", equalTo("filename"))
.body("file.href", matchesPattern(".*/projects/project/masterplans/\\d+/files/fileUid$"))
.body("file.uploaded_by", equalTo("someone"))
.body("_links.self.href", matchesPattern(".*/projects/project/masterplans/\\d+"))
}
Этот код генерирует следующий контракт:
import org.springframework.cloud.contract.spec.Contract
Contract.make {
request {
method 'POST'
url '/projects/project/masterplans'
body('''
{"description":"something","file":{"file_uid":"fileUid"}}
''')
headers {
header('''X-Forwarded-Host''', '''gateway-host''')
header('''Content-Type''', '''application/json; charset=UTF-8''')
}
}
response {
status 200
body('''
{"created_by":"me","description":"something","file":{"file_uid":"fileUid","name":"filename","size":100,"href":"http://gateway-host/projects/project/masterplans/102/files/fileUid","uploaded_by":"someone"},"_links":{"self":{"href":"http://gateway-host/projects/project/masterplans/102"}}}
''')
headers {
header('''Content-Type''', '''application/hal+json;charset=UTF-8''')
header('''Transfer-Encoding''', '''chunked''')
}
}
}
Теперь я хотел бы, чтобы matchesPattern
(пользовательские сопоставители подколенных сухожилий из библиотеки jcabi
) были отражены в самом контракте, поэтому "_links":{"self":{"href":".*/projects/project/masterplans/\d+"
вместо "_links":{"self":{"href":"http://gateway-host/projects/project/masterplans/102"
. Возможно ли это с уверенностью или мне нужно переключиться на mockmvc?