/*
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.xwiki.gwt.wysiwyg.client.plugin.link;
import org.xwiki.gwt.dom.client.DOMUtils;
import org.xwiki.gwt.dom.client.Document;
import org.xwiki.gwt.dom.client.DocumentFragment;
import org.xwiki.gwt.dom.client.Element;
import org.xwiki.gwt.wysiwyg.client.WysiwygTestCase;
import com.google.gwt.dom.client.Node;
/**
* Class to test the {@link LinkMetaDataExtractor} class, to check whether all links are correctly parsed and extracted
* in meta data fragments.
*
* @version $Id: 8372e15c045051410f6bdb46939d724e082075b7 $
*/
public class LinkMetaDataExtractorTest extends WysiwygTestCase
{
/**
* The name of the anchor tag.
*/
private static final String ANCHOR_TAG_NAME = "a";
/**
* The name of the span tag.
*/
private static final String SPAN_TAG_NAME = "span";
/**
* The content of the end wiki link marker comment.
*/
private static final String STOPWIKILINK_COMMENT = "stopwikilink";
/**
* The DOM element in which we run the tests.
*/
private Element container;
/**
* The {@link LinkMetaDataExtractor} to test.
*/
private LinkMetaDataExtractor extractor;
@Override
protected void gwtSetUp() throws Exception
{
super.gwtSetUp();
container = Document.get().createDivElement().cast();
Document.get().getBody().appendChild(container);
extractor = new LinkMetaDataExtractor();
}
@Override
protected void gwtTearDown() throws Exception
{
super.gwtTearDown();
container.getParentNode().removeChild(container);
}
/**
* Tests whether the {@link LinkMetaDataExtractor} detects and parses a link to an internal existing page.
*/
public void testWikiLink()
{
String linkInnerHTML =
"<!--startwikilink:Space.ExistingPage--><span class=\"wikilink\">"
+ "<a href=\"/xwiki/bin/view/Space/ExistingPage\">label</a></span><!--stopwikilink-->";
container.xSetInnerHTML(linkInnerHTML);
extractor.onInnerHTMLChange(container);
Element anchorElement = (Element) container.getFirstChild();
// test the elements left in the container
assertEquals(1, container.getChildNodes().getLength());
assertEquals(ANCHOR_TAG_NAME, container.getChildNodes().getItem(0).getNodeName().toLowerCase());
// Get Meta data fragment
DocumentFragment metaFragment = anchorElement.getMetaData();
assertNotNull(metaFragment);
assertEquals(3, metaFragment.getChildNodes().getLength());
// Check the three nodes in the meta fragment and the content
assertEquals(DOMUtils.COMMENT_NODE, metaFragment.getChildNodes().getItem(0).getNodeType());
assertEquals("startwikilink:Space.ExistingPage", metaFragment.getChildNodes().getItem(0).getNodeValue());
assertEquals(Node.ELEMENT_NODE, metaFragment.getChildNodes().getItem(1).getNodeType());
assertEquals(SPAN_TAG_NAME, metaFragment.getChildNodes().getItem(1).getNodeName().toLowerCase());
assertEquals(1, metaFragment.getChildNodes().getItem(1).getChildNodes().getLength());
assertEquals(Node.TEXT_NODE, metaFragment.getChildNodes().getItem(1).getChildNodes().getItem(0).getNodeType());
assertEquals(Element.INNER_HTML_PLACEHOLDER, metaFragment.getChildNodes().getItem(1).getChildNodes().getItem(0)
.getNodeValue());
assertEquals(DOMUtils.COMMENT_NODE, metaFragment.getChildNodes().getItem(2).getNodeType());
assertEquals(STOPWIKILINK_COMMENT, metaFragment.getChildNodes().getItem(2).getNodeValue());
}
/**
* Tests whether the {@link LinkMetaDataExtractor} detects and parses a link an external resource.
*/
public void testExternalLink()
{
String linkInnerHTML =
"<!--startwikilink:http://xwiki.org--><span class=\"wikiexternallink\">"
+ "<a href=\"http://xwiki.org\">label</a></span><!--stopwikilink-->";
container.xSetInnerHTML(linkInnerHTML);
extractor.onInnerHTMLChange(container);
Element anchorElement = (Element) container.getFirstChild();
// test the elements left in the container
assertEquals(1, container.getChildNodes().getLength());
assertEquals(ANCHOR_TAG_NAME, container.getChildNodes().getItem(0).getNodeName().toLowerCase());
// Get Meta data fragment
DocumentFragment metaFragment = anchorElement.getMetaData();
assertNotNull(metaFragment);
// test the meta data fragment
assertEquals(DOMUtils.COMMENT_NODE, metaFragment.getChildNodes().getItem(0).getNodeType());
assertEquals("startwikilink:http://xwiki.org", metaFragment.getChildNodes().getItem(0).getNodeValue());
assertEquals(Node.ELEMENT_NODE, metaFragment.getChildNodes().getItem(1).getNodeType());
assertEquals(SPAN_TAG_NAME, metaFragment.getChildNodes().getItem(1).getNodeName().toLowerCase());
assertEquals(1, metaFragment.getChildNodes().getItem(1).getChildNodes().getLength());
assertEquals(Node.TEXT_NODE, metaFragment.getChildNodes().getItem(1).getChildNodes().getItem(0).getNodeType());
assertEquals(Element.INNER_HTML_PLACEHOLDER, metaFragment.getChildNodes().getItem(1).getChildNodes().getItem(0)
.getNodeValue());
assertEquals(DOMUtils.COMMENT_NODE, metaFragment.getChildNodes().getItem(2).getNodeType());
assertEquals(STOPWIKILINK_COMMENT, metaFragment.getChildNodes().getItem(2).getNodeValue());
}
/**
* Tests whether the {@link LinkMetaDataExtractor} detects and parses a link to an internal new page.
*/
public void testWikiNewLink()
{
String linkInnerHTML =
"<!--startwikilink:Space.Page--><span class=\"wikicreatelink\">"
+ "<a href=\"/xwiki/bin/view/Space/Page\">label</a></span><!--stopwikilink-->";
container.xSetInnerHTML(linkInnerHTML);
extractor.onInnerHTMLChange(container);
Element anchorElement = (Element) container.getFirstChild();
// test the elements left in the container
assertEquals(1, container.getChildNodes().getLength());
assertEquals(ANCHOR_TAG_NAME, container.getChildNodes().getItem(0).getNodeName().toLowerCase());
// Get Meta data fragment
DocumentFragment metaFragment = anchorElement.getMetaData();
assertNotNull(metaFragment);
// test the meta data fragment
assertEquals(DOMUtils.COMMENT_NODE, metaFragment.getChildNodes().getItem(0).getNodeType());
assertEquals("startwikilink:Space.Page", metaFragment.getChildNodes().getItem(0).getNodeValue());
assertEquals(Node.ELEMENT_NODE, metaFragment.getChildNodes().getItem(1).getNodeType());
assertEquals(SPAN_TAG_NAME, metaFragment.getChildNodes().getItem(1).getNodeName().toLowerCase());
assertEquals(1, metaFragment.getChildNodes().getItem(1).getChildNodes().getLength());
assertEquals(Node.TEXT_NODE, metaFragment.getChildNodes().getItem(1).getChildNodes().getItem(0).getNodeType());
assertEquals(Element.INNER_HTML_PLACEHOLDER, metaFragment.getChildNodes().getItem(1).getChildNodes().getItem(0)
.getNodeValue());
assertEquals(DOMUtils.COMMENT_NODE, metaFragment.getChildNodes().getItem(2).getNodeType());
assertEquals(STOPWIKILINK_COMMENT, metaFragment.getChildNodes().getItem(2).getNodeValue());
}
}