1 package jalview.ws.dbsources;
3 import static org.testng.AssertJUnit.assertEquals;
4 import static org.testng.AssertJUnit.assertTrue;
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.testng.Assert;
24 import org.testng.annotations.AfterMethod;
25 import org.testng.annotations.BeforeMethod;
26 import org.testng.annotations.Test;
28 import com.sun.jersey.api.client.Client;
29 import com.sun.jersey.api.client.ClientResponse;
30 import com.sun.jersey.api.client.WebResource;
31 import com.sun.jersey.api.client.config.ClientConfig;
32 import com.sun.jersey.api.client.config.DefaultClientConfig;
34 public class PDBRestClientTest
37 @BeforeMethod(alwaysRun = true)
38 public void setUp() throws Exception
43 public void tearDown() throws Exception
47 @Test(groups = { "External", "Network" })
48 public void executeRequestTest()
50 List<PDBDocField> wantedFields = new ArrayList<PDBDocField>();
51 wantedFields.add(PDBDocField.MOLECULE_TYPE);
52 wantedFields.add(PDBDocField.PDB_ID);
53 wantedFields.add(PDBDocField.GENUS);
54 wantedFields.add(PDBDocField.GENE_NAME);
55 wantedFields.add(PDBDocField.TITLE);
57 PDBRestRequest request = new PDBRestRequest();
58 request.setAllowEmptySeq(false);
59 request.setResponseSize(100);
60 request.setFieldToSearchBy("text:");
61 request.setSearchTerm("abc");
62 request.setWantedFields(wantedFields);
64 PDBRestResponse response;
67 response = new PDBRestClient().executeRequest(request);
71 Assert.fail("Couldn't execute webservice call!");
74 assertTrue(response.getNumberOfItemsFound() > 99);
75 assertTrue(response.getSearchSummary() != null);
76 assertTrue(response.getSearchSummary().size() > 99);
79 @Test(groups = { "Functional" })
80 public void getPDBDocFieldsAsCommaDelimitedStringTest()
82 List<PDBDocField> wantedFields = new ArrayList<PDBDocField>();
83 wantedFields.add(PDBDocField.MOLECULE_TYPE);
84 wantedFields.add(PDBDocField.PDB_ID);
85 wantedFields.add(PDBDocField.GENUS);
86 wantedFields.add(PDBDocField.GENE_NAME);
87 wantedFields.add(PDBDocField.TITLE);
89 String expectedResult = "molecule_type,pdb_id,genus,gene_name,title";
90 String actualResult = PDBRestClient
91 .getPDBDocFieldsAsCommaDelimitedString(wantedFields);
93 assertEquals("", expectedResult, actualResult);
96 @Test(groups = { "External, Network" })
97 public void parsePDBJsonExceptionStringTest()
99 List<PDBDocField> wantedFields = new ArrayList<PDBDocField>();
100 wantedFields.add(PDBDocField.MOLECULE_TYPE);
101 wantedFields.add(PDBDocField.PDB_ID);
102 wantedFields.add(PDBDocField.GENUS);
103 wantedFields.add(PDBDocField.GENE_NAME);
104 wantedFields.add(PDBDocField.TITLE);
106 PDBRestRequest request = new PDBRestRequest();
107 request.setAllowEmptySeq(false);
108 request.setResponseSize(100);
109 request.setFieldToSearchBy("text:");
110 request.setSearchTerm("abc");
111 request.setWantedFields(wantedFields);
113 String jsonErrorResponse = "";
116 jsonErrorResponse = readJsonStringFromFile("test/jalview/io/pdb_request_json_error.txt");
117 } catch (IOException e)
122 String parsedErrorResponse = PDBRestClient
123 .parseJsonExceptionString(jsonErrorResponse);
125 String expectedErrorMsg = "\n============= PDB Rest Client RunTime error =============\n"
127 + "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"
128 + "query: text:abc OR text:go:abc AND molecule_sequence:['' TO *]\n"
131 assertEquals(expectedErrorMsg, parsedErrorResponse);
135 groups = { "External", "Network" },
136 expectedExceptions = Exception.class)
137 public void testForExpectedRuntimeException() throws Exception
139 List<PDBDocField> wantedFields = new ArrayList<PDBDocField>();
140 wantedFields.add(PDBDocField.PDB_ID);
142 PDBRestRequest request = new PDBRestRequest();
143 request.setFieldToSearchBy("text:");
144 request.setSearchTerm("abc OR text:go:abc");
145 request.setWantedFields(wantedFields);
146 new PDBRestClient().executeRequest(request);
149 @Test(groups = { "External" })
150 public void parsePDBJsonResponseTest()
152 List<PDBDocField> wantedFields = new ArrayList<PDBDocField>();
153 wantedFields.add(PDBDocField.MOLECULE_TYPE);
154 wantedFields.add(PDBDocField.PDB_ID);
155 wantedFields.add(PDBDocField.GENUS);
156 wantedFields.add(PDBDocField.GENE_NAME);
157 wantedFields.add(PDBDocField.TITLE);
159 PDBRestRequest request = new PDBRestRequest();
160 request.setAllowEmptySeq(false);
161 request.setWantedFields(wantedFields);
163 String jsonString = "";
166 jsonString = readJsonStringFromFile("test/jalview/io/pdb_response_json.txt");
167 } catch (IOException e)
171 PDBRestResponse response = PDBRestClient.parsePDBJsonResponse(
172 jsonString, request);
173 assertTrue(response.getSearchSummary() != null);
174 assertTrue(response.getNumberOfItemsFound() == 931);
175 assertTrue(response.getSearchSummary().size() == 14);
178 @Test(groups = { "Functional" })
179 public void getPDBIdColumIndexTest()
181 List<PDBDocField> wantedFields = new ArrayList<PDBDocField>();
182 wantedFields.add(PDBDocField.MOLECULE_TYPE);
183 wantedFields.add(PDBDocField.GENUS);
184 wantedFields.add(PDBDocField.GENE_NAME);
185 wantedFields.add(PDBDocField.TITLE);
186 wantedFields.add(PDBDocField.PDB_ID);
187 assertEquals(5, PDBRestClient.getPDBIdColumIndex(wantedFields, true));
188 assertEquals(4, PDBRestClient.getPDBIdColumIndex(wantedFields, false));
191 @Test(groups = { "External" })
192 public void externalServiceIntegrationTest()
194 ClientConfig clientConfig = new DefaultClientConfig();
195 Client client = Client.create(clientConfig);
197 // Build request parameters for the REST Request
198 WebResource webResource = client
199 .resource(PDBRestClient.PDB_SEARCH_ENDPOINT)
200 .queryParam("wt", "json").queryParam("rows", String.valueOf(1))
201 .queryParam("q", "text:abc AND molecule_sequence:['' TO *]");
203 // Execute the REST request
204 ClientResponse clientResponse = webResource.accept(
205 MediaType.APPLICATION_JSON).get(ClientResponse.class);
207 // Get the JSON string from the response object
208 String pdbJsonResponseString = clientResponse.getEntity(String.class);
210 // Check the response status and report exception if one occurs
211 if (clientResponse.getStatus() != 200)
213 Assert.fail("Webservice call failed!!!");
219 JSONParser jsonParser = new JSONParser();
220 JSONObject jsonObj = (JSONObject) jsonParser
221 .parse(pdbJsonResponseString);
222 JSONObject pdbResponse = (JSONObject) jsonObj.get("response");
223 String queryTime = ((JSONObject) jsonObj.get("responseHeader"))
224 .get("QTime").toString();
225 String numFound = pdbResponse.get("numFound").toString();
226 JSONArray docs = (JSONArray) pdbResponse.get("docs");
227 Iterator<JSONObject> docIter = docs.iterator();
229 assertTrue("Couldn't Retrieve 'response' object",
230 pdbResponse != null);
231 assertTrue("Couldn't Retrieve 'QTime' value", queryTime != null);
232 assertTrue("Couldn't Retrieve 'numFound' value", numFound != null);
233 assertTrue("Couldn't Retrieve 'docs' object", docs != null
234 || !docIter.hasNext());
236 JSONObject pdbJsonDoc = docIter.next();
238 for (PDBDocField field : PDBDocField.values())
240 if (field == PDBDocField.ALL)
244 if (pdbJsonDoc.get(field.getCode()) == null)
246 // System.out.println(">>>\t" + field.getCode());
247 assertTrue(field.getClass()
248 + " has been removed from PDB doc Entity",
249 !pdbJsonResponseString.contains(field.getCode()));
252 } catch (ParseException e)
254 Assert.fail(">>> Test failed due to exception while parsing pdb response json !!!");
260 public String readJsonStringFromFile(String filePath) throws IOException
263 BufferedReader br = new BufferedReader(new FileReader(filePath));
266 StringBuilder sb = new StringBuilder();
267 String line = br.readLine();
272 sb.append(System.lineSeparator());
273 line = br.readLine();
275 fileContent = sb.toString();