diff --git a/src/main/java/com/mindee/parsing/generated/GeneratedObject.java b/src/main/java/com/mindee/parsing/generated/GeneratedObject.java index 33d06ad7..17700ac0 100644 --- a/src/main/java/com/mindee/parsing/generated/GeneratedObject.java +++ b/src/main/java/com/mindee/parsing/generated/GeneratedObject.java @@ -104,10 +104,26 @@ public Polygon getPolygon() { * @return A {@link Polygon}. */ public Polygon getAsPolygon(String key) { - if (this.containsKey(key)) { - return PolygonUtils.getFrom((List>) this.get(key)); + if (!this.containsKey(key)) { + return null; } - return null; + Object rawPolygon = this.get(key); + // a valid polygon must have at least 4 points + if (!(rawPolygon instanceof List && ((List) rawPolygon).size() >= 4)) { + return null; + } + // a valid point must have exactly 2 coordinates + for (Object point : (List) rawPolygon) { + if (!(point instanceof List) || ((List) point).size() != 2) { + return null; + } + for (Object coord : (List) point) { + if (!(coord instanceof Double)) { + return null; + } + } + } + return PolygonUtils.getFrom((List>) rawPolygon); } /** diff --git a/src/test/java/com/mindee/product/generated/GeneratedV1Test.java b/src/test/java/com/mindee/product/generated/GeneratedV1Test.java index 096a164c..eb2e46d7 100644 --- a/src/test/java/com/mindee/product/generated/GeneratedV1Test.java +++ b/src/test/java/com/mindee/product/generated/GeneratedV1Test.java @@ -29,7 +29,7 @@ protected AsyncPredictResponse getAsyncPrediction(String name) thro GeneratedV1.class ); return objectMapper.readValue( - new File("src/test/resources/products/generated/response_v1/" + name + "_international_id_v1.json"), + new File("src/test/resources/products/generated/response_v1/" + name + ".json"), type ); } @@ -62,9 +62,25 @@ protected PredictResponse getSyncPrediction(String name) throws IOE ); } + @Test + void whenAsyncBadPolygonsDeserialized_mustHaveValidProperties() throws IOException { + AsyncPredictResponse response = getAsyncPrediction("bad_polygons_driver_license_v1"); + GeneratedV1Document docPrediction = response.getDocumentObj().getInference().getPrediction(); + + Map features = docPrediction.getFields(); + + // invalid polygon returned by the server + StringField categoryField = features.get("category").asStringField(); + Assertions.assertNull(categoryField.getPolygon()); + + // valid polygon + StringField mrzField = features.get("mrz").asStringField(); + Assertions.assertNotNull(mrzField.getPolygon()); + } + @Test void whenAsyncCompleteDeserialized_mustHaveValidProperties() throws IOException { - AsyncPredictResponse response = getAsyncPrediction("complete"); + AsyncPredictResponse response = getAsyncPrediction("complete_international_id_v1"); GeneratedV1Document docPrediction = response.getDocumentObj().getInference().getPrediction(); Map features = docPrediction.getFields(); @@ -114,7 +130,7 @@ void whenAsyncCompleteDeserialized_mustHaveValidProperties() throws IOException @Test void whenAsyncEmptyDeserialized_mustHaveValidProperties() throws IOException { - AsyncPredictResponse response = getAsyncPrediction("empty"); + AsyncPredictResponse response = getAsyncPrediction("empty_international_id_v1"); GeneratedV1Document docPrediction = response.getDocumentObj().getInference().getPrediction(); Map features = docPrediction.getFields(); diff --git a/src/test/resources b/src/test/resources index e48b26e5..f599a960 160000 --- a/src/test/resources +++ b/src/test/resources @@ -1 +1 @@ -Subproject commit e48b26e5250cbbab9d3ee6c66c0eb85b667a4bb8 +Subproject commit f599a960e78f4a390984c6263f387aa8cdebe0f0