From edce3029a28d39d28e4ce67d2de7d3733150348d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deleuze?= Date: Thu, 5 Dec 2024 10:59:02 +0100 Subject: [PATCH] Remove tests for Kotlin Script Templates Closes gh-34030 --- spring-webflux/spring-webflux.gradle | 2 - ...gmentViewResolutionResultHandlerTests.java | 17 +-- .../script/KotlinScriptTemplateTests.java | 131 ---------------- .../ScriptTemplateWithBindingsExtensions.kt | 16 -- .../result/view/script/jython/fragment1.html | 3 + .../result/view/script/jython/fragment2.html | 3 + .../result/view/script/kotlin/eval.kts | 4 - .../result/view/script/kotlin/footer.html | 1 - .../result/view/script/kotlin/fragment1.kts | 6 - .../result/view/script/kotlin/fragment2.kts | 6 - .../result/view/script/kotlin/header.html | 1 - .../result/view/script/kotlin/render.kts | 16 -- .../result/view/script/kotlin/template.kts | 5 - spring-webmvc/spring-webmvc.gradle | 2 - .../FragmentRenderingStreamTests.java | 17 +-- .../view/DefaultFragmentsRenderingTests.java | 19 +-- .../script/KotlinScriptTemplateTests.java | 142 ------------------ .../ScriptTemplateWithBindingsExtensions.kt | 16 -- .../servlet/view/script/jython/fragment1.html | 3 + .../servlet/view/script/jython/fragment2.html | 3 + .../web/servlet/view/script/kotlin/eval.kts | 4 - .../servlet/view/script/kotlin/footer.html | 1 - .../servlet/view/script/kotlin/fragment1.kts | 6 - .../servlet/view/script/kotlin/fragment2.kts | 6 - .../servlet/view/script/kotlin/header.html | 1 - .../web/servlet/view/script/kotlin/render.kts | 15 -- .../servlet/view/script/kotlin/template.kts | 5 - 27 files changed, 28 insertions(+), 423 deletions(-) delete mode 100644 spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/KotlinScriptTemplateTests.java delete mode 100644 spring-webflux/src/test/kotlin/org/springframework/web/reactive/result/view/script/ScriptTemplateWithBindingsExtensions.kt create mode 100644 spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/jython/fragment1.html create mode 100644 spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/jython/fragment2.html delete mode 100644 spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/eval.kts delete mode 100644 spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/footer.html delete mode 100644 spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/fragment1.kts delete mode 100644 spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/fragment2.kts delete mode 100644 spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/header.html delete mode 100644 spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/render.kts delete mode 100644 spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/template.kts delete mode 100644 spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/KotlinScriptTemplateTests.java delete mode 100644 spring-webmvc/src/test/kotlin/org/springframework/web/servlet/view/script/ScriptTemplateWithBindingsExtensions.kt create mode 100644 spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/jython/fragment1.html create mode 100644 spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/jython/fragment2.html delete mode 100644 spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/kotlin/eval.kts delete mode 100644 spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/kotlin/footer.html delete mode 100644 spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/kotlin/fragment1.kts delete mode 100644 spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/kotlin/fragment2.kts delete mode 100644 spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/kotlin/header.html delete mode 100644 spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/kotlin/render.kts delete mode 100644 spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/kotlin/template.kts diff --git a/spring-webflux/spring-webflux.gradle b/spring-webflux/spring-webflux.gradle index 7861faefc9..4bec8920dd 100644 --- a/spring-webflux/spring-webflux.gradle +++ b/spring-webflux/spring-webflux.gradle @@ -53,14 +53,12 @@ dependencies { testImplementation("org.eclipse.jetty:jetty-reactive-httpclient") testImplementation("org.eclipse.jetty:jetty-server") testImplementation("org.hibernate:hibernate-validator") - testImplementation("org.jetbrains.kotlin:kotlin-script-runtime") testImplementation("org.jetbrains.kotlinx:kotlinx-serialization-json") testRuntimeOnly("com.sun.xml.bind:jaxb-core") testRuntimeOnly("com.sun.xml.bind:jaxb-impl") testRuntimeOnly("com.sun.activation:jakarta.activation") testRuntimeOnly("io.netty:netty5-buffer") testRuntimeOnly("org.glassfish:jakarta.el") - testRuntimeOnly("org.jetbrains.kotlin:kotlin-scripting-jsr223") testRuntimeOnly("org.jruby:jruby") testRuntimeOnly("org.python:jython-standalone") testRuntimeOnly("org.webjars:underscorejs") diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/FragmentViewResolutionResultHandlerTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/FragmentViewResolutionResultHandlerTests.java index 09fb2b2154..7c66a8d4e9 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/FragmentViewResolutionResultHandlerTests.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/FragmentViewResolutionResultHandlerTests.java @@ -33,7 +33,6 @@ import reactor.core.scheduler.Schedulers; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.context.support.ResourceBundleMessageSource; import org.springframework.core.MethodParameter; import org.springframework.http.MediaType; import org.springframework.web.reactive.BindingContext; @@ -53,6 +52,7 @@ import static org.springframework.web.testfixture.method.ResolvableMethod.on; * Tests for {@link Fragment} rendering through {@link ViewResolutionResultHandler}. * * @author Rossen Stoyanchev + * @author Sebastien Deleuze */ public class FragmentViewResolutionResultHandlerTests { @@ -138,8 +138,8 @@ public class FragmentViewResolutionResultHandlerTests { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ScriptTemplatingConfiguration.class); - String prefix = "org/springframework/web/reactive/result/view/script/kotlin/"; - ScriptTemplateViewResolver viewResolver = new ScriptTemplateViewResolver(prefix, ".kts"); + String prefix = "org/springframework/web/reactive/result/view/script/jython/"; + ScriptTemplateViewResolver viewResolver = new ScriptTemplateViewResolver(prefix, ".html"); viewResolver.setApplicationContext(context); viewResolver.setSupportedMediaTypes(List.of(MediaType.TEXT_HTML, MediaType.TEXT_EVENT_STREAM)); @@ -166,18 +166,11 @@ public class FragmentViewResolutionResultHandlerTests { @Bean public ScriptTemplateConfigurer kotlinScriptConfigurer() { ScriptTemplateConfigurer configurer = new ScriptTemplateConfigurer(); - configurer.setEngineName("kotlin"); - configurer.setScripts("org/springframework/web/reactive/result/view/script/kotlin/render.kts"); + configurer.setEngineName("jython"); + configurer.setScripts("org/springframework/web/reactive/result/view/script/jython/render.py"); configurer.setRenderFunction("render"); return configurer; } - - @Bean - public ResourceBundleMessageSource messageSource() { - ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); - messageSource.setBasename("org/springframework/web/reactive/result/view/script/messages"); - return messageSource; - } } } diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/KotlinScriptTemplateTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/KotlinScriptTemplateTests.java deleted file mode 100644 index 860250bdb1..0000000000 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/result/view/script/KotlinScriptTemplateTests.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright 2002-2024 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 - * - * https://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.reactive.result.view.script; - -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.DisabledForJreRange; - -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.support.ResourceBundleMessageSource; -import org.springframework.http.MediaType; -import org.springframework.web.testfixture.http.server.reactive.MockServerHttpRequest; -import org.springframework.web.testfixture.http.server.reactive.MockServerHttpResponse; -import org.springframework.web.testfixture.server.MockServerWebExchange; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.condition.JRE.JAVA_21; - -/** - * Tests for Kotlin script templates running on Kotlin JSR-223 support. - * - * @author Sebastien Deleuze - */ -@DisabledForJreRange(min = JAVA_21, disabledReason = "Kotlin doesn't support Java 21+ yet") -class KotlinScriptTemplateTests { - - @Test - void renderTemplateWithFrenchLocale() throws Exception { - Map model = new HashMap<>(); - model.put("foo", "Foo"); - String url = "org/springframework/web/reactive/result/view/script/kotlin/template.kts"; - MockServerHttpResponse response = render(url, model, Locale.FRENCH, ScriptTemplatingConfiguration.class); - assertThat(response.getBodyAsString().block()).isEqualTo("\n

Bonjour Foo

\n"); - } - - @Test - void renderTemplateWithEnglishLocale() throws Exception { - Map model = new HashMap<>(); - model.put("foo", "Foo"); - String url = "org/springframework/web/reactive/result/view/script/kotlin/template.kts"; - MockServerHttpResponse response = render(url, model, Locale.ENGLISH, ScriptTemplatingConfiguration.class); - assertThat(response.getBodyAsString().block()).isEqualTo("\n

Hello Foo

\n"); - } - - @Test - void renderTemplateWithoutRenderFunction() throws Exception { - Map model = new HashMap<>(); - model.put("header", ""); - model.put("hello", "Hello"); - model.put("foo", "Foo"); - model.put("footer", ""); - String url = "org/springframework/web/reactive/result/view/script/kotlin/eval.kts"; - Class configClass = ScriptTemplatingConfigurationWithoutRenderFunction.class; - MockServerHttpResponse response = render(url, model, Locale.ENGLISH, configClass); - assertThat(response.getBodyAsString().block()).isEqualTo("\n

Hello Foo

\n"); - } - - - private MockServerHttpResponse render(String viewUrl, Map model, - Locale locale, Class configuration) throws Exception { - - ScriptTemplateView view = createViewWithUrl(viewUrl, configuration); - MockServerHttpRequest request = MockServerHttpRequest.get("/").acceptLanguageAsLocales(locale).build(); - MockServerWebExchange exchange = MockServerWebExchange.from(request); - view.renderInternal(model, MediaType.TEXT_HTML, exchange).block(); - return exchange.getResponse(); - } - - private ScriptTemplateView createViewWithUrl(String viewUrl, Class configuration) throws Exception { - AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); - ctx.register(configuration); - ctx.refresh(); - - ScriptTemplateView view = new ScriptTemplateView(); - view.setApplicationContext(ctx); - view.setUrl(viewUrl); - view.afterPropertiesSet(); - return view; - } - - - @Configuration - static class ScriptTemplatingConfiguration { - - @Bean - public ScriptTemplateConfigurer kotlinScriptConfigurer() { - ScriptTemplateConfigurer configurer = new ScriptTemplateConfigurer(); - configurer.setEngineName("kotlin"); - configurer.setScripts("org/springframework/web/reactive/result/view/script/kotlin/render.kts"); - configurer.setRenderFunction("render"); - return configurer; - } - - @Bean - public ResourceBundleMessageSource messageSource() { - ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); - messageSource.setBasename("org/springframework/web/reactive/result/view/script/messages"); - return messageSource; - } - } - - - @Configuration - static class ScriptTemplatingConfigurationWithoutRenderFunction { - - @Bean - public ScriptTemplateConfigurer kotlinScriptConfigurer() { - return new ScriptTemplateConfigurer("kotlin"); - } - } - -} diff --git a/spring-webflux/src/test/kotlin/org/springframework/web/reactive/result/view/script/ScriptTemplateWithBindingsExtensions.kt b/spring-webflux/src/test/kotlin/org/springframework/web/reactive/result/view/script/ScriptTemplateWithBindingsExtensions.kt deleted file mode 100644 index 71722453a7..0000000000 --- a/spring-webflux/src/test/kotlin/org/springframework/web/reactive/result/view/script/ScriptTemplateWithBindingsExtensions.kt +++ /dev/null @@ -1,16 +0,0 @@ -@file:Suppress("UNCHECKED_CAST") - -package org.springframework.web.reactive.result.view.script - -import kotlin.script.templates.standard.ScriptTemplateWithBindings - -fun ScriptTemplateWithBindings.include(path: String) = - (bindings["include"] as (String) -> String).invoke(path) - - -fun ScriptTemplateWithBindings.i18n(code: String) = - (bindings["i18n"] as (String) -> String).invoke(code) - -var ScriptTemplateWithBindings.foo: String - get() = bindings["foo"] as String - set(@Suppress("UNUSED_PARAMETER") value) { throw UnsupportedOperationException() } diff --git a/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/jython/fragment1.html b/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/jython/fragment1.html new file mode 100644 index 0000000000..db714e9070 --- /dev/null +++ b/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/jython/fragment1.html @@ -0,0 +1,3 @@ +

+ Hello $foo +

\ No newline at end of file diff --git a/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/jython/fragment2.html b/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/jython/fragment2.html new file mode 100644 index 0000000000..ce3db9aec8 --- /dev/null +++ b/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/jython/fragment2.html @@ -0,0 +1,3 @@ +

+ Hello $bar +

\ No newline at end of file diff --git a/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/eval.kts b/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/eval.kts deleted file mode 100644 index 6a8121acf0..0000000000 --- a/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/eval.kts +++ /dev/null @@ -1,4 +0,0 @@ -// TODO Improve syntax when KT-15125 will be fixed -"""${bindings["header"]} -

${bindings["hello"]} ${bindings["foo"]}

-${bindings["footer"]}""" diff --git a/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/footer.html b/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/footer.html deleted file mode 100644 index 8634a86d23..0000000000 --- a/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/footer.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/fragment1.kts b/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/fragment1.kts deleted file mode 100644 index b81c3dfb75..0000000000 --- a/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/fragment1.kts +++ /dev/null @@ -1,6 +0,0 @@ -import org.springframework.web.reactive.result.view.script.* - -""" - |

- | ${i18n("hello")} $foo - |

""".trimMargin() diff --git a/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/fragment2.kts b/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/fragment2.kts deleted file mode 100644 index c5ada27025..0000000000 --- a/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/fragment2.kts +++ /dev/null @@ -1,6 +0,0 @@ -import org.springframework.web.reactive.result.view.script.* - -""" - |

- | ${i18n("hello")} $bar - |

""".trimMargin() diff --git a/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/header.html b/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/header.html deleted file mode 100644 index 7b5b91f9a7..0000000000 --- a/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/header.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/render.kts b/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/render.kts deleted file mode 100644 index e33e6cae8c..0000000000 --- a/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/render.kts +++ /dev/null @@ -1,16 +0,0 @@ -import org.springframework.beans.factory.getBean -import org.springframework.context.support.ResourceBundleMessageSource -import org.springframework.web.reactive.result.view.script.RenderingContext -import javax.script.ScriptEngineManager -import javax.script.SimpleBindings - -fun render(template: String, model: Map, renderingContext: RenderingContext): String { - val engine = ScriptEngineManager().getEngineByName("kotlin") - val bindings = SimpleBindings() - bindings.putAll(model) - var messageSource = renderingContext.applicationContext.getBean() - bindings.put("i18n", { code: String -> messageSource.getMessage(code, null, renderingContext.locale) }) - bindings.put("include", { path: String -> renderingContext.templateLoader.apply("org/springframework/web/reactive/result/view/script/kotlin/$path.html") }) - return engine.eval(template, bindings) as String -} - diff --git a/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/template.kts b/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/template.kts deleted file mode 100644 index 5f4a0d5629..0000000000 --- a/spring-webflux/src/test/resources/org/springframework/web/reactive/result/view/script/kotlin/template.kts +++ /dev/null @@ -1,5 +0,0 @@ -import org.springframework.web.reactive.result.view.script.* - -"""${include("header") } -

${i18n("hello")} $foo

-${include("footer")}""" diff --git a/spring-webmvc/spring-webmvc.gradle b/spring-webmvc/spring-webmvc.gradle index 1ad94cf077..2bc08e35aa 100644 --- a/spring-webmvc/spring-webmvc.gradle +++ b/spring-webmvc/spring-webmvc.gradle @@ -60,7 +60,6 @@ dependencies { exclude group: "jakarta.servlet", module: "jakarta.servlet-api" } testImplementation("org.hibernate:hibernate-validator") - testImplementation("org.jetbrains.kotlin:kotlin-script-runtime") testImplementation("org.mozilla:rhino") testImplementation("org.skyscreamer:jsonassert") testImplementation("org.xmlunit:xmlunit-assertj") @@ -70,7 +69,6 @@ dependencies { testRuntimeOnly("com.sun.xml.bind:jaxb-impl") testRuntimeOnly("org.apache.httpcomponents.client5:httpclient5") testRuntimeOnly("org.glassfish:jakarta.el") - testRuntimeOnly("org.jetbrains.kotlin:kotlin-scripting-jsr223") testRuntimeOnly("org.jruby:jruby") testRuntimeOnly("org.python:jython-standalone") testRuntimeOnly("org.webjars:underscorejs") diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/FragmentRenderingStreamTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/FragmentRenderingStreamTests.java index feeeadcf8f..2e11f5b483 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/FragmentRenderingStreamTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/FragmentRenderingStreamTests.java @@ -26,7 +26,6 @@ import reactor.core.publisher.Flux; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.context.support.ResourceBundleMessageSource; import org.springframework.core.MethodParameter; import org.springframework.core.ReactiveAdapterRegistry; import org.springframework.core.task.SyncTaskExecutor; @@ -50,7 +49,9 @@ import static org.springframework.web.testfixture.method.ResolvableMethod.on; /** * Tests for streaming of {@link ModelAndView} fragments. + * * @author Rossen Stoyanchev + * @author Sebastien Deleuze */ public class FragmentRenderingStreamTests { @@ -72,8 +73,8 @@ public class FragmentRenderingStreamTests { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ScriptTemplatingConfiguration.class); - String prefix = "org/springframework/web/servlet/view/script/kotlin/"; - ScriptTemplateViewResolver viewResolver = new ScriptTemplateViewResolver(prefix, ".kts"); + String prefix = "org/springframework/web/servlet/view/script/jython/"; + ScriptTemplateViewResolver viewResolver = new ScriptTemplateViewResolver(prefix, ".html"); viewResolver.setApplicationContext(context); this.handler = new ResponseBodyEmitterReturnValueHandler( @@ -165,18 +166,12 @@ public class FragmentRenderingStreamTests { @Bean ScriptTemplateConfigurer kotlinScriptConfigurer() { ScriptTemplateConfigurer configurer = new ScriptTemplateConfigurer(); - configurer.setEngineName("kotlin"); - configurer.setScripts("org/springframework/web/servlet/view/script/kotlin/render.kts"); + configurer.setEngineName("jython"); + configurer.setScripts("org/springframework/web/servlet/view/script/jython/render.py"); configurer.setRenderFunction("render"); return configurer; } - @Bean - ResourceBundleMessageSource messageSource() { - ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); - messageSource.setBasename("org/springframework/web/servlet/view/script/messages"); - return messageSource; - } } } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/DefaultFragmentsRenderingTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/DefaultFragmentsRenderingTests.java index 160012b6aa..9f9128c7c2 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/DefaultFragmentsRenderingTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/DefaultFragmentsRenderingTests.java @@ -21,26 +21,23 @@ import java.util.Locale; import java.util.Map; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.DisabledForJreRange; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.context.support.ResourceBundleMessageSource; import org.springframework.web.servlet.view.script.ScriptTemplateConfigurer; import org.springframework.web.servlet.view.script.ScriptTemplateViewResolver; import org.springframework.web.testfixture.servlet.MockHttpServletRequest; import org.springframework.web.testfixture.servlet.MockHttpServletResponse; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.condition.JRE.JAVA_21; /** * Tests for rendering through {@link DefaultFragmentsRendering}. * * @author Rossen Stoyanchev + * @author Sebastien Deleuze */ -@DisabledForJreRange(min = JAVA_21, disabledReason = "Kotlin doesn't support Java 21+ yet") public class DefaultFragmentsRenderingTests { @Test @@ -49,8 +46,8 @@ public class DefaultFragmentsRenderingTests { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ScriptTemplatingConfiguration.class); - String prefix = "org/springframework/web/servlet/view/script/kotlin/"; - ScriptTemplateViewResolver viewResolver = new ScriptTemplateViewResolver(prefix, ".kts"); + String prefix = "org/springframework/web/servlet/view/script/jython/"; + ScriptTemplateViewResolver viewResolver = new ScriptTemplateViewResolver(prefix, ".html"); viewResolver.setApplicationContext(context); MockHttpServletRequest request = new MockHttpServletRequest(); @@ -82,18 +79,12 @@ public class DefaultFragmentsRenderingTests { @Bean ScriptTemplateConfigurer kotlinScriptConfigurer() { ScriptTemplateConfigurer configurer = new ScriptTemplateConfigurer(); - configurer.setEngineName("kotlin"); - configurer.setScripts("org/springframework/web/servlet/view/script/kotlin/render.kts"); + configurer.setEngineName("jython"); + configurer.setScripts("org/springframework/web/servlet/view/script/jython/render.py"); configurer.setRenderFunction("render"); return configurer; } - @Bean - ResourceBundleMessageSource messageSource() { - ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); - messageSource.setBasename("org/springframework/web/servlet/view/script/messages"); - return messageSource; - } } } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/KotlinScriptTemplateTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/KotlinScriptTemplateTests.java deleted file mode 100644 index 89bf07a715..0000000000 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/view/script/KotlinScriptTemplateTests.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright 2002-2024 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 - * - * https://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.script; - -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; - -import jakarta.servlet.ServletContext; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.DisabledForJreRange; - -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.support.ResourceBundleMessageSource; -import org.springframework.web.context.WebApplicationContext; -import org.springframework.web.testfixture.servlet.MockHttpServletRequest; -import org.springframework.web.testfixture.servlet.MockHttpServletResponse; -import org.springframework.web.testfixture.servlet.MockServletContext; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.condition.JRE.JAVA_21; -import static org.mockito.Mockito.mock; - -/** - * Tests for Kotlin script templates running on Kotlin JSR-223 support. - * - * @author Sebastien Deleuze - * @author Sam Brannen - */ -@DisabledForJreRange(min = JAVA_21, disabledReason = "Kotlin doesn't support Java 21+ yet") -class KotlinScriptTemplateTests { - - private WebApplicationContext webAppContext = mock(); - - private ServletContext servletContext = new MockServletContext(); - - - @BeforeEach - void setup() { - this.servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.webAppContext); - } - - @Test - void renderTemplateWithFrenchLocale() throws Exception { - Map model = new HashMap<>(); - model.put("foo", "Foo"); - String url = "org/springframework/web/servlet/view/script/kotlin/template.kts"; - MockHttpServletResponse response = render(url, model, Locale.FRENCH, ScriptTemplatingConfiguration.class); - assertThat(response.getContentAsString()).isEqualTo("\n

Bonjour Foo

\n"); - } - - @Test - void renderTemplateWithEnglishLocale() throws Exception { - Map model = new HashMap<>(); - model.put("foo", "Foo"); - String url = "org/springframework/web/servlet/view/script/kotlin/template.kts"; - MockHttpServletResponse response = render(url, model, Locale.ENGLISH, ScriptTemplatingConfiguration.class); - assertThat(response.getContentAsString()).isEqualTo("\n

Hello Foo

\n"); - } - - @Test - void renderTemplateWithoutRenderFunction() throws Exception { - Map model = new HashMap<>(); - model.put("header", ""); - model.put("hello", "Hello"); - model.put("foo", "Foo"); - model.put("footer", ""); - MockHttpServletResponse response = render("org/springframework/web/servlet/view/script/kotlin/eval.kts", - model, Locale.ENGLISH, ScriptTemplatingConfigurationWithoutRenderFunction.class); - assertThat(response.getContentAsString()).isEqualTo("\n

Hello Foo

\n"); - } - - - private static MockHttpServletResponse render(String viewUrl, Map model, - Locale locale, Class configuration) throws Exception { - - ScriptTemplateView view = createViewWithUrl(viewUrl, configuration); - MockHttpServletResponse response = new MockHttpServletResponse(); - MockHttpServletRequest request = new MockHttpServletRequest(); - request.addPreferredLocale(locale); - view.renderMergedOutputModel(model, request, response); - return response; - } - - private static ScriptTemplateView createViewWithUrl(String viewUrl, Class configuration) throws Exception { - AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(configuration); - - ScriptTemplateView view = new ScriptTemplateView(); - view.setApplicationContext(ctx); - view.setUrl(viewUrl); - view.afterPropertiesSet(); - return view; - } - - - @Configuration - static class ScriptTemplatingConfiguration { - - @Bean - ScriptTemplateConfigurer kotlinScriptConfigurer() { - ScriptTemplateConfigurer configurer = new ScriptTemplateConfigurer(); - configurer.setEngineName("kotlin"); - configurer.setScripts("org/springframework/web/servlet/view/script/kotlin/render.kts"); - configurer.setRenderFunction("render"); - return configurer; - } - - @Bean - ResourceBundleMessageSource messageSource() { - ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); - messageSource.setBasename("org/springframework/web/servlet/view/script/messages"); - return messageSource; - } - } - - @Configuration - static class ScriptTemplatingConfigurationWithoutRenderFunction { - - @Bean - ScriptTemplateConfigurer kotlinScriptConfigurer() { - return new ScriptTemplateConfigurer("kotlin"); - } - } - -} diff --git a/spring-webmvc/src/test/kotlin/org/springframework/web/servlet/view/script/ScriptTemplateWithBindingsExtensions.kt b/spring-webmvc/src/test/kotlin/org/springframework/web/servlet/view/script/ScriptTemplateWithBindingsExtensions.kt deleted file mode 100644 index 683c782396..0000000000 --- a/spring-webmvc/src/test/kotlin/org/springframework/web/servlet/view/script/ScriptTemplateWithBindingsExtensions.kt +++ /dev/null @@ -1,16 +0,0 @@ -@file:Suppress("UNCHECKED_CAST") - -package org.springframework.web.servlet.view.script - -import kotlin.script.templates.standard.ScriptTemplateWithBindings - -fun ScriptTemplateWithBindings.include(path: String) = - (bindings["include"] as (String) -> String).invoke(path) - - -fun ScriptTemplateWithBindings.i18n(code: String) = - (bindings["i18n"] as (String) -> String).invoke(code) - -var ScriptTemplateWithBindings.foo: String - get() = bindings["foo"] as String - set(@Suppress("UNUSED_PARAMETER") value) { throw UnsupportedOperationException()} diff --git a/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/jython/fragment1.html b/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/jython/fragment1.html new file mode 100644 index 0000000000..db714e9070 --- /dev/null +++ b/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/jython/fragment1.html @@ -0,0 +1,3 @@ +

+ Hello $foo +

\ No newline at end of file diff --git a/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/jython/fragment2.html b/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/jython/fragment2.html new file mode 100644 index 0000000000..ce3db9aec8 --- /dev/null +++ b/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/jython/fragment2.html @@ -0,0 +1,3 @@ +

+ Hello $bar +

\ No newline at end of file diff --git a/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/kotlin/eval.kts b/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/kotlin/eval.kts deleted file mode 100644 index 6a8121acf0..0000000000 --- a/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/kotlin/eval.kts +++ /dev/null @@ -1,4 +0,0 @@ -// TODO Improve syntax when KT-15125 will be fixed -"""${bindings["header"]} -

${bindings["hello"]} ${bindings["foo"]}

-${bindings["footer"]}""" diff --git a/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/kotlin/footer.html b/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/kotlin/footer.html deleted file mode 100644 index 8634a86d23..0000000000 --- a/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/kotlin/footer.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/kotlin/fragment1.kts b/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/kotlin/fragment1.kts deleted file mode 100644 index 5c1a4f0854..0000000000 --- a/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/kotlin/fragment1.kts +++ /dev/null @@ -1,6 +0,0 @@ -import org.springframework.web.servlet.view.script.* - -""" - |

- | ${i18n("hello")} $foo - |

""".trimMargin() diff --git a/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/kotlin/fragment2.kts b/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/kotlin/fragment2.kts deleted file mode 100644 index 56d7064e0f..0000000000 --- a/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/kotlin/fragment2.kts +++ /dev/null @@ -1,6 +0,0 @@ -import org.springframework.web.servlet.view.script.* - -""" - |

- | ${i18n("hello")} $bar - |

""".trimMargin() \ No newline at end of file diff --git a/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/kotlin/header.html b/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/kotlin/header.html deleted file mode 100644 index 7b5b91f9a7..0000000000 --- a/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/kotlin/header.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/kotlin/render.kts b/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/kotlin/render.kts deleted file mode 100644 index 9846b9a415..0000000000 --- a/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/kotlin/render.kts +++ /dev/null @@ -1,15 +0,0 @@ -import javax.script.* -import org.springframework.web.servlet.view.script.RenderingContext -import org.springframework.context.support.ResourceBundleMessageSource -import org.springframework.beans.factory.getBean - -fun render(template: String, model: Map, renderingContext: RenderingContext): String { - val engine = ScriptEngineManager().getEngineByName("kotlin") - val bindings = SimpleBindings() - bindings.putAll(model) - var messageSource = renderingContext.applicationContext.getBean() - bindings.put("i18n", { code: String -> messageSource.getMessage(code, null, renderingContext.locale) }) - bindings.put("include", { path: String -> renderingContext.templateLoader.apply("org/springframework/web/servlet/view/script/kotlin/$path.html") }) - return engine.eval(template, bindings) as String -} - diff --git a/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/kotlin/template.kts b/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/kotlin/template.kts deleted file mode 100644 index f72c9414b8..0000000000 --- a/spring-webmvc/src/test/resources/org/springframework/web/servlet/view/script/kotlin/template.kts +++ /dev/null @@ -1,5 +0,0 @@ -import org.springframework.web.servlet.view.script.* - -"""${include("header") } -

${i18n("hello")} $foo

-${include("footer")}"""