package com.celements.model.util;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import org.xwiki.model.EntityType;
import org.xwiki.model.reference.AttachmentReference;
import org.xwiki.model.reference.DocumentReference;
import org.xwiki.model.reference.EntityReference;
import org.xwiki.model.reference.EntityReferenceResolver;
import org.xwiki.model.reference.SpaceReference;
import org.xwiki.model.reference.WikiReference;
import com.celements.common.test.AbstractComponentTest;
import com.celements.model.context.ModelContext;
import com.xpn.xwiki.web.Utils;
public class ModelUtilsTest extends AbstractComponentTest {
WikiReference wikiRef = new WikiReference("wiki");
SpaceReference spaceRef = new SpaceReference("space", wikiRef);
DocumentReference docRef = new DocumentReference("doc", spaceRef);
AttachmentReference attRef = new AttachmentReference("att.jpg", docRef);
DefaultModelUtils modelUtils;
@Before
@Override
public void setUp() throws Exception {
super.setUp();
modelUtils = (DefaultModelUtils) Utils.getComponent(ModelUtils.class);
}
@Test
public void test_rootRefClass() {
assertSame("WikiReference has to be the root reference", WikiReference.class,
References.getRootClass());
}
@Test
public void test_isAbsoluteRef() {
assertTrue(modelUtils.isAbsoluteRef(docRef));
assertTrue(modelUtils.isAbsoluteRef(spaceRef));
assertTrue(modelUtils.isAbsoluteRef(wikiRef));
assertFalse(modelUtils.isAbsoluteRef(getRelativeRefResolver().resolve(
modelUtils.serializeRefLocal(docRef), EntityType.DOCUMENT)));
assertTrue(modelUtils.isAbsoluteRef(getRelativeRefResolver().resolve(modelUtils.serializeRef(
docRef), EntityType.DOCUMENT)));
}
@Test
public void test_cloneRef() {
DocumentReference ref = docRef;
EntityReference newRef = modelUtils.cloneRef(ref);
assertTrue(newRef instanceof DocumentReference);
assertNotSame(ref, newRef);
assertEquals(ref, newRef);
ref.getParent().setName("asdf");
assertFalse(ref.equals(newRef));
}
@Test
public void test_cloneRef_wikiRef() {
WikiReference ref = wikiRef;
WikiReference newRef = modelUtils.cloneRef(ref, WikiReference.class);
assertNotSame(ref, newRef);
assertEquals(ref, newRef);
ref.setName("asdf");
assertFalse(ref.equals(newRef));
}
@Test
public void test_cloneRef_spaceRef() {
SpaceReference ref = spaceRef;
SpaceReference newRef = modelUtils.cloneRef(ref, SpaceReference.class);
assertNotSame(ref, newRef);
assertEquals(ref, newRef);
ref.getParent().setName("asdf");
assertFalse(ref.equals(newRef));
}
@Test
public void test_cloneRef_docRef() {
DocumentReference ref = docRef;
DocumentReference newRef = modelUtils.cloneRef(ref, DocumentReference.class);
assertNotSame(ref, newRef);
assertEquals(ref, newRef);
ref.getParent().setName("asdf");
assertFalse(ref.equals(newRef));
}
@Test
public void test_cloneRef_entityRef() {
DocumentReference ref = docRef;
EntityReference newRef = modelUtils.cloneRef(ref, EntityReference.class);
assertTrue(newRef instanceof DocumentReference);
assertNotSame(ref, newRef);
assertEquals(ref, newRef);
ref.getParent().setName("asdf");
assertFalse(ref.equals(newRef));
}
@Test
public void test_cloneRef_relative() {
EntityReference ref = getRelativeRefResolver().resolve(modelUtils.serializeRefLocal(docRef),
EntityType.DOCUMENT);
try {
modelUtils.cloneRef(ref, DocumentReference.class);
fail("expecting failure, cannot clone relative reference to specific implementation");
} catch (IllegalArgumentException iae) {
}
}
@Test
public void test_cloneRef_relative_asEntityRef() {
EntityReference ref = getRelativeRefResolver().resolve(modelUtils.serializeRefLocal(docRef),
EntityType.DOCUMENT);
EntityReference newRef = modelUtils.cloneRef(ref);
assertFalse(newRef instanceof DocumentReference);
assertNotSame(ref, newRef);
assertEquals(ref, newRef);
ref.getParent().setName("asdf");
assertFalse(ref.equals(newRef));
}
@Test
public void test_identifyClassFromName() {
assertEquals(WikiReference.class, modelUtils.identifyClassFromName("wiki"));
assertEquals(SpaceReference.class, modelUtils.identifyClassFromName("wiki:space"));
assertEquals(DocumentReference.class, modelUtils.identifyClassFromName("wiki:space.doc"));
assertEquals(DocumentReference.class, modelUtils.identifyClassFromName("space.doc"));
assertEquals(AttachmentReference.class, modelUtils.identifyClassFromName(
"wiki:space.doc@att.jpg"));
assertEquals(AttachmentReference.class, modelUtils.identifyClassFromName("space.doc@att.jpg"));
try {
modelUtils.identifyClassFromName("doc@att");
fail("expecting failure because of relative ref");
} catch (IllegalArgumentException iae) {
}
}
@Test
public void test_identifyClassFromName_specialChars() {
assertEquals(SpaceReference.class, modelUtils.identifyClassFromName("wiki:space_test"));
assertEquals(SpaceReference.class, modelUtils.identifyClassFromName("wiki:space-test"));
assertEquals(DocumentReference.class, modelUtils.identifyClassFromName("wiki:space.doc_test"));
assertEquals(DocumentReference.class, modelUtils.identifyClassFromName("wiki:space.doc-test"));
assertEquals(DocumentReference.class, modelUtils.identifyClassFromName("space.doc_test"));
assertEquals(DocumentReference.class, modelUtils.identifyClassFromName("space.doc-test"));
assertEquals(AttachmentReference.class, modelUtils.identifyClassFromName(
"wiki:space.doc@att-test.jpg"));
assertEquals(AttachmentReference.class, modelUtils.identifyClassFromName(
"wiki:space.doc@att_test.jpg"));
}
@Test
public void test_resolveRef() {
WikiReference oWikiRef = new WikiReference("otherWiki");
Utils.getComponent(ModelContext.class).setWikiRef(wikiRef);
assertEquals(wikiRef, modelUtils.resolveRef("wiki", WikiReference.class));
// assertEquals(wikiRef, modelUtils.resolveRef("", WikiReference.class)); TODO
assertEquals(spaceRef, modelUtils.resolveRef("wiki:space", SpaceReference.class));
assertEquals(spaceRef, modelUtils.resolveRef("space", SpaceReference.class));
assertEquals(spaceRef, modelUtils.resolveRef("wiki:space", SpaceReference.class, oWikiRef));
assertEquals(new SpaceReference(spaceRef.getName(), oWikiRef), modelUtils.resolveRef("space",
SpaceReference.class, oWikiRef));
assertEquals(docRef, modelUtils.resolveRef("wiki:space.doc", DocumentReference.class));
assertEquals(docRef, modelUtils.resolveRef("space.doc", DocumentReference.class));
assertEquals(docRef, modelUtils.resolveRef("doc", DocumentReference.class, spaceRef));
}
@Test
public void test_resolveRef_failure() {
try {
modelUtils.resolveRef("doc", DocumentReference.class, wikiRef);
fail("expecting failure, space reference missing");
} catch (IllegalArgumentException iae) {
}
try {
modelUtils.resolveRef("doc", DocumentReference.class);
fail("expecting failure, space reference missing");
} catch (IllegalArgumentException iae) {
}
try {
modelUtils.resolveRef("", DocumentReference.class);
fail("expecting failure for empty string");
} catch (IllegalArgumentException iae) {
}
}
@Test
public void test_serialzeRef() {
assertEquals("wiki", modelUtils.serializeRef(wikiRef));
assertEquals("wiki:space", modelUtils.serializeRef(spaceRef));
assertEquals("wiki:space.doc", modelUtils.serializeRef(docRef));
assertEquals("wiki:space.doc@att.jpg", modelUtils.serializeRef(attRef));
try {
modelUtils.serializeRef(null);
fail("expecting failure for null value");
} catch (NullPointerException npe) {
// expected
}
}
@Test
public void test_serialzeRefLocal() {
assertEquals("", modelUtils.serializeRefLocal(wikiRef));
assertEquals("space", modelUtils.serializeRefLocal(spaceRef));
assertEquals("space.doc", modelUtils.serializeRefLocal(docRef));
assertEquals("space.doc@att.jpg", modelUtils.serializeRefLocal(attRef));
try {
modelUtils.serializeRefLocal(null);
fail("expecting failure for null value");
} catch (NullPointerException npe) {
}
}
@Test
public void test_extractRef() {
assertEquals(wikiRef, modelUtils.extractRef(docRef, WikiReference.class).get());
assertEquals(spaceRef, modelUtils.extractRef(docRef, SpaceReference.class).get());
assertEquals(docRef, modelUtils.extractRef(docRef, DocumentReference.class).get());
assertFalse(modelUtils.extractRef(docRef, AttachmentReference.class).isPresent());
assertEquals(attRef, modelUtils.extractRef(attRef, AttachmentReference.class).get());
assertNotSame(docRef, modelUtils.extractRef(docRef, DocumentReference.class).get());
}
@Test
public void test_adjustRef_higherLevel_1() {
EntityReference toRef = new WikiReference("oWiki");
DocumentReference ret = modelUtils.adjustRef(docRef, DocumentReference.class, toRef);
assertEquals(toRef, ret.getWikiReference());
assertEquals(docRef.getName(), ret.getName());
assertEquals(spaceRef.getName(), ret.getLastSpaceReference().getName());
assertEquals("wiki should have changed", toRef, ret.getWikiReference());
}
@Test
public void test_adjustRef_higherLevel_2() {
EntityReference toRef = new SpaceReference("oSpace", new WikiReference("oWiki"));
DocumentReference ret = modelUtils.adjustRef(docRef, DocumentReference.class, toRef);
assertEquals(toRef, ret.getLastSpaceReference());
assertEquals(docRef.getName(), ret.getName());
assertEquals("space should have changed", toRef, ret.getLastSpaceReference());
}
@Test
public void test_adjustRef_sameLevel() {
EntityReference toRef = new DocumentReference("oWiki", "oSpace", "oDoc");
DocumentReference ret = modelUtils.adjustRef(docRef, DocumentReference.class, toRef);
assertEquals("expecting toRef if same level entity", toRef, ret);
assertNotSame(toRef, ret);
assertEquals("doc should have changed", toRef, ret);
}
@Test
public void test_adjustRef_lowerLevel() {
EntityReference toRef = new AttachmentReference("oAtt", new DocumentReference("oWiki", "oSpace",
"oDoc"));
DocumentReference ret = modelUtils.adjustRef(docRef, DocumentReference.class, toRef);
assertEquals("expecting docRef if lower level entity", docRef, ret);
assertNotSame(docRef, ret);
}
@SuppressWarnings("unchecked")
private EntityReferenceResolver<String> getRelativeRefResolver() {
return Utils.getComponent(EntityReferenceResolver.class, "relative");
}
}