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; } } }; } }