/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.itest.store.dao;
import org.joda.time.DateMidnight;
import org.joda.time.DateTime;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import com.enonic.cms.framework.xml.XMLDocument;
import com.enonic.cms.framework.xml.XMLDocumentFactory;
import com.enonic.cms.api.client.model.user.Address;
import com.enonic.cms.core.security.group.GroupEntity;
import com.enonic.cms.core.security.group.GroupType;
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.UserStoreEntity;
import com.enonic.cms.core.security.userstore.UserStoreKey;
import com.enonic.cms.api.plugin.ext.userstore.UserStoreConfig;
import com.enonic.cms.core.security.userstore.config.UserStoreConfigParser;
import com.enonic.cms.api.plugin.ext.userstore.UserFields;
import com.enonic.cms.itest.AbstractSpringTest;
import com.enonic.cms.store.dao.GroupDao;
import com.enonic.cms.store.dao.UserDao;
import com.enonic.cms.store.dao.UserStoreDao;
import static org.junit.Assert.*;
public class UserEntityDaoTest
extends AbstractSpringTest
{
@Autowired
private UserDao userDao;
@Autowired
private UserStoreDao userStoreDao;
@Autowired
private GroupDao groupDao;
@Test
public void testFindBySpecWithUserGroupKey()
{
// Setup of prerequisites
final UserEntity user = new UserEntity();
user.setDeleted( false );
user.setEmail( "email@example.com" );
user.setDisplayName( "DisplayName" );
user.setName( "uid" );
user.setSyncValue( "syncValue" );
user.setType( UserType.NORMAL );
user.setTimestamp( new DateTime() );
userDao.storeNew( user );
final GroupEntity userGroup = new GroupEntity();
userGroup.setDeleted( 0 );
userGroup.setDescription( null );
userGroup.setName( "userGroup" + user.getKey() );
userGroup.setSyncValue( user.getSync() );
userGroup.setUser( user );
userGroup.setType( GroupType.USER );
userGroup.setRestricted( 1 );
groupDao.storeNew( userGroup );
user.setUserGroup( userGroup );
userDao.getHibernateTemplate().flush();
userDao.getHibernateTemplate().clear();
// Excercise
final UserSpecification userSpecification = new UserSpecification();
userSpecification.setUserGroupKey( userGroup.getGroupKey() );
final UserEntity storedUser = userDao.findSingleBySpecification( userSpecification );
// Verify
assertEquals( user, storedUser );
}
@Test
public void testStoreUserWithUserInfo()
{
// Setup of prerequisites
final UserEntity user = createUser( "uid", "displayName", "email@example.com", "syncValue" );
UserFields userFields = new UserFields();
userFields.setBirthday( new DateMidnight( 1976, 4, 19 ).toDate() );
userFields.setInitials( "JVS" );
userFields.setCountry( "Norway" );
userFields.setNickName( "Skriu" );
user.setUserFields( userFields );
userDao.storeNew( user );
final UserKey userKey = user.getKey();
userDao.getHibernateTemplate().flush();
userDao.getHibernateTemplate().clear();
// Excercise
final UserEntity storedUser = userDao.findByKey( userKey );
// Verify
assertEquals( user, storedUser );
userFields = storedUser.getUserFields();
assertEquals( "JVS", userFields.getInitials() );
assertEquals( "Norway", userFields.getCountry() );
assertEquals( "Skriu", userFields.getNickName() );
assertEquals( new DateMidnight( 1976, 4, 19 ).toDate(), userFields.getBirthday() );
}
@Test
public void testStoreUserWithUserInfo_Address()
{
// Setup of prerequisites
final UserEntity user = createUser( "uid", "displayName", "email@example.com", "syncValue" );
UserFields userFields = new UserFields();
userFields.setInitials( "JVS" );
userFields.setCountry( "Norway" );
final Address homeAddress = new Address();
homeAddress.setLabel( "My Home address" );
homeAddress.setStreet( "Street 9" );
homeAddress.setPostalCode( "0123" );
homeAddress.setPostalAddress( "MyCity" );
homeAddress.setRegion( "MyRegion" );
homeAddress.setCountry( "MyCountry" );
final Address workAddress = new Address();
workAddress.setLabel( "My Work address" );
workAddress.setStreet( "Street 113" );
workAddress.setPostalCode( "3210" );
workAddress.setPostalAddress( "WorkCity" );
workAddress.setRegion( "Work Region" );
workAddress.setCountry( "MyCountry" );
userFields.setAddresses( homeAddress, workAddress );
user.setUserFields( userFields );
userDao.storeNew( user );
final UserKey userKey = user.getKey();
userDao.getHibernateTemplate().flush();
userDao.getHibernateTemplate().clear();
// Excercise
final UserEntity storedUser = userDao.findByKey( userKey );
// Verify
assertEquals( user, storedUser );
userFields = storedUser.getUserFields();
assertEquals( "JVS", userFields.getInitials() );
assertEquals( "Norway", userFields.getCountry() );
final Address storedHomeAddress = userFields.getAddresses().get( 0 );
assertNotNull( storedHomeAddress );
assertEquals( storedHomeAddress, homeAddress );
assertEquals( "My Home address", storedHomeAddress.getLabel() );
assertEquals( "Street 9", storedHomeAddress.getStreet() );
assertEquals( "0123", storedHomeAddress.getPostalCode() );
assertEquals( "MyCity", storedHomeAddress.getPostalAddress() );
assertEquals( "MyRegion", storedHomeAddress.getRegion() );
assertEquals( "MyCountry", storedHomeAddress.getCountry() );
final Address storedWorkAddress = userFields.getAddresses().get( 1 );
assertNotNull( storedWorkAddress );
assertEquals( storedWorkAddress, workAddress );
assertEquals( "My Work address", storedWorkAddress.getLabel() );
assertEquals( "Street 113", storedWorkAddress.getStreet() );
assertEquals( "3210", storedWorkAddress.getPostalCode() );
assertEquals( "WorkCity", storedWorkAddress.getPostalAddress() );
assertEquals( "Work Region", storedWorkAddress.getRegion() );
assertEquals( "MyCountry", storedWorkAddress.getCountry() );
}
@Test
public void testUpdateUserInfo()
{
// Setup of prerequisites
final UserEntity newUser = createUser( "uid", "displayName", "email@example.com", "syncValue" );
// Excercise
newUser.setUserFields( new UserFields().setCountry( "Norway" ) );
userDao.storeNew( newUser );
userDao.getHibernateTemplate().flush();
userDao.getHibernateTemplate().clear();
final UserKey userKey = newUser.getKey();
// Verify
assertEquals( newUser, userDao.findByKey( userKey ) );
assertEquals( "Norway", userDao.findByKey( userKey ).getUserFields().getCountry() );
// Excercise
UserEntity updateUser = userDao.findByKey( userKey );
updateUser.setUserFields( new UserFields().setCountry( "South Africa" ) );
userDao.updateExisting( updateUser );
userDao.getHibernateTemplate().flush();
userDao.getHibernateTemplate().clear();
// Verify
assertEquals( newUser, userDao.findByKey( userKey ) );
assertEquals( "South Africa", userDao.findByKey( userKey ).getUserFields().getCountry() );
}
@Test
public void testUpdateUserInfo_Address()
{
// TODO: Implement
}
@Test
public void testDeleteUserInfo()
{
// Setup of prerequisites
final UserEntity user = createUser( "uid", "displayName", "email@example.com", "syncValue" );
UserFields userFields = new UserFields();
userFields.setInitials( "JVS" );
userFields.setCountry( "Norway" );
user.setUserFields( userFields );
userDao.storeNew( user );
final UserKey userKey = user.getKey();
userDao.getHibernateTemplate().flush();
userDao.getHibernateTemplate().clear();
// Excercise
UserEntity storedUser = userDao.findByKey( userKey );
// Verify
assertEquals( user, storedUser );
UserFields storedUserFields = storedUser.getUserFields();
assertEquals( "JVS", storedUserFields.getInitials() );
assertEquals( "Norway", storedUserFields.getCountry() );
// Update
userFields = new UserFields();
userFields.setInitials( null );
userFields.setCountry( "South Africa" );
storedUser.setUserFields( userFields );
userDao.getHibernateTemplate().flush();
userDao.getHibernateTemplate().clear();
// Excercise
storedUser = userDao.findByKey( userKey );
// Verify
assertEquals( user, storedUser );
storedUserFields = storedUser.getUserFields();
Assert.assertNull( storedUserFields.getInitials() );
assertEquals( "South Africa", storedUserFields.getCountry() );
}
@Test
public void testDeleteUserInfo_Address()
{
// Setup of prerequisites
final UserEntity user = createUser( "uid", "displayName", "email@example.com", "syncValue" );
UserFields userFields = new UserFields();
Address address = new Address();
address.setLabel( "Home" );
address.setStreet( "Street 1" );
userFields.setAddresses( address );
user.setUserFields( userFields );
userDao.storeNew( user );
final UserKey userKey = user.getKey();
userDao.getHibernateTemplate().flush();
userDao.getHibernateTemplate().clear();
// Excercise
UserEntity storedUser = userDao.findByKey( userKey );
// Verify
assertEquals( user, storedUser );
UserFields storedUserFields = storedUser.getUserFields();
assertEquals( 1, storedUserFields.getAddresses().size() );
assertEquals( "Home", storedUserFields.getAddresses().get( 0 ).getLabel() );
// Update
userFields = new UserFields();
storedUser.setUserFields( userFields );
userDao.getHibernateTemplate().flush();
userDao.getHibernateTemplate().clear();
// Excercise
storedUser = userDao.findByKey( userKey );
// Verify
assertEquals( user, storedUser );
storedUserFields = storedUser.getUserFields();
assertEquals( 0, storedUserFields.getAddresses().size() );
}
@Test
public void findByEmailAndUserStore()
{
final UserStoreEntity userStore = createUserStore();
userStoreDao.storeNew( userStore );
final UserStoreKey userStoreKey = userStore.getKey();
userStoreDao.getHibernateTemplate().flush();
userStoreDao.getHibernateTemplate().clear();
final UserEntity user = createUser( "uid", "displayName", "email@example.com", "syncValue" );
user.setUserStore( userStore );
userDao.storeNew( user );
userDao.getHibernateTemplate().flush();
userDao.getHibernateTemplate().clear();
// Excercise
final UserSpecification userSpecification = new UserSpecification();
userSpecification.setUserStoreKey( userStoreKey );
userSpecification.setEmail( "email@example.com" );
final UserEntity storedUser = userDao.findSingleBySpecification( userSpecification );
// Verify
assertNotNull( "storedUser cannot be null", storedUser );
assertEquals( user, storedUser );
}
private UserStoreEntity createUserStore()
{
final UserStoreEntity userStore = new UserStoreEntity();
userStore.setDefaultStore( false );
userStore.setDeleted( false );
userStore.setName( "TestName" );
userStore.setConnectorName( "TestConnectorName" );
final String configAsString = "<config><user-fields><first-name required=\"true\"/></user-fields></config>";
final XMLDocument configXmlDoc = XMLDocumentFactory.create( configAsString );
final UserStoreConfig config = UserStoreConfigParser.parse( configXmlDoc.getAsJDOMDocument().getRootElement() );
userStore.setConfig( config );
return userStore;
}
private UserEntity createUser( String uid, String displayName, String email, String syncValue )
{
final UserEntity user = new UserEntity();
user.setDeleted( false );
user.setEmail( email );
user.setDisplayName( displayName );
user.setName( uid );
user.setSyncValue( syncValue );
user.setType( UserType.NORMAL );
user.setTimestamp( new DateTime() );
return user;
}
}