1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.web.servlet.config.annotation;
18
19 import java.util.Arrays;
20
21 import org.junit.Before;
22 import org.junit.Test;
23
24 import org.springframework.beans.DirectFieldAccessor;
25 import org.springframework.core.Ordered;
26 import org.springframework.web.accept.ContentNegotiationManager;
27 import org.springframework.web.context.support.StaticWebApplicationContext;
28 import org.springframework.web.servlet.ViewResolver;
29 import org.springframework.web.servlet.view.BeanNameViewResolver;
30 import org.springframework.web.servlet.view.ContentNegotiatingViewResolver;
31 import org.springframework.web.servlet.view.InternalResourceViewResolver;
32 import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
33 import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver;
34 import org.springframework.web.servlet.view.groovy.GroovyMarkupConfigurer;
35 import org.springframework.web.servlet.view.groovy.GroovyMarkupViewResolver;
36 import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
37 import org.springframework.web.servlet.view.tiles3.TilesConfigurer;
38 import org.springframework.web.servlet.view.tiles3.TilesViewResolver;
39 import org.springframework.web.servlet.view.velocity.VelocityConfigurer;
40 import org.springframework.web.servlet.view.velocity.VelocityViewResolver;
41 import org.springframework.web.servlet.view.xml.MarshallingView;
42
43 import static org.junit.Assert.*;
44
45
46
47
48
49
50
51 public class ViewResolverRegistryTests {
52
53 private ViewResolverRegistry registry;
54
55
56 @Before
57 public void setUp() {
58 StaticWebApplicationContext context = new StaticWebApplicationContext();
59 context.registerSingleton("freeMarkerConfigurer", FreeMarkerConfigurer.class);
60 context.registerSingleton("velocityConfigurer", VelocityConfigurer.class);
61 context.registerSingleton("tilesConfigurer", TilesConfigurer.class);
62 context.registerSingleton("groovyMarkupConfigurer", GroovyMarkupConfigurer.class);
63 this.registry = new ViewResolverRegistry();
64 this.registry.setApplicationContext(context);
65 this.registry.setContentNegotiationManager(new ContentNegotiationManager());
66 }
67
68
69 @Test
70 public void order() {
71 assertEquals(Ordered.LOWEST_PRECEDENCE, this.registry.getOrder());
72 this.registry.enableContentNegotiation();
73 assertEquals(Ordered.HIGHEST_PRECEDENCE, this.registry.getOrder());
74 }
75
76 @Test
77 public void hasRegistrations() {
78 assertFalse(this.registry.hasRegistrations());
79 this.registry.velocity();
80 assertTrue(this.registry.hasRegistrations());
81 }
82
83 @Test
84 public void hasRegistrationsWhenContentNegotiationEnabled() {
85 assertFalse(this.registry.hasRegistrations());
86 this.registry.enableContentNegotiation();
87 assertTrue(this.registry.hasRegistrations());
88 }
89
90 @Test
91 public void noResolvers() {
92 assertNotNull(this.registry.getViewResolvers());
93 assertEquals(0, this.registry.getViewResolvers().size());
94 assertFalse(this.registry.hasRegistrations());
95 }
96
97 @Test
98 public void customViewResolver() {
99 InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
100 viewResolver.setPrefix("/");
101 viewResolver.setSuffix(".jsp");
102 this.registry.viewResolver(viewResolver);
103 assertSame(viewResolver, this.registry.getViewResolvers().get(0));
104 }
105
106 @Test
107 public void beanName() {
108 this.registry.beanName();
109 assertEquals(1, this.registry.getViewResolvers().size());
110 assertEquals(BeanNameViewResolver.class, registry.getViewResolvers().get(0).getClass());
111 }
112
113 @Test
114 public void jspDefaultValues() {
115 this.registry.jsp();
116 InternalResourceViewResolver resolver = checkAndGetResolver(InternalResourceViewResolver.class);
117 checkPropertyValues(resolver, "prefix", "/WEB-INF/", "suffix", ".jsp");
118 }
119
120 @Test
121 public void jsp() {
122 this.registry.jsp("/", ".jsp");
123 InternalResourceViewResolver resolver = checkAndGetResolver(InternalResourceViewResolver.class);
124 checkPropertyValues(resolver, "prefix", "/", "suffix", ".jsp");
125 }
126
127 @Test
128 public void jspMultipleResolvers() {
129 this.registry.jsp().viewNames("view1", "view2");
130 this.registry.jsp().viewNames("view3", "view4");
131 assertNotNull(this.registry.getViewResolvers());
132 assertEquals(2, this.registry.getViewResolvers().size());
133 assertEquals(InternalResourceViewResolver.class, this.registry.getViewResolvers().get(0).getClass());
134 assertEquals(InternalResourceViewResolver.class, this.registry.getViewResolvers().get(1).getClass());
135 }
136
137 @Test
138 public void tiles() {
139 this.registry.tiles();
140 checkAndGetResolver(TilesViewResolver.class);
141 }
142
143 @Test
144 public void velocity() {
145 this.registry.velocity().prefix("/").suffix(".vm").cache(true);
146 VelocityViewResolver resolver = checkAndGetResolver(VelocityViewResolver.class);
147 checkPropertyValues(resolver, "prefix", "/", "suffix", ".vm", "cacheLimit", 1024);
148 }
149
150 @Test
151 public void velocityDefaultValues() {
152 this.registry.velocity();
153 VelocityViewResolver resolver = checkAndGetResolver(VelocityViewResolver.class);
154 checkPropertyValues(resolver, "prefix", "", "suffix", ".vm");
155 }
156
157 @Test
158 public void freeMarker() {
159 this.registry.freeMarker().prefix("/").suffix(".fmt").cache(false);
160 FreeMarkerViewResolver resolver = checkAndGetResolver(FreeMarkerViewResolver.class);
161 checkPropertyValues(resolver, "prefix", "/", "suffix", ".fmt", "cacheLimit", 0);
162 }
163
164 @Test
165 public void freeMarkerDefaultValues() {
166 this.registry.freeMarker();
167 FreeMarkerViewResolver resolver = checkAndGetResolver(FreeMarkerViewResolver.class);
168 checkPropertyValues(resolver, "prefix", "", "suffix", ".ftl");
169 }
170
171 @Test
172 public void groovyMarkup() {
173 this.registry.groovy().prefix("/").suffix(".groovy").cache(true);
174 GroovyMarkupViewResolver resolver = checkAndGetResolver(GroovyMarkupViewResolver.class);
175 checkPropertyValues(resolver, "prefix", "/", "suffix", ".groovy", "cacheLimit", 1024);
176 }
177
178 @Test
179 public void groovyMarkupDefaultValues() {
180 this.registry.groovy();
181 GroovyMarkupViewResolver resolver = checkAndGetResolver(GroovyMarkupViewResolver.class);
182 checkPropertyValues(resolver, "prefix", "", "suffix", ".tpl");
183 }
184
185 @Test
186 public void contentNegotiation() {
187 MappingJackson2JsonView view = new MappingJackson2JsonView();
188 this.registry.enableContentNegotiation(view);
189 ContentNegotiatingViewResolver resolver = checkAndGetResolver(ContentNegotiatingViewResolver.class);
190 assertEquals(Arrays.asList(view), resolver.getDefaultViews());
191 assertEquals(Ordered.HIGHEST_PRECEDENCE, this.registry.getOrder());
192 }
193
194 @Test
195 public void contentNegotiationAddsDefaultViewRegistrations() {
196 MappingJackson2JsonView view1 = new MappingJackson2JsonView();
197 this.registry.enableContentNegotiation(view1);
198
199 ContentNegotiatingViewResolver resolver1 = checkAndGetResolver(ContentNegotiatingViewResolver.class);
200 assertEquals(Arrays.asList(view1), resolver1.getDefaultViews());
201
202 MarshallingView view2 = new MarshallingView();
203 this.registry.enableContentNegotiation(view2);
204
205 ContentNegotiatingViewResolver resolver2 = checkAndGetResolver(ContentNegotiatingViewResolver.class);
206 assertEquals(Arrays.asList(view1, view2), resolver2.getDefaultViews());
207 assertSame(resolver1, resolver2);
208 }
209
210
211 @SuppressWarnings("unchecked")
212 private <T extends ViewResolver> T checkAndGetResolver(Class<T> resolverType) {
213 assertNotNull(this.registry.getViewResolvers());
214 assertEquals(1, this.registry.getViewResolvers().size());
215 assertEquals(resolverType, this.registry.getViewResolvers().get(0).getClass());
216 return (T) registry.getViewResolvers().get(0);
217 }
218
219 private void checkPropertyValues(ViewResolver resolver, Object... nameValuePairs) {
220 DirectFieldAccessor accessor = new DirectFieldAccessor(resolver);
221 for (int i = 0; i < nameValuePairs.length ; i++, i++) {
222 Object expected = nameValuePairs[i + 1];
223 Object actual = accessor.getPropertyValue((String) nameValuePairs[i]);
224 assertEquals(expected, actual);
225 }
226 }
227
228 }