JAL-3453 test changes needed to allow tests to proceed unheeded by
[jalview.git] / test / jalview / ws / dbsources / RemoteFormatTest.java
1 package jalview.ws.dbsources;
2
3 import static org.testng.Assert.assertEquals;
4 import static org.testng.Assert.assertFalse;
5 import static org.testng.Assert.assertNotNull;
6 import static org.testng.Assert.assertTrue;
7
8 import jalview.analysis.AlignSeq;
9 import jalview.bin.Cache;
10 import jalview.datamodel.AlignmentI;
11 import jalview.datamodel.DBRefSource;
12 import jalview.datamodel.SequenceI;
13 import jalview.ext.ensembl.EnsemblGenomes;
14 import jalview.fts.api.FTSData;
15 import jalview.fts.api.FTSDataColumnI;
16 import jalview.fts.api.FTSRestClientI;
17 import jalview.fts.core.FTSRestRequest;
18 import jalview.fts.core.FTSRestResponse;
19 import jalview.fts.service.uniprot.UniProtFTSRestClient;
20 import jalview.gui.Desktop;
21 import jalview.ws.SequenceFetcher;
22 import jalview.ws.seqfetcher.DbSourceProxy;
23
24 import java.util.ArrayList;
25 import java.util.List;
26
27 import org.testng.annotations.BeforeTest;
28 import org.testng.annotations.DataProvider;
29 import org.testng.annotations.Test;
30
31 /**
32  * A class to verify that remotely fetched data has an expected format and can
33  * be successfully processed by Jalview. This is intended as a first line of
34  * defence and early warning of service affecting changes to data fetched
35  * externally.
36  * <p>
37  * This is class is not intended to cover remote services e.g. alignment. Nor
38  * should it duplicate tests already provided by other classes (such as
39  * PDBFTSRestClientTest). Or maybe we will relocate those tests here...
40  */
41 public class RemoteFormatTest
42 {
43   SequenceFetcher sf;
44
45   @BeforeTest(alwaysRun = true)
46   public void setUp() throws Exception
47   {
48     Desktop.getInstanceOnly();
49     Cache.loadProperties("test/jalview/io/testProps.jvprops");
50     // ensure 'add annotation from structure' is selected
51     Cache.setPropertyNoSave("STRUCT_FROM_PDB",
52             Boolean.TRUE.toString());
53     Cache.setPropertyNoSave("ADD_SS_ANN",
54             Boolean.TRUE.toString());
55
56     sf = SequenceFetcher.getInstance();
57   }
58
59   @DataProvider(name = "AccessionData")
60   protected Object[][] getAccessions()
61   {
62     return new Object[][] { { DBRefSource.UNIPROT, "P30419" },
63         { DBRefSource.PDB, "1QIP" }, { DBRefSource.EMBL, "X53828" },
64         { DBRefSource.EMBLCDS, "CAA37824" },
65         { DBRefSource.ENSEMBL, "ENSG00000157764" },
66         { new EnsemblGenomes().getDbSource(), "DDB_G0283883" },
67         { new PfamFull().getDbSource(), "PF03760" },
68         { new PfamSeed().getDbSource(), "PF03760" },
69         { new RfamSeed().getDbSource(), "RF00014" } };
70   }
71
72   @Test(groups = "Network", dataProvider = "AccessionData")
73   public void testFetchAccession(String dbSource, String accessionId)
74           throws Exception
75   {
76     System.out.println("Fetching " + accessionId + " from " + dbSource);
77     System.err.println(
78             "BH 2019.10.06 note see JAL-2114 JUL 2016 for why this test fails.");
79
80     List<DbSourceProxy> sps = sf.getSourceProxy(dbSource);
81     assertFalse(sps.isEmpty());
82     AlignmentI al = sps.get(0).getSequenceRecords(accessionId);
83     assertNotNull(al);
84     assertTrue(al.getHeight() > 0);
85     SequenceI sq = al.getSequenceAt(0);
86     // suppress this check as only Uniprot and PDB acquire PDB refs
87     // assertTrue(sq.getAllPDBEntries().size() > 0, "No PDBEntry on sequence.");
88     assertTrue(sq.getDBRefs().size() > 0, "No DBRef on sequence.");
89     // suppress this test as only certain databases provide 'primary' dbrefs
90     // assertFalse(sq.getPrimaryDBRefs().isEmpty());
91     int length = AlignSeq.extractGaps("-. ", sq.getSequenceAsString())
92             .length();
93     assertEquals(sq.getEnd() - sq.getStart() + 1, length,
94             "Sequence start/end doesn't match number of residues in sequence");
95   }
96
97   @Test(groups = { "Network" })
98   public void testUniprotFreeTextSearch() throws Exception
99   {
100     List<FTSDataColumnI> wantedFields = new ArrayList<>();
101     FTSRestClientI client = UniProtFTSRestClient.getInstance();
102     wantedFields.add(client.getDataColumnByNameOrCode("id"));
103     wantedFields.add(client.getDataColumnByNameOrCode("entry name"));
104     wantedFields.add(client.getDataColumnByNameOrCode("organism"));
105     wantedFields.add(client.getDataColumnByNameOrCode("reviewed")); // Status
106     wantedFields.add(client.getDataColumnByNameOrCode("length"));
107   
108     FTSRestRequest request = new FTSRestRequest();
109     request.setAllowEmptySeq(false);
110     request.setResponseSize(100);
111     request.setFieldToSearchBy("Search All");
112     request.setSearchTerm("metanephrops"); // lobster!
113     request.setWantedFields(wantedFields);
114   
115     FTSRestResponse response;
116     response = client.executeRequest(request);
117     assertTrue(response.getNumberOfItemsFound() > 20);
118     assertTrue(response.getSearchSummary() != null);
119     assertTrue(response.getSearchSummary().size() > 20);
120     // verify we successfully filtered out the header row (JAL-2485)
121     FTSData header = response.getSearchSummary().iterator().next();
122     assertFalse(
123             header.getSummaryData()[0].toString().equalsIgnoreCase("Entry"),
124             "Failed to filter out summary header row");
125   }
126 }