Skip to content

Commit

Permalink
Fix containsEntry
Browse files Browse the repository at this point in the history
  • Loading branch information
lukas-krecan committed May 22, 2021
1 parent def84ed commit b3bbe7c
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,15 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import static java.util.Arrays.stream;
import static java.util.Objects.deepEquals;
import static java.util.stream.Collectors.toList;
import static org.assertj.core.api.Assertions.entry;
import static org.assertj.core.error.ShouldContain.shouldContain;
import static org.assertj.core.error.ShouldContainValue.shouldContainValue;
import static org.assertj.core.error.ShouldNotContainValue.shouldNotContainValue;
import static org.assertj.core.util.Arrays.array;
Expand Down Expand Up @@ -116,7 +121,7 @@ public JsonMapAssert containsEntry(String key, Object value) {

@SafeVarargs
@Override
public final JsonMapAssert containsAnyOf(Map.Entry<? extends String, ?>... entries) {
public final JsonMapAssert containsAnyOf(Entry<? extends String, ?>... entries) {
return super.containsAnyOf(wrap(entries));
}

Expand All @@ -127,20 +132,38 @@ public JsonMapAssert containsAllEntriesOf(Map<? extends String, ?> other) {

@SafeVarargs
@Override
public final JsonMapAssert containsExactly(Map.Entry<? extends String, ?>... entries) {
public final JsonMapAssert containsExactly(Entry<? extends String, ?>... entries) {
return super.containsExactly(wrap(entries));
}

@SafeVarargs
@Override
public final JsonMapAssert containsOnly(Map.Entry<? extends String, ?>... entries) {
public final JsonMapAssert containsOnly(Entry<? extends String, ?>... entries) {
return super.containsOnly(wrap(entries));
}

@Override
@SafeVarargs
public final JsonMapAssert contains(Map.Entry<? extends String, ?>... entries) {
return super.contains(wrap(entries));
public final JsonMapAssert contains(Entry<? extends String, ?>... expected) {
List<Entry<? extends String, ?>> notFound = stream(expected).filter(entry -> !doesContainEntry(entry)).collect(toList());
if (!notFound.isEmpty()) {
throwAssertionError(shouldContain(actual, expected, notFound));
}
return this;
}

private boolean doesContainEntry(Entry<? extends String, ?> entry) {
String key = entry.getKey();
if (!actual.containsKey(key)) {
return false;
}
Object actualValue = actual.get(key);
if (entry.getValue() instanceof Node) {
Node value = (Node) entry.getValue();
return isSimilar(actualValue, value);
} else {
return deepEquals(actualValue, entry.getValue());
}
}

@Override
Expand All @@ -151,17 +174,17 @@ public JsonMapAssert containsValues(Object... values) {

@NotNull
@SuppressWarnings("unchecked")
private Map.Entry<? extends String, ?>[] wrap(Map.Entry<? extends String, ?>[] entries) {
return stream(entries).map(this::wrapEntry).toArray(Map.Entry[]::new);
private Entry<? extends String, ?>[] wrap(Entry<? extends String, ?>[] entries) {
return stream(entries).map(this::wrapEntry).toArray(Entry[]::new);
}


@SuppressWarnings("unchecked")
private Map.Entry<? extends String, ?>[] toEntries(Map<? extends String, ?> map) {
return map.entrySet().toArray(new Map.Entry[0]);
private Entry<? extends String, ?>[] toEntries(Map<? extends String, ?> map) {
return map.entrySet().toArray(new Entry[0]);
}

private Map.Entry<? extends String, ?> wrapEntry(Map.Entry<? extends String, ?> entry) {
private Entry<? extends String, ?> wrapEntry(Entry<? extends String, ?> entry) {
if (entry.getValue() instanceof Node) {
return entry(entry.getKey(), ((Node) entry.getValue()).getValue());
} else {
Expand All @@ -181,7 +204,7 @@ public JsonMapAssert hasFieldOrProperty(String name) {
}

/**
* Does not work. Use {@link #contains(Map.Entry[])} instead.
* Does not work. Use {@link #contains(Entry[])} instead.
* https://github.com/lukas-krecan/JsonUnit/issues/324
*/
@Override
Expand Down Expand Up @@ -240,6 +263,10 @@ private JsonMapAssert compare(@Nullable Object other, @NotNull Configuration con
}

private boolean contains(Object expected) {
return actual.entrySet().stream().anyMatch(kv -> Diff.create(expected, kv.getValue(), "fullJson", path.asPrefix(), configuration).similar());
return actual.entrySet().stream().anyMatch(entry -> isSimilar(entry.getValue(), expected));
}

private boolean isSimilar(Object actual, Object expected) {
return Diff.create(expected, actual, "fullJson", path.asPrefix(), configuration).similar();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,32 @@ void containsEntryShouldWork() {
);
}

@Test
void containsEntryShouldWorkWithMatcher() {
String json = "{\"a\": 1, \"b\": 2}";
assertThatJson(json).isObject().containsEntry("a", json("\"${json-unit.any-number}\""));
assertThatJson(json).isObject().contains(entry("a", json("\"${json-unit.any-number}\"")));
}

@Test
void containsEntryShouldFailWithMatcher() {
String json = "{\"a\": 1, \"b\": 2}";

assertThatThrownBy(() ->
assertThatJson(json).isObject().contains(
entry("a", json("\"${json-unit.any-string}\"")),
entry("b", json("\"${json-unit.any-number}\""))
)
).hasMessage("[Different value found in node \"\"] \n" +
"Expecting map:\n" +
" {\"a\":1,\"b\":2}\n" +
"to contain:\n" +
" [MapEntry[key=\"a\", value=\"${json-unit.any-string}\"],\n" +
" MapEntry[key=\"b\", value=\"${json-unit.any-number}\"]]\n" +
"but could not find the following map entries:\n" +
" [MapEntry[key=\"a\", value=\"${json-unit.any-string}\"]]\n");
}

@Test
void containsValuesShouldPass() {
String json = "{\"a\": 1, \"b\": 2}";
Expand Down

0 comments on commit b3bbe7c

Please sign in to comment.