/**
 * ÀÌ ¼Ò½º´Â Spring ÇÁ·¹ÀÓ¿öÅ© ¿öÅ©ºÏ¿¡¼­ »ç¿ëÇÑ ¿¹Á¦ ¼Ò½ºÀÔ´Ï´Ù. 
 * ÀÌ ¼Ò½º´Â ¸ðµç °³¹ßÀÚµéÀÌ ÀÚÀ¯·Ó°Ô ¼öÁ¤ ¹× ¹èÆ÷ÇÒ ¼ö ÀÖ½À´Ï´Ù. 
 * ´Ü, ÀÌ ¼Ò½º¸¦ ±â¹ÝÀ¸·Î »õ·Î¿î ¾ÖÇÃ¸®ÄÉÀÌ¼ÇÀ» °³¹ßÇÒ °æ¿ì ÃâÃ³¸¦ ¸í½ÃÇØ ÁÖ½Ã¸é µË´Ï´Ù. 
 */
package net.javajigi.user.service;

import junit.framework.TestCase;
import net.javajigi.advice.EmailNotificationPointcut;
import net.javajigi.advice.EmailNotificationThrowsAdvice;
import net.javajigi.advice.UserLoggingAdvice;
import net.javajigi.advice.UserLoggingPointcut;
import net.javajigi.user.dao.UserDAO;
import net.javajigi.user.model.User;

import org.easymock.MockControl;
import org.springframework.aop.Advisor;
import org.springframework.aop.Pointcut;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.support.DefaultPointcutAdvisor;

public class LoggingUserServiceTest extends TestCase {
	private MockControl control = null;

	private UserDAO mock = null;

	protected void setUp() throws Exception {
		control = MockControl.createControl(UserDAO.class);
		mock = (UserDAO) control.getMock();
	}

	public void testLogin() throws Exception {
		User user = new User();
		user.setUserId("javajigi");
		user.setPassword("password");
		user.setName("¹ÚÀç¼º");
		user.setEmail("javajigi@gmail.com");

		mock.findUser(user.getUserId());
		control.setReturnValue(user);
		control.replay();

		UserService target = new UserServiceImpl();
		target.setUserDAO(mock);

		ProxyFactory pf = new ProxyFactory();
		pf.addAdvice(new UserLoggingAdvice());
		pf.addAdvice(new EmailNotificationThrowsAdvice());
		pf.setTarget(target);

		UserService userService = (UserService) pf.getProxy();

		assertTrue(userService.login(user.getUserId(), user.getPassword()));
	}
	
	public void testLoginWithPointcut() throws Exception {
		User user = new User();
		user.setUserId("javajigi");
		user.setPassword("password");
		user.setName("¹ÚÀç¼º");
		user.setEmail("javajigi@gmail.com");

		UserService target = new UserServiceImpl();
		target.setUserDAO(mock);

		ProxyFactory pf = new ProxyFactory();
		
		Pointcut loggingPC = new UserLoggingPointcut();
		Advisor loggingAdvisor = new DefaultPointcutAdvisor(loggingPC, new UserLoggingAdvice());
		pf.addAdvisor(loggingAdvisor);
		
		Pointcut emailPC = new EmailNotificationPointcut();
		Advisor emailAdvisor = 
			new DefaultPointcutAdvisor(emailPC, new EmailNotificationThrowsAdvice());
		pf.addAdvisor(emailAdvisor);

		pf.setTarget(target);

		UserService userService = (UserService) pf.getProxy();
		
		mock.insert(user);
		control.setReturnValue(1);
		mock.existedUser(user.getUserId());
		control.setReturnValue(false);
		mock.findUser(user.getUserId());
		control.setReturnValue(user);
		control.replay();
		
		assertEquals(1, userService.addUser(user));
		
		assertTrue(userService.login(user.getUserId(), user.getPassword()));
	}	
}
