2892a1775dc667afd5deb76ed13e64d841d930ee
[frank.git] / test / net / jaekl / qd / http / RequestBrokerTest.java
1 package net.jaekl.qd.http;
2
3 import java.util.ArrayList;
4
5 import junit.framework.Assert;
6 import net.jaekl.qd.QDException;
7 import net.jaekl.qd.xml.ParseResult;
8 import net.jaekl.qd.xml.XmlParseException;
9
10 import org.apache.http.NameValuePair;
11 import org.junit.Test;
12 import org.xml.sax.SAXParseException;
13
14 public class RequestBrokerTest {
15
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"
23                                         + "     <soap:Body>\n"
24                                         + "             <GetRouteSummaryForStopResponse xmlns=\"http://octranspo.com\">\n"
25                                         + "                     <GetRouteSummaryForStopResult>\n"
26                                         + "                             <StopNo xmlns=\"http://tempuri.org/\">1234</StopNo>\n"
27                                         + "                             <StopDescription" 
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"
31                                         + "                                     <Route>\n"
32                                         + "                                             <RouteNo>123</RouteNo>\n"
33                                         + "                                             <DirectionID>0</DirectionID>\n"
34                                         + "                                             <Direction>NORTH</Direction>\n"
35                                         + "                                             <RouteHeading>First Mall</RouteHeading>\n"
36                                         + "                                     </Route>\n"
37                                         + "                                     <Route>\n"
38                                         + "                                             <RouteNo>123</RouteNo>\n"
39                                         + "                                             <DirectionID>1</DirectionID>\n"
40                                         + "                                             <Direction>SOUTH</Direction>\n"
41                                         + "                                             <RouteHeading>Second Mall</RouteHeading>\n"
42                                         + "                                     </Route>\n"
43                                         + "                             </Routes>\n"
44                                         + "                     </GetRouteSummaryForStopResult>\n"
45                                         + "             </GetRouteSummaryForStopResponse>\n"
46                                         + "     </soap:Body>\n"
47                                         + "</soap:Envelope>\n";
48         
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";
52
53                 private static final String[] INTERNAL = { STOP_NO };
54                 private static final Object[][] EXTERNAL = { };
55                 
56                 // Data gleaned from parsing
57                 int m_stopNo;
58                 
59                 public RouteSummaryParse() {
60                         super("GetRouteSummaryForStopResult", INTERNAL, EXTERNAL);
61                         
62                         m_stopNo = 0;
63                 }
64                 
65                 public int getStopNo() { return m_stopNo; }
66
67                 @Override
68                 public void endContents(String uri, String localName, String qName,
69                                 String chars) throws XmlParseException 
70                 {
71                         if (localName.equals(STOP_NO)) {
72                                 m_stopNo = Integer.parseInt(chars);
73                         }
74                 }
75
76                 @Override
77                 public void endExternal(String uri, String localName, String qName)
78                                 throws XmlParseException 
79                 {
80                         Assert.fail("Should not be trying to parse external tags here");
81                 }
82         }
83         
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).
86         @Test
87         public void test_submit() throws QDException {
88                 ArrayList<NameValuePair> emptyParams = new ArrayList<NameValuePair>();
89                 
90                 RequestBrokerMock rbm = new RequestBrokerMock(GATEWAY, emptyParams);
91                 rbm.setResult(METHOD, emptyParams, ROUTE_SUMMARY_FOR_STOP);
92                 
93                 String actual = rbm.submit(METHOD, emptyParams);
94                 
95                 Assert.assertEquals(ROUTE_SUMMARY_FOR_STOP, actual);
96         }
97         
98         // Try submitting a request (with a mocked-out http post component)
99         // and validate that we do, in fact, parse something correctly.
100         @Test
101         public void test_submitAndParse() throws QDException {
102                 ArrayList<NameValuePair> emptyParams = new ArrayList<NameValuePair>();
103                 
104                 RequestBrokerMock rbm = new RequestBrokerMock(GATEWAY, emptyParams);
105                 rbm.setResult(METHOD, emptyParams, ROUTE_SUMMARY_FOR_STOP);
106                 
107                 ParseResult pr = rbm.submitAndParse(METHOD, emptyParams, RouteSummaryParse.class);
108                 
109                 Assert.assertNotNull(pr);
110                 Assert.assertTrue(pr instanceof RouteSummaryParse);
111                 RouteSummaryParse rsp = (RouteSummaryParse)pr;
112                 Assert.assertEquals(1234, rsp.getStopNo());
113         }
114         
115         
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;
121                 
122                 public RequestBrokerParamExpandMock(String gatewayUrl, ArrayList<NameValuePair> baseParams) {
123                         super(gatewayUrl, baseParams);
124                         m_timesCalled = 0;
125                         m_methodPassed = null;
126                         m_paramsPassed = null;
127                         m_parserClassPassed = null;
128                 }
129                 
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; }
134                 
135                 @Override 
136                 public ParseResult submitAndParse(String method, 
137                                   ArrayList<NameValuePair> passedParams, 
138                                   Class<? extends ParseResult> rootParserClass,
139                                   String rootTagName)
140                          throws QDException
141                 {
142                         Assert.assertNull(rootTagName);
143                         
144                         m_timesCalled += 1;
145                         m_methodPassed = method;
146                         m_paramsPassed = passedParams;
147                         m_parserClassPassed = rootParserClass;
148                         
149                         return null;
150                 }
151         }
152         
153         // submitAndParse(method, passedParams, rootParser) 
154         // should call through to 
155         // submitAndParse(method, passedParams, rootParser, rootTagName=null)
156         @Test
157         public void test_submitAndParse_expandsDefault4thParam() throws QDException {
158                 final String GATEWAY_URL = "http://bogus.net:1234/gateway";
159                 final String METHOD = "MyMethod";
160                 
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);
164                 
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());
170         }
171         
172         @Test
173         public void test_submitAndParse_nonXmlResponse() {
174                 ArrayList<NameValuePair> emptyParams = new ArrayList<NameValuePair>();
175                 
176                 RequestBrokerMock rbm = new RequestBrokerMock(GATEWAY, emptyParams);
177                 rbm.setResult(METHOD, emptyParams, "No stop number specified");
178                 
179                 try {
180                         rbm.submitAndParse(METHOD, emptyParams, RouteSummaryParse.class);
181                         Assert.fail("Should have thrown an InvalidResultException");
182                 }
183                 catch (QDException qde) {
184                         Assert.assertTrue(qde instanceof InvalidResponseException);
185                         Assert.assertTrue(qde.toString().contains(GATEWAY));
186                         Assert.assertTrue(qde.toString().contains(METHOD));
187                 }
188         }
189         
190         @Test
191         public void test_submitAndParse_throwsInvalidResultException() {
192                 InvalidResponseException ire = new InvalidResponseException(GATEWAY, METHOD, new SAXParseException("dummy", null));
193                 ArrayList<NameValuePair> emptyParams = new ArrayList<NameValuePair>();
194                 
195                 RequestBrokerMock rbm = new RequestBrokerMock(GATEWAY, emptyParams);
196                 rbm.setResult(METHOD, emptyParams, ire);
197                 
198                 try {
199                         rbm.submitAndParse(METHOD, emptyParams, RouteSummaryParse.class);
200                         Assert.fail("Should have thrown an exception");
201                 }
202                 catch (QDException qde) {
203                         Assert.assertTrue(qde instanceof InvalidResponseException);
204                         Assert.assertEquals(ire, qde);
205                         Assert.assertTrue(ire.toString().contains(GATEWAY));
206                         Assert.assertTrue(ire.toString().contains(METHOD));
207                 }
208         }
209 }