/* * 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.script; import java.util.Arrays; import java.util.Collections; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.slf4j.Logger; import org.xwiki.component.manager.ComponentLookupException; import org.xwiki.component.manager.ComponentManager; import org.xwiki.component.util.ReflectionUtils; import org.xwiki.model.EntityType; import org.xwiki.model.reference.ClassPropertyReference; import org.xwiki.model.reference.DocumentReference; import org.xwiki.model.reference.DocumentReferenceResolver; import org.xwiki.model.reference.EntityReference; import org.xwiki.model.reference.EntityReferenceResolver; import org.xwiki.model.reference.EntityReferenceValueProvider; import org.xwiki.model.reference.SpaceReference; import org.xwiki.model.reference.WikiReference; import static org.mockito.Mockito.*; /** * Unit tests for {@link org.xwiki.model.script.ModelScriptService}. * * @version $Id: 6e815fa20c00d2d063b3210bfd81ec4d806e8ba9 $ * @since 2.3M1 */ public class ModelScriptServiceTest { private ModelScriptService service; private ComponentManager componentManager; private DocumentReferenceResolver<EntityReference> resolver; private EntityReferenceResolver<String> stringEntityReferenceResolver; private EntityReferenceValueProvider valueProvider; private Logger logger; @SuppressWarnings("unchecked") @Before public void setUp() { this.service = new ModelScriptService(); this.componentManager = mock(ComponentManager.class); ReflectionUtils.setFieldValue(this.service, "componentManager", this.componentManager); this.logger = mock(Logger.class); ReflectionUtils.setFieldValue(this.service, "logger", this.logger); this.resolver = mock(DocumentReferenceResolver.class); this.stringEntityReferenceResolver = mock(EntityReferenceResolver.class); this.valueProvider = mock(EntityReferenceValueProvider.class); } @Test public void createDocumentReferenceWithSpecifiedHint() throws Exception { when(this.componentManager.getInstance(DocumentReferenceResolver.TYPE_REFERENCE, "default")) .thenReturn(this.resolver); DocumentReference reference = new DocumentReference("wiki", "space", "page"); when(this.resolver.resolve(reference)).thenReturn(reference); Assert.assertEquals(reference, this.service.createDocumentReference("wiki", "space", "page", "default")); } @Test public void createDocumentReferenceWithDefaultHint() throws Exception { when(this.componentManager.getInstance(DocumentReferenceResolver.TYPE_REFERENCE, "current")) .thenReturn(this.resolver); DocumentReference reference = new DocumentReference("wiki", "space", "page"); when(this.resolver.resolve(reference)).thenReturn(reference); Assert.assertEquals(reference, this.service.createDocumentReference("wiki", "space", "page")); } @Test public void createDocumentReferenceWhenEmptyParameters() throws Exception { when(this.componentManager.getInstance(DocumentReferenceResolver.TYPE_REFERENCE, "default")) .thenReturn(this.resolver); DocumentReference reference = new DocumentReference("defaultwiki", "defaultspace", "defaultpage"); when(this.resolver.resolve(null)).thenReturn(reference); Assert.assertEquals(reference, this.service.createDocumentReference("", "", "", "default")); } @Test public void createDocumentReferenceWhenWikiParameterEmpty() throws Exception { when(this.componentManager.getInstance(DocumentReferenceResolver.TYPE_REFERENCE, "default")) .thenReturn(this.resolver); DocumentReference reference = new DocumentReference("defaultwiki", "space", "page"); when(this.resolver.resolve(new EntityReference("page", EntityType.DOCUMENT, new EntityReference("space", EntityType.SPACE)))).thenReturn(reference); Assert.assertEquals(reference, this.service.createDocumentReference("", "space", "page", "default")); } @Test public void createDocumentReferenceWhenSpaceParameterEmpty() throws Exception { when(this.componentManager.getInstance(DocumentReferenceResolver.TYPE_REFERENCE, "default")) .thenReturn(this.resolver); DocumentReference reference = new DocumentReference("wiki", "defaultspace", "page"); when(this.resolver.resolve(new EntityReference("page", EntityType.DOCUMENT, new EntityReference("wiki", EntityType.WIKI)))).thenReturn(reference); Assert.assertEquals(reference, this.service.createDocumentReference("wiki", "", "page", "default")); Assert.assertEquals(reference, this.service.createDocumentReference("wiki", Collections.<String>emptyList(), "page", "default")); } @Test public void createDocumentReferenceWhenPageParameterEmpty() throws Exception { when(this.componentManager.getInstance(DocumentReferenceResolver.TYPE_REFERENCE, "default")) .thenReturn(this.resolver); DocumentReference reference = new DocumentReference("wiki", "space", "defaultpage"); when(this.resolver.resolve(new EntityReference("space", EntityType.SPACE, new EntityReference("wiki", EntityType.WIKI)))).thenReturn(reference); Assert.assertEquals(reference, this.service.createDocumentReference("wiki", "space", "", "default")); } @Test public void createDocumentReferenceWhenWikiAndSpaceParametersEmpty() throws Exception { when(this.componentManager.getInstance(DocumentReferenceResolver.TYPE_REFERENCE, "default")) .thenReturn(this.resolver); DocumentReference reference = new DocumentReference("wiki", "defaultspace", "defaultpage"); when(this.resolver.resolve(new EntityReference("wiki", EntityType.WIKI))).thenReturn(reference); Assert.assertEquals(reference, this.service.createDocumentReference("wiki", "", "", "default")); Assert.assertEquals(reference, this.service.createDocumentReference("wiki", Collections.<String>emptyList(), "", "default")); } @Test public void createDocumentReferenceWhenInvalidHint() throws Exception { when(this.componentManager.getInstance(DocumentReferenceResolver.TYPE_REFERENCE, "invalid")) .thenThrow(new ComponentLookupException("error")); // Make sure backward compatibility is preserved. when(this.componentManager.getInstance(DocumentReferenceResolver.class, "invalid")) .thenThrow(new ComponentLookupException("error")); Assert.assertNull(this.service.createDocumentReference("wiki", "space", "page", "invalid")); } @Test public void createDocumentReferenceWithDeprecatedHint() throws Exception { when(this.componentManager.getInstance(DocumentReferenceResolver.TYPE_REFERENCE, "current/reference")) .thenThrow(new ComponentLookupException("error")); DocumentReference reference = new DocumentReference("wiki", "space", "page"); // Make sure backward compatibility is preserved. when(this.componentManager.getInstance(DocumentReferenceResolver.class, "current/reference")) .thenReturn(this.resolver); when(this.resolver.resolve(reference)).thenReturn(reference); Assert.assertEquals(reference, this.service.createDocumentReference("wiki", "space", "page", "current/reference")); // Verify that we log a warning! verify(this.logger).warn("Deprecated usage of DocumentReferenceResolver with hint [{}]. " + "Please consider using a DocumentReferenceResolver that takes into account generic types.", "current/reference"); } @Test public void createDocumentReferenceFromPageNameAndSpaceReference() { DocumentReference documentReference = new DocumentReference("wiki", "Space", "Page"); Assert.assertEquals(documentReference, this.service.createDocumentReference(documentReference.getName(), documentReference.getLastSpaceReference())); } @Test public void getEntityReferenceValue() throws Exception { when(this.componentManager.getInstance(EntityReferenceValueProvider.class, "current")) .thenReturn(this.valueProvider); when(this.valueProvider.getDefaultValue(EntityType.WIKI)).thenReturn("somewiki"); Assert.assertEquals("somewiki", this.service.getEntityReferenceValue(EntityType.WIKI)); } @Test public void getEntityReferenceValueWithInvalidHint() throws Exception { when(this.componentManager.getInstance(EntityReferenceValueProvider.class, "invalid")) .thenThrow(new ComponentLookupException("error")); Assert.assertNull(this.service.getEntityReferenceValue(EntityType.WIKI, "invalid")); } @Test public void getEntityReferenceValueWithNullType() throws Exception { Assert.assertNull(this.service.getEntityReferenceValue(null)); } @Test public void createWikiReference() { Assert.assertEquals(new WikiReference("wiki"), this.service.createWikiReference("wiki")); } @Test public void createSpaceReference() { Assert.assertEquals(new SpaceReference("space", new WikiReference("wiki")), this.service.createSpaceReference("space", this.service.createWikiReference("wiki"))); SpaceReference spaceReference = new SpaceReference("C", new SpaceReference("B", new SpaceReference("A", new WikiReference("wiki")))); Assert.assertEquals(spaceReference, this.service.createSpaceReference(Arrays.asList("A", "B", "C"), this.service.createWikiReference("wiki"))); Assert.assertEquals(spaceReference, this.service.createSpaceReference(spaceReference.getName(), (SpaceReference) spaceReference.getParent())); } @Test public void createEntityReferenceWithoutParent() { Assert.assertEquals(new EntityReference("page", EntityType.DOCUMENT), this.service.createEntityReference("page", EntityType.DOCUMENT)); } @Test public void createEntityReferenceWithParent() { Assert.assertEquals(new EntityReference("page", EntityType.DOCUMENT, new EntityReference("space", EntityType.SPACE)), this.service.createEntityReference("page", EntityType.DOCUMENT, this.service.createEntityReference("space", EntityType.SPACE))); } @Test public void resolveSpace() throws Exception { when(this.componentManager.getInstance(EntityReferenceResolver.TYPE_STRING, "current")).thenReturn( this.stringEntityReferenceResolver); SpaceReference reference = new SpaceReference("Space", new WikiReference("wiki")); when(this.stringEntityReferenceResolver.resolve("x", EntityType.SPACE, new Object[] {})).thenReturn(reference); Assert.assertEquals(reference, this.service.resolveSpace("x")); } @Test public void resolveSpaceWithHintAndParameters() throws Exception { when(this.componentManager.getInstance(EntityReferenceResolver.TYPE_STRING, "custom")).thenReturn( this.stringEntityReferenceResolver); SpaceReference reference = new SpaceReference("Foo", new WikiReference("bar")); Object[] parameters = new Object[] {new DocumentReference("wiki", "Space", "Page"), "extra"}; when(this.stringEntityReferenceResolver.resolve("reference", EntityType.SPACE, parameters)).thenReturn( reference); Assert.assertEquals(reference, this.service.resolveSpace("reference", "custom", parameters[0], parameters[1])); } @Test public void resolveClassPropertyWithHintAndParameters() throws Exception { when(this.componentManager.getInstance(EntityReferenceResolver.TYPE_STRING, "custom")).thenReturn( this.stringEntityReferenceResolver); ClassPropertyReference reference = new ClassPropertyReference("property", new DocumentReference("wiki", "Space", "Class")); Object[] parameters = new Object[] {new DocumentReference("wiki", "Space", "Page"), "extra"}; when(this.stringEntityReferenceResolver.resolve("Class^property", EntityType.CLASS_PROPERTY, parameters)) .thenReturn(reference); Assert.assertEquals(reference, this.service.resolveClassProperty("Class^property", "custom", parameters[0], parameters[1])); } }