package net.eusashead.bjugquerydsl.hateoas; import java.math.BigDecimal; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; import junit.framework.Assert; import net.eusashead.bjugquerydsl.data.entity.Basket; import net.eusashead.bjugquerydsl.data.entity.BasketItem; import net.eusashead.bjugquerydsl.data.entity.Customer; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import org.springframework.http.HttpHeaders; import org.springframework.http.ResponseEntity; import org.springframework.mock.web.MockHttpServletRequest; import com.theoryinpractise.halbuilder.DefaultRepresentationFactory; import com.theoryinpractise.halbuilder.api.ReadableRepresentation; import com.theoryinpractise.halbuilder.api.RepresentationFactory; @RunWith(JUnit4.class) public class HalResponseEntityBuilderTest { private static final Date MODIFIED_DATE = new Date(123456789l); private RepresentationFactory representationFactory = new DefaultRepresentationFactory(); private RepresentationConverterImpl converter; private MockHttpServletRequest request = new MockHttpServletRequest("GET", "/path/to/resource"); @Before public void before() throws Exception { // Build the converter this.converter = new RepresentationConverterImpl(representationFactory, new SimplePropertyConverterImpl()); this.converter.registerExtractor(new JpaEntityResourceMetadataExtractor()); } @Test public void testBasic() throws Exception { HalResponseEntityBuilder builder = new HalResponseEntityBuilder(representationFactory, converter, request, "fields"); ResponseEntity<ReadableRepresentation> response = builder.withProperty("string", "String value") .withProperty("date", new Date(123456789l)) .withProperty("int", 34) .withProperty("decimal", BigDecimal.valueOf(123.32d)) .withProperty("boolean", true) .withRepresentation("customer", customer()) .etag(MODIFIED_DATE) .lastModified(MODIFIED_DATE) .expireIn(1000000) .get(); assertHeaders(response); Assert.assertEquals("String value", response.getBody().getValue("string").toString()); Assert.assertEquals("Fri Jan 02 11:17:36 GMT 1970", response.getBody().getValue("date").toString()); Assert.assertEquals("34", response.getBody().getValue("int").toString()); Assert.assertEquals("123.32", response.getBody().getValue("decimal").toString()); Assert.assertEquals("true", response.getBody().getValue("boolean").toString()); List<? extends ReadableRepresentation> customer = response.getBody().getResourcesByRel("customer"); Assert.assertNotNull(customer); Assert.assertEquals(Integer.valueOf(1), Integer.valueOf(customer.size())); ReadableRepresentation cust = customer.get(0); Assert.assertEquals("test@domain.com", cust.getValue("email").toString()); } @Test public void testWithBean() throws Exception { HalResponseEntityBuilder builder = new HalResponseEntityBuilder(representationFactory, converter, request, "fields"); Customer customer = customer(); ResponseEntity<ReadableRepresentation> response = builder.withBean(customer) .etag(MODIFIED_DATE) .lastModified(MODIFIED_DATE) .expireIn(1000000) .get(); assertHeaders(response); Assert.assertEquals("123", response.getBody().getValue("customerId").toString()); Assert.assertEquals("test@domain.com", response.getBody().getValue("email").toString()); Assert.assertEquals("First", response.getBody().getValue("firstName").toString()); Assert.assertEquals("Last", response.getBody().getValue("lastName").toString()); Assert.assertEquals("Fri Jan 02 11:17:36 GMT 1970", response.getBody().getValue("joined").toString()); } @Test public void testWithBeanWithChildren() throws Exception { HalResponseEntityBuilder builder = new HalResponseEntityBuilder(representationFactory, converter, request, "fields"); Customer customer = customerWithBaskets(); ResponseEntity<ReadableRepresentation> response = builder.withBean(customer) .etag(MODIFIED_DATE) .lastModified(MODIFIED_DATE) .expireIn(1000000) .get(); assertHeaders(response); Assert.assertNotNull(response.getBody().getResourcesByRel("baskets")); Assert.assertEquals(Integer.valueOf(2), Integer.valueOf(response.getBody().getResourcesByRel("baskets").size())); } @Test public void testWithBeanWithChildrenIncludeFields() throws Exception { HalResponseEntityBuilder builder = new HalResponseEntityBuilder(representationFactory, converter, request, "fields"); Customer customer = customerWithBaskets(); ResponseEntity<ReadableRepresentation> response = builder.withBean(customer, "firstName", "email") .etag(MODIFIED_DATE) .lastModified(MODIFIED_DATE) .expireIn(1000000) .get(); assertHeaders(response); Set<String> keys = response.getBody().getProperties().keySet(); Assert.assertTrue(keys.size() == 2); Assert.assertTrue(keys.contains("email")); Assert.assertTrue(keys.contains("firstName")); Assert.assertEquals(Integer.valueOf(0), Integer.valueOf(response.getBody().getResourcesByRel("baskets").size())); } @Test public void testWithBeanWithChildrenRequestFields() throws Exception { Customer customer = customerWithBaskets(); request.setParameter("fields", new String[]{"lastName", "customerId"}); HalResponseEntityBuilder builder = new HalResponseEntityBuilder(representationFactory, converter, request, "fields"); ResponseEntity<ReadableRepresentation> response = builder.withBean(customer) .etag(MODIFIED_DATE) .lastModified(MODIFIED_DATE) .expireIn(1000000) .get(); assertHeaders(response); Set<String> keys = response.getBody().getProperties().keySet(); System.out.println(response.getBody().toString("application/hal+xml")); Assert.assertTrue(keys.size() == 2); Assert.assertTrue(keys.contains("lastName")); Assert.assertTrue(keys.contains("customerId")); Assert.assertEquals(Integer.valueOf(0), Integer.valueOf(response.getBody().getResourcesByRel("baskets").size())); } @Test public void testRequestFieldsOverridesIncludedFields() throws Exception { Customer customer = customerWithBaskets(); request.setParameter("fields", new String[]{"lastName", "customerId"}); HalResponseEntityBuilder builder = new HalResponseEntityBuilder(representationFactory, converter, request, "fields"); ResponseEntity<ReadableRepresentation> response = builder.withBean(customer, "firstName", "email") .etag(MODIFIED_DATE) .lastModified(MODIFIED_DATE) .expireIn(1000000) .get(); assertHeaders(response); Set<String> keys = response.getBody().getProperties().keySet(); Assert.assertTrue(keys.size() == 2); Assert.assertTrue(keys.contains("lastName")); Assert.assertTrue(keys.contains("customerId")); Assert.assertEquals(Integer.valueOf(0), Integer.valueOf(response.getBody().getResourcesByRel("baskets").size())); } @Test public void testRequestInvalidField() throws Exception { Customer customer = customerWithBaskets(); request.setParameter("fields", new String[]{"noChance", "firstName"}); HalResponseEntityBuilder builder = new HalResponseEntityBuilder(representationFactory, converter, request, "fields"); ResponseEntity<ReadableRepresentation> response = builder.withBean(customer) .etag(MODIFIED_DATE) .lastModified(MODIFIED_DATE) .expireIn(1000000) .get(); assertHeaders(response); Set<String> keys = response.getBody().getProperties().keySet(); Assert.assertTrue(keys.size() == 1); Assert.assertTrue(keys.contains("firstName")); Assert.assertEquals(Integer.valueOf(0), Integer.valueOf(response.getBody().getResourcesByRel("baskets").size())); } @Test public void testIncludeInvalidField() throws Exception { HalResponseEntityBuilder builder = new HalResponseEntityBuilder(representationFactory, converter, request, "fields"); Customer customer = customerWithBaskets(); ResponseEntity<ReadableRepresentation> response = builder.withBean(customer, "noChance", "firstName") .etag(MODIFIED_DATE) .lastModified(MODIFIED_DATE) .expireIn(1000000) .get(); assertHeaders(response); Set<String> keys = response.getBody().getProperties().keySet(); Assert.assertTrue(keys.size() == 1); Assert.assertTrue(keys.contains("firstName")); Assert.assertEquals(Integer.valueOf(0), Integer.valueOf(response.getBody().getResourcesByRel("baskets").size())); } private Customer customerWithBaskets() { final Customer customer = customer(); final Basket basket1 = new Basket(1, customer, new HashSet<BasketItem>()); final Basket basket2 = new Basket(2, customer, new HashSet<BasketItem>()); customer.getBaskets().add(basket1); customer.getBaskets().add(basket2); return customer; } private Customer customer() { final Customer customer = new Customer(123, "test@domain.com", "First", new Date(123456789l), "Last"); return customer; } private void assertHeaders(ResponseEntity<ReadableRepresentation> response) { HttpHeaders headers = response.getHeaders(); Assert.assertEquals("w/123456789", headers.getETag()); Assert.assertEquals(123456000, headers.getLastModified()); Assert.assertTrue(Long.valueOf(133456789) < Long.valueOf(headers.getExpires())); } }