/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.ki.web.attr;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import junit.framework.TestCase;
import static org.easymock.EasyMock.*;
import org.easymock.IArgumentMatcher;
import org.junit.Before;
import org.junit.Test;

import org.apache.ki.web.attr.CookieAttribute;


/**
 * @author Les Hazlewood
 * @since 0.9
 */
public class CookieAttributeTest extends TestCase {

    private CookieAttribute<String> cookieAttribute;
    private HttpServletRequest mockRequest;
    private HttpServletResponse mockResponse;

    @Before
    public void setUp() throws Exception {
        this.mockRequest = createMock(HttpServletRequest.class);
        this.mockResponse = createMock(HttpServletResponse.class);
        this.cookieAttribute = new CookieAttribute<String>("test");
    }

    @Test
    //Verifies fix for JSEC-94
    public void testRemoveValue() throws Exception {

        Cookie cookie = new Cookie("test", "blah");
        cookie.setMaxAge(2351234); //doesn't matter what the time is
        Cookie[] cookies = new Cookie[]{cookie};

        expect(mockRequest.getCookies()).andReturn(cookies);
        //no path set on the cookie, so we expect to retrieve it from the context path
        expect(mockRequest.getContextPath()).andReturn("/somepath").times(2);
        mockResponse.addCookie(cookie);
        replay(mockRequest);
        replay(mockResponse);

        cookieAttribute.removeValue(mockRequest, mockResponse);

        verify(mockRequest);
        verify(mockResponse);

        assertTrue(cookie.getMaxAge() == 0);
        assertTrue(cookie.getPath().equals("/somepath"));
    }

    private void testContextPath(String contextPath) {
        Cookie cookie = new Cookie("test", "blah");
        cookie.setMaxAge(-1);
        cookie.setPath("/");

        expect(mockRequest.getContextPath()).andReturn(contextPath);

        mockResponse.addCookie(eqCookie(cookie));

        replay(mockRequest);
        replay(mockResponse);

        cookieAttribute.setName("test");
        cookieAttribute.storeValue("blah", mockRequest, mockResponse);

        verify(mockRequest);
        verify(mockResponse);
    }

    @Test
    /** Verifies fix for <a href="http://issues.apache.org/jira/browse/JSEC-34">JSEC-34</a> (1 of 2)*/
    public void testEmptyContextPath() throws Exception {
        testContextPath("");
    }


    @Test
    /** Verifies fix for <a href="http://issues.apache.org/jira/browse/JSEC-34">JSEC-34</a> (2 of 2)*/
    public void testNullContextPath() throws Exception {
        testContextPath(null);
    }

    private static <T extends Cookie> T eqCookie(final T in) {
        reportMatcher(new IArgumentMatcher() {
            public boolean matches(Object o) {
                Cookie c = (Cookie) o;
                return c.getName().equals(in.getName()) &&
                        c.getPath().equals(in.getPath()) &&
                        c.getMaxAge() == in.getMaxAge() &&
                        c.getSecure() == in.getSecure() &&
                        c.getValue().equals(in.getValue());
            }

            public void appendTo(StringBuffer sb) {
                sb.append("eqCookie(");
                sb.append(in.getClass().getName());
                sb.append(")");

            }
        });
        return null;
    }

    @Test
    //Verifies fix for JSEC-64
    public void testRemoveValueWithNullContext() throws Exception {

        Cookie cookie = new Cookie("test", "blah");
        cookie.setMaxAge(2351234); //doesn't matter what the time is
        Cookie[] cookies = new Cookie[]{cookie};

        expect(mockRequest.getCookies()).andReturn(cookies);
        //no path set on the cookie, so we expect to retrieve it from the context path
        expect(mockRequest.getContextPath()).andReturn(null).times(2);
        mockResponse.addCookie(cookie);
        replay(mockRequest);
        replay(mockResponse);

        cookieAttribute.removeValue(mockRequest, mockResponse);

        verify(mockRequest);
        verify(mockResponse);

        assertTrue(cookie.getMaxAge() == 0);
        assertTrue(cookie.getPath().equals("/"));
    }

}
