Updates to WebMVC fragment rendering API

See gh-33162
This commit is contained in:
rstoyanchev
2024-07-10 13:30:54 +01:00
parent 6ee8786385
commit 14c1faa5ee
6 changed files with 230 additions and 27 deletions

View File

@@ -17,6 +17,8 @@
package org.springframework.web.servlet.mvc.method.annotation;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.List;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -26,7 +28,9 @@ import org.springframework.ui.ModelMap;
import org.springframework.web.context.request.ServletWebRequest;
import org.springframework.web.method.support.ModelAndViewContainer;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.SmartView;
import org.springframework.web.servlet.mvc.support.RedirectAttributesModelMap;
import org.springframework.web.servlet.view.FragmentsRendering;
import org.springframework.web.servlet.view.RedirectView;
import org.springframework.web.testfixture.servlet.MockHttpServletRequest;
@@ -60,6 +64,9 @@ class ModelAndViewMethodReturnValueHandlerTests {
@Test
void supportsReturnType() throws Exception {
assertThat(handler.supportsReturnType(returnParamModelAndView)).isTrue();
assertThat(handler.supportsReturnType(getReturnValueParam("fragmentsRendering"))).isTrue();
assertThat(handler.supportsReturnType(getReturnValueParam("fragmentsCollection"))).isTrue();
assertThat(handler.supportsReturnType(getReturnValueParam("viewName"))).isFalse();
}
@@ -81,6 +88,22 @@ class ModelAndViewMethodReturnValueHandlerTests {
assertThat(mavContainer.getModel().get("attrName")).isEqualTo("attrValue");
}
@Test
void handleFragmentsRendering() throws Exception {
FragmentsRendering rendering = FragmentsRendering.with("viewName").build();
handler.handleReturnValue(rendering, returnParamModelAndView, mavContainer, webRequest);
assertThat(mavContainer.getView()).isInstanceOf(SmartView.class);
}
@Test
void handleFragmentsCollection() throws Exception {
Collection<ModelAndView> fragments = List.of(new ModelAndView("viewName"));
handler.handleReturnValue(fragments, returnParamModelAndView, mavContainer, webRequest);
assertThat(mavContainer.getView()).isInstanceOf(SmartView.class);
}
@Test
void handleNull() throws Exception {
handler.handleReturnValue(null, returnParamModelAndView, mavContainer, webRequest);
@@ -173,4 +196,14 @@ class ModelAndViewMethodReturnValueHandlerTests {
return null;
}
@SuppressWarnings("unused")
FragmentsRendering fragmentsRendering() {
return null;
}
@SuppressWarnings("unused")
Collection<ModelAndView> fragmentsCollection() {
return null;
}
}

View File

@@ -38,12 +38,12 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.condition.JRE.JAVA_21;
/**
* Tests for rendering through {@link FragmentsView}.
* Tests for rendering through {@link DefaultFragmentsRendering}.
*
* @author Rossen Stoyanchev
*/
@DisabledForJreRange(min = JAVA_21, disabledReason = "Kotlin doesn't support Java 21+ yet")
public class FragmentsViewTests {
public class DefaultFragmentsRenderingTests {
@Test
@@ -59,7 +59,7 @@ public class FragmentsViewTests {
MockHttpServletRequest request = new MockHttpServletRequest();
MockHttpServletResponse response = new MockHttpServletResponse();
FragmentsView view = FragmentsView.create(List.of(
DefaultFragmentsRendering view = new DefaultFragmentsRendering(List.of(
new ModelAndView("fragment1", Map.of("foo", "Foo")),
new ModelAndView("fragment2", Map.of("bar", "Bar"))));