/*
* 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.wiki.internal.descriptor.builder;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Provider;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.xwiki.model.reference.DocumentReference;
import org.xwiki.model.reference.DocumentReferenceResolver;
import org.xwiki.model.reference.EntityReferenceSerializer;
import org.xwiki.model.reference.WikiReference;
import org.xwiki.test.mockito.MockitoComponentMockingRule;
import org.xwiki.wiki.descriptor.WikiDescriptor;
import org.xwiki.wiki.descriptor.WikiDescriptorManager;
import org.xwiki.wiki.internal.descriptor.document.WikiDescriptorDocumentHelper;
import org.xwiki.wiki.internal.descriptor.document.XWikiServerClassDocumentInitializer;
import org.xwiki.wiki.internal.descriptor.properties.WikiPropertyGroupManager;
import org.xwiki.wiki.properties.WikiPropertyGroupException;
import com.xpn.xwiki.XWiki;
import com.xpn.xwiki.XWikiContext;
import com.xpn.xwiki.doc.XWikiDocument;
import com.xpn.xwiki.objects.BaseObject;
/**
* Unit tests for {@link org.xwiki.wiki.internal.descriptor.builder.DefaultWikiDescriptorBuilder}.
*
* @version $Id: c194c65272409326aa2e1b06e6560fafdb67894f $
* @since 6.0M1
*/
public class DefaultWikiDescriptorBuilderTest
{
@Rule
public org.xwiki.test.mockito.MockitoComponentMockingRule<DefaultWikiDescriptorBuilder> mocker =
new MockitoComponentMockingRule<>(DefaultWikiDescriptorBuilder.class);
private Provider<XWikiContext> xcontextProvider;
private EntityReferenceSerializer<String> referenceSerializer;
private DocumentReferenceResolver<String> referenceResolver;
private DocumentReferenceResolver<String> userReferenceResolver;
private WikiDescriptorManager wikiDescriptorManager;
private WikiPropertyGroupManager wikiPropertyGroupManager;
private WikiDescriptorDocumentHelper wikiDescriptorDocumentHelper;
private XWikiContext context;
private XWiki xwiki;
@Before
public void setUp() throws Exception
{
xcontextProvider = mocker.registerMockComponent(XWikiContext.TYPE_PROVIDER);
context = mock(XWikiContext.class);
when(xcontextProvider.get()).thenReturn(context);
xwiki = mock(XWiki.class);
when(context.getWiki()).thenReturn(xwiki);
referenceSerializer = mocker.getInstance(EntityReferenceSerializer.TYPE_STRING);
referenceResolver = mocker.getInstance(DocumentReferenceResolver.TYPE_STRING);
userReferenceResolver = mocker.getInstance(DocumentReferenceResolver.TYPE_STRING, "user");
wikiDescriptorDocumentHelper = mocker.getInstance(WikiDescriptorDocumentHelper.class);
wikiDescriptorManager = mocker.registerMockComponent(WikiDescriptorManager.class);
wikiPropertyGroupManager = mocker.registerMockComponent(WikiPropertyGroupManager.class);
}
@Test
public void buildDescriptorObject() throws Exception
{
// Mocks
List<BaseObject> objects = new ArrayList<>();
BaseObject object1 = mock(BaseObject.class);
BaseObject object2 = mock(BaseObject.class);
BaseObject object3 = mock(BaseObject.class);
// Make sure that the first object is null to also verify this case since it can happen that we get holes
// with the XWikiDocument.getXObjects() API...
objects.add(null);
objects.add(object1);
objects.add(object2);
objects.add(null);
objects.add(object3);
XWikiDocument document = mock(XWikiDocument.class);
DocumentReference documentReference = new DocumentReference("mainWiki", "XWiki", "XWikiServerSubwiki1");
when(document.getDocumentReference()).thenReturn(documentReference);
when(object1.getStringValue(XWikiServerClassDocumentInitializer.FIELD_SERVER)).thenReturn("subwiki1");
when(object2.getStringValue(XWikiServerClassDocumentInitializer.FIELD_SERVER)).thenReturn("alias1");
when(object3.getStringValue(XWikiServerClassDocumentInitializer.FIELD_SERVER)).thenReturn("alias2");
DocumentReference mainPageReference = new DocumentReference("subwiki1", "Space", "MainPage");
when(object1.getStringValue(XWikiServerClassDocumentInitializer.FIELD_HOMEPAGE)).thenReturn("Space.MainPage");
when(referenceResolver.resolve("Space.MainPage")).thenReturn(mainPageReference);
when(object1.getStringValue(XWikiServerClassDocumentInitializer.FIELD_WIKIPRETTYNAME)).thenReturn(
"myPrettyName");
when(object1.getStringValue(XWikiServerClassDocumentInitializer.FIELD_OWNER)).thenReturn("myOwner");
when(object1.getStringValue(XWikiServerClassDocumentInitializer.FIELD_DESCRIPTION)).thenReturn("myDescription");
DocumentReference ownerRef = new DocumentReference("subwiki1", "XWiki", "myOwner");
when(userReferenceResolver.resolve("myOwner", new WikiReference("subwiki1"))).thenReturn(ownerRef);
when(referenceSerializer.serialize(ownerRef)).thenReturn("subwiki1:XWiki.myOwner");
// Test
WikiDescriptor result = mocker.getComponentUnderTest().buildDescriptorObject(objects, document);
assertEquals("subwiki1", result.getId());
assertEquals(3, result.getAliases().size());
assertEquals("subwiki1", result.getAliases().get(0));
assertEquals("alias1", result.getAliases().get(1));
assertEquals("alias2", result.getAliases().get(2));
assertEquals(mainPageReference, result.getMainPageReference());
assertEquals("myPrettyName", result.getPrettyName());
assertEquals("subwiki1:XWiki.myOwner", result.getOwnerId());
assertEquals("myDescription", result.getDescription());
// Verify
wikiPropertyGroupManager.loadForDescriptor(any(WikiDescriptor.class));
}
@Test
public void buildDescriptorObjectWhenInvalidWiki() throws Exception
{
// Mocks
List<BaseObject> objects = new ArrayList<>();
BaseObject object1 = mock(BaseObject.class);
objects.add(object1);
when(object1.getStringValue(XWikiServerClassDocumentInitializer.FIELD_SERVER)).thenReturn(" ");
XWikiDocument document = mock(XWikiDocument.class);
// Test
WikiDescriptor result = mocker.getComponentUnderTest().buildDescriptorObject(objects, document);
assertNull(result);
}
@Test
public void buildDescriptorObjectWhenException() throws Exception
{
// Mocks
List<BaseObject> objects = new ArrayList<>();
BaseObject object1 = mock(BaseObject.class);
objects.add(object1);
XWikiDocument document = mock(XWikiDocument.class);
DocumentReference documentReference = new DocumentReference("mainWiki", "XWiki", "XWikiServerSubwiki1");
when(document.getDocumentReference()).thenReturn(documentReference);
when(object1.getStringValue(XWikiServerClassDocumentInitializer.FIELD_SERVER)).thenReturn("subwiki1");
DocumentReference mainPageReference = new DocumentReference("subwiki1", "Space", "MainPage");
when(object1.getStringValue(XWikiServerClassDocumentInitializer.FIELD_HOMEPAGE)).thenReturn("Space.MainPage");
when(referenceResolver.resolve("Space.MainPage")).thenReturn(mainPageReference);
Exception exception = new WikiPropertyGroupException("error in wikiPropertyGroupManager.loadForDescriptor");
doThrow(exception).when(wikiPropertyGroupManager).loadForDescriptor(any(WikiDescriptor.class));
// Test
mocker.getComponentUnderTest().buildDescriptorObject(objects, document);
// Verify
verify(mocker.getMockedLogger()).error("Failed to load wiki property groups for wiki [{}].", "subwiki1",
exception);
}
}