/** * Return the raw request body content written through the request. * <p><strong>Note:</strong> If the request content has not been consumed * for any reason yet, use of this method will trigger consumption. * @throws IllegalStateException if the request body is not been fully written. */ @Nullable public byte[] getRequestBodyContent() { return this.requestBody.block(this.timeout); }
private void testCheckResource(Resource location, String requestPath) throws IOException { List<Resource> locations = singletonList(location); Resource actual = this.resolver.resolveResource(null, requestPath, locations, null).block(TIMEOUT); if (!location.createRelative(requestPath).exists() && !requestPath.contains(":")) { fail(requestPath + " doesn't actually exist as a relative path"); } assertNull(actual); }
@SuppressWarnings("unchecked") private <T> T resolveValueWithEmptyBody(MethodParameter param) { ServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.post("/path")); Mono<Object> result = this.resolver.resolveArgument(param, new BindingContext(), exchange); Object value = result.block(Duration.ofSeconds(5)); if (value != null) { assertTrue("Unexpected parameter type: " + value, param.getParameterType().isAssignableFrom(value.getClass())); } //no inspection unchecked return (T) value; }
@Test public void resolveFromClasspath() throws IOException { Resource location = new ClassPathResource("test/", PathResourceResolver.class); String path = "bar.css"; List<Resource> locations = singletonList(location); Resource actual = this.resolver.resolveResource(null, path, locations, null).block(TIMEOUT); assertEquals(location.createRelative(path), actual); }
@Test public void reactivexCompletableToPublisher() { Object source = io.reactivex.Completable.complete(); Object target = getAdapter(io.reactivex.Completable.class).toPublisher(source); assertTrue("Expected Mono Publisher: " + target.getClass().getName(), target instanceof Mono); ((Mono<Void>) target).block(Duration.ofMillis(1000)); }
@Test public void checkResourceWithAllowedLocations() { this.resolver.setAllowedLocations( new ClassPathResource("test/", PathResourceResolver.class), new ClassPathResource("testalternatepath/", PathResourceResolver.class) ); Resource location = getResource("main.css"); String actual = this.resolver.resolveUrlPath("../testalternatepath/bar.css", singletonList(location), null).block(TIMEOUT); assertEquals("../testalternatepath/bar.css", actual); }
@Test public void rxSingleToPublisher() { Object source = rx.Single.just(1); Object target = getAdapter(rx.Single.class).toPublisher(source); assertTrue("Expected Mono Publisher: " + target.getClass().getName(), target instanceof Mono); assertEquals(Integer.valueOf(1), ((Mono<Integer>) target).block(Duration.ofMillis(1000))); }
@Test // SPR-14952 public void writeAndFlushWithFluxOfDefaultDataBuffer() throws Exception { TestServerHttpResponse response = new TestServerHttpResponse(); Flux<Flux<DefaultDataBuffer>> flux = Flux.just(Flux.just(wrap("foo"))); response.writeAndFlushWith(flux).block(); assertTrue(response.statusCodeWritten); assertTrue(response.headersWritten); assertTrue(response.cookiesWritten); assertEquals(1, response.body.size()); assertEquals("foo", new String(response.body.get(0).asByteBuffer().array(), StandardCharsets.UTF_8)); }
@Test public void publisherToFlux() { List<Integer> sequence = Arrays.asList(1, 2, 3); Publisher<Integer> source = Flowable.fromIterable(sequence); Object target = getAdapter(Flux.class).fromPublisher(source); assertTrue(target instanceof Flux); assertEquals(sequence, ((Flux<Integer>) target).collectList().block(Duration.ofMillis(1000))); }
@Test public void filterWithParameterMethodNotAllowed() { postForm("_method=TRACE").block(Duration.ZERO); assertEquals(HttpMethod.POST, this.filterChain.getHttpMethod()); }
@Test public void handleNestedAnnotatedException() { Throwable ex = new Exception(new CustomException()); this.handler.handle(this.exchange, ex).block(Duration.ofSeconds(5)); assertEquals(HttpStatus.I_AM_A_TEAPOT, this.exchange.getResponse().getStatusCode()); }
@Test // SPR-15331 public void decodeFullContentAsString() { String body = "data:foo\ndata:bar\n\ndata:baz\n\n"; MockServerHttpRequest request = MockServerHttpRequest.post("/") .body(Mono.just(stringBuffer(body))); String actual = messageReader .readMono(ResolvableType.forClass(String.class), request, Collections.emptyMap()) .cast(String.class) .block(Duration.ZERO); assertEquals(body, actual); }
@Test // SPR-13149 public void resolveWithNullRequest() { String file = "js/foo.js"; Resource resolved = this.resolver.resolveResource(null, file, this.locations).block(TIMEOUT); assertEquals(getResource(file).getDescription(), resolved.getDescription()); assertEquals(getResource(file).getFilename(), resolved.getFilename()); }
@Test public void resolveResourceMatchingEncoding() { Resource resource = Mockito.mock(Resource.class); Resource gzipped = Mockito.mock(Resource.class); this.cache.put(resourceKey("bar.css"), resource); this.cache.put(resourceKey("bar.css+encoding=gzip"), gzipped); String file = "bar.css"; MockServerWebExchange exchange = MockServerWebExchange.from(get(file)); assertSame(resource, this.chain.resolveResource(exchange, file, this.locations).block(TIMEOUT)); exchange = MockServerWebExchange.from(get(file).header("Accept-Encoding", "gzip")); assertSame(gzipped, this.chain.resolveResource(exchange, file, this.locations).block(TIMEOUT)); }
@Test public void fromObject() { String body = "foo"; EntityResponse<String> response = EntityResponse.fromObject(body).build().block(); assertSame(body, response.entity()); }
@SuppressWarnings("unchecked") private void assertStringDecoder(Decoder<?> decoder, boolean textOnly) { assertEquals(StringDecoder.class, decoder.getClass()); assertTrue(decoder.canDecode(forClass(String.class), MimeTypeUtils.TEXT_PLAIN)); assertEquals(!textOnly, decoder.canDecode(forClass(String.class), MediaType.TEXT_EVENT_STREAM)); Flux<String> flux = (Flux<String>) decoder.decode( Flux.just(new DefaultDataBufferFactory().wrap("line1\nline2".getBytes(StandardCharsets.UTF_8))), ResolvableType.forClass(String.class), MimeTypeUtils.TEXT_PLAIN, Collections.emptyMap()); assertEquals(Arrays.asList("line1", "line2"), flux.collectList().block(Duration.ZERO)); }
@Test public void writeOneItem() throws Exception { Mono<Void> completion = Flux.just("one").as(this::sendOperator); Signal<Void> signal = completion.materialize().block(); assertNotNull(signal); assertTrue("Unexpected signal: " + signal, signal.isOnComplete()); assertEquals(1, this.writer.items.size()); assertEquals("one", this.writer.items.get(0)); assertTrue(this.writer.completed); }
private ServerHttpRequest generateMultipartRequest() { MultipartBodyBuilder partsBuilder = new MultipartBodyBuilder(); partsBuilder.part("fooPart", new ClassPathResource("org/springframework/http/codec/multipart/foo.txt")); partsBuilder.part("barPart", "bar"); MockClientHttpRequest outputMessage = new MockClientHttpRequest(HttpMethod.POST, "/"); new MultipartHttpMessageWriter() .write(Mono.just(partsBuilder.build()), null, MediaType.MULTIPART_FORM_DATA, outputMessage, null) .block(Duration.ofSeconds(5)); return MockServerHttpRequest.post("/") .contentType(outputMessage.getHeaders().getContentType()) .body(outputMessage.getBody()); }
@Test public void resolveUrlPathWithRelativePathInParentDirectory() { Resource resource = getResource("images/image.png"); MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("")); String actual = this.transformer.resolveUrlPath("../bar.css", exchange, resource, this.chain).block(TIMEOUT); assertEquals("../bar-11e16cf79faee7ac698c805cf28248d2.css", actual); }
@Test public void resolveUrlPath() { MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/resources/main.css")); String resourcePath = "/resources/bar.css"; Resource resource = getResource("main.css"); String actual = this.transformer.resolveUrlPath(resourcePath, exchange, resource, this.chain).block(TIMEOUT); assertEquals("/resources/bar-11e16cf79faee7ac698c805cf28248d2.css", actual); assertEquals("/resources/bar-11e16cf79faee7ac698c805cf28248d2.css", actual); }