package org.appfuse.service;

import java.util.ArrayList;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.appfuse.Constants;
import org.appfuse.model.User;
import org.appfuse.model.UserRole;


public class UserManagerTest extends BaseManagerTestCase {
    private UserManager mgr = null;
    private Log log = LogFactory.getLog(UserManagerTest.class);
    private User user;

    protected void setUp() throws Exception {
        mgr = (UserManager) ctx.getBean("userManager");
    }

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

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

        if (log.isDebugEnabled()) {
            log.debug(user);
        }

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

    public void testSaveUser() throws Exception {
        user = (User) mgr.getUser("tomcat");
        assertTrue(user.getRoles().size() == 1);
        user.setPhoneNumber("303-555-1212");

        if (log.isDebugEnabled()) {
            log.debug("saving user with updated phone number: " + user);
        }

        user = (User) mgr.saveUser(user);
        assertTrue(user.getPhoneNumber().equals("303-555-1212"));

        if (log.isDebugEnabled()) {
            log.debug("user.getRoles.size(): " +
                      user.getRoles().size());
        }

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

    public void testAddAndRemoveUser() throws Exception {
        user = new User();

        // call populate method in super class to populate test data
        // from a properties file matching this class name
        user = (User) populate(user);

        UserRole role = new UserRole();
        role.setRoleName(Constants.USER_ROLE);

        ArrayList roles = new ArrayList();
        roles.add(role);
        user.setRoles(roles);

        user = (User) mgr.saveUser(user);
        assertTrue(user.getUsername().equals("john"));
        assertTrue(user.getRoles().size() == 1);

        if (log.isDebugEnabled()) {
            log.debug("removing user...");
        }

        mgr.removeUser(user);

        try {
            user = (User) mgr.getUser("john");
            fail("Expected 'Exception' not thrown");
        } catch (Exception e) {
            if (log.isDebugEnabled()) {
                log.debug(e);
            }

            assertTrue(e != null);
        }
    }

    public static void main(String[] args) {
        junit.textui.TestRunner.run(UserManagerTest.class);
    }
}