mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-12 00:15:44 +01:00
#781 added missing unit tests for authentication related classes
This commit is contained in:
@@ -85,8 +85,8 @@ public class AdminDetector {
|
||||
|
||||
private boolean isAdminByConfiguration(User user, Collection<String> groups) {
|
||||
boolean result = false;
|
||||
|
||||
Set<String> adminUsers = configuration.getAdminUsers();
|
||||
|
||||
if (adminUsers != null) {
|
||||
result = adminUsers.contains(user.getName());
|
||||
}
|
||||
|
||||
@@ -32,7 +32,6 @@ package sonia.scm.security;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import java.util.Set;
|
||||
import org.apache.shiro.authc.DisabledAccountException;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import sonia.scm.HandlerEvent;
|
||||
|
||||
@@ -0,0 +1,121 @@
|
||||
/**
|
||||
* Copyright (c) 2014, Sebastian Sdorra
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of SCM-Manager; nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* http://bitbucket.org/sdorra/scm-manager
|
||||
*
|
||||
*/
|
||||
|
||||
package sonia.scm.security;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import java.util.Set;
|
||||
import org.junit.Test;
|
||||
import static org.junit.Assert.*;
|
||||
import org.junit.Before;
|
||||
import sonia.scm.config.ScmConfiguration;
|
||||
import sonia.scm.user.User;
|
||||
import sonia.scm.user.UserTestData;
|
||||
|
||||
/**
|
||||
* Unit tests for {@link AdminDetector}.
|
||||
*
|
||||
* @author Sebastian Sdorra
|
||||
* @since 1.52
|
||||
*/
|
||||
public class AdminDetectorTest {
|
||||
|
||||
private ScmConfiguration configuration;
|
||||
private AdminDetector detector;
|
||||
|
||||
@Before
|
||||
public void setUpObjectUnderTest(){
|
||||
configuration = new ScmConfiguration();
|
||||
detector = new AdminDetector(configuration);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests {@link AdminDetector#checkForAuthenticatedAdmin(User, Set)} with configured admin users.
|
||||
*/
|
||||
@Test
|
||||
public void testCheckForAuthenticatedAdminWithConfiguredAdminUsers() {
|
||||
configuration.setAdminUsers(ImmutableSet.of("slarti"));
|
||||
|
||||
User slarti = UserTestData.createSlarti();
|
||||
slarti.setAdmin(false);
|
||||
Set<String> groups = ImmutableSet.of();
|
||||
|
||||
detector.checkForAuthenticatedAdmin(slarti, groups);
|
||||
assertTrue(slarti.isAdmin());
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests {@link AdminDetector#checkForAuthenticatedAdmin(User, Set)} with configured admin group.
|
||||
*/
|
||||
@Test
|
||||
public void testCheckForAuthenticatedAdminWithConfiguredAdminGroup() {
|
||||
configuration.setAdminGroups(ImmutableSet.of("heartOfGold"));
|
||||
|
||||
User slarti = UserTestData.createSlarti();
|
||||
slarti.setAdmin(false);
|
||||
Set<String> groups = ImmutableSet.of("heartOfGold");
|
||||
|
||||
detector.checkForAuthenticatedAdmin(slarti, groups);
|
||||
assertTrue(slarti.isAdmin());
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests {@link AdminDetector#checkForAuthenticatedAdmin(User, Set)} with non matching configuration.
|
||||
*/
|
||||
@Test
|
||||
public void testCheckForAuthenticatedAdminWithNonMatchinConfiguration() {
|
||||
configuration.setAdminUsers(ImmutableSet.of("slarti"));
|
||||
configuration.setAdminGroups(ImmutableSet.of("heartOfGold"));
|
||||
|
||||
User trillian = UserTestData.createTrillian();
|
||||
trillian.setAdmin(false);
|
||||
Set<String> groups = ImmutableSet.of("puzzle42");
|
||||
|
||||
detector.checkForAuthenticatedAdmin(trillian, groups);
|
||||
assertFalse(trillian.isAdmin());
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests {@link AdminDetector#checkForAuthenticatedAdmin(User, Set)} with user which is already admin.
|
||||
*/
|
||||
@Test
|
||||
public void testCheckForAuthenticatedAdminWithUserWhichIsAlreadyAdmin() {
|
||||
configuration.setAdminUsers(ImmutableSet.of("slarti"));
|
||||
configuration.setAdminGroups(ImmutableSet.of("heartOfGold"));
|
||||
|
||||
User trillian = UserTestData.createTrillian();
|
||||
trillian.setAdmin(true);
|
||||
Set<String> groups = ImmutableSet.of("puzzle42");
|
||||
|
||||
detector.checkForAuthenticatedAdmin(trillian, groups);
|
||||
assertTrue(trillian.isAdmin());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
/**
|
||||
* Copyright (c) 2014, Sebastian Sdorra
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of SCM-Manager; nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* http://bitbucket.org/sdorra/scm-manager
|
||||
*
|
||||
*/
|
||||
|
||||
package sonia.scm.security;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import java.util.Set;
|
||||
import org.apache.shiro.authc.AuthenticationInfo;
|
||||
import org.apache.shiro.authc.DisabledAccountException;
|
||||
import org.apache.shiro.authc.UsernamePasswordToken;
|
||||
import org.junit.Test;
|
||||
import static org.junit.Assert.*;
|
||||
import static org.hamcrest.Matchers.*;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.InjectMocks;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.Mockito;
|
||||
import static org.mockito.Mockito.*;
|
||||
import org.mockito.runners.MockitoJUnitRunner;
|
||||
import sonia.scm.group.GroupNames;
|
||||
import sonia.scm.user.User;
|
||||
import sonia.scm.user.UserTestData;
|
||||
import sonia.scm.web.security.AuthenticationResult;
|
||||
|
||||
/**
|
||||
* Unit tests for {@link AuthenticationInfoCollector}.
|
||||
*
|
||||
* @author Sebastian Sdorra
|
||||
* @since 1.52
|
||||
*/
|
||||
@RunWith(MockitoJUnitRunner.class)
|
||||
public class AuthenticationInfoCollectorTest {
|
||||
|
||||
@Mock
|
||||
private LocalDatabaseSynchronizer synchronizer;
|
||||
|
||||
@Mock
|
||||
private GroupCollector groupCollector;
|
||||
|
||||
@Mock
|
||||
private SessionStore sessionStore;
|
||||
|
||||
@InjectMocks
|
||||
private AuthenticationInfoCollector collector;
|
||||
|
||||
/**
|
||||
* Tests {@link AuthenticationInfoCollector#createAuthenticationInfo(UsernamePasswordToken, AuthenticationResult)}.
|
||||
*/
|
||||
@Test
|
||||
public void testCreateAuthenticationInfo() {
|
||||
User trillian = UserTestData.createTrillian();
|
||||
UsernamePasswordToken token = new UsernamePasswordToken(trillian.getId(), "secret");
|
||||
AuthenticationResult result = new AuthenticationResult(trillian);
|
||||
Set<String> groups = ImmutableSet.of("puzzle42", "heartOfGold");
|
||||
when(groupCollector.collectGroups(Mockito.any(AuthenticationResult.class))).thenReturn(groups);
|
||||
|
||||
AuthenticationInfo authc = collector.createAuthenticationInfo(token, result);
|
||||
verify(synchronizer).synchronize(trillian, groups);
|
||||
verify(sessionStore).store(token);
|
||||
|
||||
assertEquals(trillian.getId(), authc.getPrincipals().getPrimaryPrincipal());
|
||||
assertEquals(trillian, authc.getPrincipals().oneByType(User.class));
|
||||
assertThat(authc.getPrincipals().oneByType(GroupNames.class), contains(groups.toArray(new String[0])));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests {@link AuthenticationInfoCollector#createAuthenticationInfo(UsernamePasswordToken, AuthenticationResult)}
|
||||
* with disabled user.
|
||||
*/
|
||||
@Test(expected = DisabledAccountException.class)
|
||||
public void testCreateAuthenticationInfoWithDisabledUser() {
|
||||
User trillian = UserTestData.createTrillian();
|
||||
trillian.setActive(false);
|
||||
UsernamePasswordToken token = new UsernamePasswordToken(trillian.getId(), "secret");
|
||||
AuthenticationResult result = new AuthenticationResult(trillian);
|
||||
Set<String> groups = ImmutableSet.of("puzzle42", "heartOfGold");
|
||||
when(groupCollector.collectGroups(Mockito.any(AuthenticationResult.class))).thenReturn(groups);
|
||||
|
||||
collector.createAuthenticationInfo(token, result);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
/**
|
||||
* Copyright (c) 2014, Sebastian Sdorra
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of SCM-Manager; nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* http://bitbucket.org/sdorra/scm-manager
|
||||
*
|
||||
*/
|
||||
|
||||
package sonia.scm.security;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import java.util.Set;
|
||||
import jdk.nashorn.internal.ir.annotations.Immutable;
|
||||
import org.junit.Test;
|
||||
import static org.junit.Assert.*;
|
||||
import static org.mockito.Mockito.*;
|
||||
import static org.hamcrest.Matchers.*;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.InjectMocks;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.runners.MockitoJUnitRunner;
|
||||
import sonia.scm.group.Group;
|
||||
import sonia.scm.group.GroupManager;
|
||||
import sonia.scm.user.UserTestData;
|
||||
import sonia.scm.web.security.AuthenticationResult;
|
||||
|
||||
/**
|
||||
* Unit tests for {@link GroupCollector}.
|
||||
*
|
||||
* @author Sebastian Sdorra
|
||||
* @since 1.52
|
||||
*/
|
||||
@RunWith(MockitoJUnitRunner.class)
|
||||
public class GroupCollectorTest {
|
||||
|
||||
@Mock
|
||||
private GroupManager groupManager;
|
||||
|
||||
@InjectMocks
|
||||
private GroupCollector collector;
|
||||
|
||||
/**
|
||||
* Tests {@link GroupCollector#collectGroups(AuthenticationResult)} without groups from authenticator.
|
||||
*/
|
||||
@Test
|
||||
public void testCollectGroupsWithoutAuthenticatorGroups() {
|
||||
Set<String> groups = collector.collectGroups(new AuthenticationResult(UserTestData.createSlarti()));
|
||||
assertThat(groups, containsInAnyOrder("_authenticated"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests {@link GroupCollector#collectGroups(AuthenticationResult)} with groups from authenticator.
|
||||
*/
|
||||
@Test
|
||||
public void testCollectGroupsWithGroupsFromAuthenticator() {
|
||||
Set<String> authGroups = ImmutableSet.of("puzzle42");
|
||||
Set<String> groups = collector.collectGroups(new AuthenticationResult(UserTestData.createSlarti(), authGroups));
|
||||
assertThat(groups, containsInAnyOrder("_authenticated", "puzzle42"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests {@link GroupCollector#collectGroups(AuthenticationResult)} with groups from db.
|
||||
*/
|
||||
@Test
|
||||
public void testCollectGroupsWithGroupsFromDB() {
|
||||
Set<Group> dbGroups = ImmutableSet.of(new Group("test", "puzzle42"));
|
||||
when(groupManager.getGroupsForMember("slarti")).thenReturn(dbGroups);
|
||||
Set<String> groups = collector.collectGroups(new AuthenticationResult(UserTestData.createSlarti()));
|
||||
assertThat(groups, containsInAnyOrder("_authenticated", "puzzle42"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests {@link GroupCollector#collectGroups(AuthenticationResult)} with groups from db.
|
||||
*/
|
||||
@Test
|
||||
public void testCollectGroupsWithGroupsFromDBAndAuthenticator() {
|
||||
Set<Group> dbGroups = ImmutableSet.of(new Group("test", "puzzle42"));
|
||||
Set<String> authGroups = ImmutableSet.of("heartOfGold");
|
||||
when(groupManager.getGroupsForMember("slarti")).thenReturn(dbGroups);
|
||||
Set<String> groups = collector.collectGroups(new AuthenticationResult(UserTestData.createSlarti(), authGroups));
|
||||
assertThat(groups, containsInAnyOrder("_authenticated", "puzzle42", "heartOfGold"));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
/**
|
||||
* Copyright (c) 2014, Sebastian Sdorra
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of SCM-Manager; nor the names of its
|
||||
* contributors may be used to endorse or promote products derived from this
|
||||
* software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* http://bitbucket.org/sdorra/scm-manager
|
||||
*
|
||||
*/
|
||||
|
||||
package sonia.scm.security;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import org.junit.Test;
|
||||
import static org.junit.Assert.*;
|
||||
import static org.hamcrest.Matchers.*;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.InjectMocks;
|
||||
import org.mockito.Mock;
|
||||
import static org.mockito.Mockito.*;
|
||||
import org.mockito.runners.MockitoJUnitRunner;
|
||||
import sonia.scm.user.User;
|
||||
import sonia.scm.user.UserDAO;
|
||||
import sonia.scm.user.UserManager;
|
||||
import sonia.scm.user.UserTestData;
|
||||
|
||||
/**
|
||||
* Unit tests for {@link LocalDatabaseSynchronizer}.
|
||||
*
|
||||
* @author Sebastian Sdorra
|
||||
* @since 1.52
|
||||
*/
|
||||
@RunWith(MockitoJUnitRunner.class)
|
||||
public class LocalDatabaseSynchronizerTest {
|
||||
|
||||
@Mock
|
||||
private AdminDetector adminSelector;
|
||||
|
||||
@Mock
|
||||
private UserManager userManager;
|
||||
|
||||
@Mock
|
||||
private UserDAO userDAO;
|
||||
|
||||
@InjectMocks
|
||||
private LocalDatabaseSynchronizer synchronizer;
|
||||
|
||||
/**
|
||||
* Tests {@link LocalDatabaseSynchronizer#synchronize(User, java.util.Set)}.
|
||||
*/
|
||||
@Test
|
||||
public void testSynchronizeWithoutDBUser() {
|
||||
User trillian = UserTestData.createTrillian();
|
||||
trillian.setType("local");
|
||||
synchronizer.synchronize(trillian, ImmutableSet.<String>of());
|
||||
verify(userDAO).add(trillian);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests {@link LocalDatabaseSynchronizer#synchronize(sonia.scm.user.User, java.util.Set)}.
|
||||
*/
|
||||
@Test
|
||||
public void testSynchronize() {
|
||||
User trillian = UserTestData.createTrillian();
|
||||
trillian.setDisplayName("Trici");
|
||||
trillian.setType("local");
|
||||
trillian.setAdmin(false);
|
||||
trillian.setActive(true);
|
||||
|
||||
User dbTrillian = UserTestData.createTrillian();
|
||||
dbTrillian.setType("local");
|
||||
dbTrillian.setAdmin(true);
|
||||
dbTrillian.setActive(false);
|
||||
|
||||
when(userDAO.get(trillian.getId())).thenReturn(dbTrillian);
|
||||
|
||||
synchronizer.synchronize(trillian, ImmutableSet.<String>of());
|
||||
assertTrue(trillian.isAdmin());
|
||||
assertFalse(trillian.isActive());
|
||||
verify(userDAO).modify(trillian);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user