X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=test%2Fjalview%2Futil%2FUrlLinkTest.java;fp=test%2Fjalview%2Futil%2FUrlLinkTest.java;h=4092cf2ff7f2b2ad87022eaf9023e8f6aec332c5;hb=2595e9d4ee0dbbd3406a98c4e49a61ccde806479;hp=0000000000000000000000000000000000000000;hpb=e20075ba805d744d7cc4976e2b8d5e5840fb0a8d;p=jalview.git diff --git a/test/jalview/util/UrlLinkTest.java b/test/jalview/util/UrlLinkTest.java new file mode 100644 index 0000000..4092cf2 --- /dev/null +++ b/test/jalview/util/UrlLinkTest.java @@ -0,0 +1,442 @@ +/* + * 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.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()); + + } + +}