@SuppressWarnings("unchecked") @Test public void initBinderMethod() throws Exception { Validator validator = mock(Validator.class); TestController controller = new TestController(); controller.setValidator(validator); InitBinderBindingContext context = getBindingContext(controller); Method method = ResolvableMethod.on(TestController.class).annotPresent(GetMapping.class).resolveMethod(); HandlerMethod handlerMethod = new HandlerMethod(controller, method); this.modelInitializer.initModel(handlerMethod, context, this.exchange).block(Duration.ofMillis(5000)); WebExchangeDataBinder binder = context.createDataBinder(this.exchange, "name"); assertEquals(Collections.singletonList(validator), binder.getValidators()); }
@SuppressWarnings("unchecked") @Test public void modelAttributeMethods() throws Exception { TestController controller = new TestController(); InitBinderBindingContext context = getBindingContext(controller); Method method = ResolvableMethod.on(TestController.class).annotPresent(GetMapping.class).resolveMethod(); HandlerMethod handlerMethod = new HandlerMethod(controller, method); this.modelInitializer.initModel(handlerMethod, context, this.exchange).block(Duration.ofMillis(5000)); Map<String, Object> model = context.getModel().asMap(); assertEquals(5, model.size()); Object value = model.get("bean"); assertEquals("Bean", ((TestBean) value).getName()); value = model.get("monoBean"); assertEquals("Mono Bean", ((Mono<TestBean>) value).block(Duration.ofMillis(5000)).getName()); value = model.get("singleBean"); assertEquals("Single Bean", ((Single<TestBean>) value).toBlocking().value().getName()); value = model.get("voidMethodBean"); assertEquals("Void Method Bean", ((TestBean) value).getName()); value = model.get("voidMonoMethodBean"); assertEquals("Void Mono Method Bean", ((TestBean) value).getName()); }
@Test public void requiredSessionAttributeMissing() throws Exception { TestController controller = new TestController(); InitBinderBindingContext context = getBindingContext(controller); Method method = ResolvableMethod.on(TestController.class).annotPresent(PostMapping.class).resolveMethod(); HandlerMethod handlerMethod = new HandlerMethod(controller, method); try { this.modelInitializer.initModel(handlerMethod, context, this.exchange).block(Duration.ofMillis(5000)); fail(); } catch (IllegalArgumentException ex) { assertEquals("Required attribute 'missing-bean' is missing.", ex.getMessage()); } }
testHandle("/path", returnType, returnValue, "account: {id=123}", resolver); returnType = on(Handler.class).annotPresent(ModelAttribute.class).resolveReturnType(String.class); returnValue = "123"; testHandle("/account", returnType, returnValue, "account: {id=123, myString=123}", resolver); returnType = on(Handler.class).annotPresent(ModelAttribute.class).resolveReturnType(Map.class); returnValue = Collections.singletonMap("name", "Joe"); testHandle("/account", returnType, returnValue, "account: {id=123, myMap={name=Joe}}", resolver); testHandle("/account", returnType, returnValue, responseBody, resolver); returnType = on(Handler.class).annotPresent(ModelAttribute.class).resolveReturnType(Long.class); testHandle("/account", returnType, 99L, "account: {id=123, myLong=99}", resolver);
@Test public void supports() { testSupports(on(Handler.class).annotPresent(ModelAttribute.class).resolveReturnType(String.class)); testSupports(on(Handler.class).annotNotPresent(ModelAttribute.class).resolveReturnType(String.class)); testSupports(on(Handler.class).resolveReturnType(Mono.class, String.class)); testSupports(on(Handler.class).resolveReturnType(Rendering.class)); testSupports(on(Handler.class).resolveReturnType(Mono.class, Rendering.class)); testSupports(on(Handler.class).resolveReturnType(View.class)); testSupports(on(Handler.class).resolveReturnType(Mono.class, View.class)); testSupports(on(Handler.class).resolveReturnType(void.class)); testSupports(on(Handler.class).resolveReturnType(Mono.class, Void.class)); testSupports(on(Handler.class).resolveReturnType(Completable.class)); testSupports(on(Handler.class).resolveReturnType(Model.class)); testSupports(on(Handler.class).annotPresent(ModelAttribute.class).resolveReturnType(Map.class)); testSupports(on(Handler.class).annotNotPresent(ModelAttribute.class).resolveReturnType(Map.class)); testSupports(on(Handler.class).resolveReturnType(TestBean.class)); testSupports(on(Handler.class).annotPresent(ModelAttribute.class).resolveReturnType(Long.class)); testDoesNotSupport(on(Handler.class).annotNotPresent(ModelAttribute.class).resolveReturnType(Long.class)); // SPR-15464 testSupports(on(Handler.class).resolveReturnType(Mono.class)); }
@Test public void clearModelAttributeFromSession() throws Exception { WebSession session = this.exchange.getSession().block(Duration.ZERO); assertNotNull(session); TestBean testBean = new TestBean("Session Bean"); session.getAttributes().put("bean", testBean); TestController controller = new TestController(); InitBinderBindingContext context = getBindingContext(controller); Method method = ResolvableMethod.on(TestController.class).annotPresent(GetMapping.class).resolveMethod(); HandlerMethod handlerMethod = new HandlerMethod(controller, method); this.modelInitializer.initModel(handlerMethod, context, this.exchange).block(Duration.ofMillis(5000)); context.getSessionStatus().setComplete(); context.saveModel(); assertEquals(0, session.getAttributes().size()); }
@Test public void retrieveModelAttributeFromSession() throws Exception { WebSession session = this.exchange.getSession().block(Duration.ZERO); assertNotNull(session); TestBean testBean = new TestBean("Session Bean"); session.getAttributes().put("bean", testBean); TestController controller = new TestController(); InitBinderBindingContext context = getBindingContext(controller); Method method = ResolvableMethod.on(TestController.class).annotPresent(GetMapping.class).resolveMethod(); HandlerMethod handlerMethod = new HandlerMethod(controller, method); this.modelInitializer.initModel(handlerMethod, context, this.exchange).block(Duration.ofMillis(5000)); context.saveModel(); assertEquals(1, session.getAttributes().size()); assertEquals("Session Bean", ((TestBean) session.getRequiredAttribute("bean")).getName()); }
@Test public void saveModelAttributeToSession() throws Exception { TestController controller = new TestController(); InitBinderBindingContext context = getBindingContext(controller); Method method = ResolvableMethod.on(TestController.class).annotPresent(GetMapping.class).resolveMethod(); HandlerMethod handlerMethod = new HandlerMethod(controller, method); this.modelInitializer.initModel(handlerMethod, context, this.exchange).block(Duration.ofMillis(5000)); WebSession session = this.exchange.getSession().block(Duration.ZERO); assertNotNull(session); assertEquals(0, session.getAttributes().size()); context.saveModel(); assertEquals(1, session.getAttributes().size()); assertEquals("Bean", ((TestBean) session.getRequiredAttribute("bean")).getName()); }
@Test public void unresolvedViewName() { String returnValue = "account"; MethodParameter returnType = on(Handler.class).annotPresent(ModelAttribute.class).resolveReturnType(String.class); HandlerResult result = new HandlerResult(new Object(), returnValue, returnType, this.bindingContext); MockServerWebExchange exchange = MockServerWebExchange.from(get("/path")); Mono<Void> mono = resultHandler().handleResult(exchange, result); StepVerifier.create(mono) .expectNextCount(0) .expectErrorMessage("Could not resolve view with name 'path'.") .verify(); }
@Test public void supports() throws NoSuchMethodException { Object controller = new TestController(); Method method; method = on(TestController.class).annotPresent(ResponseBody.class).resolveMethod(); testSupports(controller, method); method = on(TestController.class).annotNotPresent(ResponseBody.class).resolveMethod("doWork"); HandlerResult handlerResult = getHandlerResult(controller, method); assertFalse(this.resultHandler.supports(handlerResult)); }
@Test public void defaultViewName() { testDefaultViewName(null, on(Handler.class).annotPresent(ModelAttribute.class).resolveReturnType(String.class)); testDefaultViewName(Mono.empty(), on(Handler.class).resolveReturnType(Mono.class, String.class)); testDefaultViewName(Mono.empty(), on(Handler.class).resolveReturnType(Mono.class, Void.class)); testDefaultViewName(Completable.complete(), on(Handler.class).resolveReturnType(Completable.class)); }