/*
* 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.model.internal.reference;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.xwiki.model.EntityType;
import org.xwiki.model.reference.EntityReference;
import org.xwiki.model.reference.EntityReferenceProvider;
import org.xwiki.model.reference.EntityReferenceResolver;
import org.xwiki.model.reference.EntityReferenceSerializer;
import org.xwiki.model.reference.test.TestConstants;
import org.xwiki.test.annotation.ComponentList;
import org.xwiki.test.mockito.MockitoComponentMockingRule;
import static org.mockito.Mockito.*;
import static org.junit.Assert.*;
/**
* Unit tests for {@link DefaultStringEntityReferenceSerializer}.
*
* @version $Id: 2ea450caa857688c205cff6d6216d582266ae80f $
* @since 2.2M1
*/
@ComponentList({
DefaultSymbolScheme.class
})
public class DefaultStringEntityReferenceSerializerTest implements TestConstants
{
@Rule
public MockitoComponentMockingRule<DefaultStringEntityReferenceSerializer> mocker =
new MockitoComponentMockingRule<>(DefaultStringEntityReferenceSerializer.class);
@Rule
public MockitoComponentMockingRule<DefaultStringEntityReferenceResolver> resolverMocker =
new MockitoComponentMockingRule<>(DefaultStringEntityReferenceResolver.class);
private EntityReferenceSerializer<String> serializer;
private EntityReferenceResolver<String> resolver;
@Before
public void setUp() throws Exception
{
this.serializer = this.mocker.getComponentUnderTest();
this.resolver = this.resolverMocker.getComponentUnderTest();
EntityReferenceProvider referenceProvider = this.resolverMocker.getInstance(EntityReferenceProvider.class);
when(referenceProvider.getDefaultReference(EntityType.WIKI)).thenReturn(DEFAULT_WIKI_REFERENCE);
when(referenceProvider.getDefaultReference(EntityType.SPACE)).thenReturn(DEFAULT_SPACE_REFERENCE);
when(referenceProvider.getDefaultReference(EntityType.DOCUMENT)).thenReturn(DEFAULT_PAGE_REFERENCE);
when(referenceProvider.getDefaultReference(EntityType.ATTACHMENT)).thenReturn(DEFAULT_ATTACHMENT_REFERENCE);
when(referenceProvider.getDefaultReference(EntityType.OBJECT)).thenReturn(DEFAULT_OBJECT_REFERENCE);
when(referenceProvider.getDefaultReference(EntityType.OBJECT_PROPERTY)).thenReturn(
DEFAULT_OBJECT_PROPERTY_REFERENCE);
when(referenceProvider.getDefaultReference(EntityType.CLASS_PROPERTY)).thenReturn(
DEFAULT_CLASS_PROPERTY_REFERENCE);
}
@Test
public void serializeWikiReferences() throws Exception
{
EntityReference reference = resolver.resolve("wiki", EntityType.WIKI);
assertEquals("wiki", serializer.serialize(reference));
}
@Test
public void serializeDocumentReferences() throws Exception
{
EntityReference reference = resolver.resolve("wiki:space.page", EntityType.DOCUMENT);
assertEquals("wiki:space.page", serializer.serialize(reference));
reference = resolver.resolve("wiki:space.", EntityType.DOCUMENT);
assertEquals("wiki:space.defpage", serializer.serialize(reference));
reference = resolver.resolve("space.", EntityType.DOCUMENT);
assertEquals("defwiki:space.defpage", serializer.serialize(reference));
reference = resolver.resolve("page", EntityType.DOCUMENT);
assertEquals("defwiki:defspace.page", serializer.serialize(reference));
reference = resolver.resolve(".", EntityType.DOCUMENT);
assertEquals("defwiki:defspace.defpage", serializer.serialize(reference));
reference = resolver.resolve(null, EntityType.DOCUMENT);
assertEquals("defwiki:defspace.defpage", serializer.serialize(reference));
reference = resolver.resolve("", EntityType.DOCUMENT);
assertEquals("defwiki:defspace.defpage", serializer.serialize(reference));
reference = resolver.resolve("wiki1.wiki2:wiki3:some.space.page", EntityType.DOCUMENT);
assertEquals("wiki1.wiki2:wiki3:some.space.page", serializer.serialize(reference));
reference = resolver.resolve("some.space.page", EntityType.DOCUMENT);
assertEquals("defwiki:some.space.page", serializer.serialize(reference));
reference = resolver.resolve("wiki:page", EntityType.DOCUMENT);
assertEquals("defwiki:defspace.wiki:page", serializer.serialize(reference));
// Verify that passing null doesn't throw a NPE
assertNull(serializer.serialize(null));
// Test escapes
reference = resolver.resolve("\\.:@\\.", EntityType.DOCUMENT);
assertEquals("defwiki:defspace.\\.:@\\.", serializer.serialize(reference));
reference = resolver.resolve("\\\\:\\\\.\\\\", EntityType.DOCUMENT);
assertEquals("\\\\:\\\\.\\\\", serializer.serialize(reference));
// The escaping here is not necessary but we want to test that it works
reference = resolver.resolve("\\wiki:\\space.\\page", EntityType.DOCUMENT);
assertEquals("wiki:space.page", serializer.serialize(reference));
}
@Test
public void serializeSpaceReferences() throws Exception
{
EntityReference reference = resolver.resolve("wiki:space1.space2", EntityType.SPACE);
assertEquals("wiki:space1.space2", serializer.serialize(reference));
}
@Test
public void serializeAttachmentReferences() throws Exception
{
EntityReference reference = resolver.resolve("wiki:space.page@filename", EntityType.ATTACHMENT);
assertEquals("wiki:space.page@filename", serializer.serialize(reference));
reference = resolver.resolve("", EntityType.ATTACHMENT);
assertEquals("defwiki:defspace.defpage@deffilename", serializer.serialize(reference));
reference = resolver.resolve("wiki:space.page@my.png", EntityType.ATTACHMENT);
assertEquals("wiki:space.page@my.png", serializer.serialize(reference));
reference = resolver.resolve("some:file.name", EntityType.ATTACHMENT);
assertEquals("defwiki:defspace.defpage@some:file.name", serializer.serialize(reference));
// Test escapes
reference = resolver.resolve(":.\\@", EntityType.ATTACHMENT);
assertEquals("defwiki:defspace.defpage@:.\\@", serializer.serialize(reference));
}
@Test
public void serializeReferencesWithChild()
{
EntityReference reference = resolver.resolve("wiki:Space.Page", EntityType.DOCUMENT);
assertEquals("wiki:Space", serializer.serialize(reference.getParent()));
assertEquals("wiki", serializer.serialize(reference.getParent().getParent()));
}
/**
* Tests resolving and re-serializing an object reference.
*/
@Test
public void serializeObjectReferences()
{
EntityReference reference = resolver.resolve("wiki:space.page^Object", EntityType.OBJECT);
assertEquals("wiki:space.page^Object", serializer.serialize(reference));
// default values
reference = resolver.resolve("", EntityType.OBJECT);
assertEquals("defwiki:defspace.defpage^defobject", serializer.serialize(reference));
// property reference with no object
reference = resolver.resolve("wiki:space.page.property", EntityType.OBJECT);
assertEquals("defwiki:defspace.defpage^wiki:space.page.property", serializer.serialize(reference));
// test escaping character
reference = resolver.resolve("wiki:space.page^Obje\\^ct", EntityType.OBJECT);
assertEquals("wiki:space.page^Obje\\^ct", serializer.serialize(reference));
reference = resolver.resolve("wiki:spa^ce.page^Obje\\^ct", EntityType.OBJECT);
assertEquals("wiki:spa^ce.page^Obje\\^ct", serializer.serialize(reference));
reference = resolver.resolve(":.\\^@", EntityType.OBJECT);
assertEquals("defwiki:defspace.defpage^:.\\^@", serializer.serialize(reference));
}
/**
* Tests resolving and re-serializing an object reference.
*/
@Test
public void serializeObjectPropertyReferences()
{
EntityReference reference = resolver.resolve("wiki:space.page^xwiki.class[0].prop", EntityType.OBJECT_PROPERTY);
assertEquals("wiki:space.page^xwiki.class[0].prop", serializer.serialize(reference));
// default values
reference = resolver.resolve("", EntityType.OBJECT_PROPERTY);
assertEquals("defwiki:defspace.defpage^defobject.defobjproperty", serializer.serialize(reference));
// using separators
reference = resolver.resolve("space^page@attachment", EntityType.OBJECT_PROPERTY);
Assert
.assertEquals("defwiki:defspace.defpage^defobject.space^page@attachment", serializer.serialize(reference));
reference = resolver.resolve("wiki:space^object", EntityType.OBJECT_PROPERTY);
assertEquals("defwiki:defspace.defpage^defobject.wiki:space^object", serializer.serialize(reference));
// test escaping character
reference = resolver.resolve("wiki:space.page^xwiki.class[0].prop\\.erty", EntityType.OBJECT_PROPERTY);
assertEquals("wiki:space.page^xwiki.class[0].prop\\.erty", serializer.serialize(reference));
reference = resolver.resolve(":\\.^@", EntityType.OBJECT_PROPERTY);
assertEquals("defwiki:defspace.defpage^defobject.:\\.^@", serializer.serialize(reference));
}
/**
* Tests resolving and re-serializing an object reference.
*/
@Test
public void serializeClassPropertyReferences()
{
EntityReference reference = resolver.resolve("wiki:space.page^ClassProperty", EntityType.CLASS_PROPERTY);
assertEquals("wiki:space.page^ClassProperty", serializer.serialize(reference));
// default values
reference = resolver.resolve("", EntityType.CLASS_PROPERTY);
assertEquals("defwiki:defspace.defpage^defclassproperty", serializer.serialize(reference));
// property reference with no object
reference = resolver.resolve("wiki:space.page.property", EntityType.CLASS_PROPERTY);
assertEquals("defwiki:defspace.defpage^wiki:space.page.property", serializer.serialize(reference));
// test escaping character
reference = resolver.resolve("wiki:space.page^Obje\\^ct", EntityType.CLASS_PROPERTY);
assertEquals("wiki:space.page^Obje\\^ct", serializer.serialize(reference));
reference = resolver.resolve("wiki:spa^ce.page^Obje\\^ct", EntityType.CLASS_PROPERTY);
assertEquals("wiki:spa^ce.page^Obje\\^ct", serializer.serialize(reference));
reference = resolver.resolve(":.\\^@", EntityType.CLASS_PROPERTY);
assertEquals("defwiki:defspace.defpage^:.\\^@", serializer.serialize(reference));
}
@Test
public void serializeRelativeReferences()
{
EntityReference reference = new EntityReference("page", EntityType.DOCUMENT);
assertEquals("page", serializer.serialize(reference));
reference = new EntityReference("page", EntityType.DOCUMENT, new EntityReference("space", EntityType.SPACE));
assertEquals("space.page", serializer.serialize(reference));
// Ensure that the page part is not displayed in the serialized result
assertEquals("space", serializer.serialize(reference.extractReference(EntityType.SPACE)));
}
}