JAL-1726 Added external integration test for PDB Rest API
[jalview.git] / test / jalview / ws / dbsources / PDBRestClientTest.java
1 package jalview.ws.dbsources;
2
3 import static org.junit.Assert.assertEquals;
4 import static org.junit.Assert.assertTrue;
5 import static org.junit.Assert.fail;
6 import jalview.ws.dbsources.PDBRestClient.PDBDocField;
7 import jalview.ws.uimodel.PDBRestRequest;
8 import jalview.ws.uimodel.PDBRestResponse;
9
10 import java.io.BufferedReader;
11 import java.io.FileReader;
12 import java.io.IOException;
13 import java.util.ArrayList;
14 import java.util.Iterator;
15 import java.util.List;
16
17 import javax.ws.rs.core.MediaType;
18
19 import org.json.simple.JSONArray;
20 import org.json.simple.JSONObject;
21 import org.json.simple.parser.JSONParser;
22 import org.json.simple.parser.ParseException;
23 import org.junit.After;
24 import org.junit.Before;
25 import org.junit.Test;
26
27 import com.sun.jersey.api.client.Client;
28 import com.sun.jersey.api.client.ClientResponse;
29 import com.sun.jersey.api.client.WebResource;
30 import com.sun.jersey.api.client.config.ClientConfig;
31 import com.sun.jersey.api.client.config.DefaultClientConfig;
32
33 public class PDBRestClientTest
34 {
35
36   @Before
37   public void setUp() throws Exception
38   {
39   }
40
41   @After
42   public void tearDown() throws Exception
43   {
44   }
45
46   @Test
47   public void executeRequestTest()
48   {
49     List<PDBDocField> wantedFields = new ArrayList<PDBDocField>();
50     wantedFields.add(PDBDocField.MOLECULE_TYPE);
51     wantedFields.add(PDBDocField.PDB_ID);
52     wantedFields.add(PDBDocField.GENUS);
53     wantedFields.add(PDBDocField.GENE_NAME);
54     wantedFields.add(PDBDocField.TITLE);
55
56     PDBRestRequest request = new PDBRestRequest();
57     request.setAllowEmptySeq(false);
58     request.setResponseSize(100);
59     request.setFieldToSearchBy("text:");
60     request.setSearchTerm("abc");
61     request.setWantedFields(wantedFields);
62
63     PDBRestResponse response = new PDBRestClient().executeRequest(request);
64     assertTrue(response.getNumberOfItemsFound() > 99);
65     assertTrue(response.getSearchSummary() != null);
66     assertTrue(response.getSearchSummary().size() > 99);
67   }
68
69   @Test
70   public void getPDBDocFieldsAsCommaDelimitedStringTest()
71   {
72     List<PDBDocField> wantedFields = new ArrayList<PDBDocField>();
73     wantedFields.add(PDBDocField.MOLECULE_TYPE);
74     wantedFields.add(PDBDocField.PDB_ID);
75     wantedFields.add(PDBDocField.GENUS);
76     wantedFields.add(PDBDocField.GENE_NAME);
77     wantedFields.add(PDBDocField.TITLE);
78
79     String expectedResult = "molecule_type,pdb_id,genus,gene_name,title";
80     String actualResult = PDBRestClient
81             .getPDBDocFieldsAsCommaDelimitedString(wantedFields);
82
83     assertEquals("", expectedResult, actualResult);
84   }
85
86   @Test
87   public void parsePDBJsonExceptionStringTest()
88   {
89     List<PDBDocField> wantedFields = new ArrayList<PDBDocField>();
90     wantedFields.add(PDBDocField.MOLECULE_TYPE);
91     wantedFields.add(PDBDocField.PDB_ID);
92     wantedFields.add(PDBDocField.GENUS);
93     wantedFields.add(PDBDocField.GENE_NAME);
94     wantedFields.add(PDBDocField.TITLE);
95
96     PDBRestRequest request = new PDBRestRequest();
97     request.setAllowEmptySeq(false);
98     request.setResponseSize(100);
99     request.setFieldToSearchBy("text:");
100     request.setSearchTerm("abc");
101     request.setWantedFields(wantedFields);
102
103     String jsonErrorResponse = "";
104     try
105     {
106       jsonErrorResponse = readJsonStringFromFile("test/jalview/io/pdb_request_json_error.txt");
107     } catch (IOException e)
108     {
109       e.printStackTrace();
110     }
111
112     String parsedErrorResponse = PDBRestClient
113             .parseJsonExceptionString(jsonErrorResponse);
114
115     String expectedErrorMsg = "\n============= PDB Rest Client RunTime error =============\n"
116             + "Status: 400\n"
117             + "Message: org.apache.solr.search.SyntaxError: Cannot parse 'text:abc OR text:go:abc AND molecule_sequence:['' TO *]': Encountered \" \":\" \": \"\" at line 1, column 19.\n"
118             + "query: text:abc OR text:go:abc AND molecule_sequence:['' TO *]\n"
119             + "fl: pdb_id\n";
120
121     assertEquals(expectedErrorMsg, parsedErrorResponse);
122   }
123
124   @Test(expected = RuntimeException.class)
125   public void testForExpectedRuntimeException()
126   {
127     List<PDBDocField> wantedFields = new ArrayList<PDBDocField>();
128     wantedFields.add(PDBDocField.PDB_ID);
129
130     PDBRestRequest request = new PDBRestRequest();
131     request.setFieldToSearchBy("text:");
132     request.setSearchTerm("abc OR text:go:abc");
133     request.setWantedFields(wantedFields);
134     new PDBRestClient().executeRequest(request);
135   }
136
137   @Test
138   public void parsePDBJsonResponseTest()
139   {
140     List<PDBDocField> wantedFields = new ArrayList<PDBDocField>();
141     wantedFields.add(PDBDocField.MOLECULE_TYPE);
142     wantedFields.add(PDBDocField.PDB_ID);
143     wantedFields.add(PDBDocField.GENUS);
144     wantedFields.add(PDBDocField.GENE_NAME);
145     wantedFields.add(PDBDocField.TITLE);
146
147     PDBRestRequest request = new PDBRestRequest();
148     request.setAllowEmptySeq(false);
149     request.setWantedFields(wantedFields);
150
151     String jsonString = "";
152     try
153     {
154       jsonString = readJsonStringFromFile("test/jalview/io/pdb_response_json.txt");
155     } catch (IOException e)
156     {
157       e.printStackTrace();
158     }
159     PDBRestResponse response = PDBRestClient.parsePDBJsonResponse(
160             jsonString, request);
161     assertTrue(response.getSearchSummary() != null);
162     assertTrue(response.getNumberOfItemsFound() == 931);
163     assertTrue(response.getSearchSummary().size() == 14);
164   }
165
166   @Test
167   public void getPDBIdColumIndexTest()
168   {
169     List<PDBDocField> wantedFields = new ArrayList<PDBDocField>();
170     wantedFields.add(PDBDocField.MOLECULE_TYPE);
171     wantedFields.add(PDBDocField.GENUS);
172     wantedFields.add(PDBDocField.GENE_NAME);
173     wantedFields.add(PDBDocField.TITLE);
174     wantedFields.add(PDBDocField.PDB_ID);
175     assertEquals(5, PDBRestClient.getPDBIdColumIndex(wantedFields, true));
176     assertEquals(4, PDBRestClient.getPDBIdColumIndex(wantedFields, false));
177   }
178
179   @Test
180   public void externalServiceIntegrationTest()
181   {
182     ClientConfig clientConfig = new DefaultClientConfig();
183     Client client = Client.create(clientConfig);
184
185     // Build request parameters for the REST Request
186     WebResource webResource = client
187             .resource(PDBRestClient.PDB_SEARCH_ENDPOINT)
188             .queryParam("wt", "json").queryParam("rows", String.valueOf(1))
189             .queryParam("q", "text:abc AND molecule_sequence:['' TO *]");
190
191     // Execute the REST request
192     ClientResponse clientResponse = webResource.accept(
193             MediaType.APPLICATION_JSON).get(ClientResponse.class);
194
195     // Get the JSON string from the response object
196     String pdbJsonResponseString = clientResponse.getEntity(String.class);
197
198     // Check the response status and report exception if one occurs
199     if (clientResponse.getStatus() != 200)
200     {
201       fail("Webservice call failed!!!");
202     }
203     else
204     {
205       try
206       {
207         JSONParser jsonParser = new JSONParser();
208         JSONObject jsonObj = (JSONObject) jsonParser
209                 .parse(pdbJsonResponseString);
210         JSONObject pdbResponse = (JSONObject) jsonObj.get("response");
211         String queryTime = ((JSONObject) jsonObj.get("responseHeader"))
212                 .get("QTime").toString();
213         String numFound = pdbResponse.get("numFound").toString();
214         JSONArray docs = (JSONArray) pdbResponse.get("docs");
215         Iterator<JSONObject> docIter = docs.iterator();
216
217         assertTrue("Couldn't Retrieve 'response' object",
218                 pdbResponse != null);
219         assertTrue("Couldn't Retrieve 'QTime' value", queryTime != null);
220         assertTrue("Couldn't Retrieve 'numFound' value", numFound != null);
221         assertTrue("Couldn't Retrieve 'docs' object", docs != null
222                 || !docIter.hasNext());
223
224         JSONObject pdbJsonDoc = docIter.next();
225
226         for (PDBDocField field : PDBDocField.values())
227         {
228           if (field == PDBDocField.ALL)
229           {
230             continue;
231           }
232           if (pdbJsonDoc.get(field.getCode()) == null)
233           {
234             // System.out.println(">>>\t" + field.getCode());
235             assertTrue(field.getClass()
236                     + " has been removed from PDB doc Entity",
237                     !pdbJsonResponseString.contains(field.getCode()));
238           }
239         }
240       } catch (ParseException e)
241       {
242         fail(">>>  Test failed due to exception while parsing pdb response json !!!");
243         e.printStackTrace();
244       }
245     }
246   }
247
248   public String readJsonStringFromFile(String filePath) throws IOException
249   {
250     String fileContent;
251     BufferedReader br = new BufferedReader(new FileReader(filePath));
252     try
253     {
254       StringBuilder sb = new StringBuilder();
255       String line = br.readLine();
256
257       while (line != null)
258       {
259         sb.append(line);
260         sb.append(System.lineSeparator());
261         line = br.readLine();
262         }
263       fileContent = sb.toString();
264     } finally
265     {
266       br.close();
267     }
268     return fileContent;
269   }
270
271 }