/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.itest.security.userstore; import java.util.Locale; import org.joda.time.DateMidnight; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import com.enonic.cms.api.client.model.user.Gender; import com.enonic.cms.core.security.group.DeleteGroupCommand; import com.enonic.cms.core.security.group.GroupEntity; import com.enonic.cms.core.security.group.GroupKey; import com.enonic.cms.core.security.group.GroupSpecification; import com.enonic.cms.core.security.group.GroupType; import com.enonic.cms.core.security.group.StoreNewGroupCommand; import com.enonic.cms.core.security.group.UpdateGroupCommand; import com.enonic.cms.core.security.user.DeleteUserCommand; import com.enonic.cms.core.security.user.ReadOnlyUserFieldPolicyException; import com.enonic.cms.core.security.user.StoreNewUserCommand; import com.enonic.cms.core.security.user.UpdateUserCommand; import com.enonic.cms.core.security.user.UserEntity; import com.enonic.cms.core.security.user.UserKey; import com.enonic.cms.core.security.user.UserSpecification; import com.enonic.cms.core.security.user.UserType; import com.enonic.cms.core.security.userstore.UserStoreConnectorManager; import com.enonic.cms.core.security.userstore.UserStoreEntity; import com.enonic.cms.core.security.userstore.UserStoreService; import com.enonic.cms.api.plugin.ext.userstore.UserStoreConfig; import com.enonic.cms.core.security.userstore.connector.GroupAlreadyExistsException; import com.enonic.cms.api.plugin.ext.userstore.UserField; 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.DomainFactory; import com.enonic.cms.itest.util.DomainFixture; import com.enonic.cms.store.dao.GroupDao; import static org.junit.Assert.*; public class UserStoreServiceImpl_localUserStoreTest extends AbstractSpringTest { private DomainFactory factory; @Autowired private UserStoreConnectorManager userStoreConnectorManager; @Autowired private GroupDao groupDao; @Autowired private DomainFixture fixture; @Autowired private UserStoreService userStoreService; @Before public void setUp() throws Exception { factory = fixture.getFactory(); fixture.initSystemData(); UserStoreEntity userStore = factory.createUserStore( "myLocalUserStore", null, true ); UserStoreConfig userStoreConfig = new UserStoreConfig(); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.FIRST_NAME, "" ) ); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.LAST_NAME, "" ) ); userStore.setConfig( userStoreConfig ); fixture.save( userStore ); } @Test public void storeNewUser_given_userField_which_is_readOnly_then_exception_is_thrown() throws Exception { UserStoreEntity userStore = fixture.findUserStoreByName( "myLocalUserStore" ); UserStoreConfig userStoreConfig = new UserStoreConfig(); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.FIRST_NAME, "read-only" ) ); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.LAST_NAME, "" ) ); userStore.setConfig( userStoreConfig ); fixture.save( userStore ); userStoreConnectorManager.invalidateCachedConfig( userStore.getKey() ); // exercise StoreNewUserCommand createCommand = new StoreNewUserCommand(); createCommand.setUserStoreKey( userStore.getKey() ); createCommand.setUsername( "arn" ); createCommand.setEmail( "arn@test.com" ); createCommand.setDisplayName( "Arn Wyatt-Skriubakken" ); createCommand.setStorer( fixture.findUserByName( "admin" ).getKey() ); createCommand.setPassword( "password" ); UserFields userFields = new UserFields(); userFields.setFirstName( "Arn" ); userFields.setLastName( "Wyatt-Skriubakken" ); createCommand.setUserFields( userFields ); try { userStoreService.storeNewUser( createCommand ); fail( "Expected exception" ); } catch ( Exception e ) { assertTrue( e instanceof ReadOnlyUserFieldPolicyException ); assertTrue( e.getMessage().startsWith( "Read only user field not expected: first-name" ) ); } } @Test public void storeNewUser_given_userField_which_is_not_readOnly_but_others_is_then_exception_is_not_thrown() throws Exception { UserStoreEntity userStore = fixture.findUserStoreByName( "myLocalUserStore" ); UserStoreConfig userStoreConfig = new UserStoreConfig(); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.FIRST_NAME, "read-only" ) ); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.LAST_NAME, "" ) ); userStore.setConfig( userStoreConfig ); fixture.save( userStore ); userStoreConnectorManager.invalidateCachedConfig( userStore.getKey() ); // exercise StoreNewUserCommand createCommand = new StoreNewUserCommand(); createCommand.setUserStoreKey( userStore.getKey() ); createCommand.setUsername( "arn" ); createCommand.setEmail( "arn@test.com" ); createCommand.setDisplayName( "Arn Wyatt-Skriubakken" ); createCommand.setStorer( fixture.findUserByName( "admin" ).getKey() ); createCommand.setPassword( "password" ); UserFields userFields = new UserFields(); userFields.setLastName( "Wyatt-Skriubakken" ); createCommand.setUserFields( userFields ); userStoreService.storeNewUser( createCommand ); assertEquals( null, fixture.findUserByName( "arn" ).getUserFields().getFirstName() ); assertEquals( "Wyatt-Skriubakken", fixture.findUserByName( "arn" ).getUserFields().getLastName() ); } @Test public void updateUser_given_userField_which_is_readOnly_then_exception_is_thrown() throws Exception { // setup: StoreNewUserCommand createCommand = new StoreNewUserCommand(); createCommand.setUserStoreKey( fixture.findUserStoreByName( "myLocalUserStore" ).getKey() ); createCommand.setUsername( "arn" ); createCommand.setEmail( "arn@test.com" ); createCommand.setDisplayName( "Arn Wyatt-Skriubakken" ); createCommand.setStorer( fixture.findUserByName( "admin" ).getKey() ); createCommand.setPassword( "password" ); UserFields userFields = new UserFields(); userFields.setFirstName( "Arn" ); userFields.setLastName( "Wyatt-Skriubakken" ); createCommand.setUserFields( userFields ); UserKey userKey = userStoreService.storeNewUser( createCommand ); // setup: make firstname read only UserStoreEntity userStore = fixture.findUserStoreByName( "myLocalUserStore" ); UserStoreConfig userStoreConfig = new UserStoreConfig(); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.FIRST_NAME, "read-only" ) ); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.LAST_NAME, "" ) ); userStore.setConfig( userStoreConfig ); fixture.save( userStore ); userStoreConnectorManager.invalidateCachedConfig( userStore.getKey() ); // exercise & verify try { UserSpecification userToUpdateSpec = UserSpecification.usingKey( userKey ); UpdateUserCommand updateUserCommand = new UpdateUserCommand( fixture.findUserByName( "admin" ).getKey(), userToUpdateSpec ); updateUserCommand.setupModifyStrategy(); updateUserCommand.setEmail( "arn@test.com" ); userFields = new UserFields(); userFields.setFirstName( "Changed firstname" ); updateUserCommand.setUserFields( userFields ); userStoreService.updateUser( updateUserCommand ); fail( "Expected exception" ); } catch ( Exception e ) { assertTrue( e instanceof ReadOnlyUserFieldPolicyException ); assertTrue( e.getMessage().startsWith( "Read only user field not expected: first-name" ) ); } } @Test public void updateUser_given_missing_user_fields_when_strategy_is_update_then_fields_are_nulled() throws Exception { // setup: StoreNewUserCommand createCommand = new StoreNewUserCommand(); createCommand.setUserStoreKey( fixture.findUserStoreByName( "myLocalUserStore" ).getKey() ); createCommand.setUsername( "arn" ); createCommand.setEmail( "arn@test.com" ); createCommand.setDisplayName( "Arn Wyatt-Skriubakken" ); createCommand.setStorer( fixture.findUserByName( "admin" ).getKey() ); createCommand.setPassword( "password" ); UserFields userFields = new UserFields(); userFields.setFirstName( "Arn" ); userFields.setLastName( "Wyatt-Skriubakken" ); userFields.setOrganization( "Organization" ); userFields.setBirthday( new DateMidnight( 2010, 3, 18 ).toDate() ); createCommand.setUserFields( userFields ); UserKey userKey = userStoreService.storeNewUser( createCommand ); // setup: make firstname read only UserStoreEntity userStore = fixture.findUserStoreByName( "myLocalUserStore" ); UserStoreConfig userStoreConfig = new UserStoreConfig(); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.ORGANIZATION, "" ) ); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.BIRTHDAY, "" ) ); userStore.setConfig( userStoreConfig ); fixture.save( userStore ); userStoreConnectorManager.invalidateCachedConfig( userStore.getKey() ); // exercise & verify UserSpecification userToUpdateSpec = UserSpecification.usingKey( userKey ); UpdateUserCommand updateUserCommand = new UpdateUserCommand( fixture.findUserByName( "admin" ).getKey(), userToUpdateSpec ); updateUserCommand.setupUpdateStrategy(); updateUserCommand.setEmail( "arn@test.com" ); userFields = new UserFields(); updateUserCommand.setUserFields( userFields ); userStoreService.updateUser( updateUserCommand ); // verify userFields = fixture.findUserByName( "arn" ).getUserFields(); assertEquals( null, userFields.getOrganization() ); assertEquals( null, userFields.getBirthday() ); } @Test public void updateUser_given_missing_user_fields_when_strategy_is_modify_then_fields_are_unchanged() throws Exception { // setup: StoreNewUserCommand createCommand = new StoreNewUserCommand(); createCommand.setUserStoreKey( fixture.findUserStoreByName( "myLocalUserStore" ).getKey() ); createCommand.setUsername( "arn" ); createCommand.setEmail( "arn@test.com" ); createCommand.setDisplayName( "Arn Wyatt-Skriubakken" ); createCommand.setStorer( fixture.findUserByName( "admin" ).getKey() ); createCommand.setPassword( "password" ); UserFields userFields = new UserFields(); userFields.setOrganization( "Organization" ); userFields.setBirthday( new DateMidnight( 2010, 3, 18 ).toDate() ); createCommand.setUserFields( userFields ); UserKey userKey = userStoreService.storeNewUser( createCommand ); // setup: make firstname read only UserStoreEntity userStore = fixture.findUserStoreByName( "myLocalUserStore" ); UserStoreConfig userStoreConfig = new UserStoreConfig(); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.ORGANIZATION, "" ) ); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.BIRTHDAY, "" ) ); userStore.setConfig( userStoreConfig ); fixture.save( userStore ); userStoreConnectorManager.invalidateCachedConfig( userStore.getKey() ); // exercise & verify UserSpecification userToUpdateSpec = UserSpecification.usingKey( userKey ); UpdateUserCommand updateUserCommand = new UpdateUserCommand( fixture.findUserByName( "admin" ).getKey(), userToUpdateSpec ); updateUserCommand.setupModifyStrategy(); updateUserCommand.setEmail( "arn@test.com" ); userFields = new UserFields(); updateUserCommand.setUserFields( userFields ); userStoreService.updateUser( updateUserCommand ); // verify userFields = fixture.findUserByName( "arn" ).getUserFields(); assertEquals( "Organization", userFields.getOrganization() ); assertEquals( new DateMidnight( 2010, 3, 18 ).toDate(), userFields.getBirthday() ); } @Test public void updateUser_given_user_fields_with_value_null_when_strategy_is_update_then_fields_are_nulled() throws Exception { // setup: StoreNewUserCommand createCommand = new StoreNewUserCommand(); createCommand.setUserStoreKey( fixture.findUserStoreByName( "myLocalUserStore" ).getKey() ); createCommand.setUsername( "arn" ); createCommand.setEmail( "arn@test.com" ); createCommand.setDisplayName( "Arn Wyatt-Skriubakken" ); createCommand.setStorer( fixture.findUserByName( "admin" ).getKey() ); createCommand.setPassword( "password" ); UserFields userFields = new UserFields(); userFields.setOrganization( "Organization" ); userFields.setBirthday( new DateMidnight( 2010, 3, 18 ).toDate() ); createCommand.setUserFields( userFields ); UserKey userKey = userStoreService.storeNewUser( createCommand ); // setup: make firstname read only UserStoreEntity userStore = fixture.findUserStoreByName( "myLocalUserStore" ); UserStoreConfig userStoreConfig = new UserStoreConfig(); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.ORGANIZATION, "" ) ); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.BIRTHDAY, "" ) ); userStore.setConfig( userStoreConfig ); fixture.save( userStore ); userStoreConnectorManager.invalidateCachedConfig( userStore.getKey() ); // exercise & verify UserSpecification userToUpdateSpec = UserSpecification.usingKey( userKey ); UpdateUserCommand updateUserCommand = new UpdateUserCommand( fixture.findUserByName( "admin" ).getKey(), userToUpdateSpec ); updateUserCommand.setupUpdateStrategy(); updateUserCommand.setEmail( "arn@test.com" ); userFields = new UserFields(); userFields.add( new UserField( UserFieldType.ORGANIZATION, null ) ); userFields.add( new UserField( UserFieldType.BIRTHDAY, null ) ); updateUserCommand.setUserFields( userFields ); userStoreService.updateUser( updateUserCommand ); // verify userFields = fixture.findUserByName( "arn" ).getUserFields(); assertEquals( null, userFields.getOrganization() ); assertEquals( null, userFields.getBirthday() ); } @Test public void updateUser_given_textual_user_field_with_value_null_when_strategy_is_modfiy_then_field_is_unchanged() throws Exception { // setup: StoreNewUserCommand createCommand = new StoreNewUserCommand(); createCommand.setUserStoreKey( fixture.findUserStoreByName( "myLocalUserStore" ).getKey() ); createCommand.setUsername( "arn" ); createCommand.setEmail( "arn@test.com" ); createCommand.setDisplayName( "Arn Wyatt-Skriubakken" ); createCommand.setStorer( fixture.findUserByName( "admin" ).getKey() ); createCommand.setPassword( "password" ); UserFields userFields = new UserFields(); userFields.setOrganization( "Organization" ); userFields.setBirthday( new DateMidnight( 2010, 3, 18 ).toDate() ); createCommand.setUserFields( userFields ); UserKey userKey = userStoreService.storeNewUser( createCommand ); // setup: make firstname read only UserStoreEntity userStore = fixture.findUserStoreByName( "myLocalUserStore" ); UserStoreConfig userStoreConfig = new UserStoreConfig(); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.ORGANIZATION, "" ) ); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.BIRTHDAY, "" ) ); userStore.setConfig( userStoreConfig ); fixture.save( userStore ); userStoreConnectorManager.invalidateCachedConfig( userStore.getKey() ); // exercise & verify UserSpecification userToUpdateSpec = UserSpecification.usingKey( userKey ); UpdateUserCommand updateUserCommand = new UpdateUserCommand( fixture.findUserByName( "admin" ).getKey(), userToUpdateSpec ); updateUserCommand.setupModifyStrategy(); updateUserCommand.setEmail( "arn@test.com" ); userFields = new UserFields(); userFields.add( new UserField( UserFieldType.ORGANIZATION, null ) ); userFields.add( new UserField( UserFieldType.BIRTHDAY, null ) ); updateUserCommand.setUserFields( userFields ); userStoreService.updateUser( updateUserCommand ); // verify userFields = fixture.findUserByName( "arn" ).getUserFields(); assertEquals( "Organization", userFields.getOrganization() ); } @Test public void updateUser_given_non_textual_user_fields_with_value_null_when_strategy_is_modfiy_then_fields_are_nulled() throws Exception { // setup: StoreNewUserCommand createCommand = new StoreNewUserCommand(); createCommand.setUserStoreKey( fixture.findUserStoreByName( "myLocalUserStore" ).getKey() ); createCommand.setUsername( "arn" ); createCommand.setEmail( "arn@test.com" ); createCommand.setDisplayName( "Arn Wyatt-Skriubakken" ); createCommand.setStorer( fixture.findUserByName( "admin" ).getKey() ); createCommand.setPassword( "password" ); UserFields userFields = new UserFields(); userFields.setLocale( Locale.FRENCH ); userFields.setBirthday( new DateMidnight( 2010, 3, 18 ).toDate() ); createCommand.setUserFields( userFields ); UserKey userKey = userStoreService.storeNewUser( createCommand ); // setup: make firstname read only UserStoreEntity userStore = fixture.findUserStoreByName( "myLocalUserStore" ); UserStoreConfig userStoreConfig = new UserStoreConfig(); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.LOCALE, "" ) ); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.BIRTHDAY, "" ) ); userStore.setConfig( userStoreConfig ); fixture.save( userStore ); userStoreConnectorManager.invalidateCachedConfig( userStore.getKey() ); // exercise & verify UserSpecification userToUpdateSpec = UserSpecification.usingKey( userKey ); UpdateUserCommand updateUserCommand = new UpdateUserCommand( fixture.findUserByName( "admin" ).getKey(), userToUpdateSpec ); updateUserCommand.setupModifyStrategy(); updateUserCommand.setEmail( "arn@test.com" ); userFields = new UserFields(); userFields.add( new UserField( UserFieldType.LOCALE, null ) ); userFields.add( new UserField( UserFieldType.BIRTHDAY, null ) ); updateUserCommand.setUserFields( userFields ); userStoreService.updateUser( updateUserCommand ); // verify userFields = fixture.findUserByName( "arn" ).getUserFields(); assertEquals( null, userFields.getLocale() ); assertEquals( null, userFields.getBirthday() ); } @Test public void updateUser_replaceAll_changing_names() throws Exception { // verify no users exists before doing the synchronize job assertEquals( 0, fixture.countUsersByType( UserType.NORMAL ) ); UserStoreEntity userStore = fixture.findUserStoreByName( "myLocalUserStore" ); // exercise StoreNewUserCommand createCommand = new StoreNewUserCommand(); createCommand.setUserStoreKey( userStore.getKey() ); createCommand.setUsername( "arn" ); createCommand.setEmail( "arn@test.com" ); createCommand.setDisplayName( "Arn Wyatt-Skriubakken" ); createCommand.setStorer( fixture.findUserByName( "admin" ).getKey() ); createCommand.setPassword( "password" ); UserFields userFields = new UserFields(); userFields.setFirstName( "Arn" ); userFields.setLastName( "Wyatt-Skriubakken" ); createCommand.setUserFields( userFields ); userStoreService.storeNewUser( createCommand ); fixture.flushAndClearHibernateSession(); // verify created users assertEquals( 1, fixture.countUsersByType( UserType.NORMAL ) ); assertEquals( "Arn Wyatt-Skriubakken", fixture.findUserByName( "arn" ).getDisplayName() ); UserSpecification userToUpdate = new UserSpecification(); userToUpdate.setKey( fixture.findUserByName( "arn" ).getKey() ); UpdateUserCommand updateCommand = new UpdateUserCommand( fixture.findUserByName( "admin" ).getKey(), userToUpdate ); updateCommand.setupUpdateStrategy(); updateCommand.setDisplayName( "Wyatt-Skriubakken" ); updateCommand.setEmail( "arn@test.com" ); userFields = new UserFields(); userFields.setFirstName( "Arn Umshlaba" ); userFields.setLastName( "Wyatt-Zulu-Skriubakken" ); updateCommand.setUserFields( userFields ); userStoreService.updateUser( updateCommand ); fixture.flushAndClearHibernateSession(); UserEntity actualUser = fixture.findUserByName( "arn" ); assertEquals( "Wyatt-Skriubakken", actualUser.getDisplayName() ); assertEquals( "Arn Umshlaba", actualUser.getUserFields().getFirstName() ); assertEquals( "Wyatt-Zulu-Skriubakken", actualUser.getUserFields().getLastName() ); } @Test public void updateUser_replaceAll_omitting_names() throws Exception { // verify no users exists before doing the synchronize job assertEquals( 0, fixture.countUsersByType( UserType.NORMAL ) ); UserStoreEntity userStore = fixture.findUserStoreByName( "myLocalUserStore" ); // exercise StoreNewUserCommand createCommand = new StoreNewUserCommand(); createCommand.setUserStoreKey( userStore.getKey() ); createCommand.setUsername( "arn" ); createCommand.setEmail( "arn@test.com" ); createCommand.setDisplayName( "Arn Wyatt-Skriubakken" ); createCommand.setStorer( fixture.findUserByName( "admin" ).getKey() ); createCommand.setPassword( "password" ); UserFields userFields = new UserFields(); userFields.setFirstName( "Arn" ); userFields.setLastName( "Wyatt-Skriubakken" ); createCommand.setUserFields( userFields ); userStoreService.storeNewUser( createCommand ); fixture.flushAndClearHibernateSession(); // verify created users assertEquals( 1, fixture.countUsersByType( UserType.NORMAL ) ); assertEquals( "Arn Wyatt-Skriubakken", fixture.findUserByName( "arn" ).getDisplayName() ); UserSpecification userToUpdate = new UserSpecification(); userToUpdate.setKey( fixture.findUserByName( "arn" ).getKey() ); UpdateUserCommand updateCommand = new UpdateUserCommand( fixture.findUserByName( "admin" ).getKey(), userToUpdate ); updateCommand.setupUpdateStrategy(); updateCommand.setDisplayName( "Wyatt-Skriubakken" ); updateCommand.setEmail( "arn@test.com" ); UserFields userInfoForUpdate = new UserFields(); updateCommand.setUserFields( userInfoForUpdate ); userStoreService.updateUser( updateCommand ); fixture.flushAndClearHibernateSession(); UserEntity actualUser = fixture.findUserByName( "arn" ); assertEquals( "Wyatt-Skriubakken", actualUser.getDisplayName() ); assertEquals( null, actualUser.getUserFields().getFirstName() ); assertEquals( null, actualUser.getUserFields().getLastName() ); } @Test public void updateUser_given_not_all_fields_when_modify_strategy_then_missing_fields_are_not_changed() throws Exception { UserStoreEntity userStore = fixture.findUserStoreByName( "myLocalUserStore" ); UserStoreConfig userStoreConfig = new UserStoreConfig(); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.FIRST_NAME, "remote" ) ); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.LAST_NAME, "remote" ) ); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.PHOTO, "remote" ) ); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.PHONE, "remote" ) ); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.GENDER, "local" ) ); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.BIRTHDAY, "local" ) ); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.HOME_PAGE, "local" ) ); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.LOCALE, "local" ) ); userStore.setConfig( userStoreConfig ); fixture.save( userStore ); userStoreConnectorManager.invalidateCachedConfig( userStore.getKey() ); // exercise StoreNewUserCommand createCommand = new StoreNewUserCommand(); createCommand.setUserStoreKey( userStore.getKey() ); createCommand.setUsername( "Laverne" ); createCommand.setEmail( "laverne@test.com" ); createCommand.setDisplayName( "Laverne Wyatt-Skriubakken" ); createCommand.setStorer( fixture.findUserByName( "admin" ).getKey() ); createCommand.setPassword( "password" ); UserFields userFields = new UserFields(); userFields.setFirstName( "Laverne" ); userFields.setLastName( "Wyatt-Skriubakken" ); userFields.setPhoto( new byte[]{100} ); userFields.setPhone( "11111111" ); userFields.setGender( Gender.FEMALE ); userFields.setBirthday( new DateMidnight( 1980, 1, 1 ).toDate() ); userFields.setHomePage( "www.skriubakken.com" ); userFields.setLocale( Locale.ENGLISH ); createCommand.setUserFields( userFields ); UserKey userKey = userStoreService.storeNewUser( createCommand ); // exercise: every user field omitted except last name UpdateUserCommand command = new UpdateUserCommand( fixture.findUserByName( "admin" ).getKey(), UserSpecification.usingKey( userKey ) ); command.setupModifyStrategy(); command.setEmail( "laverne@test.com" ); userFields = new UserFields(); userFields.setLastName( "Changed lastname" ); command.setUserFields( userFields ); userStoreService.updateUser( command ); // verify: every user field omitted is unchanged UserEntity updatedUser = fixture.findUserByKey( userKey ); assertEquals( "Laverne Wyatt-Skriubakken", updatedUser.getDisplayName() ); assertEquals( "Laverne", updatedUser.getUserFields().getFirstName() ); assertArrayEquals( new byte[]{100}, updatedUser.getUserFields().getPhoto() ); assertEquals( "11111111", updatedUser.getUserFields().getPhone() ); assertEquals( Gender.FEMALE, updatedUser.getUserFields().getGender() ); assertEquals( new DateMidnight( 1980, 1, 1 ).toDate(), updatedUser.getUserFields().getBirthday() ); assertEquals( "www.skriubakken.com", updatedUser.getUserFields().getHomePage() ); assertEquals( Locale.ENGLISH, updatedUser.getUserFields().getLocale() ); // verify: those changed are changed assertEquals( "Changed lastname", updatedUser.getUserFields().getLastName() ); } @Test public void updateUser_given_not_all_fields_when_update_strategy_then_missing_fields_are_changed_to_null() throws Exception { UserStoreEntity userStore = fixture.findUserStoreByName( "myLocalUserStore" ); UserStoreConfig userStoreConfig = new UserStoreConfig(); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.FIRST_NAME, "remote" ) ); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.LAST_NAME, "remote" ) ); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.PHOTO, "remote" ) ); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.PHONE, "remote" ) ); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.GENDER, "local" ) ); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.BIRTHDAY, "local" ) ); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.HOME_PAGE, "local" ) ); userStoreConfig.addUserFieldConfig( factory.createUserStoreUserFieldConfig( UserFieldType.LOCALE, "local" ) ); userStore.setConfig( userStoreConfig ); fixture.save( userStore ); userStoreConnectorManager.invalidateCachedConfig( userStore.getKey() ); // exercise StoreNewUserCommand createCommand = new StoreNewUserCommand(); createCommand.setUserStoreKey( userStore.getKey() ); createCommand.setUsername( "Laverne" ); createCommand.setEmail( "laverne@test.com" ); createCommand.setDisplayName( "Laverne Wyatt-Skriubakken" ); createCommand.setStorer( fixture.findUserByName( "admin" ).getKey() ); createCommand.setPassword( "password" ); UserFields userFields = new UserFields(); userFields.setFirstName( "Laverne" ); userFields.setLastName( "Wyatt-Skriubakken" ); userFields.setPhoto( new byte[]{100} ); userFields.setPhone( "11111111" ); userFields.setGender( Gender.FEMALE ); userFields.setBirthday( new DateMidnight( 1980, 1, 1 ).toDate() ); userFields.setHomePage( "www.skriubakken.com" ); userFields.setLocale( Locale.ENGLISH ); createCommand.setUserFields( userFields ); UserKey userKey = userStoreService.storeNewUser( createCommand ); // exercise: every user field omitted except last name UpdateUserCommand command = new UpdateUserCommand( fixture.findUserByName( "admin" ).getKey(), UserSpecification.usingKey( userKey ) ); command.setupUpdateStrategy(); command.setEmail( "laverne@test.com" ); userFields = new UserFields(); userFields.setLastName( "Changed lastname" ); command.setUserFields( userFields ); userStoreService.updateUser( command ); // verify: every user field omitted is nulled UserEntity updatedUser = fixture.findUserByKey( userKey ); assertEquals( "Laverne Wyatt-Skriubakken", updatedUser.getDisplayName() ); assertEquals( null, updatedUser.getUserFields().getFirstName() ); assertEquals( null, updatedUser.getUserFields().getPhone() ); assertEquals( null, updatedUser.getUserFields().getGender() ); assertEquals( null, updatedUser.getUserFields().getBirthday() ); assertEquals( null, updatedUser.getUserFields().getHomePage() ); assertEquals( null, updatedUser.getUserFields().getLocale() ); // verify: photo is special and only remove if told so with command.setRemovePhoto assertNotNull( updatedUser.getUserFields().getPhoto() ); // verify: those changed are changed assertEquals( "Changed lastname", updatedUser.getUserFields().getLastName() ); } @Test public void storeNewUser_given_deleted_uid_then_new_user_is_created() throws Exception { // setup: exercise StoreNewUserCommand createCommand = new StoreNewUserCommand(); createCommand.setUserStoreKey( fixture.findUserStoreByName( "myLocalUserStore" ).getKey() ); createCommand.setUsername( "arn" ); createCommand.setEmail( "arn@test.com" ); createCommand.setDisplayName( "Arn Wyatt-Skriubakken" ); createCommand.setStorer( fixture.findUserByName( "admin" ).getKey() ); createCommand.setPassword( "password" ); UserFields userFields = new UserFields(); userFields.setFirstName( "Arn" ); userFields.setLastName( "Wyatt-Skriubakken" ); createCommand.setUserFields( userFields ); UserKey oldUserKey = userStoreService.storeNewUser( createCommand ); // setup: verify created users assertEquals( 1, fixture.countUsersByType( UserType.NORMAL ) ); // setup: delete user deleteUser( "arn" ); assertEquals( 1, fixture.countDeletedUsersByType( UserType.NORMAL ) ); // exercise: create new user with same uid createCommand = new StoreNewUserCommand(); createCommand.setUserStoreKey( fixture.findUserStoreByName( "myLocalUserStore" ).getKey() ); createCommand.setUsername( "arn" ); createCommand.setEmail( "arn@test.com" ); createCommand.setDisplayName( "Arn Wyatt-Skriubakken2" ); createCommand.setStorer( fixture.findUserByName( "admin" ).getKey() ); createCommand.setPassword( "password" ); userFields = new UserFields(); userFields.setFirstName( "Arn2" ); userFields.setLastName( "Wyatt-Skriubakken2" ); createCommand.setUserFields( userFields ); UserKey newUserKey = userStoreService.storeNewUser( createCommand ); // verify: new user is created UserEntity newUser = fixture.findUserByKey( newUserKey ); assertEquals( false, newUser.isDeleted() ); assertEquals( "arn", newUser.getName() ); assertEquals( "arn@test.com", newUser.getEmail() ); assertEquals( "Arn Wyatt-Skriubakken2", newUser.getDisplayName() ); assertEquals( "Arn2", newUser.getUserFields().getFirstName() ); assertEquals( "Wyatt-Skriubakken2", newUser.getUserFields().getLastName() ); // verify: old user is still deleted UserEntity oldUser = fixture.findUserByKey( oldUserKey ); assertEquals( true, oldUser.isDeleted() ); } @Test public void storeNewGroup() throws Exception { // exercise: StoreNewGroupCommand storeNewGroupCommand = new StoreNewGroupCommand(); storeNewGroupCommand.setExecutor( fixture.findUserByName( "admin" ) ); storeNewGroupCommand.setUserStoreKey( fixture.findUserStoreByName( "myLocalUserStore" ).getKey() ); storeNewGroupCommand.setType( GroupType.USERSTORE_GROUP ); storeNewGroupCommand.setName( "myGroup" ); storeNewGroupCommand.setDescription( "Description" ); GroupKey groupKey = userStoreService.storeNewGroup( storeNewGroupCommand ); GroupEntity actualGroup = fixture.findGroupByKey( groupKey ); // verify: assertEquals( "myGroup", actualGroup.getName() ); assertEquals( "Description", actualGroup.getDescription() ); assertEquals( GroupType.USERSTORE_GROUP, actualGroup.getType() ); } @Test public void storeNewGroup_given_group_with_name_that_is_already_used_then_exception_is_thrown() throws Exception { // setup: StoreNewGroupCommand storeNewGroupCommand = new StoreNewGroupCommand(); storeNewGroupCommand.setExecutor( fixture.findUserByName( "admin" ) ); storeNewGroupCommand.setUserStoreKey( fixture.findUserStoreByName( "myLocalUserStore" ).getKey() ); storeNewGroupCommand.setType( GroupType.USERSTORE_GROUP ); storeNewGroupCommand.setName( "myGroup" ); storeNewGroupCommand.setDescription( "Description" ); userStoreService.storeNewGroup( storeNewGroupCommand ); // exercise & verify try { userStoreService.storeNewGroup( storeNewGroupCommand ); fail( "Exception expected" ); } catch ( Exception e ) { assertTrue( e instanceof GroupAlreadyExistsException ); } } @Test public void storeNewGroup_given_group_with_name_that_is_already_used_but_is_deleted_then_new_group_is_stored() throws Exception { // setup: StoreNewGroupCommand storeNewGroupCommand = new StoreNewGroupCommand(); storeNewGroupCommand.setExecutor( fixture.findUserByName( "admin" ) ); storeNewGroupCommand.setUserStoreKey( fixture.findUserStoreByName( "myLocalUserStore" ).getKey() ); storeNewGroupCommand.setType( GroupType.USERSTORE_GROUP ); storeNewGroupCommand.setName( "myGroup" ); storeNewGroupCommand.setDescription( "Description" ); GroupKey groupKey = userStoreService.storeNewGroup( storeNewGroupCommand ); DeleteGroupCommand deleteGroupCommand = new DeleteGroupCommand( fixture.findUserByName( "admin" ), GroupSpecification.usingKey( groupKey ) ); userStoreService.deleteGroup( deleteGroupCommand ); assertEquals( true, fixture.findGroupByKey( groupKey ).isDeleted() ); // exercise & verify GroupKey newGroupKey = userStoreService.storeNewGroup( storeNewGroupCommand ); assertNotNull( newGroupKey ); assertFalse( groupKey.equals( newGroupKey ) ); assertEquals( false, fixture.findGroupByKey( newGroupKey ).isDeleted() ); } @Test public void deleteGroup() throws Exception { // setup: StoreNewGroupCommand storeNewGroupCommand = new StoreNewGroupCommand(); storeNewGroupCommand.setExecutor( fixture.findUserByName( "admin" ) ); storeNewGroupCommand.setUserStoreKey( fixture.findUserStoreByName( "myLocalUserStore" ).getKey() ); storeNewGroupCommand.setType( GroupType.USERSTORE_GROUP ); storeNewGroupCommand.setName( "myGroup" ); storeNewGroupCommand.setDescription( "Description" ); GroupKey groupKey = userStoreService.storeNewGroup( storeNewGroupCommand ); assertEquals( 1, fixture.countGroupsByType( GroupType.USERSTORE_GROUP ) ); // exercise GroupSpecification groupToDeleteSpec = new GroupSpecification(); groupToDeleteSpec.setKey( groupKey ); DeleteGroupCommand deleteGroupCommand = new DeleteGroupCommand( fixture.findUserByName( "admin" ), groupToDeleteSpec ); userStoreService.deleteGroup( deleteGroupCommand ); // verify: GroupEntity deletedGroup = fixture.findGroupByKey( groupKey ); assertEquals( true, deletedGroup.isDeleted() ); } @Test public void updateGroup() throws Exception { // setup: StoreNewGroupCommand storeNewGroupCommand = new StoreNewGroupCommand(); storeNewGroupCommand.setExecutor( fixture.findUserByName( "admin" ) ); storeNewGroupCommand.setUserStoreKey( fixture.findUserStoreByName( "myLocalUserStore" ).getKey() ); storeNewGroupCommand.setType( GroupType.USERSTORE_GROUP ); storeNewGroupCommand.setName( "myGroup" ); storeNewGroupCommand.setDescription( "Description" ); GroupKey groupKey = userStoreService.storeNewGroup( storeNewGroupCommand ); assertEquals( 1, fixture.countGroupsByType( GroupType.USERSTORE_GROUP ) ); // exercise UpdateGroupCommand updateGroupCommand = new UpdateGroupCommand( fixture.findUserByName( "admin" ).getKey(), groupKey ); updateGroupCommand.setName( "myChange" ); updateGroupCommand.setDescription( "Changed" ); userStoreService.updateGroup( updateGroupCommand ); // verify: assertEquals( 1, fixture.countGroupsByType( GroupType.USERSTORE_GROUP ) ); GroupEntity updatedGroup = fixture.findGroupByKey( groupKey ); assertEquals( false, updatedGroup.isDeleted() ); assertEquals( "myChange", updatedGroup.getName() ); assertEquals( "Changed", updatedGroup.getDescription() ); } private void deleteUser( String name ) { UserSpecification userToDelete = new UserSpecification(); userToDelete.setName( name ); DeleteUserCommand deleteUserCommand = new DeleteUserCommand( fixture.findUserByName( "admin" ).getKey(), userToDelete ); userStoreService.deleteUser( deleteUserCommand ); } }