/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.itest.client; import java.io.IOException; import org.jdom.JDOMException; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.mock.web.MockHttpServletRequest; import com.enonic.cms.api.client.model.CreateUserParams; import com.enonic.cms.api.client.model.JoinGroupsParams; import com.enonic.cms.api.client.model.user.UserInfo; import com.enonic.cms.api.plugin.ext.userstore.UserFieldType; import com.enonic.cms.api.plugin.ext.userstore.UserStoreConfig; import com.enonic.cms.core.client.InternalClient; import com.enonic.cms.core.config.ConfigProperties; import com.enonic.cms.core.security.PortalSecurityHolder; import com.enonic.cms.core.security.group.GroupType; import com.enonic.cms.core.security.user.User; import com.enonic.cms.core.security.user.UserEntity; import com.enonic.cms.core.security.user.UserType; import com.enonic.cms.core.security.userstore.UserStoreEntity; import com.enonic.cms.core.security.userstore.connector.config.UserStoreConnectorConfigLoader; import com.enonic.cms.core.servlet.ServletRequestAccessor; import com.enonic.cms.itest.AbstractSpringTest; import com.enonic.cms.itest.userstore.MemUserDatabase; import com.enonic.cms.itest.util.DomainFactory; import com.enonic.cms.itest.util.DomainFixture; import static org.junit.Assert.*; public class InternalClientImpl_CreateUserTest extends AbstractSpringTest { @Autowired @Qualifier("localClient") private InternalClient internalClient; @Autowired private DomainFixture fixture; @Autowired private UserStoreConnectorConfigLoader userStoreConnectorConfigLoader; @Autowired private MemUserDatabase userDatabase; @Before public void before() throws IOException, JDOMException { fixture.initSystemData(); fixture.createAndStoreNormalUserWithUserGroup( "testuser", "Test user", "testuserstore" ); MockHttpServletRequest request = new MockHttpServletRequest(); request.setRemoteAddr( "127.0.0.1" ); ServletRequestAccessor.setRequest( request ); PortalSecurityHolder.setAnonUser( fixture.findUserByName( User.ANONYMOUS_UID ).getKey() ); PortalSecurityHolder.setLoggedInUser( fixture.findUserByName( "testuser" ).getKey() ); PortalSecurityHolder.setImpersonatedUser( fixture.findUserByName( "testuser" ).getKey() ); } @Test public void create_user_in_local_userstore() throws Exception { clientLogin( "admin" ); // exercise: CreateUserParams params = new CreateUserParams(); params.userstore = "testuserstore"; params.username = "test1"; params.password = "password"; params.email = "jvs@enonic.com"; params.userInfo.setFirstName( "Jorund Vier" ); params.userInfo.setLastName( "Skriubakken" ); String userKey = internalClient.createUser( params ); // verify: assertNotNull( userKey ); UserEntity actualUser = fixture.findUserByName( "test1" ); assertEquals( "jvs@enonic.com", actualUser.getEmail() ); assertEquals( "test1", actualUser.getName() ); assertEquals( "Jorund Vier", actualUser.getUserFields().getFirstName() ); assertEquals( "Skriubakken", actualUser.getUserFields().getLastName() ); } @Test public void create_user_in_local_userstore_with_name_equals_email() throws Exception { clientLogin( "admin" ); // exercise: CreateUserParams params = new CreateUserParams(); params.userstore = "testuserstore"; params.username = "jvs@enonic.com"; params.password = "password"; params.email = "jvs@enonic.com"; params.userInfo.setFirstName( "Jorund Vier" ); params.userInfo.setLastName( "Skriubakken" ); String userKey = internalClient.createUser( params ); // verify: assertNotNull( userKey ); UserEntity actualUser = fixture.findUserByName( "jvs@enonic.com" ); assertEquals( "jvs@enonic.com", actualUser.getEmail() ); assertEquals( "jvs@enonic.com", actualUser.getName() ); } @Test public void create_user_as_root() throws Exception { clientLogin( "admin" ); // exercise: CreateUserParams params = new CreateUserParams(); params.userstore = "testuserstore"; params.username = "jvs"; params.password = "password"; params.email = "jvs@enonic.com"; UserInfo userInfo = new UserInfo(); userInfo.setFirstName( "Jorund" ); userInfo.setLastName( "Skriubakken" ); params.userInfo = userInfo; String userKey = internalClient.createUser( params ); // verify: assertNotNull( userKey ); } @Test public void create_user_as_an_enterprise_admin() throws Exception { // setup: create a user and make it member of the enterprise admins group clientLogin( "admin" ); fixture.createAndStoreUserAndUserGroup( "testea", "password", "Test ea", UserType.NORMAL, "testuserstore" ); JoinGroupsParams joinGroupsParams = new JoinGroupsParams(); joinGroupsParams.user = "#" + fixture.findUserByName( "testea" ).getKey().toString(); joinGroupsParams.groupsToJoin = new String[]{"#" + fixture.findGroupByType( GroupType.ENTERPRISE_ADMINS ).getGroupKey().toString()}; internalClient.joinGroups( joinGroupsParams ); fixture.flushAndClearHibernateSession(); // setup: login clientLogin( "testea" ); // exercise: CreateUserParams params = new CreateUserParams(); params.userstore = "testuserstore"; params.username = "jvs"; params.password = "password"; params.email = "jvs@enonic.com"; UserInfo userInfo = new UserInfo(); userInfo.setFirstName( "Jorund" ); userInfo.setLastName( "Skriubakken" ); params.userInfo = userInfo; String userKey = internalClient.createUser( params ); // verify: assertNotNull( userKey ); } @Test public void create_user_in_remote_userstore() throws Exception { setupRemoteUserStore(); clientLogin( "admin" ); // exercise: CreateUserParams params = new CreateUserParams(); params.userstore = "myRemoteUserStore"; params.username = "test2"; params.password = "password"; params.email = "jvs@enonic.com"; params.userInfo.setFirstName( "Jorund Vier" ); params.userInfo.setLastName( "Skriubakken" ); String userKey = internalClient.createUser( params ); // verify: assertNotNull( userKey ); UserEntity actualUser = fixture.findUserByName( "test2" ); assertEquals( "jvs@enonic.com", actualUser.getEmail() ); assertEquals( "test2", actualUser.getName() ); assertEquals( "Jorund Vier", actualUser.getUserFields().getFirstName() ); assertEquals( "Skriubakken", actualUser.getUserFields().getLastName() ); } private void clientLogin( String username ) { UserEntity user = fixture.findUserByName( username ); PortalSecurityHolder.setLoggedInUser( user.getKey() ); PortalSecurityHolder.setImpersonatedUser( user.getKey() ); } private void setupRemoteUserStore() throws Exception { this.userDatabase.clear(); final ConfigProperties properties = new ConfigProperties(); properties.setProperty( "cms.userstore.connector.myRemoteUserStore.userPolicy", "all" ); properties.setProperty( "cms.userstore.connector.myRemoteUserStore.plugin", "mem" ); this.userStoreConnectorConfigLoader.setProperties( properties ); final DomainFactory factory = this.fixture.getFactory(); UserStoreEntity userStore = factory.createUserStore( "myRemoteUserStore", "myRemoteUserStore", true ); UserStoreConfig userStoreConfig = new UserStoreConfig(); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.FIRST_NAME, "remote, required" ) ); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.LAST_NAME, "remote, required" ) ); userStore.setConfig( userStoreConfig ); this.fixture.save( userStore ); this.fixture.save( factory.createGroupInUserstore( GroupType.AUTHENTICATED_USERS.getName(), GroupType.AUTHENTICATED_USERS, "myRemoteUserStore" ) ); this.fixture.save( factory.createGroupInUserstore( GroupType.USERSTORE_ADMINS.getName(), GroupType.USERSTORE_ADMINS, "myRemoteUserStore" ) ); this.fixture.flushAndClearHibernateSession(); } }