/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.itest.client;
import org.jdom.Document;
import org.jdom.Element;
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.GetUserParams;
import com.enonic.cms.api.plugin.ext.userstore.RemoteUser;
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.user.User;
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_getRemoteUserTest
extends AbstractSpringTest
{
@Autowired
@Qualifier("localClient")
private InternalClient internalClient;
@Autowired
private UserStoreConnectorConfigLoader userStoreConnectorConfigLoader;
@Autowired
private MemUserDatabase userDatabase;
@Autowired
private DomainFixture fixture;
@Before
public void before()
throws Exception
{
this.fixture.initSystemData();
this.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 getUserExistsRemoteButNotLocally()
throws Exception
{
GetUserParams params = new GetUserParams();
params.user = "myRemoteUserStore:arn";
// User should not exist in db
assertNull( fixture.findUserByName( "arn" ) );
setupRemoteUserStore();
// User should be synced from LDAP and returned
internalClient.impersonate( "myRemoteUserStore:arn" );
Document userDocument = internalClient.getUser( params );
Element userNameElement = userDocument.getRootElement().getChild( "display-name" );
assertNotNull( userNameElement );
// User should now exist in db as well.
fixture.flushAndClearHibernateSession();
assertNotNull( fixture.findUserByName( "arn" ) );
}
private void setupRemoteUserStore()
throws Exception
{
this.userDatabase.clear();
final ConfigProperties properties = new ConfigProperties();
properties.setProperty( "cms.userstore.connector.myRemoteUserStore.userPolicy", "" );
properties.setProperty( "cms.userstore.connector.myRemoteUserStore.plugin", "mem" );
this.userStoreConnectorConfigLoader.setProperties( properties );
final DomainFactory factory = this.fixture.getFactory();
final 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.storeAndSetupUserStore( userStore );
final RemoteUser user = new RemoteUser( "arn" );
user.setSync( "arn" );
user.getUserFields().setFirstName( "Arn" );
user.getUserFields().setLastName( "Wyatt-Skriubakken" );
this.userDatabase.addUser( user );
}
}