/* * Copyright 2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.hateoas.mvc; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import static org.springframework.hateoas.mvc.ControllerLinkBuilder.*; import java.util.Arrays; import java.util.List; import org.junit.Before; import org.junit.Test; import org.springframework.hateoas.Identifiable; import org.springframework.hateoas.Link; import org.springframework.hateoas.LinkBuilder; import org.springframework.hateoas.ResourceSupport; import org.springframework.hateoas.TestUtils; import org.springframework.web.bind.annotation.RequestMapping; /** * Unit tests for {@link IdentifiableResourceAssemblerSupport}. * * @author Oliver Gierke */ public class IdentifiableResourceAssemblerSupportUnitTest extends TestUtils { PersonResourceAssembler assembler = new PersonResourceAssembler(); Person person; @Override @Before public void setUp() { super.setUp(); this.person = new Person(); this.person.id = 10L; this.person.alternateId = "id"; } @Test public void createsInstanceWithSelfLinkToController() { PersonResource resource = assembler.createResource(person); Link link = resource.getLink(Link.REL_SELF); assertThat(link, is(notNullValue())); assertThat(resource.getLinks().size(), is(1)); } @Test public void usesAlternateIdIfGivenExplicitly() { PersonResource resource = assembler.createResourceWithId(person.alternateId, person); Link selfLink = resource.getId(); assertThat(selfLink.getHref(), endsWith("/people/id")); } @Test public void unwrapsIdentifyablesForParameters() { PersonResource resource = new PersonResourceAssembler(ParameterizedController.class).createResource(person, person, "bar"); Link selfLink = resource.getId(); assertThat(selfLink.getHref(), endsWith("/people/10/bar/addresses/10")); } @Test public void convertsEntitiesToResources() { Person first = new Person(); first.id = 1L; Person second = new Person(); second.id = 2L; List<PersonResource> result = assembler.toResources(Arrays.asList(first, second)); LinkBuilder builder = linkTo(PersonController.class); PersonResource firstResource = new PersonResource(); firstResource.add(builder.slash(1L).withSelfRel()); PersonResource secondResource = new PersonResource(); secondResource.add(builder.slash(1L).withSelfRel()); assertThat(result.size(), is(2)); assertThat(result, hasItems(firstResource, secondResource)); } @RequestMapping("/people") static class PersonController { } @RequestMapping("/people/{id}/{foo}/addresses") static class ParameterizedController { } static class Person implements Identifiable<Long> { Long id; String alternateId; @Override public Long getId() { return id; } } static class PersonResource extends ResourceSupport { } class PersonResourceAssembler extends IdentifiableResourceAssemblerSupport<Person, PersonResource> { public PersonResourceAssembler() { this(PersonController.class); } public PersonResourceAssembler(Class<?> controllerType) { super(controllerType, PersonResource.class); } @Override public PersonResource toResource(Person entity) { return createResource(entity); } } }