1 package jalview.ws.dbsources;
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;
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;
17 import javax.ws.rs.core.MediaType;
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;
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;
33 public class PDBRestClientTest
37 public void setUp() throws Exception
42 public void tearDown() throws Exception
47 public void executeRequestTest()
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);
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);
63 PDBRestResponse response = new PDBRestClient().executeRequest(request);
64 assertTrue(response.getNumberOfItemsFound() > 99);
65 assertTrue(response.getSearchSummary() != null);
66 assertTrue(response.getSearchSummary().size() > 99);
70 public void getPDBDocFieldsAsCommaDelimitedStringTest()
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);
79 String expectedResult = "molecule_type,pdb_id,genus,gene_name,title";
80 String actualResult = PDBRestClient
81 .getPDBDocFieldsAsCommaDelimitedString(wantedFields);
83 assertEquals("", expectedResult, actualResult);
87 public void parsePDBJsonExceptionStringTest()
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);
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);
103 String jsonErrorResponse = "";
106 jsonErrorResponse = readJsonStringFromFile("test/jalview/io/pdb_request_json_error.txt");
107 } catch (IOException e)
112 String parsedErrorResponse = PDBRestClient
113 .parseJsonExceptionString(jsonErrorResponse);
115 String expectedErrorMsg = "\n============= PDB Rest Client RunTime error =============\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"
121 assertEquals(expectedErrorMsg, parsedErrorResponse);
124 @Test(expected = RuntimeException.class)
125 public void testForExpectedRuntimeException()
127 List<PDBDocField> wantedFields = new ArrayList<PDBDocField>();
128 wantedFields.add(PDBDocField.PDB_ID);
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);
138 public void parsePDBJsonResponseTest()
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);
147 PDBRestRequest request = new PDBRestRequest();
148 request.setAllowEmptySeq(false);
149 request.setWantedFields(wantedFields);
151 String jsonString = "";
154 jsonString = readJsonStringFromFile("test/jalview/io/pdb_response_json.txt");
155 } catch (IOException e)
159 PDBRestResponse response = PDBRestClient.parsePDBJsonResponse(
160 jsonString, request);
161 assertTrue(response.getSearchSummary() != null);
162 assertTrue(response.getNumberOfItemsFound() == 931);
163 assertTrue(response.getSearchSummary().size() == 14);
167 public void getPDBIdColumIndexTest()
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));
180 public void externalServiceIntegrationTest()
182 ClientConfig clientConfig = new DefaultClientConfig();
183 Client client = Client.create(clientConfig);
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 *]");
191 // Execute the REST request
192 ClientResponse clientResponse = webResource.accept(
193 MediaType.APPLICATION_JSON).get(ClientResponse.class);
195 // Get the JSON string from the response object
196 String pdbJsonResponseString = clientResponse.getEntity(String.class);
198 // Check the response status and report exception if one occurs
199 if (clientResponse.getStatus() != 200)
201 fail("Webservice call failed!!!");
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();
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());
224 JSONObject pdbJsonDoc = docIter.next();
226 for (PDBDocField field : PDBDocField.values())
228 if (field == PDBDocField.ALL)
232 if (pdbJsonDoc.get(field.getCode()) == null)
234 // System.out.println(">>>\t" + field.getCode());
235 assertTrue(field.getClass()
236 + " has been removed from PDB doc Entity",
237 !pdbJsonResponseString.contains(field.getCode()));
240 } catch (ParseException e)
242 fail(">>> Test failed due to exception while parsing pdb response json !!!");
248 public String readJsonStringFromFile(String filePath) throws IOException
251 BufferedReader br = new BufferedReader(new FileReader(filePath));
254 StringBuilder sb = new StringBuilder();
255 String line = br.readLine();
260 sb.append(System.lineSeparator());
261 line = br.readLine();
263 fileContent = sb.toString();