JAL-3829 TDBeacons fetcher needs a sequence with at least one canonical uniprot accession
[jalview.git] / test / jalview / fts / threedbeacons / TDBeaconsFTSRestClientTest.java
1 package jalview.fts.threedbeacons;
2
3 import static org.testng.Assert.assertNull;
4 import static org.testng.AssertJUnit.assertEquals;
5 import static org.testng.AssertJUnit.assertTrue;
6
7 import java.io.IOException;
8 import java.net.URL;
9 import java.nio.charset.StandardCharsets;
10 import java.util.ArrayList;
11 import java.util.Collection;
12 import java.util.HashSet;
13 import java.util.List;
14 import java.util.Set;
15
16 import org.testng.Assert;
17 import org.testng.annotations.AfterMethod;
18 import org.testng.annotations.BeforeClass;
19 import org.testng.annotations.BeforeMethod;
20 import org.testng.annotations.Test;
21
22 import jalview.fts.api.FTSDataColumnI;
23 import jalview.fts.api.FTSDataColumnI.FTSDataColumnGroupI;
24 import jalview.fts.core.FTSRestClient;
25 import jalview.fts.core.FTSRestRequest;
26 import jalview.fts.core.FTSRestResponse;
27 import jalview.fts.service.pdb.PDBFTSRestClientTest;
28 import jalview.fts.service.threedbeacons.TDBeaconsFTSRestClient;
29 import jalview.gui.JvOptionPane;
30
31 public class TDBeaconsFTSRestClientTest
32 {
33   @BeforeClass(alwaysRun = true)
34   public void setUpJvOptionPane()
35   {
36     JvOptionPane.setInteractiveMode(false);
37     JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
38   }
39
40   private FTSRestClient ftsRestClient;
41
42   @BeforeMethod(alwaysRun = true)
43   public void setUp() throws Exception
44   {
45     ftsRestClient = new FTSRestClient()
46     {
47
48       @Override
49       public String getColumnDataConfigFileName()
50       {
51         return "/fts/tdbeacons_data_columns.txt";
52       }
53
54       @Override
55       public FTSRestResponse executeRequest(FTSRestRequest ftsRequest)
56               throws Exception
57       {
58         return null;
59       }
60     };
61   }
62
63   @AfterMethod(alwaysRun = true)
64   public void tearDown() throws Exception
65   {
66   }
67
68   @Test
69   public void getAllDefaulDisplayedDataColumns()
70   {
71     // to change when resources.tdbeacons_data_columns.txt is changed
72     Assert.assertNotNull(
73             ftsRestClient.getAllDefaultDisplayedFTSDataColumns());
74     System.out
75             .println(ftsRestClient.getAllDefaultDisplayedFTSDataColumns());
76     Assert.assertTrue(!ftsRestClient.getAllDefaultDisplayedFTSDataColumns()
77             .isEmpty());
78     Assert.assertEquals(
79             ftsRestClient.getAllDefaultDisplayedFTSDataColumns().size(),
80             14);
81   }
82
83   @Test(groups = { "Functional" })
84   public void getPrimaryKeyColumIndexTest()
85   {
86     Collection<FTSDataColumnI> wantedFields = ftsRestClient
87             .getAllDefaultDisplayedFTSDataColumns();
88     int foundIndex = -1;
89     try
90     {
91       Assert.assertEquals(foundIndex, -1);
92       foundIndex = ftsRestClient.getPrimaryKeyColumIndex(wantedFields,
93               false);
94       Assert.assertEquals(foundIndex, 12);
95       foundIndex = ftsRestClient.getPrimaryKeyColumIndex(wantedFields,
96               true);
97       // 1+primary key index
98       Assert.assertEquals(foundIndex, 13);
99     } catch (Exception e)
100     {
101       e.printStackTrace();
102       Assert.fail("Exception thrown while testing...");
103     }
104   }
105
106   @Test(groups = { "Functional" })
107   public void getDataColumnsFieldsAsCommaDelimitedString()
108   {
109     // to change when resources.tdbeacons_data_columns.txt is changed
110     Collection<FTSDataColumnI> wantedFields = ftsRestClient
111             .getAllDefaultDisplayedFTSDataColumns();
112     String actual = ftsRestClient
113             .getDataColumnsFieldsAsCommaDelimitedString(wantedFields);
114     Assert.assertEquals(actual,
115             "uniprot_start,uniprot_end,provider,model_identifier,model_category,model_title,resolution,confidence_avg_local_score,confidence_type,confidence_version,coverage,created,model_url,model_page_url");
116   }
117
118   @Test(groups = { "Functional" })
119   public void getAllFTSDataColumns()
120   {
121     Collection<FTSDataColumnI> allFields = ftsRestClient
122             .getAllFTSDataColumns();
123     Assert.assertNotNull(allFields);
124     // System.out.println(allFields.size());
125     Assert.assertEquals(allFields.size(), 19);
126   }
127
128   @Test(groups = { "Functional" })
129   public void getSearchableDataColumns()
130   {
131     // to change when resources.tdbeacons_data_columns.txt is changed
132     Collection<FTSDataColumnI> searchableFields = ftsRestClient
133             .getSearchableDataColumns();
134     Assert.assertNotNull(searchableFields);
135     // System.out.println(searchableFields.size());
136     Assert.assertEquals(searchableFields.size(), 1); // only 1: uniprot
137                                                      // accession
138   }
139
140   @Test(groups = { "Functional" })
141   public void getPrimaryKeyColumn()
142   {
143     // to change when resources.tdbeacons_data_columns.txt is changed
144     FTSDataColumnI expectedPKColumn;
145     try
146     {
147       expectedPKColumn = ftsRestClient.getDataColumnByNameOrCode("Url");
148       Assert.assertNotNull(ftsRestClient.getPrimaryKeyColumn());
149       Assert.assertEquals(ftsRestClient.getPrimaryKeyColumn(),
150               expectedPKColumn);
151     } catch (Exception e)
152     {
153       e.printStackTrace();
154       Assert.fail("Exception thrown while testing...");
155     }
156   }
157
158   @Test(groups = { "Functional" })
159   public void getDataColumnByNameOrCode()
160   {
161     try
162     {
163       FTSDataColumnI foundDataCol = ftsRestClient
164               .getDataColumnByNameOrCode("uniprot_accession");
165       Assert.assertNotNull(foundDataCol);
166       Assert.assertEquals(foundDataCol.getName(), "UniProt Accession");
167     } catch (Exception e)
168     {
169       e.printStackTrace();
170       Assert.fail("Exception thrown while testing...");
171     }
172   }
173
174   @Test(groups = { "Functional" })
175   public void getDataColumnGroupById()
176   {
177     FTSDataColumnGroupI foundDataColGroup;
178     try
179     {
180       foundDataColGroup = ftsRestClient.getDataColumnGroupById("g2");
181       Assert.assertNotNull(foundDataColGroup);
182       Assert.assertEquals(foundDataColGroup.getName(), "Quality");
183     } catch (Exception e)
184     {
185       e.printStackTrace();
186     }
187   }
188
189   @Test(groups = { "Functional" })
190   public void getDefaultResponsePageSize()
191   {
192     int defaultResSize = ftsRestClient.getDefaultResponsePageSize();
193     Assert.assertEquals(defaultResSize, 100); // why 100 or 500 ? pdb is 100,
194                                               // uniprot 500
195   }
196
197   @Test(groups = { "Functional" })
198   public void getColumnMinWidthTest()
199   {
200     try
201     {
202       FTSDataColumnI foundDataCol = ftsRestClient
203               .getDataColumnByNameOrCode("uniprot_accession");
204       Assert.assertNotNull(foundDataCol);
205       int actualColMinWidth = foundDataCol.getMinWidth();
206       Assert.assertEquals(actualColMinWidth, 50);
207     } catch (Exception e)
208     {
209       e.printStackTrace();
210       Assert.fail("Exception thrown while testing...");
211     }
212   }
213   // could add test for MaxWidth & PreferedWith
214
215   @Test(groups = { "Functional" })
216   public void getColumnClassTest()
217   {
218     try
219     {
220       FTSDataColumnI foundDataCol = ftsRestClient
221               .getDataColumnByNameOrCode("uniprot_accession");
222       Assert.assertNotNull(foundDataCol);
223       Assert.assertEquals(foundDataCol.getDataType().getDataTypeClass(),
224               String.class);
225       foundDataCol = ftsRestClient.getDataColumnByNameOrCode("id");
226       Assert.assertNotNull(foundDataCol);
227       Assert.assertEquals(foundDataCol.getDataType().getDataTypeClass(),
228               String.class);
229     } catch (Exception e)
230     {
231       e.printStackTrace();
232       Assert.fail("Exception thrown while testing...");
233     }
234   }
235
236   @Test(groups = { "Functional" })
237   public void coverageForEqualsAndHashFunction()
238   {
239     Set<FTSDataColumnI> uniqueSet = new HashSet<FTSDataColumnI>();
240     Collection<FTSDataColumnI> searchableCols = ftsRestClient
241             .getSearchableDataColumns();
242     System.out.println(searchableCols);
243     for (FTSDataColumnI foundCol : searchableCols)
244     {
245       System.out.println(foundCol.toString());
246       uniqueSet.add(foundCol);
247       uniqueSet.add(foundCol);
248     }
249     Assert.assertTrue(!uniqueSet.isEmpty());
250     // Assert.assertEquals(uniqueSet.size(), 22); -> 1 or 2 currently for 3DB
251   }
252
253   @Test(groups = { "Functional" })
254   public void getTDBIdColumIndexTest()
255   {
256     List<FTSDataColumnI> wantedFields = new ArrayList<FTSDataColumnI>();
257     try
258     {
259       wantedFields.add(TDBeaconsFTSRestClient.getInstance()
260               .getDataColumnByNameOrCode("Model id"));
261       wantedFields.add(TDBeaconsFTSRestClient.getInstance()
262               .getDataColumnByNameOrCode("uniprot_accession"));
263       wantedFields.add(TDBeaconsFTSRestClient.getInstance()
264               .getDataColumnByNameOrCode("Title"));
265     } catch (Exception e)
266     {
267       e.printStackTrace();
268     }
269     try
270     {
271       assertEquals(4, TDBeaconsFTSRestClient.getInstance()
272               .getPrimaryKeyColumIndex(wantedFields, true));
273       // assertEquals(3, TDBeaconsFTSRestClient.getInstance()
274       // .getPrimaryKeyColumIndex(wantedFields, true));
275     } catch (Exception e)
276     {
277       e.printStackTrace();
278     }
279   }
280
281   private static String[][] mocks = { { "P38398.json",
282       "{\"uniprot_entry\":{\"sequence_length\":1863,\"ac\":\"P38398\",\"id\":\"BRCA1_HUMAN\"},\"structures\":[{\"model_identifier\":\"4igk\",\"model_category\":\"EXPERIMENTALLY DETERMINED\",\"provider\":\"PDBe\",\"created\":\"2012-12-17\",\"sequence_identity\":100.0,\"uniprot_start\":1646,\"uniprot_end\":1859,\"resolution\":1.75,\"coverage\":11.49,\"model_url\":\"https://www.ebi.ac.uk/pdbe/static/entry/4igk_updated.cif\",\"model_format\":\"MMCIF\",\"experimental_method\":\"X-RAY DIFFRACTION\",\"model_page_url\":\"https://www.ebi.ac.uk/pdbe/entry/pdb/4igk\"},{\"model_identifier\":\"1t15\",\"model_category\":\"EXPERIMENTALLY DETERMINED\",\"provider\":\"PDBe\",\"created\":\"2004-04-15\",\"sequence_identity\":100.0,\"uniprot_start\":1646,\"uniprot_end\":1859,\"resolution\":1.85,\"coverage\":11.49,\"model_url\":\"https://www.ebi.ac.uk/pdbe/static/entry/1t15_updated.cif\",\"model_format\":\"MMCIF\",\"experimental_method\":\"X-RAY DIFFRACTION\",\"model_page_url\":\"https://www.ebi.ac.uk/pdbe/entry/pdb/1t15\"},{\"model_identifier\":\"4ifi\",\"model_category\":\"EXPERIMENTALLY DETERMINED\",\"provider\":\"PDBe\",\"created\":\"2012-12-14\",\"sequence_identity\":100.0,\"uniprot_start\":1646,\"uniprot_end\":1859,\"resolution\":2.2,\"coverage\":11.49,\"model_url\":\"https://www.ebi.ac.uk/pdbe/static/entry/4ifi_updated.cif\",\"model_format\":\"MMCIF\",\"experimental_method\":\"X-RAY DIFFRACTION\",\"model_page_url\":\"https://www.ebi.ac.uk/pdbe/entry/pdb/4ifi\"},{\"model_identifier\":\"1t29\",\"model_category\":\"EXPERIMENTALLY DETERMINED\",\"provider\":\"PDBe\",\"created\":\"2004-04-20\",\"sequence_identity\":100.0,\"uniprot_start\":1646,\"uniprot_end\":1859,\"resolution\":2.3,\"coverage\":11.49,\"model_url\":\"https://www.ebi.ac.uk/pdbe/static/entry/1t29_updated.cif\",\"model_format\":\"MMCIF\",\"experimental_method\":\"X-RAY DIFFRACTION\",\"model_page_url\":\"https://www.ebi.ac.uk/pdbe/entry/pdb/1t29\"},{\"model_identifier\":\"3pxb\",\"model_category\":\"EXPERIMENTALLY DETERMINED\",\"provider\":\"PDBe\",\"created\":\"2010-12-09\",\"sequence_identity\":100.0,\"uniprot_start\":1646,\"uniprot_end\":1859,\"resolution\":2.5,\"coverage\":11.49,\"model_url\":\"https://www.ebi.ac.uk/pdbe/static/entry/3pxb_updated.cif\",\"model_format\":\"MMCIF\",\"experimental_method\":\"X-RAY DIFFRACTION\",\"model_page_url\":\"https://www.ebi.ac.uk/pdbe/entry/pdb/3pxb\"},{\"model_identifier\":\"4y2g\",\"model_category\":\"EXPERIMENTALLY DETERMINED\",\"provider\":\"PDBe\",\"created\":\"2015-02-09\",\"sequence_identity\":100.0,\"uniprot_start\":1646,\"uniprot_end\":1859,\"resolution\":2.5,\"coverage\":11.49,\"model_url\":\"https://www.ebi.ac.uk/pdbe/static/entry/4y2g_updated.cif\",\"model_format\":\"MMCIF\",\"experimental_method\":\"X-RAY DIFFRACTION\",\"model_page_url\":\"https://www.ebi.ac.uk/pdbe/entry/pdb/4y2g\"},{\"model_identifier\":\"1y98\",\"model_category\":\"EXPERIMENTALLY DETERMINED\",\"provider\":\"PDBe\",\"created\":\"2004-12-14\",\"sequence_identity\":100.0,\"uniprot_start\":1646,\"uniprot_end\":1859,\"resolution\":2.5,\"coverage\":11.49,\"model_url\":\"https://www.ebi.ac.uk/pdbe/static/entry/1y98_updated.cif\",\"model_format\":\"MMCIF\",\"experimental_method\":\"X-RAY DIFFRACTION\",\"model_page_url\":\"https://www.ebi.ac.uk/pdbe/entry/pdb/1y98\"},{\"model_identifier\":\"1jnx\",\"model_category\":\"EXPERIMENTALLY DETERMINED\",\"provider\":\"PDBe\",\"created\":\"2001-07-26\",\"sequence_identity\":100.0,\"uniprot_start\":1646,\"uniprot_end\":1859,\"resolution\":2.5,\"coverage\":11.49,\"model_url\":\"https://www.ebi.ac.uk/pdbe/static/entry/1jnx_updated.cif\",\"model_format\":\"MMCIF\",\"experimental_method\":\"X-RAY DIFFRACTION\",\"model_page_url\":\"https://www.ebi.ac.uk/pdbe/entry/pdb/1jnx\"},{\"model_identifier\":\"3pxa\",\"model_category\":\"EXPERIMENTALLY DETERMINED\",\"provider\":\"PDBe\",\"created\":\"2010-12-09\",\"sequence_identity\":100.0,\"uniprot_start\":1646,\"uniprot_end\":1859,\"resolution\":2.55,\"coverage\":11.49,\"model_url\":\"https://www.ebi.ac.uk/pdbe/static/entry/3pxa_updated.cif\",\"model_format\":\"MMCIF\",\"experimental_method\":\"X-RAY DIFFRACTION\",\"model_page_url\":\"https://www.ebi.ac.uk/pdbe/entry/pdb/3pxa\"},{\"model_identifier\":\"3k0h\",\"model_category\":\"EXPERIMENTALLY DETERMINED\",\"provider\":\"PDBe\",\"created\":\"2009-09-24\",\"sequence_identity\":100.0,\"uniprot_start\":1646,\"uniprot_end\":1859,\"resolution\":2.7,\"coverage\":11.49,\"model_url\":\"https://www.ebi.ac.uk/pdbe/static/entry/3k0h_updated.cif\",\"model_format\":\"MMCIF\",\"experimental_method\":\"X-RAY DIFFRACTION\",\"model_page_url\":\"https://www.ebi.ac.uk/pdbe/entry/pdb/3k0h\"},{\"model_identifier\":\"3k0k\",\"model_category\":\"EXPERIMENTALLY DETERMINED\",\"provider\":\"PDBe\",\"created\":\"2009-09-24\",\"sequence_identity\":100.0,\"uniprot_start\":1646,\"uniprot_end\":1859,\"resolution\":2.7,\"coverage\":11.49,\"model_url\":\"https://www.ebi.ac.uk/pdbe/static/entry/3k0k_updated.cif\",\"model_format\":\"MMCIF\",\"experimental_method\":\"X-RAY DIFFRACTION\",\"model_page_url\":\"https://www.ebi.ac.uk/pdbe/entry/pdb/3k0k\"},{\"model_identifier\":\"1n5o\",\"model_category\":\"EXPERIMENTALLY DETERMINED\",\"provider\":\"PDBe\",\"created\":\"2002-11-06\",\"sequence_identity\":100.0,\"uniprot_start\":1646,\"uniprot_end\":1859,\"resolution\":2.8,\"coverage\":11.49,\"model_url\":\"https://www.ebi.ac.uk/pdbe/static/entry/1n5o_updated.cif\",\"model_format\":\"MMCIF\",\"experimental_method\":\"X-RAY DIFFRACTION\",\"model_page_url\":\"https://www.ebi.ac.uk/pdbe/entry/pdb/1n5o\"},{\"model_identifier\":\"3pxc\",\"model_category\":\"EXPERIMENTALLY DETERMINED\",\"provider\":\"PDBe\",\"created\":\"2010-12-09\",\"sequence_identity\":100.0,\"uniprot_start\":1646,\"uniprot_end\":1859,\"resolution\":2.8,\"coverage\":11.49,\"model_url\":\"https://www.ebi.ac.uk/pdbe/static/entry/3pxc_updated.cif\",\"model_format\":\"MMCIF\",\"experimental_method\":\"X-RAY DIFFRACTION\",\"model_page_url\":\"https://www.ebi.ac.uk/pdbe/entry/pdb/3pxc\"},{\"model_identifier\":\"3pxd\",\"model_category\":\"EXPERIMENTALLY DETERMINED\",\"provider\":\"PDBe\",\"created\":\"2010-12-09\",\"sequence_identity\":100.0,\"uniprot_start\":1646,\"uniprot_end\":1859,\"resolution\":2.8,\"coverage\":11.49,\"model_url\":\"https://www.ebi.ac.uk/pdbe/static/entry/3pxd_updated.cif\",\"model_format\":\"MMCIF\",\"experimental_method\":\"X-RAY DIFFRACTION\",\"model_page_url\":\"https://www.ebi.ac.uk/pdbe/entry/pdb/3pxd\"},{\"model_identifier\":\"1t2u\",\"model_category\":\"EXPERIMENTALLY DETERMINED\",\"provider\":\"PDBe\",\"created\":\"2004-04-22\",\"sequence_identity\":100.0,\"uniprot_start\":1646,\"uniprot_end\":1859,\"resolution\":2.8,\"coverage\":11.49,\"model_url\":\"https://www.ebi.ac.uk/pdbe/static/entry/1t2u_updated.cif\",\"model_format\":\"MMCIF\",\"experimental_method\":\"X-RAY DIFFRACTION\",\"model_page_url\":\"https://www.ebi.ac.uk/pdbe/entry/pdb/1t2u\"},{\"model_identifier\":\"3k15\",\"model_category\":\"EXPERIMENTALLY DETERMINED\",\"provider\":\"PDBe\",\"created\":\"2009-09-25\",\"sequence_identity\":100.0,\"uniprot_start\":1646,\"uniprot_end\":1859,\"resolution\":2.8,\"coverage\":11.49,\"model_url\":\"https://www.ebi.ac.uk/pdbe/static/entry/3k15_updated.cif\",\"model_format\":\"MMCIF\",\"experimental_method\":\"X-RAY DIFFRACTION\",\"model_page_url\":\"https://www.ebi.ac.uk/pdbe/entry/pdb/3k15\"},{\"model_identifier\":\"3pxe\",\"model_category\":\"EXPERIMENTALLY DETERMINED\",\"provider\":\"PDBe\",\"created\":\"2010-12-09\",\"sequence_identity\":100.0,\"uniprot_start\":1646,\"uniprot_end\":1859,\"resolution\":2.85,\"coverage\":11.49,\"model_url\":\"https://www.ebi.ac.uk/pdbe/static/entry/3pxe_updated.cif\",\"model_format\":\"MMCIF\",\"experimental_method\":\"X-RAY DIFFRACTION\",\"model_page_url\":\"https://www.ebi.ac.uk/pdbe/entry/pdb/3pxe\"},{\"model_identifier\":\"3k16\",\"model_category\":\"EXPERIMENTALLY DETERMINED\",\"provider\":\"PDBe\",\"created\":\"2009-09-25\",\"sequence_identity\":100.0,\"uniprot_start\":1646,\"uniprot_end\":1859,\"resolution\":3.0,\"coverage\":11.49,\"model_url\":\"https://www.ebi.ac.uk/pdbe/static/entry/3k16_updated.cif\",\"model_format\":\"MMCIF\",\"experimental_method\":\"X-RAY DIFFRACTION\",\"model_page_url\":\"https://www.ebi.ac.uk/pdbe/entry/pdb/3k16\"},{\"model_identifier\":\"4ofb\",\"model_category\":\"EXPERIMENTALLY DETERMINED\",\"provider\":\"PDBe\",\"created\":\"2014-01-14\",\"sequence_identity\":100.0,\"uniprot_start\":1646,\"uniprot_end\":1859,\"resolution\":3.05,\"coverage\":11.49,\"model_url\":\"https://www.ebi.ac.uk/pdbe/static/entry/4ofb_updated.cif\",\"model_format\":\"MMCIF\",\"experimental_method\":\"X-RAY DIFFRACTION\",\"model_page_url\":\"https://www.ebi.ac.uk/pdbe/entry/pdb/4ofb\"},{\"model_identifier\":\"3coj\",\"model_category\":\"EXPERIMENTALLY DETERMINED\",\"provider\":\"PDBe\",\"created\":\"2008-03-28\",\"sequence_identity\":100.0,\"uniprot_start\":1646,\"uniprot_end\":1859,\"resolution\":3.21,\"coverage\":11.49,\"model_url\":\"https://www.ebi.ac.uk/pdbe/static/entry/3coj_updated.cif\",\"model_format\":\"MMCIF\",\"experimental_method\":\"X-RAY DIFFRACTION\",\"model_page_url\":\"https://www.ebi.ac.uk/pdbe/entry/pdb/3coj\"},{\"model_identifier\":\"7lyb\",\"model_category\":\"EXPERIMENTALLY DETERMINED\",\"provider\":\"PDBe\",\"created\":\"2021-03-06\",\"sequence_identity\":100.0,\"uniprot_start\":1,\"uniprot_end\":100,\"resolution\":3.28,\"coverage\":5.37,\"model_url\":\"https://www.ebi.ac.uk/pdbe/static/entry/7lyb_updated.cif\",\"model_format\":\"MMCIF\",\"experimental_method\":\"ELECTRON MICROSCOPY\",\"model_page_url\":\"https://www.ebi.ac.uk/pdbe/entry/pdb/7lyb\"},{\"model_identifier\":\"1t2v\",\"model_category\":\"EXPERIMENTALLY DETERMINED\",\"provider\":\"PDBe\",\"created\":\"2004-04-22\",\"sequence_identity\":100.0,\"uniprot_start\":1646,\"uniprot_end\":1859,\"resolution\":3.3,\"coverage\":11.49,\"model_url\":\"https://www.ebi.ac.uk/pdbe/static/entry/1t2v_updated.cif\",\"model_format\":\"MMCIF\",\"experimental_method\":\"X-RAY DIFFRACTION\",\"model_page_url\":\"https://www.ebi.ac.uk/pdbe/entry/pdb/1t2v\"},{\"model_identifier\":\"4y18\",\"model_category\":\"EXPERIMENTALLY DETERMINED\",\"provider\":\"PDBe\",\"created\":\"2015-02-06\",\"sequence_identity\":100.0,\"uniprot_start\":1646,\"uniprot_end\":1859,\"resolution\":3.5,\"coverage\":11.49,\"model_url\":\"https://www.ebi.ac.uk/pdbe/static/entry/4y18_updated.cif\",\"model_format\":\"MMCIF\",\"experimental_method\":\"X-RAY DIFFRACTION\",\"model_page_url\":\"https://www.ebi.ac.uk/pdbe/entry/pdb/4y18\"},{\"model_identifier\":\"4jlu\",\"model_category\":\"EXPERIMENTALLY DETERMINED\",\"provider\":\"PDBe\",\"created\":\"2013-03-13\",\"sequence_identity\":100.0,\"uniprot_start\":1649,\"uniprot_end\":1859,\"resolution\":3.5,\"coverage\":11.33,\"model_url\":\"https://www.ebi.ac.uk/pdbe/static/entry/4jlu_updated.cif\",\"model_format\":\"MMCIF\",\"experimental_method\":\"X-RAY DIFFRACTION\",\"model_page_url\":\"https://www.ebi.ac.uk/pdbe/entry/pdb/4jlu\"},{\"model_identifier\":\"4u4a\",\"model_category\":\"EXPERIMENTALLY DETERMINED\",\"provider\":\"PDBe\",\"created\":\"2014-07-23\",\"sequence_identity\":100.0,\"uniprot_start\":1646,\"uniprot_end\":1859,\"resolution\":3.51,\"coverage\":11.49,\"model_url\":\"https://www.ebi.ac.uk/pdbe/static/entry/4u4a_updated.cif\",\"model_format\":\"MMCIF\",\"experimental_method\":\"X-RAY DIFFRACTION\",\"model_page_url\":\"https://www.ebi.ac.uk/pdbe/entry/pdb/4u4a\"},{\"model_identifier\":\"2ing\",\"model_category\":\"EXPERIMENTALLY DETERMINED\",\"provider\":\"PDBe\",\"created\":\"2006-10-07\",\"sequence_identity\":100.0,\"uniprot_start\":1649,\"uniprot_end\":1859,\"resolution\":3.6,\"coverage\":11.33,\"model_url\":\"https://www.ebi.ac.uk/pdbe/static/entry/2ing_updated.cif\",\"model_format\":\"MMCIF\",\"experimental_method\":\"X-RAY DIFFRACTION\",\"model_page_url\":\"https://www.ebi.ac.uk/pdbe/entry/pdb/2ing\"},{\"model_identifier\":\"7jzv\",\"model_category\":\"EXPERIMENTALLY DETERMINED\",\"provider\":\"PDBe\",\"created\":\"2020-09-02\",\"sequence_identity\":99.0,\"uniprot_start\":2,\"uniprot_end\":104,\"resolution\":3.9,\"coverage\":5.53,\"model_url\":\"https://www.ebi.ac.uk/pdbe/static/entry/7jzv_updated.cif\",\"model_format\":\"MMCIF\",\"experimental_method\":\"ELECTRON MICROSCOPY\",\"model_page_url\":\"https://www.ebi.ac.uk/pdbe/entry/pdb/7jzv\"},{\"model_identifier\":\"6g2i\",\"model_category\":\"EXPERIMENTALLY DETERMINED\",\"provider\":\"PDBe\",\"created\":\"2018-03-23\",\"sequence_identity\":100.0,\"uniprot_start\":1646,\"uniprot_end\":1859,\"resolution\":5.9,\"coverage\":11.49,\"model_url\":\"https://www.ebi.ac.uk/pdbe/static/entry/6g2i_updated.cif\",\"model_format\":\"MMCIF\",\"experimental_method\":\"ELECTRON MICROSCOPY\",\"model_page_url\":\"https://www.ebi.ac.uk/pdbe/entry/pdb/6g2i\"},{\"model_identifier\":\"1jm7\",\"model_category\":\"EXPERIMENTALLY DETERMINED\",\"provider\":\"PDBe\",\"created\":\"2001-07-17\",\"sequence_identity\":100.0,\"uniprot_start\":1,\"uniprot_end\":110,\"resolution\":null,\"coverage\":5.9,\"model_url\":\"https://www.ebi.ac.uk/pdbe/static/entry/1jm7_updated.cif\",\"model_format\":\"MMCIF\",\"experimental_method\":\"SOLUTION NMR\",\"model_page_url\":\"https://www.ebi.ac.uk/pdbe/entry/pdb/1jm7\"},{\"model_identifier\":\"1oqa\",\"model_category\":\"EXPERIMENTALLY DETERMINED\",\"provider\":\"PDBe\",\"created\":\"2003-03-07\",\"sequence_identity\":100.0,\"uniprot_start\":1755,\"uniprot_end\":1863,\"resolution\":null,\"coverage\":5.85,\"model_url\":\"https://www.ebi.ac.uk/pdbe/static/entry/1oqa_updated.cif\",\"model_format\":\"MMCIF\",\"experimental_method\":\"SOLUTION NMR\",\"model_page_url\":\"https://www.ebi.ac.uk/pdbe/entry/pdb/1oqa\"},{\"model_identifier\":\"614833627ca5054bb52d2f3f\",\"model_category\":\"TEMPLATE-BASED\",\"provider\":\"SWISS-MODEL\",\"created\":\"2021-09-20\",\"sequence_identity\":1.0,\"uniprot_start\":1646,\"uniprot_end\":1859,\"coverage\":0.115,\"confidence_version\":\"4.2.0\",\"confidence_avg_local_score\":0.776,\"model_url\":\"https://swissmodel.expasy.org/3d-beacons/uniprot/P38398.pdb?range=1646-1859&template=6g2i.1.K&provider=swissmodel\",\"model_format\":\"PDB\",\"model_page_url\":\"https://swissmodel.expasy.org/repository/uniprot/P38398?provider=swissmodelrange=1646-1859&template=6g2i.1.K\",\"confidence_type\":\"QMEANDisCo\"},{\"model_identifier\":\"614833627ca5054bb52d2f43\",\"model_category\":\"TEMPLATE-BASED\",\"provider\":\"SWISS-MODEL\",\"created\":\"2021-09-20\",\"sequence_identity\":1.0,\"uniprot_start\":1,\"uniprot_end\":103,\"coverage\":0.055,\"confidence_version\":\"4.2.0\",\"confidence_avg_local_score\":0.655,\"model_url\":\"https://swissmodel.expasy.org/3d-beacons/uniprot/P38398.pdb?range=1-103&template=1jm7.1.A&provider=swissmodel\",\"model_format\":\"PDB\",\"model_page_url\":\"https://swissmodel.expasy.org/repository/uniprot/P38398?provider=swissmodelrange=1-103&template=1jm7.1.A\",\"confidence_type\":\"QMEANDisCo\"},{\"model_identifier\":\"AF-P38398-F1\",\"model_category\":\"DEEP-LEARNING\",\"provider\":\"AlphaFold DB\",\"created\":\"2021-07-01\",\"sequence_identity\":1.0,\"uniprot_start\":1,\"uniprot_end\":1863,\"coverage\":100.0,\"model_url\":\"https://alphafold.ebi.ac.uk/files/AF-P38398-F1-model_v1.cif\",\"model_format\":\"MMCIF\",\"model_page_url\":\"https://alphafold.ebi.ac.uk/entry/P38398\"}]}" },
283       { "P01308.json",null}};
284
285   private static void setMockData()
286   {
287     try
288     {
289       mocks[1][1]= PDBFTSRestClientTest.readJsonStringFromFile("test/jalview/fts/threedbeacons/p01308_tdb_resp.txt");
290     } catch (IOException e)
291     {
292       Assert.fail("Couldn't read mock response data",e);
293     }
294   }
295   
296   public static void setMock()
297   {
298     setMockData();
299     FTSRestClient.createMockFTSRestClient(
300             (FTSRestClient) TDBeaconsFTSRestClient.getInstance(),
301             mocks);
302   }
303
304   private static String dev_url = "https://wwwdev.ebi.ac.uk/pdbe/pdbe-kb/3dbeacons/api/uniprot/summary/";
305   private static String prod_url = "https://www.ebi.ac.uk/pdbe/pdbe-kb/3dbeacons/api/uniprot/summary/";
306
307   /**
308    * check that the mock request and response are the same as the response from
309    * a live 3D-beacons endpoint
310    * 
311    * Note - servers often have rapidly changing ids / URIs so this might fail, but the overall structure will remain. 
312    * 
313    * @throws Exception
314    */
315   @Test(groups = { "Network", "Integration" })
316   public void verifyMockTDBRequest() throws Exception
317   {
318     setMockData();
319     for (String[] otherMock:mocks)
320     {
321     verifyMockTDBRequest(otherMock[0],otherMock[1]);
322     }
323   }
324   private void verifyMockTDBRequest(String mockRequest, String _mockResponse) throws Exception
325   {
326     URL tdb_req = new URL(prod_url + mockRequest);
327     byte[] resp = tdb_req.openStream().readAllBytes();
328     String tresp = new String(resp, StandardCharsets.UTF_8);
329     assertEquals(_mockResponse.trim(), tresp.trim());
330   }
331
332   @Test(groups = { "Functional" })
333   public void testMockTDBRequest()
334   {
335
336     setMock();
337     List<FTSDataColumnI> wantedFields = new ArrayList<FTSDataColumnI>();
338     try
339     {
340       wantedFields.add(TDBeaconsFTSRestClient.getInstance()
341               .getDataColumnByNameOrCode("Model Id"));
342       wantedFields.add(TDBeaconsFTSRestClient.getInstance()
343               .getDataColumnByNameOrCode("model_url"));
344       wantedFields.add(TDBeaconsFTSRestClient.getInstance()
345               .getDataColumnByNameOrCode("provider"));
346       wantedFields.add(TDBeaconsFTSRestClient.getInstance()
347               .getDataColumnByNameOrCode("model_category"));
348       wantedFields.add(TDBeaconsFTSRestClient.getInstance()
349               .getDataColumnByNameOrCode("qmean_avg_local_score"));
350       wantedFields.add(TDBeaconsFTSRestClient.getInstance()
351               .getDataColumnByNameOrCode("uniprot_start"));
352       wantedFields.add(TDBeaconsFTSRestClient.getInstance()
353               .getDataColumnByNameOrCode("uniprot_end"));
354     } catch (Exception e1)
355     {
356       e1.printStackTrace();
357     }
358     System.out.println("wantedFields >>" + wantedFields);
359
360     FTSRestRequest request = new FTSRestRequest();
361     FTSRestResponse response;
362
363     request.setResponseSize(100);
364     request.setFieldToSearchBy("");
365     request.setWantedFields(wantedFields);
366     // check 404 behaviour
367     request.setSearchTerm("P00000.json");
368
369     try
370     {
371       response = TDBeaconsFTSRestClient.getInstance()
372               .executeRequest(request);
373
374       assertNull(response);
375     } catch (Exception e)
376     {
377       e.printStackTrace();
378       Assert.fail("Unexpected failure during mock 3DBeacons 404 test");
379     }
380
381     // check 200 behaviour
382     request.setSearchTerm("P38398.json");
383     System.out.println("request : " + request.getFieldToSearchBy());
384     // System.out.println(request.toString());
385
386     try
387     {
388       response = TDBeaconsFTSRestClient.getInstance()
389               .executeRequest(request);
390     } catch (Exception e)
391     {
392       e.printStackTrace();
393       Assert.fail("Couldn't execute webservice call!");
394       return;
395     }
396     assertTrue(response.getSearchSummary() != null);
397     assertTrue(response.getNumberOfItemsFound() > 3); // 4 atm
398     System.out.println("Search summary : \n" + response.getSearchSummary());
399
400     // System.out.println(response.getSearchSummary().size());
401   }
402
403   @Test(groups = { "External", "Network" })
404   public void executeRequestTest()
405   {
406     List<FTSDataColumnI> wantedFields = new ArrayList<FTSDataColumnI>();
407     try
408     {
409       wantedFields.add(TDBeaconsFTSRestClient.getInstance()
410               .getDataColumnByNameOrCode("Model Id"));
411       wantedFields.add(TDBeaconsFTSRestClient.getInstance()
412               .getDataColumnByNameOrCode("model_url"));
413       wantedFields.add(TDBeaconsFTSRestClient.getInstance()
414               .getDataColumnByNameOrCode("provider"));
415       wantedFields.add(TDBeaconsFTSRestClient.getInstance()
416               .getDataColumnByNameOrCode("model_category"));
417       wantedFields.add(TDBeaconsFTSRestClient.getInstance()
418               .getDataColumnByNameOrCode("confidence_avg_local_score"));
419       wantedFields.add(TDBeaconsFTSRestClient.getInstance()
420               .getDataColumnByNameOrCode("uniprot_start"));
421       wantedFields.add(TDBeaconsFTSRestClient.getInstance()
422               .getDataColumnByNameOrCode("uniprot_end"));
423     } catch (Exception e1)
424     {
425       e1.printStackTrace();
426     }
427     System.out.println("wantedFields >>" + wantedFields);
428
429     FTSRestRequest request = new FTSRestRequest();
430     request.setResponseSize(100);
431     request.setFieldToSearchBy("");
432     request.setSearchTerm("P01318.json");
433     request.setWantedFields(wantedFields);
434     System.out.println("request : " + request.getFieldToSearchBy());
435     // System.out.println(request.toString());
436
437     FTSRestResponse response;
438     try
439     {
440       response = TDBeaconsFTSRestClient.getInstance()
441               .executeRequest(request);
442     } catch (Exception e)
443     {
444       e.printStackTrace();
445       Assert.fail("Couldn't execute webservice call!");
446       return;
447     }
448     assertTrue(response.getSearchSummary() != null);
449     assertTrue(response.getNumberOfItemsFound() > 3); // 4 atm
450     System.out.println("Search summary : \n" + response.getSearchSummary());
451     // System.out.println(response.getSearchSummary().size());
452   }
453 }