package com.oreilly.jent.people.servlet;

/**
 * In general, you may use the code in this book in your programs and 
 * documentation. You do not need to contact us for permission unless 
 * you're reproducing a significant portion of the code. For example, 
 * writing a program that uses several chunks of code from this book does 
 * not require permission. Selling or distributing a CD-ROM of examples 
 * from O'Reilly books does require permission. Answering a question by 
 * citing this book and quoting example code does not require permission. 
 * Incorporating a significant amount of example code from this book into 
 * your product's documentation does require permission.
 * 
 * We appreciate, but do not require, attribution. An attribution usually 
 * includes the title, author, publisher, and ISBN. For example: 
 * 
 *   "Java Enterprise in a Nutshell, Third Edition, 
 *    by Jim Farley and William Crawford 
 *    with Prakash Malani, John G. Norman, and Justin Gehtland. 
 *    Copyright 2006 O'Reilly Media, Inc., 0-596-10142-2."
 *  
 *  If you feel your use of code examples falls outside fair use or the 
 *  permission given above, feel free to contact us at 
 *  permissions@oreilly.com.
 */

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import junit.framework.Test;

import org.apache.cactus.FilterTestCase;
import org.apache.cactus.WebResponse;

public class TestLoginFilter extends FilterTestCase {
    /** An instance of the filter under test */
    private LoginFilter mFilter = null;

    /** Default constructor */
    public TestLoginFilter() {
        super();
    }

    /** Constructor with test name */
    public TestLoginFilter(String arg0) {
        super(arg0);
    }

    /** Constructor used to wrap a test with a Cactus test */
    public TestLoginFilter(String arg0, Test arg1) {
        super(arg0, arg1);
    }
    
    public void setUp() {
        mFilter = new LoginFilter();
        try {
            mFilter.init(this.config);
        }
        catch (ServletException se) {
            fail("Unexpected servlet exception: " + se.getMessage());
        }
    }
    
    public void tearDown() {
        mFilter.destroy();
        mFilter = null;
    }
    
    /** Ensure that the filter performs a redirect when no authentication
     *  credentials are present in the user session, and no login username or
     *  password are provided as request parameters. */
    public void testLoginRedirect() {
        // Ensure that the user session is clear of our authentication
        // credentials
        HttpSession session = this.request.getSession();
        if (session != null) {
            session.removeAttribute(LoginFilter.AUTHN_ID_VAR);
        }
        try {
            // Invoke the filter
            mFilter.doFilter(this.request, this.response, this.filterChain);
        }
        catch (IOException ioe) {
            fail("Unexpected I/O exception while invoking filter: "
                 + ioe.getMessage());
        }
        catch (ServletException se) {
            fail("Unexpected servlet exception while invoking filter: "
                 + se.getMessage());
        }
    }
    
    public void endLoginRedirect(WebResponse response) {
        // The response should contain an HTTP "MOVED TEMPORARILY" 
        // status with a redirect
        assertEquals("Unexpected status code seen in response",
                     response.getStatusCode(),
                     HttpServletResponse.SC_MOVED_TEMPORARILY);
    }
}
