/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.security.user; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import com.enonic.cms.core.security.SecurityService; import com.enonic.cms.core.security.userstore.UserStoreEntity; import com.enonic.cms.core.security.userstore.UserStoreKey; import com.enonic.cms.core.security.userstore.UserStoreParser; import com.enonic.cms.core.security.userstore.UserStoreService; import com.enonic.cms.store.dao.UserDao; import com.enonic.cms.store.dao.UserStoreDao; import static org.junit.Assert.*; public class UserParserTest { private SecurityService securityService; private UserStoreService userStoreService; private UserDao userDao; private UserStoreDao userStoreDao; @Before public void before() { securityService = Mockito.mock( SecurityService.class ); userStoreService = Mockito.mock( UserStoreService.class ); userDao = Mockito.mock( UserDao.class ); userStoreDao = Mockito.mock( UserStoreDao.class ); } @Test public void parseUser_returns_logged_in_user_when_given_string_is_null() { // setup Mockito.when( securityService.getLoggedInPortalUserAsEntity() ).thenReturn( createUser( "ABC", "myuser", createUserStore( 1, "myUserStore" ) ) ); // exercise UserParser parser = new UserParser( securityService, userStoreService, userDao, new UserStoreParser( userStoreDao ) ); UserEntity actualUser = parser.parseUser( null ); // verify assertEquals( "myuser", actualUser.getName() ); } @Test public void parseUser_returns_admin_user_when_given_string_is_admin() { // setup UserEntity admin = createUser( "666", "admin", null ); admin.setType( UserType.ADMINISTRATOR ); Mockito.when( userDao.findBuiltInGlobalByName( "admin" ) ).thenReturn( admin ); // exercise UserParser parser = new UserParser( securityService, userStoreService, userDao, new UserStoreParser( userStoreDao ) ); UserEntity actualUser = parser.parseUser( "admin" ); // verify assertEquals( "admin", actualUser.getName() ); } @Test public void parseUser_returns_anonymous_user_when_given_string_is_anonymous() { // setup UserEntity admin = createUser( "333", "anonymous", null ); admin.setType( UserType.ANONYMOUS ); Mockito.when( userDao.findBuiltInGlobalByName( "anonymous" ) ).thenReturn( admin ); // exercise UserParser parser = new UserParser( securityService, userStoreService, userDao, new UserStoreParser( userStoreDao ) ); UserEntity actualUser = parser.parseUser( "anonymous" ); // verify assertEquals( "anonymous", actualUser.getName() ); } @Test public void parseUser_throws_UserNotFoundException_when_given_string_is_non_existing_built_in_user() { // setup Mockito.when( userDao.findBuiltInGlobalByName( "nonexisting" ) ).thenReturn( null ); // exercise UserParser parser = new UserParser( securityService, userStoreService, userDao, new UserStoreParser( userStoreDao ) ); try { parser.parseUser( "nonexisting" ); fail( "Expected exception" ); } catch ( Exception e ) { assertTrue( e instanceof UserNotFoundException ); } } @Test public void parseUser_returns_user_when_given_string_is_matching_user_by_key_prefixed_by_hash() { // setup Mockito.when( userDao.findByKey( new UserKey( "ABC" ) ) ).thenReturn( createUser( "ABC", "myuser", createUserStore( 1, "myUserStore" ) ) ); // exercise UserParser parser = new UserParser( securityService, userStoreService, userDao, new UserStoreParser( userStoreDao ) ); UserEntity actualUser = parser.parseUser( "#ABC" ); // verify assertEquals( "myuser", actualUser.getName() ); } @Test public void parseUser_throws_UserNotFoundException_when_given_string_is_matching_user_by_key_but_user_is_deleted() { // setup UserEntity user = createUser( "ABC", "myuser", createUserStore( 1, "myUserStore" ) ); user.setDeleted( true ); Mockito.when( userDao.findByKey( new UserKey( "ABC" ) ) ).thenReturn( user ); // exercise UserParser parser = new UserParser( securityService, userStoreService, userDao, new UserStoreParser( userStoreDao ) ); try { parser.parseUser( "#ABC" ); fail( "Expected exception" ); } catch ( Exception e ) { assertTrue( e instanceof UserNotFoundException ); } } @Test public void parseUser_throws_UserNotFoundException_when_given_string_is_not_matching_a_user_by_key() { // setup Mockito.when( userDao.findByKey( new UserKey( "ABC" ) ) ).thenReturn( null ); // exercise UserParser parser = new UserParser( securityService, userStoreService, userDao, new UserStoreParser( userStoreDao ) ); try { parser.parseUser( "#ABC" ); fail( "Expected exception" ); } catch ( Exception e ) { assertTrue( e instanceof UserNotFoundException ); } } @Test public void parseUser_returns_user_when_given_string_is_matching_user_by_qualifiedName() { // setup UserStoreEntity myUserStore = createUserStore( 1, "myUserStore" ); UserEntity user = createUser( "ABC", "myuser", myUserStore ); Mockito.when( userDao.findByKey( new UserKey( "ABC" ) ) ).thenReturn( user ); Mockito.when( userStoreDao.findByName( "myUserStore" ) ).thenReturn( myUserStore ); Mockito.when( userDao.findByQualifiedUsername( Mockito.<QualifiedUsername>any() ) ).thenReturn( user ); // exercise UserParser parser = new UserParser( securityService, userStoreService, userDao, new UserStoreParser( userStoreDao ) ); UserEntity actualUser = parser.parseUser( "myUserStore:myuser" ); // verify assertEquals( "myuser", actualUser.getName() ); } @Test public void parseUser_returns_user_when_given_string_is_matching_user_by_qualifiedName_that_does_not_exists_in_db_but_remote() { // setup UserStoreEntity myUserStore = createUserStore( 1, "myUserStore" ); UserEntity user = createUser( "ABC", "myuser", myUserStore ); Mockito.when( userDao.findByQualifiedUsername( Mockito.<QualifiedUsername>any() ) ).thenReturn( null ).thenReturn( user ); Mockito.when( userDao.findByKey( new UserKey( "ABC" ) ) ).thenReturn( user ); Mockito.when( userStoreDao.findByName( "myUserStore" ) ).thenReturn( myUserStore ); // exercise UserParser parser = new UserParser( securityService, userStoreService, userDao, new UserStoreParser( userStoreDao ) ); UserEntity actualUser = parser.parseUser( "myUserStore:myuser" ); // verify assertEquals( "myuser", actualUser.getName() ); } @Test public void parseUser_throws_UserNotFoundException_when_given_string_is_matching_user_by_qualifiedName_that_does_not_exists_in_db_and_userStore_is_local() { // setup UserStoreEntity localUserStore = createUserStore( 1, "localUserStore" ); localUserStore.setConnectorName( null ); UserEntity user = createUser( "ABC", "myuser", localUserStore ); Mockito.when( userDao.findByQualifiedUsername( Mockito.<QualifiedUsername>any() ) ).thenReturn( null ); Mockito.when( userDao.findByKey( new UserKey( "ABC" ) ) ).thenReturn( user ); Mockito.when( userStoreDao.findByName( "localUserStore" ) ).thenReturn( localUserStore ); // exercise UserParser parser = new UserParser( securityService, userStoreService, userDao, new UserStoreParser( userStoreDao ) ); try { parser.parseUser( "localUserStore:myuser" ); fail( "Expected exception" ); } catch ( Exception e ) { assertTrue( e instanceof UserNotFoundException ); } } @Test public void parseUser_throws_UserNotFoundException_when_given_string_is_matching_user_by_qualifiedName_and_synchronization_is_off_that_does_not_exists_in_db_but_remote() { // setup UserStoreEntity localUserStore = createUserStore( 1, "localUserStore" ); UserEntity user = createUser( "ABC", "myuser", localUserStore ); Mockito.when( userDao.findByQualifiedUsername( Mockito.<QualifiedUsername>any() ) ).thenReturn( null ); Mockito.when( userDao.findByKey( new UserKey( "ABC" ) ) ).thenReturn( user ); Mockito.when( userStoreDao.findByName( "localUserStore" ) ).thenReturn( localUserStore ); // exercise UserParser parser = new UserParser( securityService, userStoreService, userDao, new UserStoreParser( userStoreDao ) ).synchronizeUser( false ); try { parser.parseUser( "localUserStore:myuser" ); fail( "Expected exception" ); } catch ( Exception e ) { assertTrue( e instanceof UserNotFoundException ); } } @Test public void parseUser_throws_UserNotFoundException_when_given_string_is_matching_user_by_qualifiedName_that_does_not_exists_in_db__and_neither_remote() { // setup UserStoreEntity myUserStore = createUserStore( 1, "myUserStore" ); Mockito.when( userDao.findByQualifiedUsername( Mockito.<QualifiedUsername>any() ) ).thenReturn( null ); Mockito.when( userStoreDao.findByName( "myUserStore" ) ).thenReturn( myUserStore ); // exercise UserParser parser = new UserParser( securityService, userStoreService, userDao, new UserStoreParser( userStoreDao ) ); try { parser.parseUser( "myUserStore:myuser" ); fail( "Expected exception" ); } catch ( Exception e ) { assertTrue( e instanceof UserNotFoundException ); } } @Test public void parseUser_throws_UserNotFoundException_when_given_string_is_matching_user_by_qualifiedName_but_user_is_deleted() { // setup UserStoreEntity myUserStore = createUserStore( 1, "myUserStore" ); UserEntity user = createUser( "ABC", "myuser", myUserStore ); user.setDeleted( true ); Mockito.when( userDao.findByKey( new UserKey( "ABC" ) ) ).thenReturn( user ); Mockito.when( userStoreDao.findByName( "myUserStore" ) ).thenReturn( myUserStore ); Mockito.when( userDao.findByQualifiedUsername( Mockito.<QualifiedUsername>any() ) ).thenReturn( user ); // exercise UserParser parser = new UserParser( securityService, userStoreService, userDao, new UserStoreParser( userStoreDao ) ); try { parser.parseUser( "myUserStore:myuser" ); fail( "Expected exception" ); } catch ( Exception e ) { assertTrue( e instanceof UserNotFoundException ); } } private UserStoreEntity createUserStore( int key, String name ) { UserStoreEntity userStore = new UserStoreEntity(); userStore.setKey( new UserStoreKey( key ) ); userStore.setName( name ); userStore.setDeleted( false ); userStore.setConnectorName( "myConnector" ); return userStore; } private UserEntity createUser( String key, String name, UserStoreEntity userStore ) { UserEntity user = new UserEntity(); user.setKey( new UserKey( key ) ); user.setName( name ); user.setType( UserType.NORMAL ); user.setDeleted( false ); user.setUserStore( userStore ); return user; } }