/*
* Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
* Copyright (C) $$Year-Rel$$ The Jalview Authors
*
* This file is part of Jalview.
*
* Jalview is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version.
*
* Jalview is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Jalview. If not, see .
* The Jalview Authors are detailed in the 'AUTHORS' file.
*/
package jalview.fts.service.pdb;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertTrue;
import jalview.fts.api.FTSDataColumnI;
import jalview.fts.core.FTSRestRequest;
import jalview.fts.core.FTSRestResponse;
import jalview.gui.JvOptionPane;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.ws.rs.core.MediaType;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
public class PDBFTSRestClientTest
{
@BeforeClass(alwaysRun = true)
public void setUpJvOptionPane()
{
JvOptionPane.setInteractiveMode(false);
JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
}
@BeforeMethod(alwaysRun = true)
public void setUp() throws Exception
{
}
@AfterMethod(alwaysRun = true)
public void tearDown() throws Exception
{
}
@Test(groups = { "External", "Network" })
public void executeRequestTest()
{
List wantedFields = new ArrayList();
try
{
wantedFields.add(PDBFTSRestClient.getInstance()
.getDataColumnByNameOrCode("molecule_type"));
wantedFields.add(PDBFTSRestClient.getInstance()
.getDataColumnByNameOrCode("pdb_id"));
wantedFields.add(PDBFTSRestClient.getInstance()
.getDataColumnByNameOrCode("genus"));
wantedFields.add(PDBFTSRestClient.getInstance()
.getDataColumnByNameOrCode("gene_name"));
wantedFields.add(PDBFTSRestClient.getInstance()
.getDataColumnByNameOrCode("title"));
} catch (Exception e1)
{
e1.printStackTrace();
}
FTSRestRequest request = new FTSRestRequest();
request.setAllowEmptySeq(false);
request.setResponseSize(100);
request.setFieldToSearchBy("text:");
request.setSearchTerm("abc");
request.setWantedFields(wantedFields);
FTSRestResponse response;
try
{
response = PDBFTSRestClient.getInstance().executeRequest(request);
} catch (Exception e)
{
e.printStackTrace();
Assert.fail("Couldn't execute webservice call!");
return;
}
assertTrue(response.getNumberOfItemsFound() > 99);
assertTrue(response.getSearchSummary() != null);
assertTrue(response.getSearchSummary().size() > 99);
}
@Test(groups = { "Functional" })
public void getPDBDocFieldsAsCommaDelimitedStringTest()
{
List wantedFields = new ArrayList();
try
{
wantedFields.add(PDBFTSRestClient.getInstance()
.getDataColumnByNameOrCode("molecule_type"));
wantedFields.add(PDBFTSRestClient.getInstance()
.getDataColumnByNameOrCode("pdb_id"));
wantedFields.add(PDBFTSRestClient.getInstance()
.getDataColumnByNameOrCode("genus"));
wantedFields.add(PDBFTSRestClient.getInstance()
.getDataColumnByNameOrCode("gene_name"));
wantedFields.add(PDBFTSRestClient.getInstance()
.getDataColumnByNameOrCode("title"));
} catch (Exception e)
{
e.printStackTrace();
}
String expectedResult = "molecule_type,pdb_id,genus,gene_name,title";
String actualResult = PDBFTSRestClient.getInstance()
.getDataColumnsFieldsAsCommaDelimitedString(wantedFields);
assertEquals("", expectedResult, actualResult);
}
@Test(groups = { "External, Network" })
public void parsePDBJsonExceptionStringTest()
{
List wantedFields = new ArrayList();
try
{
wantedFields.add(PDBFTSRestClient.getInstance()
.getDataColumnByNameOrCode("molecule_type"));
wantedFields.add(PDBFTSRestClient.getInstance()
.getDataColumnByNameOrCode("pdb_id"));
wantedFields.add(PDBFTSRestClient.getInstance()
.getDataColumnByNameOrCode("genus"));
wantedFields.add(PDBFTSRestClient.getInstance()
.getDataColumnByNameOrCode("gene_name"));
wantedFields.add(PDBFTSRestClient.getInstance()
.getDataColumnByNameOrCode("title"));
} catch (Exception e1)
{
e1.printStackTrace();
}
FTSRestRequest request = new FTSRestRequest();
request.setAllowEmptySeq(false);
request.setResponseSize(100);
request.setFieldToSearchBy("text:");
request.setSearchTerm("abc");
request.setWantedFields(wantedFields);
String jsonErrorResponse = "";
try
{
jsonErrorResponse = readJsonStringFromFile("test/jalview/io/pdb_request_json_error.txt");
} catch (IOException e)
{
e.printStackTrace();
}
String parsedErrorResponse = PDBFTSRestClient
.parseJsonExceptionString(jsonErrorResponse);
String expectedErrorMsg = "\n============= PDB Rest Client RunTime error =============\n"
+ "Status: 400\n"
+ "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"
+ "query: text:abc OR text:go:abc AND molecule_sequence:['' TO *]\n"
+ "fl: pdb_id\n";
assertEquals(expectedErrorMsg, parsedErrorResponse);
}
@Test(groups = { "External" }, expectedExceptions = Exception.class)
public void testForExpectedRuntimeException() throws Exception
{
List wantedFields = new ArrayList();
wantedFields.add(PDBFTSRestClient.getInstance()
.getDataColumnByNameOrCode("pdb_id"));
FTSRestRequest request = new FTSRestRequest();
request.setFieldToSearchBy("text:");
request.setSearchTerm("abc OR text:go:abc");
request.setWantedFields(wantedFields);
PDBFTSRestClient.getInstance().executeRequest(request);
}
// JBP: Is this actually external ? Looks like it is mocked
@Test(groups = { "External" })
public void parsePDBJsonResponseTest()
{
List wantedFields = new ArrayList();
try
{
wantedFields.add(PDBFTSRestClient.getInstance()
.getDataColumnByNameOrCode("molecule_type"));
wantedFields.add(PDBFTSRestClient.getInstance()
.getDataColumnByNameOrCode("pdb_id"));
wantedFields.add(PDBFTSRestClient.getInstance()
.getDataColumnByNameOrCode("genus"));
wantedFields.add(PDBFTSRestClient.getInstance()
.getDataColumnByNameOrCode("gene_name"));
wantedFields.add(PDBFTSRestClient.getInstance()
.getDataColumnByNameOrCode("title"));
} catch (Exception e1)
{
e1.printStackTrace();
}
FTSRestRequest request = new FTSRestRequest();
request.setAllowEmptySeq(false);
request.setWantedFields(wantedFields);
String jsonString = "";
try
{
jsonString = readJsonStringFromFile("test/jalview/io/pdb_response_json.txt");
} catch (IOException e)
{
e.printStackTrace();
}
FTSRestResponse response = PDBFTSRestClient.parsePDBJsonResponse(
jsonString, request);
assertTrue(response.getSearchSummary() != null);
assertTrue(response.getNumberOfItemsFound() == 931);
assertTrue(response.getSearchSummary().size() == 14);
}
@Test(groups = { "Functional" })
public void getPDBIdColumIndexTest()
{
List wantedFields = new ArrayList();
try
{
wantedFields.add(PDBFTSRestClient.getInstance()
.getDataColumnByNameOrCode("molecule_type"));
wantedFields.add(PDBFTSRestClient.getInstance()
.getDataColumnByNameOrCode("genus"));
wantedFields.add(PDBFTSRestClient.getInstance()
.getDataColumnByNameOrCode("gene_name"));
wantedFields.add(PDBFTSRestClient.getInstance()
.getDataColumnByNameOrCode("title"));
wantedFields.add(PDBFTSRestClient.getInstance()
.getDataColumnByNameOrCode("pdb_id"));
} catch (Exception e)
{
e.printStackTrace();
}
try
{
assertEquals(5, PDBFTSRestClient.getInstance()
.getPrimaryKeyColumIndex(wantedFields, true));
assertEquals(4, PDBFTSRestClient.getInstance()
.getPrimaryKeyColumIndex(wantedFields, false));
} catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test(groups = { "External" })
public void externalServiceIntegrationTest()
{
ClientConfig clientConfig = new DefaultClientConfig();
Client client = Client.create(clientConfig);
// Build request parameters for the REST Request
WebResource webResource = client
.resource(PDBFTSRestClient.PDB_SEARCH_ENDPOINT)
.queryParam("wt", "json").queryParam("rows", String.valueOf(1))
.queryParam("q", "text:abc AND molecule_sequence:['' TO *]");
// Execute the REST request
ClientResponse clientResponse = webResource.accept(
MediaType.APPLICATION_JSON).get(ClientResponse.class);
// Get the JSON string from the response object
String pdbJsonResponseString = clientResponse.getEntity(String.class);
// Check the response status and report exception if one occurs
if (clientResponse.getStatus() != 200)
{
Assert.fail("Webservice call failed!!!");
}
else
{
try
{
JSONParser jsonParser = new JSONParser();
JSONObject jsonObj = (JSONObject) jsonParser
.parse(pdbJsonResponseString);
JSONObject pdbResponse = (JSONObject) jsonObj.get("response");
String queryTime = ((JSONObject) jsonObj.get("responseHeader"))
.get("QTime").toString();
String numFound = pdbResponse.get("numFound").toString();
JSONArray docs = (JSONArray) pdbResponse.get("docs");
Iterator docIter = docs.iterator();
assertTrue("Couldn't Retrieve 'response' object",
pdbResponse != null);
assertTrue("Couldn't Retrieve 'QTime' value", queryTime != null);
assertTrue("Couldn't Retrieve 'numFound' value", numFound != null);
assertTrue("Couldn't Retrieve 'docs' object", docs != null
|| !docIter.hasNext());
JSONObject pdbJsonDoc = docIter.next();
for (FTSDataColumnI field : PDBFTSRestClient.getInstance()
.getAllFTSDataColumns())
{
if (field.getName().equalsIgnoreCase("ALL"))
{
continue;
}
if (pdbJsonDoc.get(field.getCode()) == null)
{
// System.out.println(">>>\t" + field.getCode());
assertTrue(field.getCode()
+ " has been removed from PDB doc Entity",
!pdbJsonResponseString.contains(field.getCode()));
}
}
} catch (ParseException e)
{
Assert.fail(">>> Test failed due to exception while parsing pdb response json !!!");
e.printStackTrace();
}
}
}
public String readJsonStringFromFile(String filePath) throws IOException
{
String fileContent;
BufferedReader br = new BufferedReader(new FileReader(filePath));
try
{
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null)
{
sb.append(line);
sb.append(System.lineSeparator());
line = br.readLine();
}
fileContent = sb.toString();
} finally
{
br.close();
}
return fileContent;
}
}