/**
 * ÀÌ ¼Ò½º´Â Spring ÇÁ·¹ÀÓ¿öÅ© ¿öÅ©ºÏ¿¡¼­ »ç¿ëÇÑ ¿¹Á¦ ¼Ò½ºÀÔ´Ï´Ù. 
 * ÀÌ ¼Ò½º´Â ¸ðµç °³¹ßÀÚµéÀÌ ÀÚÀ¯·Ó°Ô ¼öÁ¤ ¹× ¹èÆ÷ÇÒ ¼ö ÀÖ½À´Ï´Ù. 
 * ´Ü, ÀÌ ¼Ò½º¸¦ ±â¹ÝÀ¸·Î »õ·Î¿î ¾ÖÇÃ¸®ÄÉÀÌ¼ÇÀ» °³¹ßÇÒ °æ¿ì ÃâÃ³¸¦ ¸í½ÃÇØ ÁÖ½Ã¸é µË´Ï´Ù. 
 */
package net.javajigi.user.service;

import java.util.Hashtable;

import javax.naming.InitialContext;
import javax.naming.NamingException;

import junit.framework.TestCase;
import net.javajigi.user.PasswordMismatchException;
import net.javajigi.user.model.User;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserServiceTest extends TestCase {
	private UserService userService;

    private InitialContext getContext() throws NamingException {
        Hashtable props = new Hashtable();

        // ----------------------JBOSS
        props.put(InitialContext.INITIAL_CONTEXT_FACTORY,
                "org.jnp.interfaces.NamingContextFactory");
        props.put(InitialContext.PROVIDER_URL, "jnp://127.0.0.1:1099");
        // ----------------------JBOSS

        InitialContext initialContext = new InitialContext(props);

        return initialContext;
    }    
    
	protected void setUp() throws Exception {
		ApplicationContext ctx = new ClassPathXmlApplicationContext(
				"/WEB-INF/applicationContext*.xml");
		userService = (UserService) ctx.getBean("userService");
        
        InitialContext context = getContext();
	}

	protected void tearDown() throws Exception {
		super.tearDown();
	}

	private User populateUser() {
		User user = new User();
		user.setUserId("sanjigi");
		user.setPassword("password");
		user.setEmail("javajigi@gmail.com");
		user.setName("¹ÚÀç¼º");
		user.setAdmin(false);

		return user;
	}

	/*
	 * Test method for 'net.javajigi.user.service.UserServiceImpl.addUser(User)'
	 */
	public void testAddAndFindAndRemoveUser() throws Exception {
		User user = populateUser();
		try {
			int result = userService.addUser(user);
			
			assertEquals(1, result);
			
			User findUser = userService.findUser(user.getUserId());
			
			assertEquals(user, findUser);
		} finally {
			userService.removeUser(user.getUserId());
		}
	}

	/*
	 * Test method for
	 * 'net.javajigi.user.service.UserServiceImpl.updateUser(User)'
	 */
	public void testUpdateAndFindAndRemoveUser() throws Exception {
		User user = populateUser();
		try {
			int result = userService.addUser(user);
			
			assertEquals(1, result);
			
			user.setName("±è¿µÁ¤");
			user.setEmail("sanjigi@hotmail.com");
			user.setPassword("pass");
			user.setAdmin(true);
			
			int updateResult = userService.updateUser(user);
			
			assertEquals(1, updateResult);
			
			User findUser = userService.findUser(user.getUserId());
			
			assertEquals(user, findUser);
		} finally {
			userService.removeUser(user.getUserId());
		}
	}

	/*
	 * Test method for
	 * 'net.javajigi.user.service.UserServiceImpl.findUserList()'
	 */
	public void testFindUserList() {

	}

	/*
	 * Test method for 'net.javajigi.user.service.UserServiceImpl.login(String,
	 * String)'
	 */
	public void testLoginSuccess() throws Exception{
		User user = populateUser();
		try {
			int result = userService.addUser(user);
			
			assertEquals(1, result);
			
			assertTrue(userService.login(user.getUserId(), user.getPassword()));			
		} finally {
			userService.removeUser(user.getUserId());
		}
	}
	
	public void testLoginFailed() throws Exception {
		User user = populateUser();
		try {
			int result = userService.addUser(user);
			
			assertEquals(1, result);
			
			try {
				assertTrue(userService.login(user.getUserId(), user.getPassword()+ "fail"));
				
				fail("PasswordMismatchExceptionÀÌ ¹ß»ýÇØ¾ß ÇÕ´Ï´Ù.");
			} catch (PasswordMismatchException e) {
				assertTrue(true);
			}		
		} finally {
			userService.removeUser(user.getUserId());
		}		
	}
}
