JAL-3829 more testing wit tdbeacons data columns and FTSclient
[jalview.git] / test / jalview / fts / service / pdb / PDBFTSRestClientTest.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21 package jalview.fts.service.pdb;
22
23 import static org.testng.AssertJUnit.assertEquals;
24 import static org.testng.AssertJUnit.assertTrue;
25
26 import jalview.fts.api.FTSDataColumnI;
27 import jalview.fts.core.FTSRestRequest;
28 import jalview.fts.core.FTSRestResponse;
29 import jalview.gui.JvOptionPane;
30
31 import java.io.BufferedReader;
32 import java.io.FileReader;
33 import java.io.IOException;
34 import java.util.ArrayList;
35 import java.util.Iterator;
36 import java.util.List;
37
38 import javax.ws.rs.core.MediaType;
39
40 import org.json.simple.JSONArray;
41 import org.json.simple.JSONObject;
42 import org.json.simple.parser.JSONParser;
43 import org.json.simple.parser.ParseException;
44 import org.testng.Assert;
45 import org.testng.annotations.AfterMethod;
46 import org.testng.annotations.BeforeClass;
47 import org.testng.annotations.BeforeMethod;
48 import org.testng.annotations.Test;
49
50 import com.sun.jersey.api.client.Client;
51 import com.sun.jersey.api.client.ClientResponse;
52 import com.sun.jersey.api.client.WebResource;
53 import com.sun.jersey.api.client.config.ClientConfig;
54 import com.sun.jersey.api.client.config.DefaultClientConfig;
55
56 public class PDBFTSRestClientTest
57 {
58
59   @BeforeClass(alwaysRun = true)
60   public void setUpJvOptionPane()
61   {
62     JvOptionPane.setInteractiveMode(false);
63     JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
64   }
65
66   @BeforeMethod(alwaysRun = true)
67   public void setUp() throws Exception
68   {
69   }
70
71   @AfterMethod(alwaysRun = true)
72   public void tearDown() throws Exception
73   {
74   }
75
76   @Test(groups = { "External", "Network" })
77   public void executeRequestTest()
78   {
79     List<FTSDataColumnI> wantedFields = new ArrayList<FTSDataColumnI>();
80     try
81     {
82       wantedFields.add(PDBFTSRestClient.getInstance()
83               .getDataColumnByNameOrCode("molecule_type"));
84       wantedFields.add(PDBFTSRestClient.getInstance()
85               .getDataColumnByNameOrCode("pdb_id"));
86       wantedFields.add(PDBFTSRestClient.getInstance()
87               .getDataColumnByNameOrCode("genus"));
88       wantedFields.add(PDBFTSRestClient.getInstance()
89               .getDataColumnByNameOrCode("gene_name"));
90       wantedFields.add(PDBFTSRestClient.getInstance()
91               .getDataColumnByNameOrCode("title"));
92     } catch (Exception e1)
93     {
94       e1.printStackTrace();
95     }
96     System.out.println("wantedFields >>" + wantedFields);
97
98
99     FTSRestRequest request = new FTSRestRequest();
100     request.setAllowEmptySeq(false);
101     request.setResponseSize(100);
102     request.setFieldToSearchBy("text:");
103     request.setSearchTerm("abc");
104     request.setWantedFields(wantedFields);
105
106     FTSRestResponse response;
107     try
108     {
109       response = PDBFTSRestClient.getInstance().executeRequest(request);
110     } catch (Exception e)
111     {
112       e.printStackTrace();
113       Assert.fail("Couldn't execute webservice call!");
114       return;
115     }
116     assertTrue(response.getNumberOfItemsFound() > 99);
117     assertTrue(response.getSearchSummary() != null);
118     assertTrue(response.getSearchSummary().size() > 99);
119   }
120
121   @Test(groups = { "Functional" })
122   public void getPDBDocFieldsAsCommaDelimitedStringTest()
123   {
124     List<FTSDataColumnI> wantedFields = new ArrayList<FTSDataColumnI>();
125     try
126     {
127       wantedFields.add(PDBFTSRestClient.getInstance()
128               .getDataColumnByNameOrCode("molecule_type"));
129       wantedFields.add(PDBFTSRestClient.getInstance()
130               .getDataColumnByNameOrCode("pdb_id"));
131       wantedFields.add(PDBFTSRestClient.getInstance()
132               .getDataColumnByNameOrCode("genus"));
133       wantedFields.add(PDBFTSRestClient.getInstance()
134               .getDataColumnByNameOrCode("gene_name"));
135       wantedFields.add(PDBFTSRestClient.getInstance()
136               .getDataColumnByNameOrCode("title"));
137     } catch (Exception e)
138     {
139       e.printStackTrace();
140     }
141
142     String expectedResult = "molecule_type,pdb_id,genus,gene_name,title";
143     String actualResult = PDBFTSRestClient.getInstance()
144             .getDataColumnsFieldsAsCommaDelimitedString(wantedFields);
145
146     assertEquals("", expectedResult, actualResult);
147   }
148
149   @Test(groups = { "External, Network" })
150   public void parsePDBJsonExceptionStringTest()
151   {
152     List<FTSDataColumnI> wantedFields = new ArrayList<FTSDataColumnI>();
153     try
154     {
155       wantedFields.add(PDBFTSRestClient.getInstance()
156               .getDataColumnByNameOrCode("molecule_type"));
157       wantedFields.add(PDBFTSRestClient.getInstance()
158               .getDataColumnByNameOrCode("pdb_id"));
159       wantedFields.add(PDBFTSRestClient.getInstance()
160               .getDataColumnByNameOrCode("genus"));
161       wantedFields.add(PDBFTSRestClient.getInstance()
162               .getDataColumnByNameOrCode("gene_name"));
163       wantedFields.add(PDBFTSRestClient.getInstance()
164               .getDataColumnByNameOrCode("title"));
165     } catch (Exception e1)
166     {
167       e1.printStackTrace();
168     }
169
170     FTSRestRequest request = new FTSRestRequest();
171     request.setAllowEmptySeq(false);
172     request.setResponseSize(100);
173     request.setFieldToSearchBy("text:");
174     request.setSearchTerm("abc");
175     request.setWantedFields(wantedFields);
176
177     String jsonErrorResponse = "";
178     try
179     {
180       jsonErrorResponse = readJsonStringFromFile("test/jalview/io/pdb_request_json_error.txt");
181     } catch (IOException e)
182     {
183       e.printStackTrace();
184     }
185
186     String parsedErrorResponse = PDBFTSRestClient
187             .parseJsonExceptionString(jsonErrorResponse);
188
189     String expectedErrorMsg = "\n============= PDB Rest Client RunTime error =============\n"
190             + "Status: 400\n"
191             + "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"
192             + "query: text:abc OR text:go:abc AND molecule_sequence:['' TO *]\n"
193             + "fl: pdb_id\n";
194
195     assertEquals(expectedErrorMsg, parsedErrorResponse);
196   }
197
198   @Test(groups = { "External" }, expectedExceptions = Exception.class)
199   public void testForExpectedRuntimeException() throws Exception
200   {
201     List<FTSDataColumnI> wantedFields = new ArrayList<FTSDataColumnI>();
202     wantedFields.add(PDBFTSRestClient.getInstance()
203             .getDataColumnByNameOrCode("pdb_id"));
204
205     FTSRestRequest request = new FTSRestRequest();
206     request.setFieldToSearchBy("text:");
207     request.setSearchTerm("abc OR text:go:abc");
208     request.setWantedFields(wantedFields);
209     PDBFTSRestClient.getInstance().executeRequest(request);
210   }
211
212   // JBP: Is this actually external ? Looks like it is mocked
213   @Test(groups = { "External" })
214   public void parsePDBJsonResponseTest()
215   {
216     List<FTSDataColumnI> wantedFields = new ArrayList<FTSDataColumnI>();
217     try
218     {
219       wantedFields.add(PDBFTSRestClient.getInstance()
220               .getDataColumnByNameOrCode("molecule_type"));
221       wantedFields.add(PDBFTSRestClient.getInstance()
222               .getDataColumnByNameOrCode("pdb_id"));
223       wantedFields.add(PDBFTSRestClient.getInstance()
224               .getDataColumnByNameOrCode("genus"));
225       wantedFields.add(PDBFTSRestClient.getInstance()
226               .getDataColumnByNameOrCode("gene_name"));
227       wantedFields.add(PDBFTSRestClient.getInstance()
228               .getDataColumnByNameOrCode("title"));
229     } catch (Exception e1)
230     {
231       e1.printStackTrace();
232     }
233
234     FTSRestRequest request = new FTSRestRequest();
235     request.setAllowEmptySeq(false);
236     request.setWantedFields(wantedFields);
237
238     String jsonString = "";
239     try
240     {
241       jsonString = readJsonStringFromFile("test/jalview/io/pdb_response_json.txt");
242     } catch (IOException e)
243     {
244       e.printStackTrace();
245     }
246     FTSRestResponse response = PDBFTSRestClient.parsePDBJsonResponse(
247             jsonString, request);
248     assertTrue(response.getSearchSummary() != null);
249     assertTrue(response.getNumberOfItemsFound() == 931);
250     assertTrue(response.getSearchSummary().size() == 14);
251     System.out.println("Search summary : " + response.getSearchSummary());
252   }
253
254   @Test(groups = { "Functional" })
255   public void getPDBIdColumIndexTest()
256   {
257     List<FTSDataColumnI> wantedFields = new ArrayList<FTSDataColumnI>();
258     try
259     {
260       wantedFields.add(PDBFTSRestClient.getInstance()
261               .getDataColumnByNameOrCode("molecule_type"));
262       wantedFields.add(PDBFTSRestClient.getInstance()
263               .getDataColumnByNameOrCode("genus"));
264       wantedFields.add(PDBFTSRestClient.getInstance()
265               .getDataColumnByNameOrCode("gene_name"));
266       wantedFields.add(PDBFTSRestClient.getInstance()
267               .getDataColumnByNameOrCode("title"));
268       wantedFields.add(PDBFTSRestClient.getInstance()
269               .getDataColumnByNameOrCode("pdb_id"));
270     } catch (Exception e)
271     {
272       e.printStackTrace();
273     }
274     try
275     {
276       assertEquals(5, PDBFTSRestClient.getInstance()
277               .getPrimaryKeyColumIndex(wantedFields, true));
278       assertEquals(4, PDBFTSRestClient.getInstance()
279               .getPrimaryKeyColumIndex(wantedFields, false));
280     } catch (Exception e)
281     {
282       // TODO Auto-generated catch block
283       e.printStackTrace();
284     }
285   }
286
287   @Test(groups = { "External" })
288   public void externalServiceIntegrationTest()
289   {
290     ClientConfig clientConfig = new DefaultClientConfig();
291     Client client = Client.create(clientConfig);
292
293     // Build request parameters for the REST Request
294     WebResource webResource = client
295             .resource(PDBFTSRestClient.PDB_SEARCH_ENDPOINT)
296             .queryParam("wt", "json").queryParam("rows", String.valueOf(1))
297             .queryParam("q", "text:abc AND molecule_sequence:['' TO *]");
298
299     // Execute the REST request
300     ClientResponse clientResponse = webResource.accept(
301             MediaType.APPLICATION_JSON).get(ClientResponse.class);
302
303     // Get the JSON string from the response object
304     String pdbJsonResponseString = clientResponse.getEntity(String.class);
305
306     // Check the response status and report exception if one occurs
307     if (clientResponse.getStatus() != 200)
308     {
309       Assert.fail("Webservice call failed!!!");
310     }
311     else
312     {
313       try
314       {
315         JSONParser jsonParser = new JSONParser();
316         JSONObject jsonObj = (JSONObject) jsonParser
317                 .parse(pdbJsonResponseString);
318         JSONObject pdbResponse = (JSONObject) jsonObj.get("response");
319         String queryTime = ((JSONObject) jsonObj.get("responseHeader"))
320                 .get("QTime").toString();
321         String numFound = pdbResponse.get("numFound").toString();
322         JSONArray docs = (JSONArray) pdbResponse.get("docs");
323         Iterator<JSONObject> docIter = docs.iterator();
324
325         assertTrue("Couldn't Retrieve 'response' object",
326                 pdbResponse != null);
327         assertTrue("Couldn't Retrieve 'QTime' value", queryTime != null);
328         assertTrue("Couldn't Retrieve 'numFound' value", numFound != null);
329         assertTrue("Couldn't Retrieve 'docs' object", docs != null
330                 || !docIter.hasNext());
331
332         JSONObject pdbJsonDoc = docIter.next();
333
334         for (FTSDataColumnI field : PDBFTSRestClient.getInstance()
335                 .getAllFTSDataColumns())
336         {
337           if (field.getName().equalsIgnoreCase("ALL"))
338           {
339             continue;
340           }
341           if (pdbJsonDoc.get(field.getCode()) == null)
342           {
343             // System.out.println(">>>\t" + field.getCode());
344             assertTrue(field.getCode()
345                     + " has been removed from PDB doc Entity",
346                     !pdbJsonResponseString.contains(field.getCode()));
347           }
348         }
349       } catch (ParseException e)
350       {
351         Assert.fail(">>>  Test failed due to exception while parsing pdb response json !!!");
352         e.printStackTrace();
353       }
354     }
355   }
356
357   public String readJsonStringFromFile(String filePath) throws IOException
358   {
359     String fileContent;
360     BufferedReader br = new BufferedReader(new FileReader(filePath));
361     try
362     {
363       StringBuilder sb = new StringBuilder();
364       String line = br.readLine();
365
366       while (line != null)
367       {
368         sb.append(line);
369         sb.append(System.lineSeparator());
370         line = br.readLine();
371       }
372       fileContent = sb.toString();
373     } finally
374     {
375       br.close();
376     }
377     return fileContent;
378   }
379
380 }