org.xwiki.users.internal.WikiUserManagerTest.java Source code

Java tutorial

Introduction

Here is the source code for org.xwiki.users.internal.WikiUserManagerTest.java

Source

/*
 * See the NOTICE file distributed with this work for additional
 * information regarding copyright ownership.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program 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 Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see http://www.gnu.org/licenses/
 */
package org.xwiki.users.internal;

import org.xwiki.bridge.DocumentAccessBridge;
import org.xwiki.configuration.ConfigurationSource;
import org.xwiki.model.EntityType;
import org.xwiki.model.ModelConfiguration;
import org.xwiki.model.ModelContext;
import org.xwiki.model.reference.DocumentReference;
import org.xwiki.model.reference.EntityReference;
import org.xwiki.model.reference.EntityReferenceResolver;
import org.xwiki.model.reference.EntityReferenceSerializer;
import org.xwiki.model.reference.SpaceReference;
import org.xwiki.model.reference.WikiReference;
import org.xwiki.test.mockito.MockitoComponentMockingRule;
import org.xwiki.users.User;
import org.xwiki.users.UserManager;

import org.apache.commons.lang3.StringUtils;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.mockito.Matchers;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;

import static org.mockito.Matchers.any;
import static org.mockito.Mockito.when;

/**
 * Tests the wiki user manager.
 *
 * @version $Id: 1ad41eb2757d3301bf512f210e509e54cb26fa5a $
 * @since 1.0M9
 */
public class WikiUserManagerTest {
    @Rule
    public final MockitoComponentMockingRule<UserManager> mocker = new MockitoComponentMockingRule<UserManager>(
            WikiUserManager.class);

    private UserManager userManager;

    private EntityReferenceResolver<String> nameResolver;

    private EntityReferenceResolver<EntityReference> referenceResolver;

    private EntityReferenceSerializer<String> serializer;

    private ConfigurationSource configuration;

    private ModelConfiguration modelConfiguration;

    private ModelContext modelContext;

    private DocumentAccessBridge bridge;

    @Before
    public void configure() throws Exception {
        this.nameResolver = this.mocker.getInstance(EntityReferenceResolver.TYPE_STRING, "explicit");
        this.referenceResolver = this.mocker.getInstance(EntityReferenceResolver.TYPE_REFERENCE, "explicit");
        this.serializer = this.mocker.getInstance(EntityReferenceSerializer.TYPE_STRING);
        this.configuration = this.mocker.getInstance(ConfigurationSource.class, "xwikiproperties");
        this.modelConfiguration = this.mocker.getInstance(ModelConfiguration.class);
        this.modelContext = this.mocker.getInstance(ModelContext.class);
        this.bridge = this.mocker.getInstance(DocumentAccessBridge.class);

        when(this.configuration.getProperty("users.defaultUserSpace", "XWiki")).thenReturn("XWiki");
        when(WikiUserManagerTest.this.modelConfiguration.getDefaultReferenceValue(EntityType.WIKI))
                .thenReturn("xwiki");
        when(this.referenceResolver.resolve(any(EntityReference.class), any(EntityType.class),
                any(DocumentReference.class))).thenAnswer(new Answer<EntityReference>() {
                    @Override
                    public EntityReference answer(InvocationOnMock invocation) throws Throwable {
                        EntityReference toResolve = (EntityReference) invocation.getArguments()[0];
                        DocumentReference reference = (DocumentReference) invocation.getArguments()[2];
                        return new DocumentReference(toResolve.getName(),
                                new SpaceReference(toResolve.getParent().getName(), reference.getRoot()));
                    }
                });

        this.userManager = this.mocker.getComponentUnderTest();
    }

    @Test
    public void getUserFromLocalReference() throws Exception {
        setupMocks("XWiki.Admin", "xwiki");
        User u = this.userManager.getUser("XWiki.Admin");
        Assert.assertEquals("xwiki:XWiki.Admin", u.getId());
        Assert.assertTrue(u instanceof WikiUser);
    }

    @Test
    public void getUserFromFullReference() throws Exception {
        setupMocks("playground:SouthPark.Timmy", "SouthPark", "playground", true);
        User u = this.userManager.getUser("playground:SouthPark.Timmy");
        Assert.assertEquals("playground:SouthPark.Timmy", u.getId());
        Assert.assertTrue(u instanceof WikiUser);
    }

    @Test
    public void differentSettingsAndUserInLocalWiki() throws Exception {
        setupMocks("local");
        User u = this.userManager.getUser("Admin");
        Assert.assertEquals("local:XWiki.Admin", u.getId());
        Assert.assertTrue(u instanceof WikiUser);
    }

    @Test
    public void differentSettingsAndUserInUsersWiki() throws Exception {
        setupMocks("users");
        User u = this.userManager.getUser("Admin");
        Assert.assertEquals("users:XWiki.Admin", u.getId());
        Assert.assertTrue(u instanceof WikiUser);
    }

    @Test
    public void differentSettingsAndUserInGlobalWiki() throws Exception {
        setupMocks("xwiki");
        User u = this.userManager.getUser("Admin");
        Assert.assertEquals("xwiki:XWiki.Admin", u.getId());
        Assert.assertTrue(u instanceof WikiUser);
    }

    @Test
    public void differentSettingsAndMissingUser() throws Exception {
        setupMocks("Admin", "XWiki", "users", false);
        User u = this.userManager.getUser("Admin");
        Assert.assertNull(u);
    }

    @Test
    public void forceWithExistingUserInLocalWiki() throws Exception {
        setupMocks("local");
        User u = this.userManager.getUser("Admin", true);
        Assert.assertEquals("local:XWiki.Admin", u.getId());
        Assert.assertTrue(u.exists());
    }

    @Test
    public void forceWithExistingUserInUsersWiki() throws Exception {
        setupMocks("users");
        User u = this.userManager.getUser("Admin", true);
        Assert.assertEquals("users:XWiki.Admin", u.getId());
        Assert.assertTrue(u.exists());
    }

    @Test
    public void forceWithExistingUserInGlobalWiki() throws Exception {
        setupMocks("xwiki");
        User u = this.userManager.getUser("Admin", true);
        when(this.serializer.serialize(Matchers.same(new DocumentReference("xwiki", "XWiki", "Admin"))))
                .thenReturn("xwiki:XWiki.Admin");
        Assert.assertEquals("xwiki:XWiki.Admin", u.getId());
        Assert.assertTrue(u.exists());
    }

    @Test
    public void forceWithMissingUser() throws Exception {
        setupMocks("Admin", "XWiki", "users", false);
        User u = this.userManager.getUser("Admin", true);
        Assert.assertEquals("users:XWiki.Admin", u.getId());
        Assert.assertFalse(u.exists());
    }

    @Test
    public void nullIdentifierReturnsNull() throws Exception {
        User u = this.userManager.getUser(null);
        Assert.assertNull(u);
    }

    @Test
    public void emptyIdentifierReturnsNull() throws Exception {
        User u = this.userManager.getUser("");
        Assert.assertNull(u);
    }

    @Test
    public void blankIdentifierReturnsNull() throws Exception {
        User u = this.userManager.getUser("\n \t");
        Assert.assertNull(u);
    }

    @Test
    public void blankIdentifierAndForceReturnsNull() throws Exception {
        User u = this.userManager.getUser("\n \t", true);
        Assert.assertNull(u);
    }

    private void setupMocks(final String targetUserWiki) {
        setupMocks("Admin", "XWiki", targetUserWiki, true);
    }

    private void setupMocks(final String passedIdentifier, final String targetUserWiki) {
        setupMocks(passedIdentifier, "XWiki", targetUserWiki, true);
    }

    private void setupMocks(final String passedIdentifier, final String targetSpace, final String targetUserWiki,
            final boolean existing) {
        final DocumentReference targetUser = new DocumentReference(targetUserWiki, "XWiki", "Admin");
        when(this.configuration.getProperty("users.defaultWiki", "local")).thenReturn("users");
        when(this.modelContext.getCurrentEntityReference())
                .thenReturn(new DocumentReference("local", "Main", "WebHome"));

        when(this.bridge.exists(new DocumentReference("xwiki", targetSpace, "Admin"))).thenReturn(false);
        when(this.bridge.exists(new DocumentReference("users", targetSpace, "Admin"))).thenReturn(false);
        when(this.bridge.exists(new DocumentReference("local", targetSpace, "Admin"))).thenReturn(false);
        when(this.bridge.exists(targetUser)).thenReturn(existing);

        when(this.referenceResolver.resolve(new EntityReference("XWikiUsers", EntityType.DOCUMENT,
                new EntityReference("XWiki", EntityType.SPACE)), EntityType.DOCUMENT, targetUser))
                        .thenReturn(new DocumentReference(targetUserWiki, "XWiki", "XWikiUsers"));

        when(this.serializer.serialize(targetUser, new Object[0]))
                .thenReturn(targetUserWiki + ":" + targetSpace + "." + StringUtils
                        .defaultIfEmpty(StringUtils.substringAfterLast(passedIdentifier, "."), passedIdentifier));

        if (passedIdentifier.startsWith(targetUserWiki + ":")) {
            when(this.nameResolver.resolve(passedIdentifier, EntityType.DOCUMENT,
                    new EntityReference("XWiki", EntityType.SPACE, new WikiReference("local"))))
                            .thenReturn(targetUser);
        } else {
            when(this.nameResolver.resolve(passedIdentifier, EntityType.DOCUMENT,
                    new EntityReference("XWiki", EntityType.SPACE, new WikiReference("xwiki"))))
                            .thenReturn(new DocumentReference("xwiki", targetSpace, "Admin"));
            when(this.nameResolver.resolve(passedIdentifier, EntityType.DOCUMENT,
                    new EntityReference("XWiki", EntityType.SPACE, new WikiReference("users"))))
                            .thenReturn(new DocumentReference("users", targetSpace, "Admin"));
            when(this.nameResolver.resolve(passedIdentifier, EntityType.DOCUMENT,
                    new EntityReference("XWiki", EntityType.SPACE, new WikiReference("local"))))
                            .thenReturn(new DocumentReference("local", targetSpace, "Admin"));
        }
    }
}