/**
* This file Copyright (c) 2010-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.test.mock;
import static org.junit.Assert.*;
import info.magnolia.cms.core.BinaryNodeData;
import info.magnolia.cms.core.Content;
import info.magnolia.cms.core.NodeData;
import info.magnolia.test.mock.jcr.MockNode;
import java.io.IOException;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collection;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
import javax.jcr.PropertyType;
import javax.jcr.RepositoryException;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Transformer;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.junit.Test;
/**
* @version $Id$
*/
public class MockContentTest {
/**
* This is the mock-equivalent test of {@link info.magnolia.cms.core.DefaultContentTest#testNameFilteringWorksForBothBinaryAndNonBinaryProperties()}.
*/
@Test
public void testNameFilteringWorksForBothBinaryAndNonBinaryProperties() throws Exception {
String contentProperties = StringUtils.join(Arrays.asList(
"/somepage/mypage@type=mgnl:content",
"/somepage/mypage/paragraphs@type=mgnl:contentNode",
"/somepage/mypage/paragraphs/0@type=mgnl:contentNode",
"/somepage/mypage/paragraphs/0@type=mgnl:contentNode",
// 2 regular props
"/somepage/mypage/paragraphs/0/attention=booyah",
"/somepage/mypage/paragraphs/0/imaginary=date:2009-10-14T08:59:01.227-04:00",
// 3 binaries
"/somepage/mypage/paragraphs/0/attachment1@type=mgnl:resource",
"/somepage/mypage/paragraphs/0/attachment1.fileName=hello",
"/somepage/mypage/paragraphs/0/attachment1.extension=gif",
"/somepage/mypage/paragraphs/0/attachment1.jcr\\:data=X",
"/somepage/mypage/paragraphs/0/attachment1.jcr\\:mimeType=image/gif",
"/somepage/mypage/paragraphs/0/attachment1.jcr\\:lastModified=",
"/somepage/mypage/paragraphs/0/attachment2@type=mgnl:resource",
"/somepage/mypage/paragraphs/0/attachment2.fileName=test",
"/somepage/mypage/paragraphs/0/attachment2.extension=jpeg",
"/somepage/mypage/paragraphs/0/attachment2.jcr\\:data=X",
"/somepage/mypage/paragraphs/0/attachment2.jcr\\:mimeType=image/jpeg",
"/somepage/mypage/paragraphs/0/attachment2.jcr\\:lastModified=",
"/somepage/mypage/paragraphs/0/image3@type=mgnl:resource",
"/somepage/mypage/paragraphs/0/image3.fileName=third",
"/somepage/mypage/paragraphs/0/image3.extension=png",
"/somepage/mypage/paragraphs/0/image3.jcr\\:data=X",
"/somepage/mypage/paragraphs/0/image3.jcr\\:mimeType=image/png",
"/somepage/mypage/paragraphs/0/image3.jcr\\:lastModified=",
// and more which should not match
"/somepage/mypage/paragraphs/0/foo=bar",
"/somepage/mypage/paragraphs/0/mybool=boolean:true",
"/somepage/mypage/paragraphs/0/rand@type=mgnl:resource",
"/somepage/mypage/paragraphs/0/rand.fileName=randdddd",
"/somepage/mypage/paragraphs/0/rand.extension=png",
"/somepage/mypage/paragraphs/0/rand.jcr\\:data=X",
"/somepage/mypage/paragraphs/0/rand.jcr\\:mimeType=image/png",
"/somepage/mypage/paragraphs/0/rand.jcr\\:lastModified="
), "\n");
// --- only this line differs from the DefaultContentTest equivalent
final MockHierarchyManager hm = MockUtil.createHierarchyManager(contentProperties);
// ---
final Content content = hm.getContent("/somepage/mypage/paragraphs/0");
final Collection<NodeData> props = content.getNodeDataCollection("att*|ima*");
assertEquals(5, props.size());
// sort by name
final TreeSet<NodeData> sorted = new TreeSet<NodeData>(new Comparator<NodeData>() {
@Override
public int compare(NodeData o1, NodeData o2) {
return o1.getName().compareTo(o2.getName());
}
});
sorted.addAll(props);
// sanity check - just recheck we still have 5 elements
assertEquals(5, sorted.size());
final Iterator<NodeData> it = sorted.iterator();
final NodeData a = it.next();
final NodeData b = it.next();
final NodeData c = it.next();
final NodeData d = it.next();
final NodeData e = it.next();
assertEquals("attachment1", a.getName());
assertEquals(PropertyType.BINARY, a.getType());
assertEquals("attachment2", b.getName());
assertEquals(PropertyType.BINARY, b.getType());
assertEquals("image3", d.getName());
assertEquals(PropertyType.BINARY, d.getType());
assertEquals("image3", d.getName());
assertEquals(PropertyType.BINARY, d.getType());
assertEquals("attention", c.getName());
assertEquals(PropertyType.STRING, c.getType());
assertEquals("booyah", c.getString());
assertEquals("imaginary", e.getName());
assertEquals(PropertyType.DATE, e.getType());
assertEquals(true, e.getDate().before(Calendar.getInstance()));
}
/**
* This is the mock-equivalent test of {@link info.magnolia.cms.core.DefaultContentTest#testStringPropertiesCanBeRetrievedByStreamAndViceVersa()}.
*/
@Test
public void testStringPropertiesCanBeRetrievedByStreamAndViceVersa() throws Exception {
String contentProperties = StringUtils.join(Arrays.asList(
"/hello/foo=bar",
// a binary
"/hello/bin@type=mgnl:resource",
"/hello/bin.fileName=hello",
"/hello/bin.extension=gif",
"/hello/bin.jcr\\:data=some-data",
"/hello/bin.jcr\\:mimeType=image/gif",
"/hello/bin.jcr\\:lastModified="), "\n");
// --- only this line differs from the DefaultContentTest equivalent
final MockHierarchyManager hm = MockUtil.createHierarchyManager(contentProperties);
// ---
final Content content = hm.getContent("/hello");
final NodeData st = content.getNodeData("foo");
assertTrue(st instanceof MockNodeData);
assertEquals(PropertyType.STRING, st.getType());
assertEquals("bar", st.getString());
assertEquals("bar", IOUtils.toString(st.getStream()));
final NodeData bin = content.getNodeData("bin");
assertTrue(bin instanceof BinaryNodeData);
assertEquals(PropertyType.BINARY, bin.getType());
assertEquals("some-data", IOUtils.toString(bin.getStream()));
assertEquals("some-data", bin.getString());
}
@Test
public void testOrderBefore() throws RepositoryException, IOException{
MockHierarchyManager hm = MockUtil.createHierarchyManager(
"/node/a\n" +
"/node/b\n" +
"/node/c\n");
Content node = hm.getContent("/node");
node.orderBefore("c", "b");
Collection<Content> result = node.getChildren();
// transform to collection of names
CollectionUtils.transform(result, new Transformer() {
@Override
public Object transform(Object childObj) {
return ((Content)childObj).getName();
}
});
assertEquals(Arrays.asList(new String[]{"a", "c","b"}), result);
}
@Test
public void testOrderBefore2() throws RepositoryException, IOException{
MockHierarchyManager hm = MockUtil.createHierarchyManager(
"/node/a\n" +
"/node/b\n" +
"/node/c\n");
Content node = hm.getContent("/node");
node.orderBefore("a", "c");
Collection<Content> result = node.getChildren();
// transform to collection of names
CollectionUtils.transform(result, new Transformer() {
@Override
public Object transform(Object childObj) {
return ((Content)childObj).getName();
}
});
assertEquals(Arrays.asList(new String[]{"b", "a","c"}), result);
}
@Test
public void testOrderBeforeFirstNode() throws RepositoryException, IOException{
MockHierarchyManager hm = MockUtil.createHierarchyManager(
"/node/a\n" +
"/node/b\n" +
"/node/c\n");
Content node = hm.getContent("/node");
node.orderBefore("c", "a");
Collection<Content> result = node.getChildren();
// transform to collection of names
CollectionUtils.transform(result, new Transformer() {
@Override
public Object transform(Object childObj) {
return ((Content)childObj).getName();
}
});
assertEquals(Arrays.asList(new String[]{"c", "a","b"}), result);
}
@Test
public void testGetAncestor() throws RepositoryException, IOException {
MockHierarchyManager hm =
MockUtil.createHierarchyManager("/level0\n" + "/level0/level1\n" + "/level0/level1/level2\n");
Content node = hm.getContent("/level0/level1/level2");
Collection<Content> ancestors = node.getAncestors();
assertEquals(3, ancestors.size());
}
@Test
public void testCanDeleteAProperty() throws Exception {
MockHierarchyManager hm = MockUtil.createHierarchyManager(
"/node.a=lol\n" +
"/node.b=yop\n" +
"/node.c=boum\n");
final Content node = hm.getContent("/node");
assertEquals(3, node.getNodeDataCollection().size());
node.deleteNodeData("b");
assertEquals(2, node.getNodeDataCollection().size());
assertEquals(true, node.getNodeData("a").isExist());
assertEquals(true, node.getNodeData("c").isExist());
assertEquals(false, node.getNodeData("b").isExist());
}
@Test
public void testGetHandle() throws Exception {
// GIVEN
MockContent content = new MockContent("test");
// WHEN
final String result = content.getHandle();
// THEN
assertEquals("/test", result);
}
@Test
public void testGetHandleOnRoot() throws Exception {
// GIVE
MockContent root = new MockContent(MockNode.ROOT_NODE_NAME);
// WHEN
final String result = root.getHandle();
// THEN
assertEquals("/", result);
}
@Test
public void testGetName() throws Exception {
// GIVEN
MockContent content = new MockContent("test");
// WHEN
final String result = content.getHandle();
// THEN
assertEquals("/test", result);
}
@Test
public void testGetNameOnRoot() throws Exception {
// GIVE
MockContent root = new MockContent(MockNode.ROOT_NODE_NAME);
// WHEN
final String result = root.getName();
// THEN
assertEquals("", result);
}
@Test
public void testSetNodeDataReferencingOtherContent() throws Exception {
// GIVEN
MockHierarchyManager hm = MockUtil.createHierarchyManager(
"/node.a=lol\n" +
"/node.c=boum\n");
final Content node = hm.getContent("/node");
MockContent a = (MockContent) node.createContent("a");
MockContent b = (MockContent) node.createContent("b");
b.setUUID("12345-abc");
final String referenceToB = "ref2b";
a.setNodeData(referenceToB, b);
// WHEN
Object result = a.getNodeData(referenceToB).getReferencedContent();
// THEN
assertEquals(b, result);
}
}