// Path: src/main/java/org/bigtesting/fixd/request/HttpRequest.java
// public interface HttpRequest {
// 
//     String getPath();
//     
//     String getUndecodedPath();
//     
//     Set<String> getRequestParameterNames();
//     
//     String getRequestParameter(String name);
//     
//     String getPathParameter(String name);
//     
//     List<String> getHeaderNames();
//     
//     String getHeaderValue(String name);
//     
//     String getBody();
//     
//     InputStream getBodyAsStream() throws IOException;
//     
//     <T> T getBody(Class<T> type);
//     
//     long getContentLength();
//     
//     String getContentType();
//     
//     String getMethod();
//     
//     long getTime();
//     
//     String getQuery();
//     
//     int getMajor();
//     
//     int getMinor();
//     
//     String getTarget();
//     
//     /**
//      * @return a session, if it exists, or null if it does not
//      */
//     Session getSession();
//     
//     Route getRoute();
// }
// 
// Path: src/main/java/org/bigtesting/fixd/session/PathParamSessionHandler.java
// public class PathParamSessionHandler implements SessionHandler {
// 
//     public void onCreate(HttpRequest request) {
//         
//         List<NamedParameterElement> pathParams = request.getRoute().getNamedParameterElements();
//         String[] pathTokens = RouteHelper.getPathElements(request.getPath());
//         
//         for (NamedParameterElement pathParam : pathParams) {
//             request.getSession().set(pathParam.name(), pathTokens[pathParam.index()]);
//         }
//     }
// }
// 
// Path: src/main/java/org/bigtesting/fixd/session/Session.java
// public class Session {
// 
//     private final String sessionId;
//     
//     private final Map<String, Object> values = new HashMap<String, Object>();
//     
//     private boolean valid = true;
//     
//     public Session() {
//         
//         this.sessionId = UUID.randomUUID().toString();
//     }
//     
//     public String getSessionId() {
//         
//         return sessionId;
//     }
//     
//     public Object get(String key) {
//         
//         return values.get(key);
//     }
//     
//     public void set(String key, Object value) {
//         
//         values.put(key, value);
//     }
//     
//     public Set<String> getAttributeNames() {
//         
//         return values.keySet();
//     }
//     
//     public boolean isValid() {
//         
//         return valid;
//     }
//     
//     public void invalidate() {
//         
//         this.valid = false;
//     }
// }
// 
// Path: src/main/java/org/bigtesting/fixd/session/SessionHandler.java
// public interface SessionHandler {
// 
//     void onCreate(HttpRequest request);
// }


import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.bigtesting.fixd.request.HttpRequest;
import org.bigtesting.fixd.session.PathParamSessionHandler;
import org.bigtesting.fixd.session.Session;
import org.bigtesting.fixd.session.SessionHandler;
import org.bigtesting.routd.Route;
import org.junit.Test;
/*
 * Copyright (C) 2015 BigTesting.org
 *
 * Licensed 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.bigtesting.fixd.tests;




/**
 * 
 * @author Luis Antunes
 */
public class TestPathParamSessionHandler {

    @Test
    public void onCreateIsHandled() {
        
        HttpRequest request = mock(HttpRequest.class);
        when(request.getPath()).thenReturn("/first-name/John/last-name/Doe");
        
        Session session = new Session();
        when(request.getSession()).thenReturn(session);
        
        Route route = new Route("/first-name/:firstName/last-name/:lastName");
        when(request.getRoute()).thenReturn(route);
        
        newSessionHandler().onCreate(request);
        
        List<String> attributeNames = new ArrayList<String>(session.getAttributeNames());
        Collections.sort(attributeNames);
        
        assertEquals("[firstName, lastName]", attributeNames.toString());
        
        assertEquals("John", session.get("firstName"));
        assertEquals("Doe", session.get("lastName"));
    }
    
    @Test
    public void onCreateIsHandledWithNoParams() {
        
        HttpRequest request = mock(HttpRequest.class);
        when(request.getPath()).thenReturn("/");
        
// Path: src/main/java/org/bigtesting/fixd/request/HttpRequest.java
// public interface HttpRequest {
// 
//     String getPath();
//     
//     String getUndecodedPath();
//     
//     Set<String> getRequestParameterNames();
//     
//     String getRequestParameter(String name);
//     
//     String getPathParameter(String name);
//     
//     List<String> getHeaderNames();
//     
//     String getHeaderValue(String name);
//     
//     String getBody();
//     
//     InputStream getBodyAsStream() throws IOException;
//     
//     <T> T getBody(Class<T> type);
//     
//     long getContentLength();
//     
//     String getContentType();
//     
//     String getMethod();
//     
//     long getTime();
//     
//     String getQuery();
//     
//     int getMajor();
//     
//     int getMinor();
//     
//     String getTarget();
//     
//     /**
//      * @return a session, if it exists, or null if it does not
//      */
//     Session getSession();
//     
//     Route getRoute();
// }
// 
// Path: src/main/java/org/bigtesting/fixd/session/PathParamSessionHandler.java
// public class PathParamSessionHandler implements SessionHandler {
// 
//     public void onCreate(HttpRequest request) {
//         
//         List<NamedParameterElement> pathParams = request.getRoute().getNamedParameterElements();
//         String[] pathTokens = RouteHelper.getPathElements(request.getPath());
//         
//         for (NamedParameterElement pathParam : pathParams) {
//             request.getSession().set(pathParam.name(), pathTokens[pathParam.index()]);
//         }
//     }
// }
// 
// Path: src/main/java/org/bigtesting/fixd/session/Session.java
// public class Session {
// 
//     private final String sessionId;
//     
//     private final Map<String, Object> values = new HashMap<String, Object>();
//     
//     private boolean valid = true;
//     
//     public Session() {
//         
//         this.sessionId = UUID.randomUUID().toString();
//     }
//     
//     public String getSessionId() {
//         
//         return sessionId;
//     }
//     
//     public Object get(String key) {
//         
//         return values.get(key);
//     }
//     
//     public void set(String key, Object value) {
//         
//         values.put(key, value);
//     }
//     
//     public Set<String> getAttributeNames() {
//         
//         return values.keySet();
//     }
//     
//     public boolean isValid() {
//         
//         return valid;
//     }
//     
//     public void invalidate() {
//         
//         this.valid = false;
//     }
// }
// 
// Path: src/main/java/org/bigtesting/fixd/session/SessionHandler.java
// public interface SessionHandler {
// 
//     void onCreate(HttpRequest request);
// }


// Path: src/test/java/org/bigtesting/fixd/tests/TestPathParamSessionHandler.java
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.bigtesting.fixd.request.HttpRequest;
import org.bigtesting.fixd.session.PathParamSessionHandler;
import org.bigtesting.fixd.session.Session;
import org.bigtesting.fixd.session.SessionHandler;
import org.bigtesting.routd.Route;
import org.junit.Test;

/*
 * Copyright (C) 2015 BigTesting.org
 *
 * Licensed 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.bigtesting.fixd.tests;




/**
 * 
 * @author Luis Antunes
 */
public class TestPathParamSessionHandler {

    @Test
    public void onCreateIsHandled() {
        
        HttpRequest request = mock(HttpRequest.class);
        when(request.getPath()).thenReturn("/first-name/John/last-name/Doe");
        
        Session session = new Session();
        when(request.getSession()).thenReturn(session);
        
        Route route = new Route("/first-name/:firstName/last-name/:lastName");
        when(request.getRoute()).thenReturn(route);
        
        newSessionHandler().onCreate(request);
        
        List<String> attributeNames = new ArrayList<String>(session.getAttributeNames());
        Collections.sort(attributeNames);
        
        assertEquals("[firstName, lastName]", attributeNames.toString());
        
        assertEquals("John", session.get("firstName"));
        assertEquals("Doe", session.get("lastName"));
    }
    
    @Test
    public void onCreateIsHandledWithNoParams() {
        
        HttpRequest request = mock(HttpRequest.class);
        when(request.getPath()).thenReturn("/");
        
        Session session = new Session();