@Test // SPR-13154
  public void types() throws URISyntaxException {
    URI url = new URI("http://example.com");
    List<String> body = Arrays.asList("foo", "bar");
    ParameterizedTypeReference<?> typeReference = new ParameterizedTypeReference<List<String>>() {};

    RequestEntity<?> entity = RequestEntity.post(url).body(body, typeReference.getType());
    assertEquals(typeReference.getType(), entity.getType());
  }
  @Test
  public void headers() throws URISyntaxException {
    MediaType accept = MediaType.TEXT_PLAIN;
    Charset charset = Charset.forName("UTF-8");
    long ifModifiedSince = 12345L;
    String ifNoneMatch = "\"foo\"";
    long contentLength = 67890;
    MediaType contentType = MediaType.TEXT_PLAIN;

    RequestEntity<Void> responseEntity =
        RequestEntity.post(new URI("http://example.com"))
            .accept(accept)
            .acceptCharset(charset)
            .ifModifiedSince(ifModifiedSince)
            .ifNoneMatch(ifNoneMatch)
            .contentLength(contentLength)
            .contentType(contentType)
            .build();

    assertNotNull(responseEntity);
    assertEquals(HttpMethod.POST, responseEntity.getMethod());
    assertEquals(new URI("http://example.com"), responseEntity.getUrl());
    HttpHeaders responseHeaders = responseEntity.getHeaders();

    assertEquals("text/plain", responseHeaders.getFirst("Accept"));
    assertEquals("utf-8", responseHeaders.getFirst("Accept-Charset"));
    assertEquals("Thu, 01 Jan 1970 00:00:12 GMT", responseHeaders.getFirst("If-Modified-Since"));
    assertEquals(ifNoneMatch, responseHeaders.getFirst("If-None-Match"));
    assertEquals(String.valueOf(contentLength), responseHeaders.getFirst("Content-Length"));
    assertEquals(contentType.toString(), responseHeaders.getFirst("Content-Type"));

    assertNull(responseEntity.getBody());
  }
  @Test
  public void get() {
    RequestEntity<Void> requestEntity =
        RequestEntity.get(URI.create("http://example.com"))
            .accept(MediaType.IMAGE_GIF, MediaType.IMAGE_JPEG, MediaType.IMAGE_PNG)
            .build();

    assertNotNull(requestEntity);
    assertEquals(HttpMethod.GET, requestEntity.getMethod());
    assertTrue(requestEntity.getHeaders().containsKey("Accept"));
    assertEquals("image/gif, image/jpeg, image/png", requestEntity.getHeaders().getFirst("Accept"));
    assertNull(requestEntity.getBody());
  }
  @Test
  public void normal() throws URISyntaxException {
    String headerName = "My-Custom-Header";
    String headerValue = "HeaderValue";
    URI url = new URI("http://example.com");
    Integer entity = 42;

    RequestEntity<Object> requestEntity =
        RequestEntity.method(HttpMethod.GET, url).header(headerName, headerValue).body(entity);

    assertNotNull(requestEntity);
    assertEquals(HttpMethod.GET, requestEntity.getMethod());
    assertTrue(requestEntity.getHeaders().containsKey(headerName));
    assertEquals(headerValue, requestEntity.getHeaders().getFirst(headerName));
    assertEquals(entity, requestEntity.getBody());
  }
  @Test
  public void uriVariablesExpansion() throws URISyntaxException {
    URI uri = new UriTemplate("http://example.com/{foo}").expand("bar");
    RequestEntity.get(uri).accept(MediaType.TEXT_PLAIN).build();

    String url = "http://www.{host}.com/{path}";
    String host = "example";
    String path = "foo/bar";
    URI expected = new URI("http://www.example.com/foo/bar");

    uri = new UriTemplate(url).expand(host, path);
    RequestEntity<?> entity = RequestEntity.get(uri).build();
    assertEquals(expected, entity.getUrl());

    Map<String, String> uriVariables = new HashMap<>(2);
    uriVariables.put("host", host);
    uriVariables.put("path", path);

    uri = new UriTemplate(url).expand(uriVariables);
    entity = RequestEntity.get(uri).build();
    assertEquals(expected, entity.getUrl());
  }
  @Test
  public void methods() throws URISyntaxException {
    URI url = new URI("http://example.com");

    RequestEntity<?> entity = RequestEntity.get(url).build();
    assertEquals(HttpMethod.GET, entity.getMethod());

    entity = RequestEntity.post(url).build();
    assertEquals(HttpMethod.POST, entity.getMethod());

    entity = RequestEntity.head(url).build();
    assertEquals(HttpMethod.HEAD, entity.getMethod());

    entity = RequestEntity.options(url).build();
    assertEquals(HttpMethod.OPTIONS, entity.getMethod());

    entity = RequestEntity.put(url).build();
    assertEquals(HttpMethod.PUT, entity.getMethod());

    entity = RequestEntity.patch(url).build();
    assertEquals(HttpMethod.PATCH, entity.getMethod());

    entity = RequestEntity.delete(url).build();
    assertEquals(HttpMethod.DELETE, entity.getMethod());
  }