1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 }