/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.itest.client;
import java.io.IOException;
import java.text.ParseException;
import org.jdom.JDOMException;
import org.junit.After;
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.esl.util.DateUtil;
import com.enonic.cms.api.client.model.UpdateUserParams;
import com.enonic.cms.api.client.model.user.UserInfo;
import com.enonic.cms.api.plugin.ext.userstore.UserStoreConfigField;
import com.enonic.cms.core.client.InternalClient;
import com.enonic.cms.core.security.PortalSecurityHolder;
import com.enonic.cms.core.security.SecurityService;
import com.enonic.cms.core.security.user.StoreNewUserCommand;
import com.enonic.cms.core.security.user.UserKey;
import com.enonic.cms.core.security.user.UserType;
import com.enonic.cms.core.security.userstore.StoreNewUserStoreCommand;
import com.enonic.cms.core.security.userstore.UserStoreKey;
import com.enonic.cms.core.security.userstore.UserStoreService;
import com.enonic.cms.api.plugin.ext.userstore.UserStoreConfig;
import com.enonic.cms.core.servlet.ServletRequestAccessor;
import com.enonic.cms.api.plugin.ext.userstore.UserFieldType;
import com.enonic.cms.api.plugin.ext.userstore.UserFields;
import com.enonic.cms.itest.AbstractSpringTest;
import com.enonic.cms.itest.util.DomainFixture;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNull;
public class InternalClientImpl_UpdateUserTest
extends AbstractSpringTest
{
@Autowired
@Qualifier("localClient")
private InternalClient internalClient;
@Autowired
private SecurityService securityService;
@Autowired
private UserStoreService userStoreService;
@Autowired
private DomainFixture fixture;
@Before
public void before()
throws IOException, JDOMException
{
fixture.initSystemData();
MockHttpServletRequest request = new MockHttpServletRequest();
request.setRemoteAddr( "127.0.0.1" );
ServletRequestAccessor.setRequest( request );
PortalSecurityHolder.setAnonUser( fixture.findUserByName( "anonymous" ).getKey() );
}
@After
public void after()
{
securityService.logoutPortalUser();
}
@Test
// UpdateUserParams.userInfo.phone = null -> row for phone field must be removed if existing
public void update_phone_to_null()
{
prepareUserStoreConfig( UserFieldType.PHONE );
UserFields userFields = new UserFields();
userFields.setFirstName( "First name" );
userFields.setLastName( "Last name" );
userFields.setInitials( "INI" );
userFields.setPhone( "2771188" );
createNormalUser( "testuser", "myLocalStore", userFields );
// verify
UserFields resultUserFields = fixture.findUserByName( "testuser" ).getUserFields();
assertEquals( "INI", resultUserFields.getInitials() );
assertEquals( "2771188", resultUserFields.getPhone() );
loginPortalUser( "testuser" );
// exercise
UpdateUserParams params = new UpdateUserParams();
params.userstore = "myLocalStore";
params.username = "testuser";
params.displayName = "dName";
params.email = "email@company.com";
UserInfo updUserInfo = new UserInfo();
updUserInfo.setFirstName( "First name changed" );
updUserInfo.setLastName( "Last name changed" );
updUserInfo.setInitials( "Initials changed" );
updUserInfo.setPhone( null );
params.userInfo = updUserInfo;
params.updateStrategy = UpdateUserParams.UpdateStrategy.UPDATE;
internalClient.updateUser( params );
// verify
resultUserFields = fixture.findUserByName( "testuser" ).getUserFields();
assertNull( resultUserFields.getPhone() );
assertEquals( "Initials changed", resultUserFields.getInitials() );
}
@Test
// UpdateUserParams.userInfo.phone = <blank> -> row for phone field must be updated or created with blank
public void update_phone_to_empty()
{
prepareUserStoreConfig( UserFieldType.PHONE );
UserFields userFields = new UserFields();
userFields.setFirstName( "First name" );
userFields.setLastName( "Last name" );
userFields.setInitials( "INI" );
userFields.setPhone( "2771188" );
createNormalUser( "testuser", "myLocalStore", userFields );
// verify
UserFields resultUserFields = fixture.findUserByName( "testuser" ).getUserFields();
assertEquals( "INI", resultUserFields.getInitials() );
assertEquals( "2771188", resultUserFields.getPhone() );
loginPortalUser( "testuser" );
// exercise
UpdateUserParams params = new UpdateUserParams();
params.userstore = "myLocalStore";
params.username = "testuser";
params.displayName = "dName";
params.email = "email@company.com";
UserInfo updUserInfo = new UserInfo();
updUserInfo.setFirstName( "First name changed" );
updUserInfo.setLastName( "Last name changed" );
updUserInfo.setInitials( "Initials changed" );
updUserInfo.setPhone( "" );
params.userInfo = updUserInfo;
params.updateStrategy = UpdateUserParams.UpdateStrategy.UPDATE;
internalClient.updateUser( params );
// verify
resultUserFields = fixture.findUserByName( "testuser" ).getUserFields();
assertEquals( "", resultUserFields.getPhone() );
assertEquals( "Initials changed", resultUserFields.getInitials() );
}
@Test
// UpdateUserParams.userInfo.phone = 1234 -> row for phone field must be updated or created with 1234
public void update_phone_to_valued()
{
prepareUserStoreConfig( UserFieldType.PHONE );
UserFields userFields = new UserFields();
userFields.setFirstName( "First name" );
userFields.setLastName( "Last name" );
userFields.setInitials( "INI" );
userFields.setPhone( "2771188" );
createNormalUser( "testuser", "myLocalStore", userFields );
// verify
UserFields resultUserFields = fixture.findUserByName( "testuser" ).getUserFields();
assertEquals( "INI", resultUserFields.getInitials() );
assertEquals( "2771188", resultUserFields.getPhone() );
loginPortalUser( "testuser" );
// exercise
UpdateUserParams params = new UpdateUserParams();
params.userstore = "myLocalStore";
params.username = "testuser";
params.displayName = "dName";
params.email = "email@company.com";
UserInfo updUserInfo = new UserInfo();
updUserInfo.setFirstName( "First name changed" );
updUserInfo.setLastName( "Last name changed" );
updUserInfo.setInitials( "Initials changed" );
updUserInfo.setPhone( "1234" );
params.userInfo = updUserInfo;
params.updateStrategy = UpdateUserParams.UpdateStrategy.UPDATE;
internalClient.updateUser( params );
// verify
resultUserFields = fixture.findUserByName( "testuser" ).getUserFields();
assertEquals( "1234", resultUserFields.getPhone() );
assertEquals( "Initials changed", resultUserFields.getInitials() );
}
@Test
// UpdateUserParams.userInfo.birthday = null -> birthday field for user should end up being removed from db (row in tUserfield)
public void update_birthday_to_null()
throws ParseException
{
prepareUserStoreConfig( UserFieldType.BIRTHDAY );
UserFields userFields = new UserFields();
userFields.setFirstName( "First name" );
userFields.setLastName( "Last name" );
userFields.setInitials( "INI" );
userFields.setBirthday( DateUtil.parseDate( "12.12.2012" ) );
createNormalUser( "testuser", "myLocalStore", userFields );
// verify
UserFields resultUserFields = fixture.findUserByName( "testuser" ).getUserFields();
assertEquals( "12.12.2012", DateUtil.formatDate( resultUserFields.getBirthday() ) );
assertEquals( "INI", resultUserFields.getInitials() );
loginPortalUser( "testuser" );
// exercise
UpdateUserParams params = new UpdateUserParams();
params.userstore = "myLocalStore";
params.username = "testuser";
params.displayName = "dName";
params.email = "email@company.com";
UserInfo updUserInfo = new UserInfo();
updUserInfo.setFirstName( "First name changed" );
updUserInfo.setLastName( "Last name changed" );
updUserInfo.setInitials( "Initials changed" );
updUserInfo.setBirthday( null );
params.userInfo = updUserInfo;
params.updateStrategy = UpdateUserParams.UpdateStrategy.UPDATE;
internalClient.updateUser( params );
// verify
resultUserFields = fixture.findUserByName( "testuser" ).getUserFields();
assertNull( resultUserFields.getBirthday() );
assertEquals( "Initials changed", resultUserFields.getInitials() );
}
@Test
// UpdateUserParams.userInfo.birthday = <date> -> birthday field in table tUserfield should end up being created if missing or updated if already existing
public void update_birthday_to_valued()
throws ParseException
{
prepareUserStoreConfig( UserFieldType.BIRTHDAY );
UserFields userFields = new UserFields();
userFields.setFirstName( "First name" );
userFields.setLastName( "Last name" );
userFields.setInitials( "INI" );
userFields.setBirthday( DateUtil.parseDate( "12.12.2012" ) );
createNormalUser( "testuser", "myLocalStore", userFields );
// verify
UserFields resultUserFields = fixture.findUserByName( "testuser" ).getUserFields();
assertNotNull( resultUserFields.getBirthday() );
assertEquals( "12.12.2012", DateUtil.formatDate( resultUserFields.getBirthday() ) );
assertEquals( "INI", resultUserFields.getInitials() );
loginPortalUser( "testuser" );
// exercise
UpdateUserParams params = new UpdateUserParams();
params.userstore = "myLocalStore";
params.username = "testuser";
params.displayName = "dName";
params.email = "email@company.com";
UserInfo updUserInfo = new UserInfo();
updUserInfo.setFirstName( "First name changed" );
updUserInfo.setLastName( "Last name changed" );
updUserInfo.setInitials( "Initials changed" );
updUserInfo.setBirthday( DateUtil.parseDate( "22.12.2012" ) );
params.userInfo = updUserInfo;
params.updateStrategy = UpdateUserParams.UpdateStrategy.UPDATE;
internalClient.updateUser( params );
// verify
resultUserFields = fixture.findUserByName( "testuser" ).getUserFields();
assertEquals( "22.12.2012", DateUtil.formatDate( resultUserFields.getBirthday() ) );
assertEquals( "Initials changed", resultUserFields.getInitials() );
}
@Test
// UpdateUserParams.userInfo.phone = null -> phone field must not be changed
public void modify_phone_to_null()
{
prepareUserStoreConfig( UserFieldType.PHONE );
UserFields userFields = new UserFields();
userFields.setFirstName( "First name" );
userFields.setLastName( "Last name" );
userFields.setInitials( "INI" );
userFields.setPhone( "2771188" );
createNormalUser( "testuser", "myLocalStore", userFields );
// verify
UserFields resultUserFields = fixture.findUserByName( "testuser" ).getUserFields();
assertEquals( "INI", resultUserFields.getInitials() );
assertEquals( "2771188", resultUserFields.getPhone() );
loginPortalUser( "testuser" );
// exercise
UpdateUserParams params = new UpdateUserParams();
params.userstore = "myLocalStore";
params.username = "testuser";
params.displayName = "dName";
params.email = "email@company.com";
UserInfo updUserInfo = new UserInfo();
updUserInfo.setFirstName( "First name changed" );
updUserInfo.setLastName( "Last name changed" );
updUserInfo.setInitials( "Initials changed" );
updUserInfo.setPhone( null );
params.userInfo = updUserInfo;
params.updateStrategy = UpdateUserParams.UpdateStrategy.MODIFY;
internalClient.updateUser( params );
// verify
resultUserFields = fixture.findUserByName( "testuser" ).getUserFields();
assertEquals( "2771188", resultUserFields.getPhone() );
assertEquals( "Initials changed", resultUserFields.getInitials() );
}
@Test
// UpdateUserParams.userInfo.phone = <blank> -> row for phone field must be updated or created with blank
public void modify_phone_to_empty()
{
prepareUserStoreConfig( UserFieldType.PHONE );
UserFields userFields = new UserFields();
userFields.setFirstName( "First name" );
userFields.setLastName( "Last name" );
userFields.setInitials( "INI" );
userFields.setPhone( "2771188" );
createNormalUser( "testuser", "myLocalStore", userFields );
// verify
UserFields resultUserFields = fixture.findUserByName( "testuser" ).getUserFields();
assertEquals( "INI", resultUserFields.getInitials() );
assertEquals( "2771188", resultUserFields.getPhone() );
loginPortalUser( "testuser" );
// exercise
UpdateUserParams params = new UpdateUserParams();
params.userstore = "myLocalStore";
params.username = "testuser";
params.displayName = "dName";
params.email = "email@company.com";
UserInfo updUserInfo = new UserInfo();
updUserInfo.setFirstName( "First name changed" );
updUserInfo.setLastName( "Last name changed" );
updUserInfo.setInitials( "Initials changed" );
updUserInfo.setPhone( "" );
params.userInfo = updUserInfo;
params.updateStrategy = UpdateUserParams.UpdateStrategy.MODIFY;
internalClient.updateUser( params );
// verify
resultUserFields = fixture.findUserByName( "testuser" ).getUserFields();
assertEquals( "", resultUserFields.getPhone() );
assertEquals( "Initials changed", resultUserFields.getInitials() );
}
@Test
// UpdateUserParams.userInfo.phone = 1234 -> row for phone field must be updated or created with 1234
public void modify_phone_to_valued()
{
prepareUserStoreConfig( UserFieldType.PHONE );
UserFields userFields = new UserFields();
userFields.setFirstName( "First name" );
userFields.setLastName( "Last name" );
userFields.setInitials( "INI" );
userFields.setPhone( "2771188" );
createNormalUser( "testuser", "myLocalStore", userFields );
// verify
UserFields resultUserFields = fixture.findUserByName( "testuser" ).getUserFields();
assertEquals( "INI", resultUserFields.getInitials() );
assertEquals( "2771188", resultUserFields.getPhone() );
loginPortalUser( "testuser" );
// exercise
UpdateUserParams params = new UpdateUserParams();
params.userstore = "myLocalStore";
params.username = "testuser";
params.displayName = "dName";
params.email = "email@company.com";
UserInfo updUserInfo = new UserInfo();
updUserInfo.setFirstName( "First name changed" );
updUserInfo.setLastName( "Last name changed" );
updUserInfo.setInitials( "Initials changed" );
updUserInfo.setPhone( "1234" );
params.userInfo = updUserInfo;
params.updateStrategy = UpdateUserParams.UpdateStrategy.MODIFY;
internalClient.updateUser( params );
// verify
resultUserFields = fixture.findUserByName( "testuser" ).getUserFields();
assertEquals( "1234", resultUserFields.getPhone() );
assertEquals( "Initials changed", resultUserFields.getInitials() );
}
@Test
// UpdateUserParams.userInfo.birthday = null -> birthday field must not be changed
public void modify_birthday_to_null()
throws ParseException
{
prepareUserStoreConfig( UserFieldType.BIRTHDAY );
UserFields userFields = new UserFields();
userFields.setFirstName( "First name" );
userFields.setLastName( "Last name" );
userFields.setInitials( "INI" );
userFields.setBirthday( DateUtil.parseDate( "12.12.2012" ) );
createNormalUser( "testuser", "myLocalStore", userFields );
// verify
UserFields resultUserFields = fixture.findUserByName( "testuser" ).getUserFields();
assertEquals( "12.12.2012", DateUtil.formatDate( resultUserFields.getBirthday() ) );
assertEquals( "INI", resultUserFields.getInitials() );
loginPortalUser( "testuser" );
// exercise
UpdateUserParams params = new UpdateUserParams();
params.userstore = "myLocalStore";
params.username = "testuser";
params.displayName = "dName";
params.email = "email@company.com";
UserInfo updUserInfo = new UserInfo();
updUserInfo.setFirstName( "First name changed" );
updUserInfo.setLastName( "Last name changed" );
updUserInfo.setInitials( "Initials changed" );
updUserInfo.setBirthday( null );
params.userInfo = updUserInfo;
params.updateStrategy = UpdateUserParams.UpdateStrategy.MODIFY;
internalClient.updateUser( params );
// verify
resultUserFields = fixture.findUserByName( "testuser" ).getUserFields();
assertEquals( "12.12.2012", DateUtil.formatDate( resultUserFields.getBirthday() ) );
assertEquals( "Initials changed", resultUserFields.getInitials() );
}
@Test
// UpdateUserParams.userInfo.birthday = <date> -> birthday field in table tUserfield should end up being created if missing or updated if already existing
public void modify_birthday_to_valued()
throws ParseException
{
prepareUserStoreConfig( UserFieldType.BIRTHDAY );
UserFields userFields = new UserFields();
userFields.setFirstName( "First name" );
userFields.setLastName( "Last name" );
userFields.setInitials( "INI" );
userFields.setBirthday( DateUtil.parseDate( "12.12.2012" ) );
createNormalUser( "testuser", "myLocalStore", userFields );
// verify
UserFields resultUserFields = fixture.findUserByName( "testuser" ).getUserFields();
assertNotNull( resultUserFields.getBirthday() );
assertEquals( "12.12.2012", DateUtil.formatDate( resultUserFields.getBirthday() ) );
assertEquals( "INI", resultUserFields.getInitials() );
loginPortalUser( "testuser" );
// exercise
UpdateUserParams params = new UpdateUserParams();
params.userstore = "myLocalStore";
params.username = "testuser";
params.displayName = "dName";
params.email = "email@company.com";
UserInfo updUserInfo = new UserInfo();
updUserInfo.setFirstName( "First name changed" );
updUserInfo.setLastName( "Last name changed" );
updUserInfo.setInitials( "Initials changed" );
updUserInfo.setBirthday( DateUtil.parseDate( "22.12.2012" ) );
params.userInfo = updUserInfo;
params.updateStrategy = UpdateUserParams.UpdateStrategy.MODIFY;
internalClient.updateUser( params );
// verify
resultUserFields = fixture.findUserByName( "testuser" ).getUserFields();
assertEquals( "22.12.2012", DateUtil.formatDate( resultUserFields.getBirthday() ) );
assertEquals( "Initials changed", resultUserFields.getInitials() );
}
private void prepareUserStoreConfig( UserFieldType type )
{
UserStoreConfig userStoreConfig = new UserStoreConfig();
userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.FIRST_NAME, "required" ) );
userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.LAST_NAME, "required" ) );
userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( UserFieldType.INITIALS, "required" ) );
userStoreConfig.addUserFieldConfig( createUserStoreUserFieldConfig( type, "" ) );
createLocalUserStore( "myLocalStore", true, userStoreConfig );
fixture.flushAndClearHibernateSession();
}
private UserStoreConfigField createUserStoreUserFieldConfig( UserFieldType type, String properties )
{
UserStoreConfigField fieldConfig = new UserStoreConfigField( type );
fieldConfig.setRemote( properties.contains( "remote" ) );
fieldConfig.setReadOnly( properties.contains( "read-only" ) );
fieldConfig.setRequired( properties.contains( "required" ) );
fieldConfig.setIso( properties.contains( "iso" ) );
return fieldConfig;
}
private void loginPortalUser( String userName )
{
PortalSecurityHolder.setImpersonatedUser( fixture.findUserByName( userName ).getKey() );
PortalSecurityHolder.setLoggedInUser( fixture.findUserByName( userName ).getKey() );
}
private UserStoreKey createLocalUserStore( String name, boolean defaultStore, UserStoreConfig config )
{
StoreNewUserStoreCommand command = new StoreNewUserStoreCommand();
command.setStorer( fixture.findUserByName( "admin" ).getKey() );
command.setName( name );
command.setDefaultStore( defaultStore );
command.setConfig( config );
return userStoreService.storeNewUserStore( command );
}
private UserKey createNormalUser( String userName, String userStoreName, UserFields userFields )
{
StoreNewUserCommand command = new StoreNewUserCommand();
command.setStorer( fixture.findUserByName( "admin" ).getKey() );
command.setUsername( userName );
command.setUserStoreKey( fixture.findUserStoreByName( userStoreName ).getKey() );
command.setAllowAnyUserAccess( true );
command.setEmail( userName + "@example.com" );
command.setPassword( "password" );
command.setType( UserType.NORMAL );
command.setDisplayName( userName );
command.setUserFields( userFields );
return userStoreService.storeNewUser( command );
}
}