2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
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.
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.
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.
21 package jalview.fts.service.pdb;
23 import static org.testng.AssertJUnit.assertEquals;
24 import static org.testng.AssertJUnit.assertTrue;
26 import jalview.fts.api.FTSDataColumnI;
27 import jalview.fts.core.FTSRestRequest;
28 import jalview.fts.core.FTSRestResponse;
29 import jalview.gui.JvOptionPane;
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;
38 import javax.ws.rs.core.MediaType;
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;
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;
56 public class PDBFTSRestClientTest
59 @BeforeClass(alwaysRun = true)
60 public void setUpJvOptionPane()
62 JvOptionPane.setInteractiveMode(false);
63 JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
66 @BeforeMethod(alwaysRun = true)
67 public void setUp() throws Exception
71 @AfterMethod(alwaysRun = true)
72 public void tearDown() throws Exception
76 @Test(groups = { "External", "Network" })
77 public void executeRequestTest()
79 List<FTSDataColumnI> wantedFields = new ArrayList<FTSDataColumnI>();
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)
96 System.out.println("wantedFields >>" + wantedFields);
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);
106 FTSRestResponse response;
109 response = PDBFTSRestClient.getInstance().executeRequest(request);
110 } catch (Exception e)
113 Assert.fail("Couldn't execute webservice call!");
116 assertTrue(response.getNumberOfItemsFound() > 99);
117 assertTrue(response.getSearchSummary() != null);
118 assertTrue(response.getSearchSummary().size() > 99);
121 @Test(groups = { "Functional" })
122 public void getPDBDocFieldsAsCommaDelimitedStringTest()
124 List<FTSDataColumnI> wantedFields = new ArrayList<FTSDataColumnI>();
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)
142 String expectedResult = "molecule_type,pdb_id,genus,gene_name,title";
143 String actualResult = PDBFTSRestClient.getInstance()
144 .getDataColumnsFieldsAsCommaDelimitedString(wantedFields);
146 assertEquals("", expectedResult, actualResult);
149 @Test(groups = { "External, Network" })
150 public void parsePDBJsonExceptionStringTest()
152 List<FTSDataColumnI> wantedFields = new ArrayList<FTSDataColumnI>();
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)
167 e1.printStackTrace();
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);
177 String jsonErrorResponse = "";
180 jsonErrorResponse = readJsonStringFromFile("test/jalview/io/pdb_request_json_error.txt");
181 } catch (IOException e)
186 String parsedErrorResponse = PDBFTSRestClient
187 .parseJsonExceptionString(jsonErrorResponse);
189 String expectedErrorMsg = "\n============= PDB Rest Client RunTime error =============\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"
195 assertEquals(expectedErrorMsg, parsedErrorResponse);
198 @Test(groups = { "External" }, expectedExceptions = Exception.class)
199 public void testForExpectedRuntimeException() throws Exception
201 List<FTSDataColumnI> wantedFields = new ArrayList<FTSDataColumnI>();
202 wantedFields.add(PDBFTSRestClient.getInstance()
203 .getDataColumnByNameOrCode("pdb_id"));
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);
212 // JBP: Is this actually external ? Looks like it is mocked
213 @Test(groups = { "External" })
214 public void parsePDBJsonResponseTest()
216 List<FTSDataColumnI> wantedFields = new ArrayList<FTSDataColumnI>();
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)
231 e1.printStackTrace();
234 FTSRestRequest request = new FTSRestRequest();
235 request.setAllowEmptySeq(false);
236 request.setWantedFields(wantedFields);
238 String jsonString = "";
241 jsonString = readJsonStringFromFile("test/jalview/io/pdb_response_json.txt");
242 } catch (IOException e)
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());
254 @Test(groups = { "Functional" })
255 public void getPDBIdColumIndexTest()
257 List<FTSDataColumnI> wantedFields = new ArrayList<FTSDataColumnI>();
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)
276 assertEquals(5, PDBFTSRestClient.getInstance()
277 .getPrimaryKeyColumIndex(wantedFields, true));
278 assertEquals(4, PDBFTSRestClient.getInstance()
279 .getPrimaryKeyColumIndex(wantedFields, false));
280 } catch (Exception e)
282 // TODO Auto-generated catch block
287 @Test(groups = { "External" })
288 public void externalServiceIntegrationTest()
290 ClientConfig clientConfig = new DefaultClientConfig();
291 Client client = Client.create(clientConfig);
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 *]");
299 // Execute the REST request
300 ClientResponse clientResponse = webResource.accept(
301 MediaType.APPLICATION_JSON).get(ClientResponse.class);
303 // Get the JSON string from the response object
304 String pdbJsonResponseString = clientResponse.getEntity(String.class);
306 // Check the response status and report exception if one occurs
307 if (clientResponse.getStatus() != 200)
309 Assert.fail("Webservice call failed!!!");
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();
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());
332 JSONObject pdbJsonDoc = docIter.next();
334 for (FTSDataColumnI field : PDBFTSRestClient.getInstance()
335 .getAllFTSDataColumns())
337 if (field.getName().equalsIgnoreCase("ALL"))
341 if (pdbJsonDoc.get(field.getCode()) == null)
343 // System.out.println(">>>\t" + field.getCode());
344 assertTrue(field.getCode()
345 + " has been removed from PDB doc Entity",
346 !pdbJsonResponseString.contains(field.getCode()));
349 } catch (ParseException e)
351 Assert.fail(">>> Test failed due to exception while parsing pdb response json !!!");
357 public String readJsonStringFromFile(String filePath) throws IOException
360 BufferedReader br = new BufferedReader(new FileReader(filePath));
363 StringBuilder sb = new StringBuilder();
364 String line = br.readLine();
369 sb.append(System.lineSeparator());
370 line = br.readLine();
372 fileContent = sb.toString();