/* * Copyright 2008-2010 the T2 Project ant the Others. * * 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.t2framework.confeito.action.impl; import java.lang.annotation.Annotation; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import junit.framework.TestCase; import org.t2framework.confeito.annotation.ActionParam; import org.t2framework.confeito.annotation.ActionPath; import org.t2framework.confeito.annotation.Default; import org.t2framework.confeito.annotation.GET; import org.t2framework.confeito.annotation.POST; import org.t2framework.confeito.annotation.Page; import org.t2framework.confeito.contexts.Request; import org.t2framework.confeito.contexts.WebContext; import org.t2framework.confeito.mock.MockPageComponent; import org.t2framework.confeito.mock.MockWebContext; import org.t2framework.confeito.model.PageComponent; import org.t2framework.confeito.navigation.Forward; import org.t2framework.confeito.spi.Navigation; public class PageDescFinderImplTest extends TestCase { public void testFind_normalCase() throws Exception { PageDescFinderImpl finder = new PageDescFinderImpl(); { MockWebContext mock = MockWebContext.createMock("aaa", "bbb"); Map<String, PageComponent> map = new HashMap<String, PageComponent>(); map.put("bbb", new MockPageComponent(PageDescFinderImplTest.class, "bbb")); finder.initialize(map); List<PageComponent> find = finder.find(mock); assertNotNull(find); assertTrue(find.size() == 1); assertEquals("bbb", find.get(0).getPageTemplatePath()); } } public void testFind_pathDoesnotMatch() throws Exception { PageDescFinderImpl finder = new PageDescFinderImpl(); { MockWebContext mock = MockWebContext.createMock("aaa", "bbb"); Map<String, PageComponent> map = new HashMap<String, PageComponent>(); map.put("not_match_path", new MockPageComponent( PageDescFinderImplTest.class, "not_match_path")); finder.initialize(map); List<PageComponent> find = finder.find(mock); assertTrue(find.isEmpty()); } } public void testFind_longestFirst() throws Exception { PageDescFinderImpl finder = new PageDescFinderImpl(); List<PageComponent> find = null; { MockWebContext mock = MockWebContext.createMock("aaa", "bbb/ccc/ddd"); Map<String, PageComponent> map = new HashMap<String, PageComponent>(); map.put("bbb", new MockPageComponent(PageDescFinderImplTest.class, "bbb")); map.put("bbb/ccc/ddd", new MockPageComponent( PageDescFinderImplTest.class, "bbb/ccc/ddd")); map.put("bbb/ccc", new MockPageComponent( PageDescFinderImplTest.class, "bbb/ccc")); finder.initialize(map); find = finder.find(mock); } assertNotNull(find); assertTrue(find.size() == 3); assertEquals("bbb/ccc/ddd", find.get(0).getPageTemplatePath()); assertEquals("bbb/ccc", find.get(1).getPageTemplatePath()); assertEquals("bbb", find.get(2).getPageTemplatePath()); } public void testFind_expressionLast() throws Exception { PageDescFinderImpl finder = new PageDescFinderImpl(); List<PageComponent> find = null; { MockWebContext mock = MockWebContext.createMock("aaa", "bbb/ccc/ddd"); Map<String, PageComponent> map = new HashMap<String, PageComponent>(); map.put("bbb", new MockPageComponent(PageDescFinderImplTest.class, "bbb")); map.put("bbb/ccc/ddd", new MockPageComponent( PageDescFinderImplTest.class, "bbb/ccc/ddd")); map.put("bbb/ccc", new MockPageComponent( PageDescFinderImplTest.class, "bbb/ccc")); map.put("bbb/{hoge}", new MockPageComponent( PageDescFinderImplTest.class, "bbb/{hoge}")); finder.initialize(map); find = finder.find(mock); } assertNotNull(find); assertTrue(find.size() == 4); assertEquals("bbb/ccc/ddd", find.get(0).getPageTemplatePath()); assertEquals("bbb/ccc", find.get(1).getPageTemplatePath()); assertEquals("bbb/{hoge}", find.get(2).getPageTemplatePath()); assertEquals("bbb", find.get(3).getPageTemplatePath()); } public void testFind_expressionLast2() throws Exception { PageDescFinderImpl finder = new PageDescFinderImpl(); List<PageComponent> find = null; { MockWebContext mock = MockWebContext.createMock("aaa", "aaa/bbb/ccc"); MockPageComponent pd1 = new MockPageComponent( PageDescFinderImplTest.class, "aaa"); MockPageComponent pd2 = new MockPageComponent( PageDescFinderImplTest.class, "aaa/bbb/ccc"); MockPageComponent pd3 = new MockPageComponent( PageDescFinderImplTest.class, "aaa/bbb"); MockPageComponent pd4 = new MockPageComponent( PageDescFinderImplTest.class, "aaa/bbb/{hoge}"); MockPageComponent pd5 = new MockPageComponent( PageDescFinderImplTest.class, "aaa/{hoge}"); finder.initialize(createMap(pd1, pd2, pd3, pd4, pd5)); find = finder.find(mock); } assertNotNull(find); assertTrue(find.size() == 5); for (PageComponent pd : find) { System.out.println(pd.getPageTemplatePath()); } assertEquals("aaa/bbb/ccc", find.get(0).getPageTemplatePath()); assertEquals("aaa/bbb/{hoge}", find.get(1).getPageTemplatePath()); assertEquals("aaa/bbb", find.get(2).getPageTemplatePath()); assertEquals("aaa/{hoge}", find.get(3).getPageTemplatePath()); assertEquals("aaa", find.get(4).getPageTemplatePath()); } public void testFind_rootPath() throws Exception { PageDescFinderImpl finder = new PageDescFinderImpl(); { MockWebContext mock = MockWebContext.createMock("/t2-spring", "/"); Map<String, PageComponent> map = new HashMap<String, PageComponent>(); map.put("/", new MockPageComponent(PageDescFinderImplTest.class, "/")); finder.initialize(map); List<PageComponent> find = finder.find(mock); assertNotNull(find); assertTrue(find.size() == 1); assertEquals("/", find.get(0).getPageTemplatePath()); } } protected Map<String, PageComponent> createMap(PageComponent... pageDescs) { Map<String, PageComponent> map = new HashMap<String, PageComponent>(); for (PageComponent pd : pageDescs) { map.put(pd.getPageTemplatePath(), pd); } return map; } public void testCreate1() throws Exception { PageDescFinderImpl finder = new PageDescFinderImpl(); { MockWebContext mock = MockWebContext.createMock("/t2", "/test"); Map<String, PageComponent> map = new HashMap<String, PageComponent>(); map.put("/test", new MockPageComponent( PageDescFinderImplTest.class, "/test")); finder.initialize(map); List<PageComponent> find = finder.find(mock); assertNotNull(find); assertTrue(find.size() == 1); assertEquals("/test", find.get(0).getPageTemplatePath()); } } public void testCreate2() throws Exception { PageDescFinderImpl finder = new PageDescFinderImpl(); { MockWebContext mock = MockWebContext .createMock("/t2", "/test/0!_-"); Map<String, PageComponent> map = new HashMap<String, PageComponent>(); map.put("/test/{hoge}", new MockPageComponent( PageDescFinderImplTest.class, "/test/{hoge}")); finder.initialize(map); List<PageComponent> find = finder.find(mock); assertNotNull(find); assertTrue(find.size() == 1); assertEquals("/test/{hoge}", find.get(0).getPageTemplatePath()); } } public void testCreate3() throws Exception { PageDescFinderImpl finder = new PageDescFinderImpl(); { MockWebContext mock = MockWebContext.createMock("/t2", "/0"); Map<String, PageComponent> map = new HashMap<String, PageComponent>(); map.put("{aaa}", new MockPageComponent( PageDescFinderImplTest.class, "{hoge}")); finder.initialize(map); List<PageComponent> find = finder.find(mock); assertNotNull(find); assertTrue(find.size() == 1); assertEquals("{hoge}", find.get(0).getPageTemplatePath()); } } public void testUnnaturalRequest1() throws Exception { PageDescFinderImpl finder = new PageDescFinderImpl(); { MockWebContext mock = MockWebContext.createMock("/t2", "/"); Map<String, PageComponent> map = new HashMap<String, PageComponent>(); map .put("", new MockPageComponent( PageDescFinderImplTest.class, "")); finder.initialize(map); List<PageComponent> find = finder.find(mock); assertNotNull(find); assertTrue(find.size() == 1); assertEquals("", find.get(0).getPageTemplatePath()); } } public void testUnnaturalRequest2() throws Exception { PageDescFinderImpl finder = new PageDescFinderImpl(); { MockWebContext mock = MockWebContext.createMock("/t2", ""); Map<String, PageComponent> map = new HashMap<String, PageComponent>(); map.put("a", new MockPageComponent(PageDescFinderImplTest.class, "a")); finder.initialize(map); List<PageComponent> find = finder.find(mock); assertTrue(find.size() == 0); } } public void testMatch_el3() throws Exception { PageDescFinderImpl finder = new PageDescFinderImpl(); { MockWebContext mock = MockWebContext.createMock("/t2", "moge/hoge"); Map<String, PageComponent> map = new HashMap<String, PageComponent>(); map.put("{aaa}/hoge", new MockPageComponent( PageDescFinderImplTest.class, "{aaa}/hoge")); finder.initialize(map); List<PageComponent> find = finder.find(mock); assertTrue(find.size() == 1); } } public void testMatch_el4() throws Exception { PageDescFinderImpl finder = new PageDescFinderImpl(); { MockWebContext mock = MockWebContext.createMock("/t2", "moge/hoge/foo"); Map<String, PageComponent> map = new HashMap<String, PageComponent>(); map.put("{aaa}/hoge/{bbb}", new MockPageComponent( PageDescFinderImplTest.class, "{aaa}/hoge/{bbb}")); finder.initialize(map); List<PageComponent> find = finder.find(mock); assertTrue(find.size() == 1); } } public void testMatch_el5_requestedUrlShouldBeChoppedToVerify() throws Exception { PageDescFinderImpl finder = new PageDescFinderImpl(); { MockWebContext mock = MockWebContext.createMock("/t2", "/page/invoke/moge/123"); Map<String, PageComponent> map = new HashMap<String, PageComponent>(); map.put("/page/{hoge}", new MockPageComponent( PageDescFinderImplTest.class, "/page/{hoge}")); finder.initialize(map); List<PageComponent> find = finder.find(mock); assertTrue(find.size() == 1); } } public static Set<Class<? extends Annotation>> set = new HashSet<Class<? extends Annotation>>(); static { set.add(ActionPath.class); set.add(ActionParam.class); set.add(GET.class); set.add(POST.class); } @Page("/test") public static class TestPage { @Default public Navigation init(WebContext context) { return null; } @GET @ActionPath public Navigation a(WebContext context) { return null; } @POST @ActionParam public Navigation b(WebContext context) { return null; } } @Page("/test2") public static class Test2Page { @Default public Navigation getAaa(WebContext context) { return Forward.to("aaa.jsp"); } @GET @POST @ActionParam("button1") public Navigation submit(WebContext context) { return null; } @GET @ActionParam("link2") public Navigation link(WebContext context) { return null; } } @Page("/test/{hoge}") public static class Test3Page { } @Page public static class Test4Page { } @Page public static class Test5Page { @Default public Navigation hoge(WebContext context) { return Forward.to("aaa.jsp"); } @ActionParam("hogehoge") public Navigation hoge(WebContext context, Request request) { return null; } } }