swagger-coverage
swagger-coverage copied to clipboard
Bug: NPE in PropertyConditionPredicate when processing empty schema
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 здесь
Проблема решена инициализацией пустого 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 всегда инициализирован, даже если пуст.