package com.rapidftr.utils;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.hamcrest.CustomMatcher;
import org.hamcrest.Matcher;
import org.json.JSONObject;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
public class JSONMatcher {
public static final ObjectMapper JSON_MAPPER = new ObjectMapper();
public static Matcher<Object> equalJSONIgnoreOrder(final Object value) throws IOException {
final String content = value.toString().replace('\'', '\"');
final JsonNode expectedValue = JSON_MAPPER.readTree(content);
return new CustomMatcher<Object>(content) {
@Override
public boolean matches(Object object) {
try {
return JSON_MAPPER.readTree(object.toString()).equals(expectedValue);
} catch (IOException e) {
return false;
}
}
};
}
public static final <T extends List<? extends Object>> Matcher<T> hasJSONObjects(Object... expectedObjects) {
final List<Object> expected = Arrays.asList(expectedObjects);
return new CustomMatcher<T>(expected.toString()) {
@Override
public boolean matches(Object o) {
try {
T actuals = (T) o;
boolean matches = expected.size() == actuals.size();
if (matches)
for (int i=0, j=actuals.size(); matches && i<j; i++)
matches = equalJSONIgnoreOrder(expected.get(i)).matches(actuals.get(i));
return matches;
} catch (Exception e) {
return false;
}
}
};
}
}