From 92bc7822d60c5fce551d8c07c9a3906de2108566 Mon Sep 17 00:00:00 2001 From: amatiushkin Date: Mon, 21 Oct 2019 12:06:25 -0700 Subject: [PATCH 1/2] Add tests for CDC Result processing in callback interceptor (#60) --- .../ipp/interceptors/CallbackHandlerBase.java | 10 + .../CallbackHandlerInterceptorCDCTest.java | 176 +++++++++++++++++- .../CallbackHandlerInterceptorTest.java | 9 - 3 files changed, 177 insertions(+), 18 deletions(-) diff --git a/ipp-v3-java-devkit/src/test/java/com/intuit/ipp/interceptors/CallbackHandlerBase.java b/ipp-v3-java-devkit/src/test/java/com/intuit/ipp/interceptors/CallbackHandlerBase.java index ef7246ff..4bdf8c56 100644 --- a/ipp-v3-java-devkit/src/test/java/com/intuit/ipp/interceptors/CallbackHandlerBase.java +++ b/ipp-v3-java-devkit/src/test/java/com/intuit/ipp/interceptors/CallbackHandlerBase.java @@ -1,12 +1,15 @@ package com.intuit.ipp.interceptors; import com.intuit.ipp.data.CDCResponse; +import com.intuit.ipp.data.IntuitEntity; import com.intuit.ipp.data.IntuitResponse; import com.intuit.ipp.exception.FMSException; import com.intuit.ipp.services.CDCQueryResult; import com.intuit.ipp.services.CallbackHandler; import com.intuit.ipp.services.CallbackMessage; +import javax.xml.bind.JAXBElement; +import javax.xml.namespace.QName; import java.util.List; public class CallbackHandlerBase { @@ -38,4 +41,11 @@ public void execute(CallbackMessage callbackMessage) { public static CallbackHandlerInterceptor callback() { return interceptor; } + + public class IntuitTestEntity extends IntuitEntity {} + + public JAXBElement getDummyTestEntity() { + QName qname = new QName("http://www.example.com", "interceptor-test"); + return new JAXBElement<>(qname, IntuitTestEntity.class, new IntuitTestEntity()); + } } diff --git a/ipp-v3-java-devkit/src/test/java/com/intuit/ipp/interceptors/CallbackHandlerInterceptorCDCTest.java b/ipp-v3-java-devkit/src/test/java/com/intuit/ipp/interceptors/CallbackHandlerInterceptorCDCTest.java index 4056252c..7c238c19 100644 --- a/ipp-v3-java-devkit/src/test/java/com/intuit/ipp/interceptors/CallbackHandlerInterceptorCDCTest.java +++ b/ipp-v3-java-devkit/src/test/java/com/intuit/ipp/interceptors/CallbackHandlerInterceptorCDCTest.java @@ -1,13 +1,19 @@ package com.intuit.ipp.interceptors; import com.intuit.ipp.data.CDCResponse; +import com.intuit.ipp.data.Error; +import com.intuit.ipp.data.Fault; +import com.intuit.ipp.data.IntuitEntity; +import com.intuit.ipp.data.QueryResponse; import com.intuit.ipp.exception.FMSException; import com.intuit.ipp.services.CDCQueryResult; import org.testng.annotations.Test; +import javax.xml.bind.JAXBElement; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; - import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertNotNull; @@ -15,19 +21,171 @@ public class CallbackHandlerInterceptorCDCTest extends CallbackHandlerBase { - @Test public void emptyListIsOk() throws FMSException { - final List results = invokeCDC(Collections.emptyList()); - assertNull(results); + assertNull(invokeCDC(Collections.emptyList())); + } + + @Test + public void singleWithResponse() throws FMSException { + assertEmptyResult(invokeCDC(Collections.singletonList(new CDCResponse()))); + } + + @Test + public void singleResponseWithEmptyQuery() throws FMSException { + final CDCResponse o = new CDCResponse(); + o.setQueryResponse(Collections.singletonList(new QueryResponse())); + + assertEmptyResult(invokeCDC(Collections.singletonList(o))); + } + + @Test + public void singleEntityIsOk() throws FMSException { + final CDCResponse response = new CDCResponse(); + final QueryResponse queryResponse = new QueryResponse(); + + queryResponse.setIntuitObject(Collections.>singletonList(getDummyTestEntity())); + + response.setQueryResponse(Collections.singletonList(queryResponse)); + + new ResultChecker( assertAndGetFirst(invokeCDC(Collections.singletonList(response)))) + .assertQueryKeys("IntuitTestEntity"); } + @Test - public void singleItemIsOk() throws FMSException { - final List results = invokeCDC(Collections.singletonList(new CDCResponse())); + public void error() throws FMSException { + final CDCResponse o = new CDCResponse(); + final QueryResponse queryResponse = new QueryResponse(); + final Fault fault = new Fault(); + final Error error = new Error(); + fault.setError(Collections.singletonList(error)); + error.setDetail("My custom error"); + queryResponse.setFault(fault); + + o.setQueryResponse(Collections.singletonList(queryResponse)); + new ResultChecker( assertAndGetFirst(invokeCDC(Collections.singletonList(o)))) + .assertErrorsDetails("My custom error"); + + } + + + /** + * Asserts that query result contains exactly one response without any fields set + * @param results + */ + private void assertEmptyResult(List results) { + new ResultChecker(assertAndGetFirst(results)).assertEmpty(); + } - assertNotNull(results); - assertFalse(results.isEmpty()); - assertEquals(1, results.size()); + /** + * Asserts exactly single response and returns first {@link CDCQueryResult} + * @param results + * @return + */ + private CDCQueryResult assertAndGetFirst(List results) { + return new ListChecker<>(results) + .exactlyOne() + .first(); } + + + /** + * Declaratively verifies an arbitrary list + * @param + */ + static class ListChecker { + + private List it; + + public ListChecker(List it) { + this.it = it; + } + + /** + * Asserts that list has exactly one element + * @return + */ + ListChecker exactlyOne() { + assertNotNull(it); + assertFalse(it.isEmpty()); + assertEquals(1, it.size()); + return this; + } + + /** Returns first element from list + * + * @return + */ + T first() { + return it.get(0); + } + } + + /** + * Holds verified object + * @param + */ + static class Checker { + + private T it; + + public Checker(T it) { + this.it = it; + } + + public T it() { + return it; + } + } + + /** + * Declaratively verifies result + */ + private static class ResultChecker extends Checker { + ResultChecker(CDCQueryResult it) { + super(it); + } + + /** + * Asserts query result has no errors nor responses + * @return + */ + ResultChecker assertEmpty() { + assertNull( it().getFalut()); + assertNull( it().getQueryResults()); + assertNull( it().getSize()); + return this; + + } + + /** + * Asserts CDC Query Result to have exact number of {@link com.intuit.ipp.services.QueryResult} + * using its key + * + * @param keys + * @return + */ + ResultChecker assertQueryKeys(String... keys) { + assertEquals(Arrays.asList(keys), it().getQueryResults().keySet()); + return this; + } + + /** + * Asserts all error details in query result + * @param details + * @return + */ + ResultChecker assertErrorsDetails(String... details) { + List actualDetails = new ArrayList<>(); + for(Error error : it().getFalut().getError()) { + actualDetails.add(error.getDetail()); + } + assertEquals(Arrays.asList(details), actualDetails); + return this; + } + + } + + } diff --git a/ipp-v3-java-devkit/src/test/java/com/intuit/ipp/interceptors/CallbackHandlerInterceptorTest.java b/ipp-v3-java-devkit/src/test/java/com/intuit/ipp/interceptors/CallbackHandlerInterceptorTest.java index 277cfeab..054df1a2 100644 --- a/ipp-v3-java-devkit/src/test/java/com/intuit/ipp/interceptors/CallbackHandlerInterceptorTest.java +++ b/ipp-v3-java-devkit/src/test/java/com/intuit/ipp/interceptors/CallbackHandlerInterceptorTest.java @@ -2,7 +2,6 @@ import com.intuit.ipp.core.Response; -import com.intuit.ipp.data.IntuitEntity; import com.intuit.ipp.data.IntuitResponse; import com.intuit.ipp.data.QueryResponse; import com.intuit.ipp.exception.FMSException; @@ -10,9 +9,6 @@ import com.intuit.ipp.services.CallbackMessage; import org.testng.annotations.Test; -import javax.xml.bind.JAXBElement; -import javax.xml.namespace.QName; - import static org.testng.Assert.*; public class CallbackHandlerInterceptorTest extends CallbackHandlerBase { @@ -97,10 +93,5 @@ public void queryIsOk() throws FMSException { - public class IntuitTestEntity extends IntuitEntity {} - public JAXBElement getDummyTestEntity() { - QName qname = new QName("http://www.example.com", "interceptor-test"); - return new JAXBElement<>(qname, IntuitTestEntity.class, new IntuitTestEntity()); - } } \ No newline at end of file From 0fc6ffd2faac1240caad7bfef334a8bc9f1a415d Mon Sep 17 00:00:00 2001 From: amatiushkin Date: Mon, 21 Oct 2019 12:29:43 -0700 Subject: [PATCH 2/2] Add test for partial and no response test (#75) cases (#60) --- .../CallbackHandlerInterceptorCDCTest.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/ipp-v3-java-devkit/src/test/java/com/intuit/ipp/interceptors/CallbackHandlerInterceptorCDCTest.java b/ipp-v3-java-devkit/src/test/java/com/intuit/ipp/interceptors/CallbackHandlerInterceptorCDCTest.java index 7c238c19..3bed3e1f 100644 --- a/ipp-v3-java-devkit/src/test/java/com/intuit/ipp/interceptors/CallbackHandlerInterceptorCDCTest.java +++ b/ipp-v3-java-devkit/src/test/java/com/intuit/ipp/interceptors/CallbackHandlerInterceptorCDCTest.java @@ -53,6 +53,25 @@ public void singleEntityIsOk() throws FMSException { } + /** + * Illustrates https://github.com/intuit/QuickBooks-V3-Java-SDK/issues/75 + * Error is expected in result, but it gives empty result. + * + * @throws FMSException + */ + @Test + public void errorNoResponse() throws FMSException { + final CDCResponse o = new CDCResponse(); + final Fault fault = new Fault(); + final Error error = new Error(); + fault.setError(Collections.singletonList(error)); + error.setDetail("My custom error"); + o.setFault(fault); + o.setQueryResponse(null); + + assertEmptyResult(invokeCDC(Collections.singletonList(o))); + } + @Test public void error() throws FMSException { final CDCResponse o = new CDCResponse(); @@ -69,6 +88,23 @@ public void error() throws FMSException { } + @Test + public void partialError() throws FMSException { + final CDCResponse o = new CDCResponse(); + final QueryResponse queryResponse = new QueryResponse(); + final Fault fault = new Fault(); + final Error error = new Error(); + fault.setError(Collections.singletonList(error)); + error.setDetail("My custom error"); + queryResponse.setFault(fault); + queryResponse.setIntuitObject(Collections.>singletonList(getDummyTestEntity())); + + o.setQueryResponse(Collections.singletonList(queryResponse)); + new ResultChecker( assertAndGetFirst(invokeCDC(Collections.singletonList(o)))) + .assertErrorsDetails("My custom error") + .assertQueryKeys("IntuitTestEntity"); + } + /** * Asserts that query result contains exactly one response without any fields set