/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  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.  For additional information regarding
 * copyright in this work, please see the NOTICE file in the top level
 * directory of this distribution.
 */
package org.apache.abdera.protocol.server.test.route;

import static org.easymock.EasyMock.expect;
import static org.easymock.classextension.EasyMock.createMock;
import static org.easymock.classextension.EasyMock.replay;

import java.util.HashMap;
import java.util.Map;

import junit.framework.Assert;

import org.apache.abdera.i18n.templates.HashMapContext;
import org.apache.abdera.i18n.templates.Route;
import org.apache.abdera.protocol.server.RequestContext;
import org.apache.abdera.protocol.server.Target;
import org.apache.abdera.protocol.server.context.RequestContextWrapper;
import org.apache.abdera.protocol.server.impl.RouteManager;
import org.junit.Test;

public class RouteTest extends Assert {
  @Test
  public void testSimpleRoute() throws Exception {
    Route route = new Route("feed", "/:collection");
    
    HashMapContext ctx = new HashMapContext();
    ctx.put("collection", "test");
    assertEquals("/test", route.expand(ctx));
    
    assertTrue(route.match("/foo"));
    assertFalse(route.match("/foo/test"));
    assertFalse(route.match("foo"));
    
    Map<String, String> vars = route.parse("/test");
    assertEquals("test", vars.get("collection"));
  }
  @Test
  public void testStaticRoute() throws Exception {
    Route route = new Route("feed", "/feed");
    
    HashMapContext ctx = new HashMapContext();
    assertEquals("/feed", route.expand(ctx));
    
    assertTrue(route.match("/feed"));
    assertFalse(route.match("/feed/test"));
    assertFalse(route.match("feed"));
    
    Map<String, String> vars = route.parse("/test");
    assertEquals(0, vars.size());
  }
  
  @Test
  public void testTwoPathRoute() throws Exception {
    Route route = new Route("entry", "/:collection/:entry");
    
    HashMapContext ctx = new HashMapContext();
    ctx.put("collection", "c");
    ctx.put("entry", "e");
    assertEquals("/c/e", route.expand(ctx));
    
    assertFalse(route.match("/foo"));
    assertTrue(route.match("/foo/test"));
    assertFalse(route.match("foo"));
    assertFalse(route.match("/foo/test/bar"));

    Map<String, String> vars = route.parse("/1/2");
    assertEquals("1", vars.get("collection"));
    assertEquals("2", vars.get("entry"));
    
    vars = route.parse("/1/");
    assertEquals("1", vars.get("collection"));
    assertNull(vars.get("entry"));
  }

  @Test
  public void testTwoPathRouteWithSubstitution() throws Exception {
    Map<String, String> defaults = new HashMap<String,String>();
    defaults.put("collection", "c");
    Route route = new Route("entry", "/:collection/:entry", defaults, null);
    
    HashMapContext ctx = new HashMapContext();
    ctx.put("entry", "e");
    assertEquals("/c/e", route.expand(ctx));
  }

  @Test
  public void testDashedRoute() throws Exception {
    Route route = new Route("entry", ":collection/:entry-:foo");
    
    HashMapContext ctx = new HashMapContext();
    ctx.put("collection", "c");
    ctx.put("entry", "e");
    ctx.put("foo", "f");
    assertEquals("c/e-f", route.expand(ctx));
    
    assertTrue(route.match("1/2-3"));
    assertFalse(route.match("1/2-"));
    assertFalse(route.match("1/-"));
  }

  @Test
  public void testDashedRouteWithSubstitution() throws Exception {
    Map<String, String> defaults = new HashMap<String,String>();
    defaults.put("foo", "f");
    Route route = new Route("entry", ":collection/:entry-:foo", defaults, null);
    
    HashMapContext ctx = new HashMapContext();
    ctx.put("collection", "c");
    ctx.put("entry", "e");
    assertEquals("c/e-f", route.expand(ctx));
    
    assertTrue(route.match("1/2-3"));
    assertFalse(route.match("1/2-"));
    assertFalse(route.match("1/-"));
  }

  @Test
  public void testBaseURI() throws Exception {
    Route route = new Route("entry", "/base/:collection/:entry");

    assertTrue(route.match("/base/test/123"));
    assertFalse(route.match("/base/test"));
    assertFalse(route.match("base/test"));
    
    Map<String, String> vars = route.parse("/base/1/2");
    assertEquals("1", vars.get("collection"));
    assertEquals("2", vars.get("entry"));
  }
  

  @Test
  public void testNonVariablesAtBothEnds() throws Exception {
    Route route = new Route("entry", "/base/:collection/:entry;categories");

    assertTrue(route.match("/base/test/123;categories"));
    assertFalse(route.match("/base/test/123"));
    
    Map<String, String> vars = route.parse("/base/1/2;categories");
    assertEquals("1", vars.get("collection"));
    assertEquals("2", vars.get("entry"));
  }
  @Test
  public void testSubDelims() throws Exception {
    Route route = new Route("entry", "/base/:collection/:entry");

    assertTrue(route.match("/base/test/123"));
    assertFalse(route.match("/base/test/123;categories"));
    
    Map<String, String> vars = route.parse("/base/test/123");
    assertEquals("test", vars.get("collection"));
    assertEquals("123", vars.get("entry"));
  }
  @Test
  public void testGenDelims() throws Exception {
    Route route = new Route("entry", "/base/:collection/");

    assertTrue(route.match("/base/test/"));
    assertFalse(route.match("/base/test/123/"));
    
    Map<String, String> vars = route.parse("/base/test/");
    assertEquals("test", vars.get("collection"));
  }
    
  @Test
  public void testUrlFor() throws Exception {
    RouteManager manager = new RouteManager().addRoute(new Route("entry", "/base/:collection/:entry"));

    Target targetMock = createMock(Target.class);
    expect(targetMock.getParameter("collection")).andReturn("entries");
    expect(targetMock.getParameter("entry")).andReturn("123");
    replay(targetMock);
    RequestContext contextMock = createMock(RequestContextWrapper.class);
    expect(contextMock.getContextPath()).andReturn("/appBase");
    expect(contextMock.getTarget()).andReturn(targetMock).times(2);
    replay(contextMock);

    assertEquals(manager.urlFor(contextMock, "entry", null), "/appBase/base/entries/123");
  }
}
