package org.appfuse.persistence;

import org.apache.commons.logging.LogFactory;

import org.appfuse.Constants;
import org.appfuse.model.User;
import org.appfuse.model.UserCookie;


public class UserDAOTest extends BaseDAOTestCase {

    private User user = null;
    private UserDAO dao = null;

    protected void setUp() throws Exception {
        log = LogFactory.getLog(UserDAOTest.class);
        dao = (UserDAO) ctx.getBean("userDAO");
    }

    protected void tearDown() throws Exception {
        dao = null;
    }

    public void testGetUserInvalid() throws Exception {
        try {
            user = dao.getUser("badusername");
            fail("'badusername' found in database, failing test...");
        } catch (DAOException d) {
            if (log.isDebugEnabled()) {
                log.debug(d);
            }

            assertTrue(d != null);
        }
    }

    public void testGetUser() throws Exception {
        user = dao.getUser("tomcat");

        assertTrue(user != null);
        assertTrue(user.getRoles().size() == 1);
    }

    public void testSaveUser() throws Exception {
        user = dao.getUser("mraible");

        //log.info(user);
        user.setAddress("new address");

        user = dao.saveUser(user);
        assertEquals(user.getAddress(), "new address");
    }

    public void testAddUserRole() throws Exception {
        user = dao.getUser("mraible");

        assertTrue(user.getRoles().size() == 1);

        user.addRole(Constants.ADMIN_ROLE);
        user = dao.saveUser(user);

        assertTrue(user.getRoles().size() == 2);

        user.getRoles().remove(1);
        user = dao.saveUser(user);

        assertTrue(user.getRoles().size() == 1);
    }

    public void testAddUser() throws Exception {
        user = new User();
        user.setUsername("testuser");
        user.setPassword("testpass");
        user.setFirstName("Test");
        user.setLastName("Last");
        user.setCity("Denver");
        user.setProvince("CO");
        user.setCountry("USA");
        user.setPostalCode("80210");
        user.setEmail("testuser@appfuse.org");
        user.setWebsite("http://raibledesigns.com");
        user.addRole(Constants.USER_ROLE);

        user = dao.saveUser(user);
        assertTrue(user.getUsername() != null);
        assertTrue(user.getPassword().equals("testpass"));
        assertTrue(user.getRoles().size() == 1);
    }

    public void testRemoveUser() throws Exception {
        user = dao.getUser("testuser");
        dao.removeUser(user);

        try {
            user = dao.getUser("testuser");
            fail("Expected 'ObjectNotFoundException' not thrown");
        } catch (DAOException d) {
            if (log.isDebugEnabled()) {
                log.debug(d);
            }

            assertTrue(d != null);
        }
    }
    
    public void testSaveAndDeleteUserCookie() throws Exception {
        String cookieId = "BA67E786-C031-EA40-2769-863BB30B31EC";
        UserCookie cookie = new UserCookie();
        cookie.setUsername("tomcat");
        cookie.setCookieId(cookieId);
        dao.saveUserCookie(cookie);
        cookie = dao.getUserCookie(cookieId);
        assertEquals(cookieId, cookie.getCookieId());
        
        dao.removeUserCookies(cookie.getUsername());
        
        cookie = dao.getUserCookie(cookieId);
        assertNull(cookie);
    }
 
    public static void main(String[] args) {
        junit.textui.TestRunner.run(UserDAOTest.class);
    }
}