/**
* This file Copyright (c) 2003-2012 Magnolia International
* Ltd. (http://www.magnolia-cms.com). All rights reserved.
*
*
* This file is dual-licensed under both the Magnolia
* Network Agreement and the GNU General Public License.
* You may elect to use one or the other of these licenses.
*
* This file is distributed in the hope that it will be
* useful, but AS-IS and WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE, TITLE, or NONINFRINGEMENT.
* Redistribution, except as permitted by whichever of the GPL
* or MNA you select, is prohibited.
*
* 1. For the GPL license (GPL), you can redistribute and/or
* modify this file under the terms of the GNU General
* Public License, Version 3, as published by the Free Software
* Foundation. You should have received a copy of the GNU
* General Public License, Version 3 along with this program;
* if not, write to the Free Software Foundation, Inc., 51
* Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* 2. For the Magnolia Network Agreement (MNA), this file
* and the accompanying materials are made available under the
* terms of the MNA which accompanies this distribution, and
* is available at http://www.magnolia-cms.com/mna.html
*
* Any modifications to this file must keep this entire header
* intact.
*
*/
package info.magnolia.link;
import static org.junit.Assert.*;
import info.magnolia.cms.beans.config.ServerConfiguration;
import info.magnolia.objectfactory.Components;
import info.magnolia.repository.RepositoryConstants;
import info.magnolia.test.mock.jcr.MockNode;
import info.magnolia.test.mock.jcr.MockSession;
import org.apache.commons.lang.StringUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* Tests.
*/
public class LinkUtilTest extends BaseLinkTest {
private static final String HTML_WITH_ABSOLUTE_LINK = "this is a <a href=\"" + HREF_ABSOLUTE_LINK + "\">test</a>";
private static final String HTML_WITH_UUIDS = "this is a <a href=\"" + UUID_PATTERN_SIMPLE + "\">test</a>";
private static final String HTML_WITH_ABSOLUTE_LINK_AND_CONTEXT_PATH = "this is a <a href=\"" + SOME_CONTEXT + HREF_ABSOLUTE_LINK + "\">test</a>";
@Override
@Before
public void setUp() throws Exception {
super.setUp();
}
@Override
@After
public void tearDown() throws Exception {
super.tearDown();
}
@Test
public void testParsingLinks() {
String res = LinkUtil.convertAbsoluteLinksToUUIDs(HTML_WITH_ABSOLUTE_LINK);
assertEquals(HTML_WITH_UUIDS, res);
}
@Test
public void testParsingLinksWithBackslashInQueryParam() {
String res = LinkUtil.convertAbsoluteLinksToUUIDs("look <a href=\"/parent/sub.html?p4if_p=\\File%20Box\\Quick%20Reference%20Guides\\Strategy%20Management\\WIT\">here</a> for results");
assertEquals("look <a href=\"${link:{uuid:{2},repository:{website},path:{/parent/sub},nodeData:{},extension:{html}}}?p4if_p=\\File%20Box\\Quick%20Reference%20Guides\\Strategy%20Management\\WIT\">here</a> for results", res);
}
@Test
public void testParsingLinksShouldNotTouchNonContentAbsoluteLinks() throws Exception{
doTestParsingLinksShouldNotParse("/somthing/else.html");
}
@Test
public void testParsingLinksDoesNotTryToConvertExternalLinks() {
doTestParsingLinksShouldNotParse("http://www.magnolia-cms.com");
doTestParsingLinksShouldNotParse("http://foo.bar.org/File%20Box/Quick%20Reference%20Guides/EMR/upgrade_brief_2007.pdf");
doTestParsingLinksShouldNotParse("http://foo.bar.org/File Box/Quick Reference Guides/EMR/upgrade_brief_2007.pdf");
}
@Test
public void testParsingLinksDoesNotTryToConvertPageAnchors() {
doTestParsingLinksShouldNotParse("#");
doTestParsingLinksShouldNotParse("#foo");
}
@Test
public void testParsingLinksShouldPreserverParameters() {
doTestParsingLinks("http://www.magnolia-cms.com/foo?bar=baz", "http://www.magnolia-cms.com/foo?bar=baz");
doTestParsingLinks(UUID_PATTERN_SIMPLE + "?bar=baz", HREF_ABSOLUTE_LINK + "?bar=baz");
}
@Test
public void testParsingLinksShouldPreserveAnchors() {
doTestParsingLinks(UUID_PATTERN_SIMPLE + "#bar", HREF_ABSOLUTE_LINK + "#bar");
doTestParsingLinks("http://www.magnolia-cms.com/foo#bar", "http://www.magnolia-cms.com/foo#bar");
}
private void doTestParsingLinksShouldNotParse(String href) {
doTestParsingLinks(href, href);
}
private void doTestParsingLinks(String expectedHref, String originalHref) {
final String originalHtml = "this is a <a href=\"" + originalHref + "\">test</a>, yo.";
final String expectedHtml = "this is a <a href=\"" + expectedHref + "\">test</a>, yo.";
final String res = LinkUtil.convertAbsoluteLinksToUUIDs(originalHtml);
assertEquals(expectedHtml, res);
}
@Test
public void testUUIDToAbsoluteLinks() throws LinkException {
String res = LinkUtil.convertLinksFromUUIDPattern(HTML_WITH_UUIDS, LinkTransformerManager.getInstance().getAbsolute(false));
assertEquals(HTML_WITH_ABSOLUTE_LINK, res);
}
@Test
public void testUUIDToInternalLinks() throws LinkException {
String res = LinkUtil.convertLinksFromUUIDPattern(HTML_WITH_UUIDS, LinkTransformerManager.getInstance().getEditorLink());
assertEquals(HTML_WITH_ABSOLUTE_LINK_AND_CONTEXT_PATH, res);
}
@Test
public void testUUIDToRootLinks() throws LinkException {
String res = LinkUtil.convertLinksFromUUIDPattern("<p>Large article pages have a <a href=\"${link:{uuid:{2a98b29f-b514-4949-9cb3-e1162171a2ca},repository:{website},handle:{/features/special-templates},nodeData:{},extension:{html}}}\">Table Of Contents</a> (<a href=\"${link:{uuid:{},repository:{website},handle:{/},nodeData:{},extension:{html}}}\">TOC</a>) navigation.</p>", LinkTransformerManager.getInstance().getEditorLink());
assertEquals("<p>Large article pages have a <a href=\"/some-context/features/special-templates.html\">Table Of Contents</a> (<a href=\"/some-context/\">TOC</a>) navigation.</p>", res);
}
@Test
public void testUUIDToRelativeLinks() throws LinkException {
String res = LinkUtil.convertLinksFromUUIDPattern(HTML_WITH_UUIDS, LinkTransformerManager.getInstance().getRelative("/parent/sub2"));
assertEquals(StringUtils.replace(HTML_WITH_ABSOLUTE_LINK, "/parent/sub.html", "sub.html"), res);
}
@Test
public void testUUIDToAbsoluteLinkWithDollar() throws LinkException {
String htmlAbsoluteWithDollar = "this is a <a href=\"" + HREF_ABSOLUTE_LINK + "?var=${some_var}\">test</a>";
String htmlUuidWithDollar = "this is a <a href=\"" + UUID_PATTERN_SIMPLE + "?var=${some_var}\">test</a>";
String res = LinkUtil.convertLinksFromUUIDPattern(htmlUuidWithDollar, LinkTransformerManager.getInstance().getAbsolute(false));
assertEquals(htmlAbsoluteWithDollar, res);
}
@Test
public void testMakeUUIDFromAbsolutePath() throws LinkException{
String uuid = LinkUtil.parseLink("/parent/sub").getUUID();
assertEquals("2", uuid);
}
@Test
public void testMakingRelativeLinks() {
assertEquals("d.html", LinkUtil.makePathRelative("/a/b/c.html", "/a/b/d.html"));
assertEquals("c/e.html", LinkUtil.makePathRelative("/a/b/c.html", "/a/b/c/e.html"));
assertEquals("../x/y.html", LinkUtil.makePathRelative("/a/b/c.html", "/a/x/y.html"));
assertEquals("../../z/x/y.html", LinkUtil.makePathRelative("/a/b/c.html", "/z/x/y.html"));
assertEquals("../../../b.html", LinkUtil.makePathRelative("/a/b/c/d/e.html", "/a/b.html"));
assertEquals("a/b.html", LinkUtil.makePathRelative("/a.html", "/a/b.html"));
assertEquals(".", LinkUtil.makePathRelative("/a.html", "/"));
assertEquals(".", LinkUtil.makePathRelative("/b/a.html", "/b/"));
assertEquals("../", LinkUtil.makePathRelative("/c/b/a.html", "/c/"));
}
@Test
public void testInternalRelativeLinksAreProperlyDetermined() {
assertTrue(LinkUtil.isInternalRelativeLink("foo"));
assertTrue(LinkUtil.isInternalRelativeLink("foo/bar"));
assertTrue(LinkUtil.isInternalRelativeLink("foo/bar.gif"));
assertFalse(LinkUtil.isInternalRelativeLink("/foo"));
assertFalse(LinkUtil.isInternalRelativeLink("/foo/bar"));
assertFalse(LinkUtil.isInternalRelativeLink("/foo/bar.gif"));
assertFalse(LinkUtil.isInternalRelativeLink("http://foo.com/bar.gif"));
assertFalse(LinkUtil.isInternalRelativeLink("http://foo.com/bar/baz.gif"));
assertFalse(LinkUtil.isInternalRelativeLink("http://foo.com/bar/"));
assertFalse(LinkUtil.isInternalRelativeLink("http://foo.com/bar"));
assertFalse(LinkUtil.isInternalRelativeLink("http://foo.com/"));
assertFalse(LinkUtil.isInternalRelativeLink("http://foo.com"));
assertFalse(LinkUtil.isInternalRelativeLink("https://foo.com"));
assertFalse(LinkUtil.isInternalRelativeLink("https://foo.com/bar"));
assertFalse(LinkUtil.isInternalRelativeLink("ftp://user:pass@server.com/foo/bar"));
assertFalse(LinkUtil.isInternalRelativeLink("mailto:murdock@a-team.org"));
assertFalse(LinkUtil.isInternalRelativeLink("tel:12345"));
assertFalse(LinkUtil.isInternalRelativeLink("tel:+41 0800 80 80"));
assertFalse(LinkUtil.isInternalRelativeLink("#anchor"));
assertFalse(LinkUtil.isInternalRelativeLink("#another-anchor"));
assertFalse(LinkUtil.isInternalRelativeLink("javascript:void(window.open('http://www.google.com','','resizable=no,location=no,menubar=no,scrollbars=no,status=no,toolbar=no,fullscreen=no,dependent=no,width=200,height=200'))"));
assertFalse(LinkUtil.isInternalRelativeLink("javascript:void(window.open('/foo/bar','','resizable=no,location=no,menubar=no,scrollbars=no,status=no,toolbar=no,fullscreen=no,dependent=no,width=200,height=200'))"));
}
@Test
public void testExternalLinksAreProperlyDetermined() {
assertFalse(LinkUtil.isExternalLinkOrAnchor("foo"));
assertFalse(LinkUtil.isExternalLinkOrAnchor("foo/bar"));
assertFalse(LinkUtil.isExternalLinkOrAnchor("foo/bar.gif"));
assertFalse(LinkUtil.isExternalLinkOrAnchor("/foo"));
assertFalse(LinkUtil.isExternalLinkOrAnchor("/foo/bar"));
assertFalse(LinkUtil.isExternalLinkOrAnchor("/foo/bar.gif"));
assertTrue(LinkUtil.isExternalLinkOrAnchor("http://foo.com/bar.gif"));
assertTrue(LinkUtil.isExternalLinkOrAnchor("http://foo.com/bar/baz.gif"));
assertTrue(LinkUtil.isExternalLinkOrAnchor("http://foo.com/bar/"));
assertTrue(LinkUtil.isExternalLinkOrAnchor("http://foo.com/bar"));
assertTrue(LinkUtil.isExternalLinkOrAnchor("http://foo.com/"));
assertTrue(LinkUtil.isExternalLinkOrAnchor("http://foo.com"));
assertTrue(LinkUtil.isExternalLinkOrAnchor("https://foo.com"));
assertTrue(LinkUtil.isExternalLinkOrAnchor("https://foo.com/bar"));
assertTrue(LinkUtil.isExternalLinkOrAnchor("ftp://user:pass@server.com/foo/bar"));
assertTrue(LinkUtil.isExternalLinkOrAnchor("mailto:murdock@a-team.org"));
assertTrue(LinkUtil.isExternalLinkOrAnchor("tel:12345"));
assertTrue(LinkUtil.isExternalLinkOrAnchor("tel:+41 0800 80 80"));
assertTrue(LinkUtil.isExternalLinkOrAnchor("#anchor"));
assertTrue(LinkUtil.isExternalLinkOrAnchor("#another-anchor"));
assertTrue(LinkUtil.isExternalLinkOrAnchor("javascript:void(window.open('http://www.google.com','','resizable=no,location=no,menubar=no,scrollbars=no,status=no,toolbar=no,fullscreen=no,dependent=no,width=200,height=200'))"));
assertTrue(LinkUtil.isExternalLinkOrAnchor("javascript:void(window.open('/foo/bar','','resizable=no,location=no,menubar=no,scrollbars=no,status=no,toolbar=no,fullscreen=no,dependent=no,width=200,height=200'))"));
}
@Test
public void testMakeAbsolutePathFromUUID() throws LinkException {
String absolutePath = LinkUtil.createLinkInstance(RepositoryConstants.WEBSITE, "2").getPath();
assertEquals("/parent/sub", absolutePath);
}
@Test
public void testMakeCompleteURL() throws Exception {
ServerConfiguration serverConfiguration = Components.getComponent(ServerConfiguration.class);
String base = serverConfiguration.getDefaultBaseUrl();
serverConfiguration.setDefaultBaseUrl("http://some.site/yay/");
String url = null;
try {
MockSession session = new MockSession("website");
MockNode c = (MockNode) session.getRootNode();
url = LinkTransformerManager.getInstance().getCompleteUrl().transform(LinkUtil.createLinkInstance(c));
} finally {
// restore
serverConfiguration.setDefaultBaseUrl(base);
}
assertNotNull(url);
assertEquals(-1, StringUtils.substringAfter(url, "http://").indexOf("//"));
}
@Test
public void testCreateUndefinedLinkIfUUIDIsNonExistentOrFallbackHandleIsEmpty() {
try {
String link = LinkUtil.convertLinksFromUUIDPattern("<p>Large article pages have a <a href=\"${link:{uuid:{00060890-0220-4544-b6a4-320325dcfd86},repository:{website},handle:{},nodeData:{},extension:{html}}}\">Table Of Contents</a></p>", LinkTransformerManager.getInstance().getEditorLink());
assertEquals("<p>Large article pages have a <a href=\"/some-context/\">Table Of Contents</a></p>", link);
} catch (LinkException e) {
fail("Got unexpected exception "+ e.getMessage());
}
}
}