Цель: зафиксировать OpenAPI как контракт и ловить дрейф между спекой и реальными ответами автоматически в тестах.
Зависимость: INIT-5, INIT-6.
Что сделать
- Сейчас OpenAPI генерится из кода (code-first). Сними снапшот в файл и положи в репо как контракт-источник: дёрни
GET /v3/api-docs в тесте и сохрани src/test/resources/openapi/warehouse.json. Реши: коммитим снапшот или генерим в CI и сравниваем.
- Валидируй реальные ответы контроллеров против схемы. Возьми
com.atlassian.oas:swagger-request-validator-spring-mvc (или -restassured) и оберни вызовы MockMvc валидатором.
mockMvc.perform(get("/api/items/1").header(AUTH, token))
.andExpect(openApi().isValid("openapi/warehouse.json"));
- Сделай тест, который падает при дрейфе: генерируй спеку заново и
assertEquals с зафиксированным снапшотом. Расхождение → красный.
- Трудные места: spec-first vs code-first (где источник правды); нестабильные поля (
timestamp, id) в снапшоте; покрыть и success, и error-ответы (404/409/422) из CROSS-1.
Acceptance criteria
Цель: зафиксировать OpenAPI как контракт и ловить дрейф между спекой и реальными ответами автоматически в тестах.
Зависимость: INIT-5, INIT-6.
Что сделать
GET /v3/api-docsв тесте и сохраниsrc/test/resources/openapi/warehouse.json. Реши: коммитим снапшот или генерим в CI и сравниваем.com.atlassian.oas:swagger-request-validator-spring-mvc(или-restassured) и оберни вызовы MockMvc валидатором.assertEqualsс зафиксированным снапшотом. Расхождение → красный.timestamp,id) в снапшоте; покрыть и success, и error-ответы (404/409/422) из CROSS-1.Acceptance criteria