1   /*
2    * Copyright 2004-2008 the Seasar Foundation and the Others.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
13   * either express or implied. See the License for the specific language
14   * governing permissions and limitations under the License.
15   */
16  package org.seasar.cubby.routing.impl;
17  
18  import java.util.ArrayList;
19  import java.util.HashMap;
20  import java.util.List;
21  import java.util.Map;
22  
23  import junit.framework.Assert;
24  
25  import org.seasar.cubby.routing.InternalForwardInfo;
26  import org.seasar.cubby.routing.PathResolver;
27  import org.seasar.cubby.util.CubbyUtils;
28  import org.seasar.extension.unit.S2TestCase;
29  
30  public class PathResolverImplTest extends S2TestCase {
31  
32  	private PathResolver pathResolver;
33  
34  	@Override
35  	protected void setUp() throws Exception {
36  		super.setUp();
37  		include(this.getClass().getName().replaceAll("\\.", "/") + ".dicon");
38  	}
39  
40  	public void testRoot1() {
41  		InternalForwardInfo info = pathResolver.getInternalForwardInfo("/",
42  				"GET");
43  		assertNotNull(info);
44  		assertEquals(CubbyUtils.getInternalForwardPath(MockRootAction.class, "index"), info
45  				.getInternalForwardPath());
46  	}
47  
48  	public void testRoot2() {
49  		InternalForwardInfo info = pathResolver.getInternalForwardInfo(
50  				"/dummy1", "GET");
51  		assertNotNull(info);
52  		assertEquals(CubbyUtils.getInternalForwardPath(MockRootAction.class, "dummy1"), info
53  				.getInternalForwardPath());
54  	}
55  
56  	public void testDefault1() {
57  		InternalForwardInfo info = pathResolver.getInternalForwardInfo(
58  				"/mock/update", "GET");
59  		assertNotNull(info);
60  		Query query = new Query(info.getInternalForwardPath());
61  		assertEquals(CubbyUtils.getInternalForwardPath(MockAction.class, "update"), query
62  				.getPath());
63  		assertTrue(query.isEmptyParameter());
64  	}
65  
66  	public void testDefault2() {
67  		InternalForwardInfo info = pathResolver.getInternalForwardInfo(
68  				"/mock/create", "GET");
69  		assertNotNull(info);
70  		Query query = new Query(info.getInternalForwardPath());
71  		assertEquals(CubbyUtils.getInternalForwardPath(MockAction.class, "insert"), query
72  				.getPath());
73  		assertTrue(query.isEmptyParameter());
74  	}
75  
76  	public void testDefault3() {
77  		InternalForwardInfo info = pathResolver.getInternalForwardInfo(
78  				"/mock/delete/10", "GET");
79  		assertNotNull(info);
80  		Query query = new Query(info.getInternalForwardPath());
81  		assertEquals(CubbyUtils.getInternalForwardPath(MockAction.class, "delete"), query
82  				.getPath());
83  		assertEquals(1, query.getParameterSize());
84  		assertEquals(1, query.getParam("value").size());
85  		assertEquals("10", query.getParam("value").get(0));
86  	}
87  
88  	public void testDefault4() {
89  		InternalForwardInfo info = pathResolver.getInternalForwardInfo(
90  				"/mock/delete/a", "GET");
91  		assertNull(info);
92  	}
93  
94  	public void testDefault5() {
95  		InternalForwardInfo info = pathResolver.getInternalForwardInfo(
96  				"/mock/cubby", "GET");
97  		assertNotNull(info);
98  		Query query = new Query(info.getInternalForwardPath());
99  		assertEquals(CubbyUtils.getInternalForwardPath(MockAction.class, "name"), query
100 				.getPath());
101 		assertEquals(1, query.getParam("name").size());
102 		assertEquals("cubby", query.getParam("name").get(0));
103 	}
104 
105 	public void testPath1() {
106 		InternalForwardInfo info = pathResolver.getInternalForwardInfo(
107 				"/foo/4/update", "GET");
108 		assertNotNull(info);
109 		Query query = new Query(info.getInternalForwardPath());
110 		assertEquals(CubbyUtils.getInternalForwardPath(MockPathAction.class, "update"), query
111 				.getPath());
112 		assertEquals(1, query.getParameterSize());
113 		assertEquals(1, query.getParam("id").size());
114 		assertEquals("4", query.getParam("id").get(0));
115 	}
116 
117 	public void testPath2() {
118 		InternalForwardInfo info = pathResolver.getInternalForwardInfo(
119 				"/foo/4/create", "GET");
120 		assertNotNull(info);
121 		Query query = new Query(info.getInternalForwardPath());
122 		assertEquals(CubbyUtils.getInternalForwardPath(MockPathAction.class, "insert"), query
123 				.getPath());
124 		assertEquals(1, query.getParameterSize());
125 		assertEquals(1, query.getParam("id").size());
126 		assertEquals("4", query.getParam("id").get(0));
127 	}
128 
129 	public void testPath3() {
130 		InternalForwardInfo info = pathResolver.getInternalForwardInfo(
131 				"/foo/4/delete/10", "GET");
132 		assertNotNull(info);
133 		Query query = new Query(info.getInternalForwardPath());
134 		assertEquals(CubbyUtils.getInternalForwardPath(MockPathAction.class, "delete"), query
135 				.getPath());
136 		assertEquals(2, query.getParameterSize());
137 		assertEquals(1, query.getParam("id").size());
138 		assertEquals("4", query.getParam("id").get(0));
139 		assertEquals(1, query.getParam("value").size());
140 		assertEquals("10", query.getParam("value").get(0));
141 	}
142 
143 	public void testPath4() {
144 		InternalForwardInfo info = pathResolver.getInternalForwardInfo(
145 				"/foo/4/delete/a", "GET");
146 		assertNull(info);
147 	}
148 
149 	public void testPath5() {
150 		InternalForwardInfo info = pathResolver.getInternalForwardInfo(
151 				"/foo/4/cubby", "GET");
152 		assertNotNull(info);
153 		Query query = new Query(info.getInternalForwardPath());
154 		assertEquals(CubbyUtils.getInternalForwardPath(MockPathAction.class, "name"), query
155 				.getPath());
156 		assertEquals(1, query.getParam("id").size());
157 		assertEquals("4", query.getParam("id").get(0));
158 		assertEquals(1, query.getParam("name").size());
159 		assertEquals("cubby", query.getParam("name").get(0));
160 	}
161 
162 	class Query {
163 		private String path;
164 		private Map<String, List<String>> params;
165 
166 		public Query(String path) {
167 			String[] tokens = path.split("\\?", 2);
168 			switch (tokens.length) {
169 			case 1:
170 				this.path = tokens[0];
171 				this.params = new HashMap<String, List<String>>();
172 				break;
173 			case 2:
174 				this.path = tokens[0];
175 				this.params = parseQueryString(tokens[1]);
176 
177 				break;
178 			default:
179 				Assert.fail("illegal path " + path);
180 				break;
181 			}
182 		}
183 
184 		private Map<String, List<String>> parseQueryString(String queryString) {
185 			Map<String, List<String>> params = new HashMap<String, List<String>>();
186 			String[] tokens = queryString.split("&");
187 			for (String token : tokens) {
188 				String[] param = parseQueryParameter(token);
189 				String name = param[0];
190 				String value = param[1];
191 				List<String> values;
192 				if (params.containsKey(name)) {
193 					values = params.get(name);
194 				} else {
195 					values = new ArrayList<String>();
196 					params.put(name, values);
197 				}
198 				values.add(value);
199 			}
200 			return params;
201 		}
202 
203 		private String[] parseQueryParameter(String token) {
204 			return token.split("=");
205 		}
206 
207 		public String getPath() {
208 			return path;
209 		}
210 
211 		public List<String> getParam(String name) {
212 			return params.get(name);
213 		}
214 
215 		public boolean isEmptyParameter() {
216 			return params.isEmpty();
217 		}
218 
219 		public int getParameterSize() {
220 			return params.size();
221 		}
222 	}
223 
224 }