1 package net.jaekl.qd.http;
3 import java.util.ArrayList;
5 import org.junit.Assert;
6 import net.jaekl.qd.QDException;
7 import net.jaekl.qd.xml.ParseResult;
8 import net.jaekl.qd.xml.XmlParseException;
10 import org.apache.http.NameValuePair;
11 import org.junit.Test;
12 import org.xml.sax.SAXParseException;
14 public class RequestBrokerTest {
16 private static final String GATEWAY = "http://hostname.bogus/";
17 private static final String METHOD = "apiMethod";
18 private static final String ROUTE_SUMMARY_FOR_STOP =
19 "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
20 + "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n"
21 + "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\n"
22 + "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n"
24 + " <GetRouteSummaryForStopResponse xmlns=\"http://octranspo.com\">\n"
25 + " <GetRouteSummaryForStopResult>\n"
26 + " <StopNo xmlns=\"http://tempuri.org/\">1234</StopNo>\n"
28 + " xmlns=\"http://tempuri.org/\">ONE-TWO-THREE-FOUR</StopDescription>\n"
29 + " <Error xmlns=\"http://tempuri.org/\"/>\n"
30 + " <Routes xmlns=\"http://tempuri.org/\">\n"
32 + " <RouteNo>123</RouteNo>\n"
33 + " <DirectionID>0</DirectionID>\n"
34 + " <Direction>NORTH</Direction>\n"
35 + " <RouteHeading>First Mall</RouteHeading>\n"
38 + " <RouteNo>123</RouteNo>\n"
39 + " <DirectionID>1</DirectionID>\n"
40 + " <Direction>SOUTH</Direction>\n"
41 + " <RouteHeading>Second Mall</RouteHeading>\n"
44 + " </GetRouteSummaryForStopResult>\n"
45 + " </GetRouteSummaryForStopResponse>\n"
47 + "</soap:Envelope>\n";
49 // Parse sub-tags, handling some internally and some externally
50 public static class RouteSummaryParse extends ParseResult {
51 private static final String STOP_NO = "StopNo";
53 private static final String[] INTERNAL = { STOP_NO };
54 private static final Object[][] EXTERNAL = { };
56 // Data gleaned from parsing
59 public RouteSummaryParse() {
60 super("GetRouteSummaryForStopResult", INTERNAL, EXTERNAL);
65 public int getStopNo() { return m_stopNo; }
68 public void endContents(String uri, String localName, String qName,
69 String chars) throws XmlParseException
71 if (localName.equals(STOP_NO)) {
72 m_stopNo = Integer.parseInt(chars);
77 public void endExternal(String uri, String localName, String qName)
78 throws XmlParseException
80 Assert.fail("Should not be trying to parse external tags here");
84 // Try submitting a request (with a mocked-out http post component)
85 // and validate that we do, in fact, return the expected text (XML).
87 public void test_submit() throws QDException {
88 ArrayList<NameValuePair> emptyParams = new ArrayList<NameValuePair>();
90 RequestBrokerMock rbm = new RequestBrokerMock(GATEWAY, emptyParams);
91 rbm.setResult(METHOD, emptyParams, ROUTE_SUMMARY_FOR_STOP);
93 String actual = rbm.submit(METHOD, emptyParams);
95 Assert.assertEquals(ROUTE_SUMMARY_FOR_STOP, actual);
98 // Try submitting a request (with a mocked-out http post component)
99 // and validate that we do, in fact, parse something correctly.
101 public void test_submitAndParse() throws QDException {
102 ArrayList<NameValuePair> emptyParams = new ArrayList<NameValuePair>();
104 RequestBrokerMock rbm = new RequestBrokerMock(GATEWAY, emptyParams);
105 rbm.setResult(METHOD, emptyParams, ROUTE_SUMMARY_FOR_STOP);
107 ParseResult pr = rbm.submitAndParse(METHOD, emptyParams, RouteSummaryParse.class);
109 Assert.assertNotNull(pr);
110 Assert.assertTrue(pr instanceof RouteSummaryParse);
111 RouteSummaryParse rsp = (RouteSummaryParse)pr;
112 Assert.assertEquals(1234, rsp.getStopNo());
116 class RequestBrokerParamExpandMock extends RequestBrokerMock {
117 private int m_timesCalled;
118 private String m_methodPassed;
119 private ArrayList<NameValuePair> m_paramsPassed;
120 private Class<? extends ParseResult> m_parserClassPassed;
122 public RequestBrokerParamExpandMock(String gatewayUrl, ArrayList<NameValuePair> baseParams) {
123 super(gatewayUrl, baseParams);
125 m_methodPassed = null;
126 m_paramsPassed = null;
127 m_parserClassPassed = null;
130 public int getTimesCalled() { return m_timesCalled; }
131 public String getMethodPassed() { return m_methodPassed; }
132 public ArrayList<NameValuePair> getParamsPassed() { return m_paramsPassed; }
133 public Class<? extends ParseResult> getParserClassPassed() { return m_parserClassPassed; }
136 public ParseResult submitAndParse(String method,
137 ArrayList<NameValuePair> passedParams,
138 Class<? extends ParseResult> rootParserClass,
142 Assert.assertNull(rootTagName);
145 m_methodPassed = method;
146 m_paramsPassed = passedParams;
147 m_parserClassPassed = rootParserClass;
153 // submitAndParse(method, passedParams, rootParser)
154 // should call through to
155 // submitAndParse(method, passedParams, rootParser, rootTagName=null)
157 public void test_submitAndParse_expandsDefault4thParam() throws QDException {
158 final String GATEWAY_URL = "http://bogus.net:1234/gateway";
159 final String METHOD = "MyMethod";
161 RequestBrokerParamExpandMock rbpem = new RequestBrokerParamExpandMock(GATEWAY_URL, new ArrayList<NameValuePair>() );
162 ArrayList<NameValuePair> passedParams = new ArrayList<NameValuePair>();
163 ParseResult pr = rbpem.submitAndParse(METHOD, passedParams, ParseResult.class);
165 Assert.assertNull(pr);
166 Assert.assertEquals(1, rbpem.getTimesCalled());
167 Assert.assertEquals(METHOD, rbpem.getMethodPassed());
168 Assert.assertEquals(passedParams, rbpem.getParamsPassed());
169 Assert.assertEquals(ParseResult.class, rbpem.getParserClassPassed());
173 public void test_submitAndParse_nonXmlResponse() {
174 ArrayList<NameValuePair> emptyParams = new ArrayList<NameValuePair>();
176 RequestBrokerMock rbm = new RequestBrokerMock(GATEWAY, emptyParams);
177 rbm.setResult(METHOD, emptyParams, "No stop number specified");
180 rbm.submitAndParse(METHOD, emptyParams, RouteSummaryParse.class);
181 Assert.fail("Should have thrown an InvalidResultException");
183 catch (QDException qde) {
184 Assert.assertTrue(qde instanceof InvalidResponseException);
185 Assert.assertTrue(qde.toString().contains(GATEWAY));
186 Assert.assertTrue(qde.toString().contains(METHOD));
191 public void test_submitAndParse_throwsInvalidResultException() {
192 final String RESPONSE = "Must specify stop number.";
193 InvalidResponseException ire = new InvalidResponseException(new SAXParseException("dummy", null), GATEWAY, METHOD, RESPONSE);
194 ArrayList<NameValuePair> emptyParams = new ArrayList<NameValuePair>();
196 RequestBrokerMock rbm = new RequestBrokerMock(GATEWAY, emptyParams);
197 rbm.setResult(METHOD, emptyParams, ire);
200 rbm.submitAndParse(METHOD, emptyParams, RouteSummaryParse.class);
201 Assert.fail("Should have thrown an exception");
203 catch (QDException qde) {
204 Assert.assertTrue(qde instanceof InvalidResponseException);
205 Assert.assertEquals(ire, qde);
206 Assert.assertTrue(ire.toString().contains(GATEWAY));
207 Assert.assertTrue(ire.toString().contains(METHOD));
208 Assert.assertTrue(ire.toString().contains(RESPONSE));