Skip to content

Commit e15675b

Browse files
fix display + add basic unit test
1 parent 52742d5 commit e15675b

File tree

4 files changed

+164
-29
lines changed

4 files changed

+164
-29
lines changed
Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
package com.mindee.parsing.v2;
22

33
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
4+
import com.mindee.parsing.SummaryHelper;
45
import java.util.HashMap;
5-
import java.util.Map;
6+
import java.util.StringJoiner;
67
import lombok.EqualsAndHashCode;
78

89
/**
@@ -13,10 +14,28 @@
1314
public final class InferenceFields extends HashMap<String, DynamicField> {
1415
@Override
1516
public String toString() {
16-
StringBuilder strBuilder = new StringBuilder();
17-
for (Map.Entry<String, DynamicField> entry : this.entrySet()) {
18-
strBuilder.append(':').append(entry.getKey()).append(": ").append(entry.getValue());
17+
if (this.isEmpty()) {
18+
return "";
1919
}
20-
return strBuilder.toString();
20+
StringJoiner joiner = new StringJoiner("\n");
21+
22+
this.forEach((fieldKey, fieldValue) -> {
23+
StringBuilder strBuilder = new StringBuilder();
24+
strBuilder.append(':').append(fieldKey).append(": ");
25+
26+
if (fieldValue.getListField() != null) {
27+
ListField listField = fieldValue.getListField();
28+
if (listField.getItems() != null && !listField.getItems().isEmpty()) {
29+
strBuilder.append(listField);
30+
}
31+
} else if (fieldValue.getObjectField() != null) {
32+
strBuilder.append(fieldValue.getObjectField());
33+
} else if (fieldValue.getSimpleField() != null) {
34+
strBuilder.append(fieldValue.getSimpleField().getValue() != null ? fieldValue.getSimpleField().getValue() : "");
35+
}
36+
joiner.add(strBuilder);
37+
});
38+
39+
return SummaryHelper.cleanSummary(joiner.toString());
2140
}
2241
}

src/main/java/com/mindee/parsing/v2/ObjectField.java

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -25,29 +25,7 @@ public class ObjectField extends BaseField {
2525

2626
@Override
2727
public String toString() {
28-
if (fields == null || fields.isEmpty()) {
29-
return "\n";
30-
}
31-
32-
StringBuilder outStr = new StringBuilder();
33-
34-
fields.forEach((fieldKey, fieldValue) -> {
35-
outStr.append("\n");
36-
outStr.append(':').append(fieldKey).append(": ");
37-
38-
if (fieldValue.getListField() != null) {
39-
ListField listField = fieldValue.getListField();
40-
if (listField.getItems() != null && !listField.getItems().isEmpty()) {
41-
outStr.append(listField);
42-
}
43-
} else if (fieldValue.getObjectField() != null) {
44-
outStr.append(fieldValue.getObjectField());
45-
} else if (fieldValue.getSimpleField() != null) {
46-
outStr.append(fieldValue.getSimpleField().getValue() != null ? fieldValue.getSimpleField().getValue() : "");
47-
}
48-
});
49-
50-
return outStr + "\n";
28+
return "\n" + (fields != null ? fields.toString() : "");
5129
}
5230

5331
}

src/main/java/com/mindee/parsing/v2/SimpleField.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,6 @@ public final class SimpleField extends BaseField {
2727

2828
@Override
2929
public String toString() {
30-
return value == null ? "\n" : (value + "\n");
30+
return value == null ? "" : value.toString();
3131
}
3232
}
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
package com.mindee.v2;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import com.mindee.parsing.v2.DynamicField;
5+
import com.mindee.parsing.v2.DynamicField.FieldType;
6+
import com.mindee.parsing.v2.InferenceFields;
7+
import com.mindee.parsing.v2.InferenceResponse;
8+
import com.mindee.parsing.v2.ListField;
9+
import com.mindee.parsing.v2.ObjectField;
10+
import java.io.IOException;
11+
import java.io.InputStream;
12+
import java.util.Map;
13+
import org.junit.jupiter.api.DisplayName;
14+
import org.junit.jupiter.api.Nested;
15+
import org.junit.jupiter.api.Test;
16+
17+
import static org.junit.jupiter.api.Assertions.*;
18+
19+
@DisplayName("InferenceV2 – field integrity checks")
20+
class InferenceTest {
21+
22+
/* ------------------------------------------------------------------ */
23+
/* Helper */
24+
/* ------------------------------------------------------------------ */
25+
26+
private static InferenceResponse loadPrediction(String name) throws IOException {
27+
String resourcePath = "v2/products/financial_document/" + name + ".json";
28+
try (InputStream is = InferenceTest.class.getClassLoader().getResourceAsStream(resourcePath)) {
29+
assertNotNull(is, "Test resource not found: " + resourcePath);
30+
ObjectMapper mapper = new ObjectMapper().findAndRegisterModules();
31+
return mapper.readValue(is, InferenceResponse.class);
32+
}
33+
}
34+
35+
/* ------------------------------------------------------------------ */
36+
/* Tests – “blank” */
37+
/* ------------------------------------------------------------------ */
38+
39+
@Nested
40+
@DisplayName("When the async prediction is blank")
41+
class BlankPrediction {
42+
43+
@Test
44+
@DisplayName("all properties must be valid")
45+
void asyncPredict_whenEmpty_mustHaveValidProperties() throws IOException {
46+
InferenceResponse response = loadPrediction("blank");
47+
InferenceFields fields = response.getInference().getResult().getFields();
48+
49+
assertEquals(21, fields.size(), "Expected 21 fields");
50+
51+
/* taxes ----------------------------------------------------------------- */
52+
DynamicField taxes = fields.get("taxes");
53+
assertNotNull(taxes, "'taxes' field must exist");
54+
ListField taxesList = taxes.getListField();
55+
assertNotNull(taxesList, "'taxes' must be a ListField");
56+
assertTrue(taxesList.getItems().isEmpty(), "'taxes' list must be empty");
57+
58+
/* supplier_address ------------------------------------------------------- */
59+
DynamicField supplierAddress = fields.get("supplier_address");
60+
assertNotNull(supplierAddress, "'supplier_address' field must exist");
61+
ObjectField supplierObj = supplierAddress.getObjectField();
62+
assertNotNull(supplierObj, "'supplier_address' must be an ObjectField");
63+
64+
/* generic checks --------------------------------------------------------- */
65+
for (Map.Entry<String, DynamicField> entry : fields.entrySet()) {
66+
DynamicField value = entry.getValue();
67+
if (value == null) {
68+
continue;
69+
}
70+
71+
FieldType type = value.getType();
72+
switch (type) {
73+
case LIST_FIELD:
74+
assertNotNull(value.getListField(), entry.getKey() + " – ListField expected");
75+
assertNull(value.getObjectField(), entry.getKey() + " – ObjectField must be null");
76+
assertNull(value.getSimpleField(), entry.getKey() + " – SimpleField must be null");
77+
break;
78+
79+
case OBJECT_FIELD:
80+
assertNotNull(value.getObjectField(), entry.getKey() + " – ObjectField expected");
81+
assertNull(value.getListField(), entry.getKey() + " – ListField must be null");
82+
assertNull(value.getSimpleField(), entry.getKey() + " – SimpleField must be null");
83+
break;
84+
85+
default: // SimpleField (or any scalar)
86+
assertNotNull(value.getSimpleField(), entry.getKey() + " – SimpleField expected");
87+
assertNull(value.getListField(), entry.getKey() + " – ListField must be null");
88+
assertNull(value.getObjectField(), entry.getKey() + " – ObjectField must be null");
89+
break;
90+
}
91+
}
92+
}
93+
}
94+
95+
@Nested
96+
@DisplayName("When the async prediction is complete")
97+
class CompletePrediction {
98+
99+
@Test
100+
@DisplayName("all properties must be valid")
101+
void asyncPredict_whenComplete_mustHaveValidProperties() throws IOException {
102+
InferenceResponse response = loadPrediction("complete");
103+
InferenceFields fields = response.getInference().getResult().getFields();
104+
105+
assertEquals(21, fields.size(), "Expected 21 fields");
106+
107+
DynamicField taxes = fields.get("taxes");
108+
assertNotNull(taxes, "'taxes' field must exist");
109+
ListField taxesList = taxes.getListField();
110+
assertNotNull(taxesList, "'taxes' must be a ListField");
111+
assertEquals(1, taxesList.getItems().size(), "'taxes' list must contain exactly one item");
112+
assertNotNull(taxes.toString(), "'taxes' toString() must not be null");
113+
114+
ObjectField taxItemObj = taxesList.getItems().get(0).getObjectField();
115+
assertNotNull(taxItemObj, "First item of 'taxes' must be an ObjectField");
116+
assertEquals(3, taxItemObj.getFields().size(), "Tax ObjectField must contain 3 sub-fields");
117+
assertEquals(
118+
31.5,
119+
taxItemObj.getFields().get("base").getSimpleField().getValue(),
120+
"'taxes.base' value mismatch"
121+
);
122+
123+
/* supplier_address ------------------------------------------------------- */
124+
DynamicField supplierAddress = fields.get("supplier_address");
125+
assertNotNull(supplierAddress, "'supplier_address' field must exist");
126+
127+
ObjectField supplierObj = supplierAddress.getObjectField();
128+
assertNotNull(supplierObj, "'supplier_address' must be an ObjectField");
129+
130+
DynamicField country = supplierObj.getFields().get("country");
131+
assertNotNull(country, "'supplier_address.country' must exist");
132+
assertEquals("USA", country.getSimpleField().getValue());
133+
assertEquals("USA", country.toString());
134+
135+
assertNotNull(supplierAddress.toString(), "'supplier_address'.toString() must not be null");
136+
}
137+
}
138+
}

0 commit comments

Comments
 (0)