/* * 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.util; import static jalview.util.UrlConstants.DB_ACCESSION; import static jalview.util.UrlConstants.SEQUENCE_ID; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertFalse; import static org.testng.AssertJUnit.assertNull; import static org.testng.AssertJUnit.assertTrue; import jalview.datamodel.DBRefEntry; import jalview.datamodel.DBRefSource; import jalview.datamodel.Sequence; import jalview.gui.JvOptionPane; import java.util.ArrayList; import java.util.Comparator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; public class UrlLinkTest { @BeforeClass(alwaysRun = true) public void setUpJvOptionPane() { JvOptionPane.setInteractiveMode(false); JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION); } final static String DB = "Test"; final static String URL_PREFIX = "http://www.jalview.org/"; final static String URL_SUFFIX = "/blah"; final static String SEP = "|"; final static String DELIM = "$"; final static String REGEX_NESTED = "=/^(?:Label:)?(?:(?:gi\\|(\\d+))|([^:]+))/="; final static String REGEX_RUBBISH = "=/[0-9]++/="; /** * Test URL link creation when the input string has no regex */ @Test(groups = { "Functional" }) public void testUrlLinkCreationNoRegex() { // SEQUENCE_ID UrlLink ul = new UrlLink(DB + SEP + URL_PREFIX + DELIM + SEQUENCE_ID + DELIM + URL_SUFFIX); assertEquals(DB, ul.getTarget()); assertEquals(DB, ul.getLabel()); assertEquals(URL_PREFIX, ul.getUrlPrefix()); assertEquals(URL_SUFFIX, ul.getUrlSuffix()); assertTrue(ul.isDynamic()); assertFalse(ul.usesDBAccession()); assertNull(ul.getRegexReplace()); assertTrue(ul.isValid()); assertNull(ul.getInvalidMessage()); // DB_ACCESSION ul = new UrlLink(DB + SEP + URL_PREFIX + DELIM + DB_ACCESSION + DELIM + URL_SUFFIX); assertEquals(DB, ul.getTarget()); assertEquals(DB, ul.getLabel()); assertEquals(URL_PREFIX, ul.getUrlPrefix()); assertEquals(URL_SUFFIX, ul.getUrlSuffix()); assertTrue(ul.isDynamic()); assertTrue(ul.usesDBAccession()); assertNull(ul.getRegexReplace()); assertTrue(ul.isValid()); assertNull(ul.getInvalidMessage()); // Not dynamic ul = new UrlLink(DB + SEP + URL_PREFIX + URL_SUFFIX.substring(1)); assertEquals(DB, ul.getTarget()); assertEquals(DB, ul.getLabel()); assertEquals(URL_PREFIX + URL_SUFFIX.substring(1), ul.getUrlPrefix()); assertFalse(ul.isDynamic()); assertFalse(ul.usesDBAccession()); assertNull(ul.getRegexReplace()); assertTrue(ul.isValid()); assertNull(ul.getInvalidMessage()); } /** * Test URL link creation when the input string has regex */ @Test(groups = { "Functional" }) public void testUrlLinkCreationWithRegex() { // SEQUENCE_ID UrlLink ul = new UrlLink(DB + SEP + URL_PREFIX + DELIM + SEQUENCE_ID + REGEX_NESTED + DELIM + URL_SUFFIX); assertEquals(DB, ul.getTarget()); assertEquals(DB, ul.getLabel()); assertEquals(URL_PREFIX, ul.getUrlPrefix()); assertEquals(URL_SUFFIX, ul.getUrlSuffix()); assertTrue(ul.isDynamic()); assertFalse(ul.usesDBAccession()); assertEquals(REGEX_NESTED.substring(2, REGEX_NESTED.length() - 2), ul.getRegexReplace()); assertTrue(ul.isValid()); assertNull(ul.getInvalidMessage()); // DB_ACCESSION ul = new UrlLink(DB + SEP + URL_PREFIX + DELIM + DB_ACCESSION + REGEX_NESTED + DELIM + URL_SUFFIX); assertEquals(DB, ul.getTarget()); assertEquals(DB, ul.getLabel()); assertEquals(URL_PREFIX, ul.getUrlPrefix()); assertEquals(URL_SUFFIX, ul.getUrlSuffix()); assertTrue(ul.isDynamic()); assertTrue(ul.usesDBAccession()); assertEquals(REGEX_NESTED.substring(2, REGEX_NESTED.length() - 2), ul.getRegexReplace()); assertTrue(ul.isValid()); assertNull(ul.getInvalidMessage()); // invalid regex ul = new UrlLink(DB + SEP + URL_PREFIX + DELIM + DB_ACCESSION + REGEX_RUBBISH + DELIM + URL_SUFFIX); assertEquals(DB, ul.getTarget()); assertEquals(DB, ul.getLabel()); assertEquals(URL_PREFIX, ul.getUrlPrefix()); assertEquals(URL_SUFFIX, ul.getUrlSuffix()); assertTrue(ul.isDynamic()); assertTrue(ul.usesDBAccession()); assertEquals(REGEX_RUBBISH.substring(2, REGEX_RUBBISH.length() - 2), ul.getRegexReplace()); assertFalse(ul.isValid()); assertEquals( "Invalid Regular Expression : '" + REGEX_RUBBISH.substring(2, REGEX_RUBBISH.length() - 2) + "'\n", ul.getInvalidMessage()); } /** * Test construction of link by substituting sequence id or name */ @Test(groups = { "Functional" }) public void testMakeUrlNoRegex() { // Single non-regex UrlLink ul = new UrlLink(DB + SEP + URL_PREFIX + DELIM + SEQUENCE_ID + DELIM + URL_SUFFIX); String idstring = "FER_CAPAA"; String[] urls = ul.makeUrls(idstring, true); assertEquals(2, urls.length); assertEquals(idstring, urls[0]); assertEquals(URL_PREFIX + idstring + URL_SUFFIX, urls[1]); urls = ul.makeUrls(idstring, false); assertEquals(2, urls.length); assertEquals(idstring, urls[0]); assertEquals(URL_PREFIX + idstring + URL_SUFFIX, urls[1]); } /** * Test construction of link by substituting sequence id or name using regular * expression */ @Test(groups = { "Functional" }) public void testMakeUrlWithRegex() { // Unused regex UrlLink ul = new UrlLink(DB + SEP + URL_PREFIX + DELIM + DB_ACCESSION + REGEX_NESTED + DELIM + URL_SUFFIX); String idstring = "FER_CAPAA"; String[] urls = ul.makeUrls(idstring, true); assertEquals(2, urls.length); assertEquals(idstring, urls[0]); assertEquals(URL_PREFIX + idstring + URL_SUFFIX, urls[1]); assertTrue(ul.isValid()); assertNull(ul.getInvalidMessage()); urls = ul.makeUrls(idstring, false); assertEquals(2, urls.length); assertEquals(idstring, urls[0]); assertEquals(URL_PREFIX + idstring + URL_SUFFIX, urls[1]); assertTrue(ul.isValid()); assertNull(ul.getInvalidMessage()); // nested regex idstring = "Label:gi|9234|pdb|102L|A"; urls = ul.makeUrls(idstring, true); assertEquals(2, urls.length); assertEquals("9234", urls[0]); assertEquals(URL_PREFIX + "9234" + URL_SUFFIX, urls[1]); assertTrue(ul.isValid()); assertNull(ul.getInvalidMessage()); urls = ul.makeUrls(idstring, false); assertEquals(2, urls.length); assertEquals("9234", urls[0]); assertEquals(URL_PREFIX + "9234" + URL_SUFFIX, urls[1]); assertTrue(ul.isValid()); assertNull(ul.getInvalidMessage()); // unmatched regex idstring = "this does not match"; urls = ul.makeUrls(idstring, true); assertEquals(2, urls.length); assertEquals(idstring, urls[0]); assertEquals(URL_PREFIX + idstring + URL_SUFFIX, urls[1]); assertTrue(ul.isValid()); assertNull(ul.getInvalidMessage()); urls = ul.makeUrls(idstring, false); assertEquals(2, urls.length); assertEquals(idstring, urls[0]); assertEquals(URL_PREFIX + idstring + URL_SUFFIX, urls[1]); assertTrue(ul.isValid()); assertNull(ul.getInvalidMessage()); // empty idstring idstring = ""; urls = ul.makeUrls(idstring, true); assertNull(urls); urls = ul.makeUrls(idstring, false); assertEquals(2, urls.length); assertEquals("", urls[0]); assertEquals(URL_PREFIX + URL_SUFFIX, urls[1]); assertTrue(ul.isValid()); assertNull(ul.getInvalidMessage()); } /** * Test creating links with null sequence */ @Test(groups = { "Functional" }) public void testCreateLinksFromNullSequence() { UrlLink ul = new UrlLink(DB + SEP + URL_PREFIX + DELIM + SEQUENCE_ID + DELIM + URL_SUFFIX); Map> linkset = new LinkedHashMap<>(); ul.createLinksFromSeq(null, linkset); String key = DB + SEP + URL_PREFIX; assertEquals(1, linkset.size()); assertTrue(linkset.containsKey(key)); assertEquals(DB, linkset.get(key).get(0)); assertEquals(DB, linkset.get(key).get(1)); assertEquals(null, linkset.get(key).get(2)); assertEquals(URL_PREFIX, linkset.get(key).get(3)); } /** * Test creating links with non-dynamic urlLink */ @Test(groups = { "Functional" }) public void testCreateLinksForNonDynamic() { UrlLink ul = new UrlLink(DB + SEP + URL_PREFIX + URL_SUFFIX); Map> linkset = new LinkedHashMap<>(); ul.createLinksFromSeq(null, linkset); String key = DB + SEP + URL_PREFIX + URL_SUFFIX; assertEquals(1, linkset.size()); assertTrue(linkset.containsKey(key)); assertEquals(DB, linkset.get(key).get(0)); assertEquals(DB, linkset.get(key).get(1)); assertEquals(null, linkset.get(key).get(2)); assertEquals(URL_PREFIX + URL_SUFFIX, linkset.get(key).get(3)); } /** * Test creating links */ @Test(groups = { "Functional" }) public void testCreateLinksFromSequence() { // create list of links and list of DBRefs List links = new ArrayList<>(); List refs = new ArrayList<>(); // links as might be added into Preferences | Connections dialog links.add("EMBL-EBI Search | http://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$" + SEQUENCE_ID + "$"); links.add("UNIPROT | http://www.uniprot.org/uniprot/$" + DB_ACCESSION + "$"); links.add("INTERPRO | http://www.ebi.ac.uk/interpro/entry/$" + DB_ACCESSION + "$"); // make seq0 dbrefs refs.add(new DBRefEntry(DBRefSource.UNIPROT, "1", "P83527")); refs.add(new DBRefEntry("INTERPRO", "1", "IPR001041")); refs.add(new DBRefEntry("INTERPRO", "1", "IPR006058")); refs.add(new DBRefEntry("INTERPRO", "1", "IPR012675")); Sequence seq0 = new Sequence("FER1", "AKPNGVL"); // add all the dbrefs to the sequence seq0.addDBRef(refs.get(0)); seq0.addDBRef(refs.get(1)); seq0.addDBRef(refs.get(2)); seq0.addDBRef(refs.get(3)); seq0.createDatasetSequence(); // Test where link takes a sequence id as replacement UrlLink ul = new UrlLink(DB + SEP + URL_PREFIX + DELIM + SEQUENCE_ID + DELIM + URL_SUFFIX); Map> linkset = new LinkedHashMap<>(); ul.createLinksFromSeq(seq0, linkset); String key = seq0.getName() + SEP + URL_PREFIX + seq0.getName() + URL_SUFFIX; assertEquals(1, linkset.size()); assertTrue(linkset.containsKey(key)); assertEquals(DB, linkset.get(key).get(0)); assertEquals(DB, linkset.get(key).get(1)); assertEquals(seq0.getName(), linkset.get(key).get(2)); assertEquals(URL_PREFIX + seq0.getName() + URL_SUFFIX, linkset.get(key) .get(3)); // Test where link takes a db annotation id and only has one dbref ul = new UrlLink(links.get(1)); linkset = new LinkedHashMap<>(); ul.createLinksFromSeq(seq0, linkset); key = "P83527|http://www.uniprot.org/uniprot/P83527"; assertEquals(linkset.size(), 1); assertTrue(linkset.containsKey(key)); assertEquals(DBRefSource.UNIPROT, linkset.get(key).get(0)); assertEquals(DBRefSource.UNIPROT + SEP + "P83527", linkset.get(key) .get(1)); assertEquals("P83527", linkset.get(key).get(2)); assertEquals("http://www.uniprot.org/uniprot/P83527", linkset.get(key) .get(3)); // Test where link takes a db annotation id and has multiple dbrefs ul = new UrlLink(links.get(2)); linkset = new LinkedHashMap<>(); ul.createLinksFromSeq(seq0, linkset); assertEquals(3, linkset.size()); // check each link made it in correctly key = "IPR001041|http://www.ebi.ac.uk/interpro/entry/IPR001041"; assertTrue(linkset.containsKey(key)); assertEquals("INTERPRO", linkset.get(key).get(0)); assertEquals("INTERPRO" + SEP + "IPR001041", linkset.get(key).get(1)); assertEquals("IPR001041", linkset.get(key).get(2)); assertEquals("http://www.ebi.ac.uk/interpro/entry/IPR001041", linkset .get(key).get(3)); key = "IPR006058|http://www.ebi.ac.uk/interpro/entry/IPR006058"; assertTrue(linkset.containsKey(key)); assertEquals("INTERPRO", linkset.get(key).get(0)); assertEquals("INTERPRO" + SEP + "IPR006058", linkset.get(key).get(1)); assertEquals("IPR006058", linkset.get(key).get(2)); assertEquals("http://www.ebi.ac.uk/interpro/entry/IPR006058", linkset .get(key).get(3)); key = "IPR012675|http://www.ebi.ac.uk/interpro/entry/IPR012675"; assertTrue(linkset.containsKey(key)); assertEquals("INTERPRO", linkset.get(key).get(0)); assertEquals("INTERPRO" + SEP + "IPR012675", linkset.get(key).get(1)); assertEquals("IPR012675", linkset.get(key).get(2)); assertEquals("http://www.ebi.ac.uk/interpro/entry/IPR012675", linkset .get(key).get(3)); // Test where there are no matching dbrefs for the link ul = new UrlLink(DB + SEP + URL_PREFIX + DELIM + DB_ACCESSION + DELIM + URL_SUFFIX); linkset = new LinkedHashMap<>(); ul.createLinksFromSeq(seq0, linkset); assertTrue(linkset.isEmpty()); } /** * Test links where label and target are both included */ @Test(groups = { "Functional" }) public void testLinksWithTargets() { UrlLink ul = new UrlLink( "Protein Data Bank | http://www.identifiers.org/pdb/$" + DB_ACCESSION + "$" + " | pdb"); assertEquals("Protein Data Bank", ul.getLabel()); assertEquals("pdb", ul.getTarget()); assertEquals("http://www.identifiers.org/pdb/$" + DB_ACCESSION + "$", ul.getUrlWithToken()); assertEquals("Protein Data Bank|http://www.identifiers.org/pdb/$" + DB_ACCESSION + "$" + "|pdb", ul.toStringWithTarget()); ul = new UrlLink("Protein Data Bank", "http://www.identifiers.org/pdb/$" + DB_ACCESSION + "$", "pdb"); assertEquals("Protein Data Bank", ul.getLabel()); assertEquals("pdb", ul.getTarget()); assertEquals("http://www.identifiers.org/pdb/$" + DB_ACCESSION + "$", ul.getUrlWithToken()); assertEquals("Protein Data Bank|http://www.identifiers.org/pdb/$" + DB_ACCESSION + "$" + "|pdb", ul.toStringWithTarget()); } @Test(groups = { "Functional" }) public void testLinkComparator() { Comparator c = UrlLink.LINK_COMPARATOR; assertEquals(0, c.compare(null, null)); assertEquals(0, c.compare(null, "x")); assertEquals(0, c.compare("y", null)); /* * SEQUENCE_ID templates should come before DB_ACCESSION templates */ String dbRefUrl = "Cath|http://www.cathdb.info/version/v4_2_0/superfamily/$DB_ACCESSION$"; String seqIdUrl = "EBI|https://www.ebi.ac.uk/ebisearch/search.ebi?db=allebi&query=$SEQUENCE_ID$"; assertTrue(c.compare(seqIdUrl, dbRefUrl) < 0); assertTrue(c.compare(dbRefUrl, seqIdUrl) > 0); String interpro = "Interpro|https://www.ebi.ac.uk/interpro/entry/$DB_ACCESSION$"; String prosite = "ProSite|https://prosite.expasy.org/PS00197"; assertTrue(c.compare(interpro, prosite) < 0); assertTrue(c.compare(prosite, interpro) > 0); } }