Skip to content

Commit 569a8cd

Browse files
authored
Merge pull request #649 from baulea/jsonPathJacksonProvider
introduce JsonPathJacksonProvider
2 parents 6e1c2be + 881953b commit 569a8cd

File tree

13 files changed

+160
-121
lines changed

13 files changed

+160
-121
lines changed

core/pom.xml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -111,10 +111,6 @@
111111
<groupId>com.jayway.jsonpath</groupId>
112112
<artifactId>json-path</artifactId>
113113
</dependency>
114-
<dependency>
115-
<groupId>net.minidev</groupId>
116-
<artifactId>json-smart</artifactId>
117-
</dependency>
118114

119115
<dependency>
120116
<groupId>com.google.classpath-explorer</groupId>
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package org.jsmart.zerocode.core.di.provider;
2+
3+
import com.jayway.jsonpath.Configuration;
4+
import com.jayway.jsonpath.Option;
5+
import com.jayway.jsonpath.spi.json.JacksonJsonProvider;
6+
import com.jayway.jsonpath.spi.json.JsonProvider;
7+
import com.jayway.jsonpath.spi.mapper.JacksonMappingProvider;
8+
import com.jayway.jsonpath.spi.mapper.MappingProvider;
9+
import jakarta.inject.Provider;
10+
import java.util.EnumSet;
11+
import java.util.Set;
12+
13+
public class JsonPathJacksonProvider implements Provider<Configuration.Defaults> {
14+
@Override
15+
public Configuration.Defaults get() {
16+
return new Configuration.Defaults() {
17+
18+
private final JsonProvider jsonProvider = new JacksonJsonProvider();
19+
private final MappingProvider mappingProvider = new JacksonMappingProvider();
20+
21+
@Override
22+
public JsonProvider jsonProvider() {
23+
return jsonProvider;
24+
}
25+
26+
@Override
27+
public MappingProvider mappingProvider() {
28+
return mappingProvider;
29+
}
30+
31+
@Override
32+
public Set<Option> options() {
33+
return EnumSet.noneOf(Option.class);
34+
}
35+
};
36+
}
37+
}

core/src/main/java/org/jsmart/zerocode/core/engine/assertion/array/ArrayIsEmptyAsserterImpl.java

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11

22
package org.jsmart.zerocode.core.engine.assertion.array;
33

4-
import net.minidev.json.JSONArray;
54
import org.jsmart.zerocode.core.engine.assertion.FieldAssertionMatcher;
65
import org.jsmart.zerocode.core.engine.assertion.JsonAsserter;
76

7+
import java.util.List;
8+
89
import static org.jsmart.zerocode.core.engine.assertion.FieldAssertionMatcher.aMatchingMessage;
910
import static org.jsmart.zerocode.core.engine.assertion.FieldAssertionMatcher.aNotMatchingMessage;
1011

@@ -27,21 +28,14 @@ public Object getExpected() {
2728

2829
@Override
2930
public FieldAssertionMatcher actualEqualsToExpected(Object result) {
30-
if(result instanceof JSONArray){
31-
32-
final JSONArray actualArrayValue = (JSONArray) result;
33-
34-
if(actualArrayValue.isEmpty()){
31+
if (result instanceof List<?>) {
32+
List<?> list = (List<?>) result;
3533

34+
if (list.isEmpty()) {
3635
return aMatchingMessage();
3736
}
3837

39-
return aNotMatchingMessage(path, "[]", result);
40-
41-
} else {
42-
43-
return aNotMatchingMessage(path, "[]", result);
44-
4538
}
39+
return aNotMatchingMessage(path, "[]", result);
4640
}
4741
}

core/src/main/java/org/jsmart/zerocode/core/engine/assertion/array/ArraySizeAsserterImpl.java

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11

22
package org.jsmart.zerocode.core.engine.assertion.array;
33

4-
import net.minidev.json.JSONArray;
54
import org.jsmart.zerocode.core.engine.assertion.FieldAssertionMatcher;
65
import org.jsmart.zerocode.core.engine.assertion.JsonAsserter;
76

7+
import java.util.List;
8+
89
import static org.jsmart.zerocode.core.engine.assertion.FieldAssertionMatcher.aMatchingMessage;
910
import static org.jsmart.zerocode.core.engine.assertion.FieldAssertionMatcher.aNotMatchingMessage;
1011
import static org.jsmart.zerocode.core.engine.tokens.ZeroCodeAssertionTokens.ASSERT_VALUE_EQUAL_TO_NUMBER;
@@ -41,25 +42,24 @@ public Object getExpected() {
4142

4243
@Override
4344
public FieldAssertionMatcher actualEqualsToExpected(Object result) {
44-
if (result instanceof JSONArray) {
45-
46-
final JSONArray actualArrayValue = (JSONArray) result;
45+
if (result instanceof List<?>) {
46+
List<?> list = (List<?>) result;
4747

4848
if (this.expectedSize == -1 && this.expectedSizeExpression != null) {
4949

50-
return processRelationalExpression(actualArrayValue);
50+
return processRelationalExpression(list);
5151

5252
}
5353

54-
if (actualArrayValue.size() == this.expectedSize) {
54+
if (list.size() == this.expectedSize) {
5555

5656
return aMatchingMessage();
5757
}
5858

5959
return aNotMatchingMessage(
6060
path,
6161
String.format("Array of size %d", expectedSize),
62-
actualArrayValue.size());
62+
list.size());
6363

6464
} else {
6565

@@ -68,33 +68,33 @@ public FieldAssertionMatcher actualEqualsToExpected(Object result) {
6868
}
6969
}
7070

71-
public FieldAssertionMatcher processRelationalExpression(JSONArray actualArrayValue) {
71+
public FieldAssertionMatcher processRelationalExpression(List<?> list) {
7272
if (expectedSizeExpression.startsWith(ASSERT_VALUE_GREATER_THAN)) {
7373
String greaterThan = this.expectedSizeExpression.substring(ASSERT_VALUE_GREATER_THAN.length());
74-
if (actualArrayValue.size() > Integer.parseInt(greaterThan)) {
74+
if (list.size() > Integer.parseInt(greaterThan)) {
7575
return aMatchingMessage();
7676
}
7777
} else if (expectedSizeExpression.startsWith(ASSERT_VALUE_LESSER_THAN)) {
7878
String lesserThan = this.expectedSizeExpression.substring(ASSERT_VALUE_LESSER_THAN.length());
79-
if (actualArrayValue.size() < Integer.parseInt(lesserThan)) {
79+
if (list.size() < Integer.parseInt(lesserThan)) {
8080
return aMatchingMessage();
8181
}
8282
} else if (expectedSizeExpression.startsWith(ASSERT_VALUE_EQUAL_TO_NUMBER)) {
8383
String equalTo = this.expectedSizeExpression.substring(ASSERT_VALUE_EQUAL_TO_NUMBER.length());
84-
if (actualArrayValue.size() == Integer.parseInt(equalTo)) {
84+
if (list.size() == Integer.parseInt(equalTo)) {
8585
return aMatchingMessage();
8686
}
8787
} else if (expectedSizeExpression.startsWith(ASSERT_VALUE_NOT_EQUAL_TO_NUMBER)) {
8888
String notEqualTo = this.expectedSizeExpression.substring(ASSERT_VALUE_NOT_EQUAL_TO_NUMBER.length());
89-
if (actualArrayValue.size() != Integer.parseInt(notEqualTo)) {
89+
if (list.size() != Integer.parseInt(notEqualTo)) {
9090
return aMatchingMessage();
9191
}
9292
}
9393

9494
return aNotMatchingMessage(
9595
path,
9696
String.format("Array of size %s", expectedSizeExpression),
97-
actualArrayValue.size());
97+
list.size());
9898
}
9999

100100

core/src/main/java/org/jsmart/zerocode/core/engine/preprocessor/ZeroCodeAssertionsProcessorImpl.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import com.google.inject.Inject;
99
import com.google.inject.name.Named;
1010
import com.jayway.jsonpath.JsonPath;
11-
import net.minidev.json.JSONArray;
1211
import org.apache.commons.text.StringSubstitutor;
1312
import org.jsmart.zerocode.core.domain.Step;
1413
import org.jsmart.zerocode.core.engine.assertion.FieldAssertionMatcher;
@@ -442,7 +441,7 @@ private LocalDateTime parseLocalDateTime(String value) {
442441
}
443442

444443
boolean isPathValueJson(Object jsonPathValue) {
445-
return jsonPathValue instanceof LinkedHashMap || jsonPathValue instanceof JSONArray;
444+
return jsonPathValue instanceof LinkedHashMap || jsonPathValue instanceof List<?>;
446445
}
447446

448447
void resolveLeafOnlyNodeValue(String scenarioState, Map<String, String> paramMap, String thisPath) {

core/src/main/java/org/jsmart/zerocode/core/engine/sorter/ZeroCodeSorterImpl.java

Lines changed: 21 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
import com.fasterxml.jackson.databind.ObjectMapper;
66
import com.google.inject.Inject;
77
import com.jayway.jsonpath.JsonPath;
8-
import net.minidev.json.JSONArray;
9-
import net.minidev.json.JSONObject;
108
import org.jsmart.zerocode.core.domain.Step;
119
import org.jsmart.zerocode.core.engine.preprocessor.ZeroCodeAssertionsProcessor;
1210
import org.slf4j.Logger;
@@ -52,43 +50,37 @@ public String sortArrayAndReplaceInResponse(Step thisStep, String results, Strin
5250
//
5351
String transformedPath = zeroCodeAssertionsProcessor.resolveStringJson(path,
5452
resolvedScenarioState);
55-
Object result = getArrayToSort(transformedPath, results);
53+
54+
List<?> listToSort = JsonPath.parse(results).read(transformedPath, List.class);
55+
// sorting passed array
56+
List<Map<?, ?>> sortedList = sortList(listToSort, key, order);
57+
return replaceArrayWithSorted(results, transformedPath, sortedList);
5658

57-
if (result instanceof JSONArray) {
58-
JSONArray arrayToSort = (JSONArray) result;
59-
60-
// sorting passed array
61-
JSONArray sortedArray = sortArray(arrayToSort, key, order);
62-
return replaceArrayWithSorted(results, transformedPath, sortedArray);
63-
} else {
64-
throw new RuntimeException("Can't sort not an array");
65-
}
6659
}
6760

68-
private JSONArray sortArray(JSONArray arrayToSort, String key, String order) {
69-
JSONArray sortedJsonArray = new JSONArray();
7061

71-
List<Map<String, ?>> jsonValues = new ArrayList<>();
62+
private List<Map<?, ?>> sortList(List<?> arrayToSort, String key, String order) {
63+
List<Map<?, ?>> jsonValues = new ArrayList<>();
7264
for (Object o : arrayToSort) {
73-
jsonValues.add((Map<String, ?>) o);
65+
if (o instanceof Map<?, ?>) {
66+
Map<?, ?> map = (Map<?, ?>) o;
67+
jsonValues.add(map);
68+
} else {
69+
LOGGER.error("list item is no map and ignored during sort: {}", o);
70+
}
7471
}
75-
7672
jsonValues.sort((a, b) -> {
77-
Comparable valA;
78-
Comparable valB;
79-
8073
try {
81-
valA = (Comparable) a.get(key);
82-
valB = (Comparable) b.get(key);
83-
} catch (Exception e) {
84-
LOGGER.error("Objects can't be compared" + e);
74+
Comparable valA = (Comparable<?>) a.get(key);
75+
Comparable valB = (Comparable<?>) b.get(key);
76+
return order.equalsIgnoreCase(SortOrder.NATURAL.getValue()) ? valA.compareTo(valB)
77+
: -valA.compareTo(valB);
78+
} catch (ClassCastException e) {
79+
LOGGER.error("Objects can't be compared", e);
8580
throw new RuntimeException("Objects can't be compared", e.getCause());
8681
}
87-
return order.equalsIgnoreCase(SortOrder.NATURAL.getValue()) ? valA.compareTo(valB)
88-
: -valA.compareTo(valB);
8982
});
90-
sortedJsonArray.addAll(jsonValues);
91-
return sortedJsonArray;
83+
return jsonValues;
9284
}
9385

9486
private Map<String, String> convertToMap(String value) {
@@ -101,11 +93,7 @@ private Map<String, String> convertToMap(String value) {
10193
}
10294
}
10395

104-
public Object getArrayToSort(String path, String results) {
105-
return JsonPath.read(results, path);
106-
}
107-
108-
public String replaceArrayWithSorted(String results, String path, Object sortedArray) {
96+
private String replaceArrayWithSorted(String results, String path, Object sortedArray) {
10997
return JsonPath.parse(results).set(path, sortedArray).jsonString();
11098
}
11199

core/src/main/java/org/jsmart/zerocode/core/engine/validators/ZeroCodeValidatorImpl.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,23 @@
11
package org.jsmart.zerocode.core.engine.validators;
22

3+
import com.fasterxml.jackson.core.JsonProcessingException;
34
import com.fasterxml.jackson.databind.JsonNode;
5+
import com.fasterxml.jackson.databind.ObjectMapper;
46
import com.google.inject.Inject;
7+
import com.jayway.jsonpath.Configuration;
58
import com.jayway.jsonpath.JsonPath;
6-
import java.util.ArrayList;
7-
import java.util.List;
9+
import org.jsmart.zerocode.core.di.provider.JsonPathJacksonProvider;
10+
import org.jsmart.zerocode.core.di.provider.ObjectMapperProvider;
811
import org.jsmart.zerocode.core.domain.Step;
912
import org.jsmart.zerocode.core.domain.Validator;
1013
import org.jsmart.zerocode.core.engine.assertion.FieldAssertionMatcher;
1114
import org.jsmart.zerocode.core.engine.assertion.JsonAsserter;
1215
import org.jsmart.zerocode.core.engine.preprocessor.ZeroCodeAssertionsProcessor;
1316
import org.slf4j.Logger;
1417

18+
import java.util.ArrayList;
19+
import java.util.List;
20+
1521
import static org.jsmart.zerocode.core.utils.HelperJsonUtils.strictComparePayload;
1622
import static org.slf4j.LoggerFactory.getLogger;
1723

@@ -20,9 +26,13 @@ public class ZeroCodeValidatorImpl implements ZeroCodeValidator {
2026

2127
private final ZeroCodeAssertionsProcessor zeroCodeAssertionsProcessor;
2228

29+
private final ObjectMapper mapper;
30+
2331
@Inject
2432
public ZeroCodeValidatorImpl(ZeroCodeAssertionsProcessor zeroCodeAssertionsProcessor) {
2533
this.zeroCodeAssertionsProcessor = zeroCodeAssertionsProcessor;
34+
this.mapper = new ObjectMapperProvider().get();
35+
Configuration.setDefaults(new JsonPathJacksonProvider().get());
2636
}
2737

2838
@Override
@@ -40,10 +50,16 @@ public List<FieldAssertionMatcher> validateFlat(Step thisStep, String actualResu
4050
JsonNode expectedValue = validator.getValue();
4151

4252
Object actualValue = JsonPath.read(actualResult, transformed);
53+
String actualString;
54+
try {
55+
actualString = this.mapper.writeValueAsString(actualValue);
56+
} catch (JsonProcessingException e) {
57+
throw new RuntimeException(e);
58+
}
4359

4460
List<JsonAsserter> asserters = zeroCodeAssertionsProcessor.createJsonAsserters(expectedValue.toString());
4561

46-
failureResults.addAll(zeroCodeAssertionsProcessor.assertAllAndReturnFailed(asserters, actualValue.toString()));
62+
failureResults.addAll(zeroCodeAssertionsProcessor.assertAllAndReturnFailed(asserters, actualString));
4763
}
4864

4965
return failureResults;

core/src/main/java/org/jsmart/zerocode/core/kafka/helper/KafkaProducerHelper.java

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,14 @@
11
package org.jsmart.zerocode.core.kafka.helper;
22

3-
import static org.jsmart.zerocode.core.kafka.KafkaConstants.RAW;
4-
import static org.jsmart.zerocode.core.kafka.common.CommonConfigs.BOOTSTRAP_SERVERS;
5-
import static org.jsmart.zerocode.core.kafka.common.KafkaCommonUtils.resolveValuePlaceHolders;
6-
import static org.jsmart.zerocode.core.kafka.error.KafkaMessageConstants.NO_RECORD_FOUND_TO_SEND;
7-
8-
import java.io.IOException;
9-
import java.io.InputStream;
10-
import java.lang.reflect.InvocationTargetException;
11-
import java.lang.reflect.Method;
12-
import java.util.List;
13-
import java.util.Properties;
14-
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import com.google.common.io.Resources;
5+
import com.google.gson.Gson;
6+
import com.google.protobuf.InvalidProtocolBufferException;
7+
import com.google.protobuf.Message;
8+
import com.google.protobuf.Message.Builder;
9+
import com.google.protobuf.util.JsonFormat;
10+
import com.jayway.jsonpath.JsonPath;
11+
import com.jayway.jsonpath.PathNotFoundException;
1512
import org.apache.kafka.clients.producer.KafkaProducer;
1613
import org.apache.kafka.clients.producer.Producer;
1714
import org.apache.kafka.clients.producer.ProducerRecord;
@@ -22,15 +19,17 @@
2219
import org.slf4j.Logger;
2320
import org.slf4j.LoggerFactory;
2421

25-
import com.fasterxml.jackson.databind.ObjectMapper;
26-
import com.google.common.io.Resources;
27-
import com.google.gson.Gson;
28-
import com.google.protobuf.InvalidProtocolBufferException;
29-
import com.google.protobuf.Message;
30-
import com.google.protobuf.Message.Builder;
31-
import com.google.protobuf.util.JsonFormat;
32-
import com.jayway.jsonpath.JsonPath;
33-
import com.jayway.jsonpath.PathNotFoundException;
22+
import java.io.IOException;
23+
import java.io.InputStream;
24+
import java.lang.reflect.InvocationTargetException;
25+
import java.lang.reflect.Method;
26+
import java.util.List;
27+
import java.util.Properties;
28+
29+
import static org.jsmart.zerocode.core.kafka.KafkaConstants.RAW;
30+
import static org.jsmart.zerocode.core.kafka.common.CommonConfigs.BOOTSTRAP_SERVERS;
31+
import static org.jsmart.zerocode.core.kafka.common.KafkaCommonUtils.resolveValuePlaceHolders;
32+
import static org.jsmart.zerocode.core.kafka.error.KafkaMessageConstants.NO_RECORD_FOUND_TO_SEND;
3433

3534
public class KafkaProducerHelper {
3635
private static final Logger LOGGER = LoggerFactory.getLogger(KafkaProducerHelper.class);

0 commit comments

Comments
 (0)