Skip to content

Commit c2ebf90

Browse files
matchers: containAll renders bean details when compared against maps (#1443)
1 parent aea7556 commit c2ebf90

File tree

3 files changed

+51
-6
lines changed

3 files changed

+51
-6
lines changed

webtau-core/src/main/java/org/testingisdocumenting/webtau/expectation/contain/ContainAllMatcher.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.testingisdocumenting.webtau.expectation.contain;
1818

19+
import org.testingisdocumenting.webtau.data.converters.ValueConverter;
1920
import org.testingisdocumenting.webtau.data.render.DataRenderers;
2021
import org.testingisdocumenting.webtau.data.ValuePath;
2122
import org.testingisdocumenting.webtau.expectation.ExpectedValuesAware;
@@ -33,13 +34,17 @@
3334
public class ContainAllMatcher implements ValueMatcher, ExpectedValuesAware {
3435
private ContainAnalyzer containAnalyzer;
3536
private final Collection<Object> expectedList;
36-
private Boolean isNegative;
3737
private List<Object> expectedThatFailContains;
3838

3939
public ContainAllMatcher(Collection<Object> expected) {
4040
this.expectedList = expected;
4141
}
4242

43+
@Override
44+
public ValueConverter valueConverter() {
45+
return containAnalyzer.createValueConverter();
46+
}
47+
4348
@Override
4449
public Set<ValuePath> matchedPaths() {
4550
return containAnalyzer.generateMatchPaths();
@@ -52,6 +57,7 @@ public Set<ValuePath> mismatchedPaths() {
5257

5358
@Override
5459
public TokenizedMessage matchingTokenizedMessage(ValuePath actualPath, Object actual) {
60+
containAnalyzer = ContainAnalyzer.containAnalyzer();
5561
return tokenizedMessage().matcher("to contain all").valueFirstLinesOnly(expectedList);
5662
}
5763

@@ -67,10 +73,8 @@ public TokenizedMessage mismatchedTokenizedMessage(ValuePath actualPath, Object
6773

6874
@Override
6975
public boolean matches(ValuePath actualPath, Object actual) {
70-
containAnalyzer = ContainAnalyzer.containAnalyzer();
71-
isNegative = false;
72-
7376
expectedThatFailContains = new ArrayList<>();
77+
containAnalyzer.resetReportData();
7478

7579
for (Object oneOfExpected : expectedList) {
7680
boolean expectedContains = containAnalyzer.contains(actualPath, actual, oneOfExpected);
@@ -84,6 +88,7 @@ public boolean matches(ValuePath actualPath, Object actual) {
8488

8589
@Override
8690
public TokenizedMessage negativeMatchingTokenizedMessage(ValuePath actualPath, Object actual) {
91+
containAnalyzer = ContainAnalyzer.containAnalyzer();
8792
return tokenizedMessage().matcher("to not contain all").valueFirstLinesOnly(expectedList);
8893
}
8994

@@ -99,8 +104,7 @@ public TokenizedMessage negativeMismatchedTokenizedMessage(ValuePath actualPath,
99104

100105
@Override
101106
public boolean negativeMatches(ValuePath actualPath, Object actual) {
102-
containAnalyzer = ContainAnalyzer.containAnalyzer();
103-
isNegative = true;
107+
containAnalyzer.resetReportData();
104108

105109
boolean allContains = true;
106110
for (Object oneOfExpected : expectedList) {

webtau-core/src/test/groovy/org/testingisdocumenting/webtau/expectation/contain/ContainAllMatcherTest.groovy

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@
1717
package org.testingisdocumenting.webtau.expectation.contain
1818

1919
import org.junit.Test
20+
import org.testingisdocumenting.webtau.Account
21+
import org.testingisdocumenting.webtau.Address
2022

2123
import static org.testingisdocumenting.webtau.Matchers.*
24+
import static org.testingisdocumenting.webtau.WebTauCore.map
2225
import static org.testingisdocumenting.webtau.testutils.TestConsoleOutput.runExpectExceptionAndValidateOutput
2326

2427
class ContainAllMatcherTest {
@@ -60,4 +63,41 @@ class ContainAllMatcherTest {
6063
void "containing all alias"() {
6164
actual([['a'], ['b'], ['c', 'd', 'e']]).should(contain(containingAll('d', 'e')))
6265
}
66+
67+
@Test
68+
void "list of beans contain all maps prints converted beans"() {
69+
def address = new Address("city", "zipcode")
70+
def ac1 = new Account("id1", "name1", "d1", address)
71+
def ac2 = new Account("id2", "name2", "d2", address)
72+
def ac3 = new Account("id3", "name3", "d3", address)
73+
def beans = [ac1, ac2, ac3]
74+
75+
runExpectExceptionAndValidateOutput(AssertionError, 'X failed expecting [value] to contain all [{"id": "id1", "name": "name2"}, {"id": "id2", "name": "name2"}]:\n' +
76+
' no matches found for: [{"id": "id1", "name": "name2"}] (Xms)\n' +
77+
' \n' +
78+
' [\n' +
79+
' {\n' +
80+
' "address": org.testingisdocumenting.webtau.Address@<ref>,\n' +
81+
' "description": "d1",\n' +
82+
' "id": "id1",\n' +
83+
' "name": "name1"\n' +
84+
' },\n' +
85+
' {\n' +
86+
' "address": org.testingisdocumenting.webtau.Address@<ref>,\n' +
87+
' "description": "d2",\n' +
88+
' "id": "id2",\n' +
89+
' "name": "name2"\n' +
90+
' },\n' +
91+
' {\n' +
92+
' "address": org.testingisdocumenting.webtau.Address@<ref>,\n' +
93+
' "description": "d3",\n' +
94+
' "id": "id3",\n' +
95+
' "name": "name3"\n' +
96+
' }\n' +
97+
' ]') {
98+
actual(beans).should(containAll(
99+
map("id", "id1", "name", "name2"),
100+
map("id", "id2", "name", "name2")))
101+
}
102+
}
63103
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
* Fix: `containsAll` [Matcher](matchers/introduction) now properly renders java bean details when compared against multiple maps

0 commit comments

Comments
 (0)