/* * Copyright 2002-2016 the original author or authors. * * 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.springframework.web.servlet.view.groovy; import java.io.Reader; import java.util.HashMap; import java.util.Locale; import java.util.Map; import javax.servlet.ServletContext; import groovy.text.Template; import groovy.text.TemplateEngine; import groovy.text.markup.MarkupTemplateEngine; import groovy.text.markup.TemplateConfiguration; import org.hamcrest.Matchers; import org.junit.Before; import org.junit.Test; import org.springframework.beans.DirectFieldAccessor; import org.springframework.context.ApplicationContextException; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.mock.web.test.MockHttpServletRequest; import org.springframework.mock.web.test.MockHttpServletResponse; import org.springframework.mock.web.test.MockServletContext; import org.springframework.web.context.WebApplicationContext; import static org.junit.Assert.*; import static org.mockito.BDDMockito.*; /** * @author Brian Clozel */ public class GroovyMarkupViewTests { private static final String RESOURCE_LOADER_PATH = "classpath*:org/springframework/web/servlet/view/groovy/"; private WebApplicationContext webAppContext; private ServletContext servletContext; @Before public void setup() { this.webAppContext = mock(WebApplicationContext.class); this.servletContext = new MockServletContext(); this.servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.webAppContext); } @Test public void missingGroovyMarkupConfig() throws Exception { GroovyMarkupView view = new GroovyMarkupView(); given(this.webAppContext.getBeansOfType(GroovyMarkupConfig.class, true, false)) .willReturn(new HashMap<>()); view.setUrl("sampleView"); try { view.setApplicationContext(this.webAppContext); fail(); } catch (ApplicationContextException ex) { assertTrue(ex.getMessage().contains("GroovyMarkupConfig")); } } @Test public void customTemplateEngine() throws Exception { GroovyMarkupView view = new GroovyMarkupView(); view.setTemplateEngine(new TestTemplateEngine()); view.setApplicationContext(this.webAppContext); DirectFieldAccessor accessor = new DirectFieldAccessor(view); TemplateEngine engine = (TemplateEngine) accessor.getPropertyValue("engine"); assertNotNull(engine); assertEquals(TestTemplateEngine.class, engine.getClass()); } @Test public void detectTemplateEngine() throws Exception { GroovyMarkupView view = new GroovyMarkupView(); view.setTemplateEngine(new TestTemplateEngine()); view.setApplicationContext(this.webAppContext); DirectFieldAccessor accessor = new DirectFieldAccessor(view); TemplateEngine engine = (TemplateEngine) accessor.getPropertyValue("engine"); assertNotNull(engine); assertEquals(TestTemplateEngine.class, engine.getClass()); } @Test public void checkResource() throws Exception { GroovyMarkupView view = createViewWithUrl("test.tpl"); assertTrue(view.checkResource(Locale.US)); } @Test public void checkMissingResource() throws Exception { GroovyMarkupView view = createViewWithUrl("missing.tpl"); assertFalse(view.checkResource(Locale.US)); } @Test public void checkI18nResource() throws Exception { GroovyMarkupView view = createViewWithUrl("i18n.tpl"); assertTrue(view.checkResource(Locale.FRENCH)); } @Test public void checkI18nResourceMissingLocale() throws Exception { GroovyMarkupView view = createViewWithUrl("i18n.tpl"); assertTrue(view.checkResource(Locale.CHINESE)); } @Test public void renderMarkupTemplate() throws Exception { Map<String, Object> model = new HashMap<>(); model.put("name", "Spring"); MockHttpServletResponse response = renderViewWithModel("test.tpl", model, Locale.US); assertThat(response.getContentAsString(), Matchers.containsString("<h1>Hello Spring</h1>")); } @Test public void renderI18nTemplate() throws Exception { Map<String, Object> model = new HashMap<>(); model.put("name", "Spring"); MockHttpServletResponse response = renderViewWithModel("i18n.tpl", model, Locale.FRANCE); assertEquals("<p>Bonjour Spring</p>", response.getContentAsString()); response = renderViewWithModel("i18n.tpl", model, Locale.GERMANY); assertEquals("<p>Include German</p><p>Hallo Spring</p>", response.getContentAsString()); response = renderViewWithModel("i18n.tpl", model, new Locale("es")); assertEquals("<p>Include Default</p><p>Hola Spring</p>", response.getContentAsString()); } @Test public void renderLayoutTemplate() throws Exception { Map<String, Object> model = new HashMap<>(); MockHttpServletResponse response = renderViewWithModel("content.tpl", model, Locale.US); assertEquals("<html><head><title>Layout example</title></head><body><p>This is the body</p></body></html>", response.getContentAsString()); } private MockHttpServletResponse renderViewWithModel(String viewUrl, Map<String, Object> model, Locale locale) throws Exception { GroovyMarkupView view = createViewWithUrl(viewUrl); MockHttpServletResponse response = new MockHttpServletResponse(); MockHttpServletRequest request = new MockHttpServletRequest(); request.addPreferredLocale(locale); LocaleContextHolder.setLocale(locale); view.renderMergedTemplateModel(model, request, response); return response; } private GroovyMarkupView createViewWithUrl(String viewUrl) throws Exception { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.register(GroovyMarkupConfiguration.class); ctx.refresh(); GroovyMarkupView view = new GroovyMarkupView(); view.setUrl(viewUrl); view.setApplicationContext(ctx); view.afterPropertiesSet(); return view; } public class TestTemplateEngine extends MarkupTemplateEngine { public TestTemplateEngine() { super(new TemplateConfiguration()); } @Override public Template createTemplate(Reader reader) { return null; } } @Configuration static class GroovyMarkupConfiguration { @Bean public GroovyMarkupConfig groovyMarkupConfigurer() { GroovyMarkupConfigurer configurer = new GroovyMarkupConfigurer(); configurer.setResourceLoaderPath(RESOURCE_LOADER_PATH); return configurer; } } }