swagger-coverage icon indicating copy to clipboard operation
swagger-coverage copied to clipboard

Bug: NPE in PropertyConditionPredicate when processing empty schema

Open beskrovnykh opened this issue 11 months ago • 1 comments

I'm submitting a ... [x] bug report [ ] feature request

What is the current behavior?

PropertyConditionPredicate выбрасывает NPE при попытке доступа к properties пустой Schema во время анализа покрытия. Ошибка возникает потому что SwaggerCoverageV3RestAssured создает Schema без инициализации properties, а PropertyConditionPredicate предполагает что properties всегда инициализированы.

If the current behavior is a bug, please provide steps to reproduce: Использовать фильтр SwaggerCoverageV3RestAssured с REST-assured: RestAssured.given().filter(new SwaggerCoverageV3RestAssured()) Сделать любой запрос с телом Попытаться сгенерировать отчет о покрытии Ошибка:

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.util.Map.entrySet()" because the return value of "io.swagger.v3.oas.models.media.Schema.getProperties()" is null at com.github.viclovsky.swagger.coverage.core.predicate.PropertyConditionPredicate.lambda$check$2(PropertyConditionPredicate.java:32)

What is the expected behavior? PropertyConditionPredicate должен корректно обрабатывать null в properties, либо: Обеспечивая создание Schema с инициализированными properties в SwaggerCoverageV3RestAssured Либо добавляя проверку на null в PropertyConditionPredicate What is the motivation / use case for changing the behavior? Текущая реализация ломает анализ покрытия для любого запроса с телом из-за необработанного NPE. Это затрагивает всех пользователей независимо от того, используют они сгенерированные клиенты или нет, так как фильтр всегда создает новую пустую Schema.

Other information В документации указано что "Swagger-coverage работает хорошо с клиентами, сгенерированными из swagger", однако это не имеет отношения к проблеме, так как SwaggerCoverageV3RestAssured создает новую пустую Schema независимо от типа клиента:

// в SwaggerCoverageV3RestAssured
MediaType mediaType = new MediaType();
mediaType.setSchema(new Schema()); // properties == null
// в PropertyConditionPredicate
.flatMap(o -> (Stream<Map.Entry<String, Schema>>) o.getProperties().entrySet().stream()) // NPE здесь

beskrovnykh avatar Dec 13 '24 08:12 beskrovnykh

Проблема решена инициализацией пустого Map для properties при создании Schema в SwaggerCoverageV3RestAssured.

Было:

MediaType mediaType = new MediaType(); mediaType.setSchema(new Schema()); // properties == null

Стало:

MediaType mediaType = new MediaType(); mediaType.setSchema(new Schema().properties(new HashMap<>())); // properties инициализирован

Это предотвращает NPE в PropertyConditionPredicate, так как теперь properties всегда инициализирован, даже если пуст.

beskrovnykh avatar Dec 13 '24 10:12 beskrovnykh