diff --git a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/AbstractWebIntegrationTests.java b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/AbstractWebIntegrationTests.java index c3f7edc44..7da993978 100644 --- a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/AbstractWebIntegrationTests.java +++ b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/AbstractWebIntegrationTests.java @@ -17,26 +17,20 @@ package org.springframework.data.rest.webmvc; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; -import static org.junit.Assume.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; import java.util.Collections; -import java.util.List; import java.util.Map; -import java.util.Map.Entry; import net.minidev.json.JSONArray; import org.junit.Before; -import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration; import org.springframework.hateoas.Link; -import org.springframework.hateoas.LinkDiscoverer; import org.springframework.hateoas.LinkDiscoverers; -import org.springframework.hateoas.MediaTypes; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.mock.web.MockHttpServletResponse; @@ -45,9 +39,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; -import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.ResultMatcher; -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.util.LinkedMultiValueMap; @@ -59,6 +51,10 @@ import com.jayway.jsonpath.InvalidPathException; import com.jayway.jsonpath.JsonPath; /** + * A test harness for hypermedia unit/integration testing. Provides chained operations (like postAndGet) to create + * a new entity and then retrieve it with a single method call. It also provides often-used assertions (like + * assertJsonPathEquals). + * * @author Oliver Gierke * @author Greg Turnquist */ @@ -69,77 +65,18 @@ public abstract class AbstractWebIntegrationTests { private static final String CONTENT_LINK_JSONPATH = "$._embedded.._links.%s.href[0]"; - protected static MediaType DEFAULT_MEDIA_TYPE = org.springframework.hateoas.MediaTypes.HAL_JSON; - @Autowired WebApplicationContext context; @Autowired LinkDiscoverers discoverers; + protected WebTestUtils testUtils; protected MockMvc mvc; @Before public void setUp() { mvc = MockMvcBuilders.webAppContextSetup(context).// - defaultRequest(get("/").accept(DEFAULT_MEDIA_TYPE)).build(); - } - - protected MockHttpServletResponse request(String href, MediaType contentType) throws Exception { - return mvc.perform(get(href).accept(contentType)). // - andExpect(status().isOk()). // - andExpect(content().contentType(contentType)). // - andReturn().getResponse(); - } - - protected MockHttpServletResponse request(Link link) throws Exception { - return request(link.expand().getHref()); - } - - protected MockHttpServletResponse request(Link link, MediaType mediaType) throws Exception { - return request(link.expand().getHref(), mediaType); - } - - protected MockHttpServletResponse request(String href) throws Exception { - return request(href, DEFAULT_MEDIA_TYPE); - } - - protected ResultActions follow(Link link) throws Exception { - return follow(link.expand().getHref()); - } - - protected ResultActions follow(String href) throws Exception { - return mvc.perform(get(href)); - } - - protected List discover(String rel) throws Exception { - return discover(new Link("/"), rel); - } - - protected Link discoverUnique(String rel) throws Exception { - - List discover = discover(rel); - assertThat(discover, hasSize(1)); - return discover.get(0); - } - - protected List discover(Link root, String rel) throws Exception { - - MockHttpServletResponse response = mvc.perform(get(root.expand().getHref()).accept(DEFAULT_MEDIA_TYPE)).// - andExpect(status().isOk()).// - andExpect(hasLinkWithRel(rel)).// - andReturn().getResponse(); - - String s = response.getContentAsString(); - return getDiscoverer(response).findLinksWithRel(rel, s); - } - - protected Link discoverUnique(Link root, String rel) throws Exception { - - MockHttpServletResponse response = mvc.perform(get(root.expand().getHref()).accept(DEFAULT_MEDIA_TYPE)).// - andExpect(status().isOk()).// - andExpect(hasLinkWithRel(rel)).// - andReturn().getResponse(); - - return assertHasLinkWithRel(rel, response); + defaultRequest(get("/").accept(WebTestUtils.DEFAULT_MEDIA_TYPE)).build(); + testUtils = new WebTestUtils(mvc, discoverers); } protected MockHttpServletResponse postAndGet(Link link, Object payload, MediaType mediaType) throws Exception { @@ -157,7 +94,7 @@ public abstract class AbstractWebIntegrationTests { return response; } - return request(response.getHeader("Location")); + return testUtils.request(response.getHeader("Location")); } protected MockHttpServletResponse putAndGet(Link link, Object payload, MediaType mediaType) throws Exception { @@ -168,7 +105,7 @@ public abstract class AbstractWebIntegrationTests { andExpect(status().is(both(greaterThanOrEqualTo(200)).and(lessThan(300)))).// andReturn().getResponse(); - return StringUtils.hasText(response.getContentAsString()) ? response : request(link); + return StringUtils.hasText(response.getContentAsString()) ? response : testUtils.request(link); } protected MockHttpServletResponse patchAndGet(Link link, Object payload, MediaType mediaType) throws Exception { @@ -180,7 +117,7 @@ public abstract class AbstractWebIntegrationTests { andExpect(status().isNoContent()).// andReturn().getResponse(); - return StringUtils.hasText(response.getContentAsString()) ? response : request(href); + return StringUtils.hasText(response.getContentAsString()) ? response : testUtils.request(href); } protected void deleteAndVerify(Link link) throws Exception { @@ -196,17 +133,6 @@ public abstract class AbstractWebIntegrationTests { andExpect(status().isNotFound()); } - protected Link assertHasLinkWithRel(String rel, MockHttpServletResponse response) throws Exception { - - String content = response.getContentAsString(); - Link link = getDiscoverer(response).findLinkWithRel(rel, content); - - assertThat("Expected to find link with rel " + rel + " but found none in " + content + "!", link, - is(notNullValue())); - - return link; - } - protected Link assertHasContentLinkWithRel(String rel, MockHttpServletResponse response) throws Exception { return assertContentLinkWithRel(rel, response, true); } @@ -241,22 +167,11 @@ public abstract class AbstractWebIntegrationTests { protected void assertDoesNotHaveLinkWithRel(String rel, MockHttpServletResponse response) throws Exception { String content = response.getContentAsString(); - Link link = getDiscoverer(response).findLinkWithRel(rel, content); + Link link = testUtils.getDiscoverer(response).findLinkWithRel(rel, content); assertThat("Expected not to find link with rel " + rel + " but found " + link + "!", link, is(nullValue())); } - private LinkDiscoverer getDiscoverer(MockHttpServletResponse response) { - - String contentType = response.getContentType(); - LinkDiscoverer linkDiscovererFor = discoverers.getLinkDiscovererFor(contentType); - - assertThat("Did not find a LinkDiscoverer for returned media type " + contentType + "!", linkDiscovererFor, - is(notNullValue())); - - return linkDiscovererFor; - } - @SuppressWarnings("unchecked") protected T assertHasJsonPathValue(String path, MockHttpServletResponse response) throws Exception { @@ -296,22 +211,6 @@ public abstract class AbstractWebIntegrationTests { return jsonQueryResults; } - protected ResultMatcher hasLinkWithRel(final String rel) { - - return new ResultMatcher() { - - @Override - public void match(MvcResult result) throws Exception { - - MockHttpServletResponse response = result.getResponse(); - String s = response.getContentAsString(); - - assertThat("Expected to find link with rel " + rel + " but found none in " + s, // - getDiscoverer(response).findLinkWithRel(rel, s), notNullValue()); - } - }; - } - protected ResultMatcher doesNotHaveLinkWithRel(final String rel) { return new ResultMatcher() { @@ -323,161 +222,11 @@ public abstract class AbstractWebIntegrationTests { String s = response.getContentAsString(); assertThat("Expected not to find link with rel " + rel + " but found one in " + s, // - getDiscoverer(response).findLinkWithRel(rel, s), nullValue()); + testUtils.getDiscoverer(response).findLinkWithRel(rel, s), nullValue()); } }; } - // Root test cases - - @Test - public void exposesRootResource() throws Exception { - - ResultActions actions = mvc.perform(get("/").accept(DEFAULT_MEDIA_TYPE)).andExpect(status().isOk()); - - for (String rel : expectedRootLinkRels()) { - actions.andExpect(hasLinkWithRel(rel)); - } - } - - /** - * @see DATAREST-113 - */ - @Test - public void exposesSchemasForResourcesExposed() throws Exception { - - MockHttpServletResponse response = request("/"); - - for (String rel : expectedRootLinkRels()) { - - Link link = assertHasLinkWithRel(rel, response); - - // Resource - request(link); - - // Schema - TODO:Improve by using hypermedia - mvc.perform(get(link.expand().getHref() + "/schema").// - accept(MediaType.parseMediaType("application/schema+json"))).// - andExpect(status().isOk()); - } - } - - /** - * @see DATAREST-203 - */ - @Test - public void servesHalWhenRequested() throws Exception { - - mvc.perform(get("/")). // - andExpect(content().contentType(MediaTypes.HAL_JSON)). // - andExpect(jsonPath("$._links", notNullValue())); - } - - /** - * @see DATAREST-203 - */ - @Test - public void servesHalWhenJsonIsRequested() throws Exception { - - mvc.perform(get("/").accept(MediaType.APPLICATION_JSON)). // - andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)). // - andExpect(jsonPath("$._links", notNullValue())); - } - - /** - * @see DATAREST-203 - */ - @Test - public void exposesSearchesForRootResources() throws Exception { - - MockHttpServletResponse response = request("/"); - - for (String rel : expectedRootLinkRels()) { - - Link link = assertHasLinkWithRel(rel, response); - String rootResourceRepresentation = request(link).getContentAsString(); - Link searchLink = getDiscoverer(response).findLinkWithRel("search", rootResourceRepresentation); - - if (searchLink != null) { - request(searchLink); - } - } - } - - @Test - public void nic() throws Exception { - - Map payloads = getPayloadToPost(); - assumeFalse(payloads.isEmpty()); - - MockHttpServletResponse response = request("/"); - - for (String rel : expectedRootLinkRels()) { - - String payload = payloads.get(rel); - - if (payload != null) { - - Link link = assertHasLinkWithRel(rel, response); - String target = link.expand().getHref(); - - MockHttpServletRequestBuilder request = post(target).// - content(payload).// - contentType(MediaType.APPLICATION_JSON); - - mvc.perform(request). // - andExpect(status().isCreated()); - } - } - } - - /** - * @see DATAREST-198 - */ - @Test - public void accessLinkedResources() throws Exception { - - MockHttpServletResponse rootResource = request("/"); - - for (Entry> linked : getRootAndLinkedResources().entrySet()) { - - Link resourceLink = assertHasLinkWithRel(linked.getKey(), rootResource); - MockHttpServletResponse resource = request(resourceLink); - - for (String linkedRel : linked.getValue()) { - - // Find URIs pointing to linked resources - String jsonPath = String.format("$..%s._links.%s.href", linked.getKey(), linkedRel); - String representation = resource.getContentAsString(); - JSONArray uris = JsonPath.read(representation, jsonPath); - - for (Object href : uris) { - - follow(href.toString()). // - andExpect(status().isOk()); - } - } - } - } - - /** - * @see DATAREST-230 - */ - @Test - public void exposesDescriptionAsAlpsDocuments() throws Exception { - - MediaType ALPS_MEDIA_TYPE = MediaType.valueOf("application/alps+json"); - - MockHttpServletResponse response = request("/"); - Link profileLink = assertHasLinkWithRel("profile", response); - - mvc.perform(// - get(profileLink.expand().getHref()).// - accept(ALPS_MEDIA_TYPE)).// - andExpect(status().isOk()).// - andExpect(content().contentType(ALPS_MEDIA_TYPE)); - } - protected abstract Iterable expectedRootLinkRels(); protected Map getPayloadToPost() throws Exception { diff --git a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/CommonWebTests.java b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/CommonWebTests.java new file mode 100644 index 000000000..72c805e71 --- /dev/null +++ b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/CommonWebTests.java @@ -0,0 +1,201 @@ +/* + * Copyright 2013-2014 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.data.rest.webmvc; + +import static org.hamcrest.Matchers.*; +import static org.junit.Assume.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import java.util.List; +import java.util.Map; + +import net.minidev.json.JSONArray; + +import org.junit.Test; +import org.springframework.hateoas.Link; +import org.springframework.hateoas.MediaTypes; +import org.springframework.http.MediaType; +import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; + +import com.jayway.jsonpath.JsonPath; + +/** + * This class contains a common test suite used to verify multiple data stores with the same domain space. + * When verifying support of a new data store, it's good to start with extending this suite of tests. However, + * if the data store doesn't map well onto this, then a good alternative would be write a new test suite + * using {@link org.springframework.data.rest.webmvc.AbstractWebIntegrationTests AbstractWebIntegrationTests} as + * the test harness. + * + * @author Oliver Gierke + * @author Greg Turnquist + */ +public abstract class CommonWebTests extends AbstractWebIntegrationTests { + + // Root test cases + + @Test + public void exposesRootResource() throws Exception { + + ResultActions actions = mvc.perform(get("/").accept(WebTestUtils.DEFAULT_MEDIA_TYPE)).andExpect(status().isOk()); + + for (String rel : expectedRootLinkRels()) { + actions.andExpect(webTestUtils.hasLinkWithRel(rel)); + } + } + + /** + * @see DATAREST-113 + */ + @Test + public void exposesSchemasForResourcesExposed() throws Exception { + + MockHttpServletResponse response = webTestUtils.request("/"); + + for (String rel : expectedRootLinkRels()) { + + Link link = webTestUtils.assertHasLinkWithRel(rel, response); + + // Resource + webTestUtils.request(link); + + // Schema - TODO:Improve by using hypermedia + mvc.perform(get(link.expand().getHref() + "/schema").// + accept(MediaType.parseMediaType("application/schema+json"))).// + andExpect(status().isOk()); + } + } + + /** + * @see DATAREST-203 + */ + @Test + public void servesHalWhenRequested() throws Exception { + + mvc.perform(get("/")). // + andExpect(content().contentType(MediaTypes.HAL_JSON)). // + andExpect(jsonPath("$._links", notNullValue())); + } + + /** + * @see DATAREST-203 + */ + @Test + public void servesHalWhenJsonIsRequested() throws Exception { + + mvc.perform(get("/").accept(MediaType.APPLICATION_JSON)). // + andExpect(content().contentTypeCompatibleWith(MediaType.APPLICATION_JSON)). // + andExpect(jsonPath("$._links", notNullValue())); + } + + /** + * @see DATAREST-203 + */ + @Test + public void exposesSearchesForRootResources() throws Exception { + + MockHttpServletResponse response = webTestUtils.request("/"); + + for (String rel : expectedRootLinkRels()) { + + Link link = webTestUtils.assertHasLinkWithRel(rel, response); + String rootResourceRepresentation = webTestUtils.request(link).getContentAsString(); + Link searchLink = webTestUtils.getDiscoverer(response).findLinkWithRel("search", rootResourceRepresentation); + + if (searchLink != null) { + webTestUtils.request(searchLink); + } + } + } + + @Test + public void nic() throws Exception { + + Map payloads = getPayloadToPost(); + assumeFalse(payloads.isEmpty()); + + MockHttpServletResponse response = webTestUtils.request("/"); + + for (String rel : expectedRootLinkRels()) { + + String payload = payloads.get(rel); + + if (payload != null) { + + Link link = webTestUtils.assertHasLinkWithRel(rel, response); + String target = link.expand().getHref(); + + MockHttpServletRequestBuilder request = post(target).// + content(payload).// + contentType(MediaType.APPLICATION_JSON); + + mvc.perform(request). // + andExpect(status().isCreated()); + } + } + } + + /** + * @see DATAREST-198 + */ + @Test + public void accessLinkedResources() throws Exception { + + MockHttpServletResponse rootResource = webTestUtils.request("/"); + + for (Map.Entry> linked : getRootAndLinkedResources().entrySet()) { + + Link resourceLink = webTestUtils.assertHasLinkWithRel(linked.getKey(), rootResource); + MockHttpServletResponse resource = webTestUtils.request(resourceLink); + + for (String linkedRel : linked.getValue()) { + + // Find URIs pointing to linked resources + String jsonPath = String.format("$..%s._links.%s.href", linked.getKey(), linkedRel); + String representation = resource.getContentAsString(); + JSONArray uris = JsonPath.read(representation, jsonPath); + + for (Object href : uris) { + + webTestUtils.follow(href.toString()). // + andExpect(status().isOk()); + } + } + } + } + + /** + * @see DATAREST-230 + */ + @Test + public void exposesDescriptionAsAlpsDocuments() throws Exception { + + MediaType ALPS_MEDIA_TYPE = MediaType.valueOf("application/alps+json"); + + MockHttpServletResponse response = webTestUtils.request("/"); + Link profileLink = webTestUtils.assertHasLinkWithRel("profile", response); + + mvc.perform(// + get(profileLink.expand().getHref()).// + accept(ALPS_MEDIA_TYPE)).// + andExpect(status().isOk()).// + andExpect(content().contentType(ALPS_MEDIA_TYPE)); + } + +} diff --git a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/TestMvcClient.java b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/TestMvcClient.java new file mode 100644 index 000000000..0ecb83456 --- /dev/null +++ b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/TestMvcClient.java @@ -0,0 +1,272 @@ +/* + * Copyright 2013 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.data.rest.webmvc; + +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import java.util.List; + +import org.springframework.hateoas.Link; +import org.springframework.hateoas.LinkDiscoverer; +import org.springframework.hateoas.LinkDiscoverers; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.test.web.servlet.ResultMatcher; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +/** + * Helper methods for web integration testing. + * + * @author Oliver Gierke + * @author Greg Turnquist + */ +public class WebTestUtils { + + public static MediaType DEFAULT_MEDIA_TYPE = org.springframework.hateoas.MediaTypes.HAL_JSON; + + private final MockMvc mvc; + private final LinkDiscoverers discoverers; + + public WebTestUtils(MockMvc mvc, LinkDiscoverers discoverers) { + this.mvc = mvc; + this.discoverers = discoverers; + } + + /** + * Initializes web tests. Will register a {@link MockHttpServletRequest} for the current thread. + */ + public static void initWebTest() { + + MockHttpServletRequest request = new MockHttpServletRequest(); + ServletRequestAttributes requestAttributes = new ServletRequestAttributes(request); + RequestContextHolder.setRequestAttributes(requestAttributes); + } + + public static void assertAllowHeaders(HttpEntity response, HttpMethod... methods) { + + HttpHeaders headers = response.getHeaders(); + + assertThat(headers.getAllow(), hasSize(methods.length)); + assertThat(headers.getAllow(), hasItems(methods)); + } + + /** + * Perform GET [href] with an explicit Accept media type using MockMvc. Verify the requests succeeded + * and also came back as the Accept type. + * + * @param href + * @param contentType + * @return a mocked servlet response with results from GET [href] + * @throws Exception + */ + public MockHttpServletResponse request(String href, MediaType contentType) throws Exception { + return mvc.perform(get(href).accept(contentType)). // + andExpect(status().isOk()). // + andExpect(content().contentType(contentType)). // + andReturn().getResponse(); + } + + /** + * Convenience wrapper that first expands the link using URI substitution before requesting with the + * default media type. + * + * @param link + * @return + * @throws Exception + */ + public MockHttpServletResponse request(Link link) throws Exception { + return request(link.expand().getHref()); + } + + /** + * Convenience wrapper that first expands the link using URI substitution and then GET [href] using + * an explicit media type + * + * @param link + * @param mediaType + * @return + * @throws Exception + */ + public MockHttpServletResponse request(Link link, MediaType mediaType) throws Exception { + return request(link.expand().getHref(), mediaType); + } + + /** + * Convenience wrapper to GET [href] using the default media type. + * + * @param href + * @return + * @throws Exception + */ + public MockHttpServletResponse request(String href) throws Exception { + return request(href, DEFAULT_MEDIA_TYPE); + } + + /** + * For a given link, expand the href using URI substitution and then do a simple GET. + * + * @param link + * @return + * @throws Exception + */ + public ResultActions follow(Link link) throws Exception { + return follow(link.expand().getHref()); + } + + /** + * Follow URL supplied as a string. NOTE: Assumes no URI templates. + * + * @param href + * @return + * @throws Exception + */ + public ResultActions follow(String href) throws Exception { + return mvc.perform(get(href)); + } + + /** + * Discover list of URIs associated with a rel, starting at the root node ("/") + * + * @param rel + * @return + * @throws Exception + */ + public List discover(String rel) throws Exception { + return discover(new Link("/"), rel); + } + + /** + * Discover single URI associated with a rel, starting at the root node ("/") + * @param rel + * @return + * @throws Exception + */ + public Link discoverUnique(String rel) throws Exception { + + List discover = discover(rel); + assertThat(discover, hasSize(1)); + return discover.get(0); + } + + /** + * Given a URI (root), discover the URIs for a given rel. + * + * @param root - URI to start from + * @param rel - name of the relationship to seek links + * @return list of {@link org.springframework.hateoas.Link Link} objects associated with the rel + * @throws Exception + */ + public List discover(Link root, String rel) throws Exception { + + MockHttpServletResponse response = mvc.perform(get(root.expand().getHref()).accept(DEFAULT_MEDIA_TYPE)).// + andExpect(status().isOk()).// + andExpect(hasLinkWithRel(rel)).// + andReturn().getResponse(); + + String s = response.getContentAsString(); + return getDiscoverer(response).findLinksWithRel(rel, s); + } + + /** + * Given a URI (root), discover the unique URI for a given rel. NOTE: Assumes there is only one URI + * + * @param root + * @param rel + * @return {@link org.springframework.hateoas.Link Link} tied to a given rel + * @throws Exception + */ + public Link discoverUnique(Link root, String rel) throws Exception { + + MockHttpServletResponse response = mvc.perform(get(root.expand().getHref()).accept(DEFAULT_MEDIA_TYPE)).// + andExpect(status().isOk()).// + andExpect(hasLinkWithRel(rel)).// + andReturn().getResponse(); + + return assertHasLinkWithRel(rel, response); + } + + /** + * For a given servlet response, verify that the provided rel exists in its hypermedia. If so, + * return the URI link. + * + * @param rel + * @param response + * @return {@link org.springframework.hateoas.Link} of the rel found in the response + * @throws Exception + */ + public Link assertHasLinkWithRel(String rel, MockHttpServletResponse response) throws Exception { + + String content = response.getContentAsString(); + Link link = getDiscoverer(response).findLinkWithRel(rel, content); + + assertThat("Expected to find link with rel " + rel + " but found none in " + content + "!", link, + is(notNullValue())); + + return link; + } + + /** + * MockMvc matcher used to verify existence of rel with URI link + * + * @param rel + * @return + */ + public ResultMatcher hasLinkWithRel(final String rel) { + + return new ResultMatcher() { + + @Override + public void match(MvcResult result) throws Exception { + + MockHttpServletResponse response = result.getResponse(); + String s = response.getContentAsString(); + + assertThat("Expected to find link with rel " + rel + " but found none in " + s, // + getDiscoverer(response).findLinkWithRel(rel, s), notNullValue()); + } + }; + } + + /** + * Using the servlet response's content type, find the corresponding link discoverer. + * + * @param response + * @return {@link org.springframework.hateoas.LinkDiscoverer} + */ + public LinkDiscoverer getDiscoverer(MockHttpServletResponse response) { + + String contentType = response.getContentType(); + LinkDiscoverer linkDiscovererFor = discoverers.getLinkDiscovererFor(contentType); + + assertThat("Did not find a LinkDiscoverer for returned media type " + contentType + "!", linkDiscovererFor, + is(notNullValue())); + + return linkDiscovererFor; + } + + +} diff --git a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/WebTestUtils.java b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/WebTestUtils.java deleted file mode 100644 index f70ea863a..000000000 --- a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/WebTestUtils.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2013 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.data.rest.webmvc; - -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; - -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.mock.web.MockHttpServletRequest; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - -/** - * Helper methods for web integration testing. - * - * @author Oliver Gierke - */ -public class WebTestUtils { - - /** - * Initializes web tests. Will register a {@link MockHttpServletRequest} for the current thread. - */ - public static void initWebTest() { - - MockHttpServletRequest request = new MockHttpServletRequest(); - ServletRequestAttributes requestAttributes = new ServletRequestAttributes(request); - RequestContextHolder.setRequestAttributes(requestAttributes); - } - - public static void assertAllowHeaders(HttpEntity response, HttpMethod... methods) { - - HttpHeaders headers = response.getHeaders(); - - assertThat(headers.getAllow(), hasSize(methods.length)); - assertThat(headers.getAllow(), hasItems(methods)); - } -} diff --git a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/gemfire/GemfireWebTests.java b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/gemfire/GemfireWebTests.java index a92aef524..15c982471 100644 --- a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/gemfire/GemfireWebTests.java +++ b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/gemfire/GemfireWebTests.java @@ -17,14 +17,14 @@ package org.springframework.data.rest.webmvc.gemfire; import java.util.Arrays; -import org.springframework.data.rest.webmvc.AbstractWebIntegrationTests; +import org.springframework.data.rest.webmvc.CommonWebTests; import org.springframework.test.context.ContextConfiguration; /** * @author Oliver Gierke */ @ContextConfiguration(classes = GemfireRepositoryConfig.class) -public class GemfireWebTests extends AbstractWebIntegrationTests { +public class GemfireWebTests extends CommonWebTests { /* * (non-Javadoc) diff --git a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/jpa/JpaWebTests.java b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/jpa/JpaWebTests.java index 193d8c897..b9636f967 100644 --- a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/jpa/JpaWebTests.java +++ b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/jpa/JpaWebTests.java @@ -33,7 +33,7 @@ import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.rest.core.mapping.ResourceMappings; -import org.springframework.data.rest.webmvc.AbstractWebIntegrationTests; +import org.springframework.data.rest.webmvc.CommonWebTests; import org.springframework.hateoas.Link; import org.springframework.hateoas.RelProvider; import org.springframework.http.MediaType; @@ -57,7 +57,7 @@ import com.jayway.jsonpath.JsonPath; */ @Transactional @ContextConfiguration(classes = JpaRepositoryConfig.class) -public class JpaWebTests extends AbstractWebIntegrationTests { +public class JpaWebTests extends CommonWebTests { private static final MediaType TEXT_URI_LIST = MediaType.valueOf("text/uri-list"); static final String LINK_TO_SIBLINGS_OF = "$._embedded..[?(@.firstName == '%s')]._links.siblings.href[0]"; @@ -125,17 +125,17 @@ public class JpaWebTests extends AbstractWebIntegrationTests { @Test public void accessPersons() throws Exception { - MockHttpServletResponse response = request("/people?page=0&size=1"); + MockHttpServletResponse response = testUtils.request("/people?page=0&size=1"); - Link nextLink = assertHasLinkWithRel(Link.REL_NEXT, response); + Link nextLink = testUtils.assertHasLinkWithRel(Link.REL_NEXT, response); assertDoesNotHaveLinkWithRel(Link.REL_PREVIOUS, response); - response = request(nextLink); - assertHasLinkWithRel(Link.REL_PREVIOUS, response); - nextLink = assertHasLinkWithRel(Link.REL_NEXT, response); + response = testUtils.request(nextLink); + testUtils.assertHasLinkWithRel(Link.REL_PREVIOUS, response); + nextLink = testUtils.assertHasLinkWithRel(Link.REL_NEXT, response); - response = request(nextLink); - assertHasLinkWithRel(Link.REL_PREVIOUS, response); + response = testUtils.request(nextLink); + testUtils.assertHasLinkWithRel(Link.REL_PREVIOUS, response); assertDoesNotHaveLinkWithRel(Link.REL_NEXT, response); } @@ -145,13 +145,13 @@ public class JpaWebTests extends AbstractWebIntegrationTests { @Test public void exposesLinkForRelatedResource() throws Exception { - MockHttpServletResponse response = request("/"); - Link ordersLink = assertHasLinkWithRel("orders", response); + MockHttpServletResponse response = testUtils.request("/"); + Link ordersLink = testUtils.assertHasLinkWithRel("orders", response); - MockHttpServletResponse orders = request(ordersLink); + MockHttpServletResponse orders = testUtils.request(ordersLink); Link creatorLink = assertHasContentLinkWithRel("creator", orders); - assertThat(request(creatorLink), is(notNullValue())); + assertThat(testUtils.request(creatorLink), is(notNullValue())); } /** @@ -160,10 +160,10 @@ public class JpaWebTests extends AbstractWebIntegrationTests { @Test public void exposesInlinedEntities() throws Exception { - MockHttpServletResponse response = request("/"); - Link ordersLink = assertHasLinkWithRel("orders", response); + MockHttpServletResponse response = testUtils.request("/"); + Link ordersLink = testUtils.assertHasLinkWithRel("orders", response); - MockHttpServletResponse orders = request(ordersLink); + MockHttpServletResponse orders = testUtils.request(ordersLink); assertHasJsonPathValue("$..lineItems", orders); } @@ -185,7 +185,7 @@ public class JpaWebTests extends AbstractWebIntegrationTests { @Test public void createPersonThenVerifyIgnoredAttributesDontExist() throws Exception { - Link peopleLink = discoverUnique("people"); + Link peopleLink = testUtils.discoverUnique("people"); ObjectMapper mapper = new ObjectMapper(); Person frodo = new Person("Frodo", "Baggins"); frodo.setAge(77); @@ -208,12 +208,12 @@ public class JpaWebTests extends AbstractWebIntegrationTests { @Test public void createThenPatch() throws Exception { - Link peopleLink = discoverUnique("people"); + Link peopleLink = testUtils.discoverUnique("people"); MockHttpServletResponse bilbo = postAndGet(peopleLink, "{ \"firstName\" : \"Bilbo\", \"lastName\" : \"Baggins\" }", MediaType.APPLICATION_JSON); - Link bilboLink = assertHasLinkWithRel("self", bilbo); + Link bilboLink = testUtils.assertHasLinkWithRel("self", bilbo); assertThat((String) JsonPath.read(bilbo.getContentAsString(), "$.firstName"), is("Bilbo")); assertThat((String) JsonPath.read(bilbo.getContentAsString(), "$.lastName"), is("Baggins")); @@ -235,13 +235,13 @@ public class JpaWebTests extends AbstractWebIntegrationTests { @Test public void createThenPut() throws Exception { - Link peopleLink = discoverUnique("people"); + Link peopleLink = testUtils.discoverUnique("people"); MockHttpServletResponse bilbo = postAndGet(peopleLink,// "{ \"firstName\" : \"Bilbo\", \"lastName\" : \"Baggins\" }",// MediaType.APPLICATION_JSON); - Link bilboLink = assertHasLinkWithRel("self", bilbo); + Link bilboLink = testUtils.assertHasLinkWithRel("self", bilbo); assertThat((String) JsonPath.read(bilbo.getContentAsString(), "$.firstName"), equalTo("Bilbo")); assertThat((String) JsonPath.read(bilbo.getContentAsString(), "$.lastName"), equalTo("Baggins")); @@ -376,7 +376,7 @@ public class JpaWebTests extends AbstractWebIntegrationTests { @Test public void propertiesCanHaveNulls() throws Exception { - Link peopleLink = discoverUnique("people"); + Link peopleLink = testUtils.discoverUnique("people"); Person frodo = new Person(); frodo.setFirstName("Frodo"); @@ -396,39 +396,39 @@ public class JpaWebTests extends AbstractWebIntegrationTests { @Test public void putShouldWorkDespiteExistingLinks() throws Exception { - Link peopleLink = discoverUnique("people"); + Link peopleLink = testUtils.discoverUnique("people"); Person frodo = new Person("Frodo", "Baggins"); String frodoString = mapper.writeValueAsString(frodo); MockHttpServletResponse createdPerson = postAndGet(peopleLink, frodoString, MediaType.APPLICATION_JSON); - Link frodoLink = assertHasLinkWithRel("self", createdPerson); + Link frodoLink = testUtils.assertHasLinkWithRel("self", createdPerson); assertJsonPathEquals("$.firstName", "Frodo", createdPerson); String bilboWithFrodosLinks = createdPerson.getContentAsString().replace("Frodo", "Bilbo"); MockHttpServletResponse overwrittenResponse = putAndGet(frodoLink, bilboWithFrodosLinks, MediaType.APPLICATION_JSON); - assertHasLinkWithRel("self", overwrittenResponse); + testUtils.assertHasLinkWithRel("self", overwrittenResponse); assertJsonPathEquals("$.firstName", "Bilbo", overwrittenResponse); } private List preparePersonResources(Person primary, Person... persons) throws Exception { - Link peopleLink = discoverUnique("people"); + Link peopleLink = testUtils.discoverUnique("people"); List links = new ArrayList(); MockHttpServletResponse primaryResponse = postAndGet(peopleLink, mapper.writeValueAsString(primary), MediaType.APPLICATION_JSON); - links.add(assertHasLinkWithRel("siblings", primaryResponse)); + links.add(testUtils.assertHasLinkWithRel("siblings", primaryResponse)); for (Person person : persons) { String payload = mapper.writeValueAsString(person); MockHttpServletResponse response = postAndGet(peopleLink, payload, MediaType.APPLICATION_JSON); - links.add(assertHasLinkWithRel(Link.REL_SELF, response)); + links.add(testUtils.assertHasLinkWithRel(Link.REL_SELF, response)); } return links; @@ -440,7 +440,7 @@ public class JpaWebTests extends AbstractWebIntegrationTests { @Test public void doesNotAllowGetToCollectionResourceIfFindAllIsNotExported() throws Exception { - Link link = discoverUnique("addresses"); + Link link = testUtils.discoverUnique("addresses"); mvc.perform(get(link.getHref())).// andExpect(status().isMethodNotAllowed()); @@ -452,7 +452,7 @@ public class JpaWebTests extends AbstractWebIntegrationTests { @Test public void doesNotAllowPostToCollectionResourceIfSaveIsNotExported() throws Exception { - Link link = discoverUnique("addresses"); + Link link = testUtils.discoverUnique("addresses"); mvc.perform(post(link.getHref()).content("{}").contentType(MediaType.APPLICATION_JSON)).// andExpect(status().isMethodNotAllowed()); @@ -467,9 +467,9 @@ public class JpaWebTests extends AbstractWebIntegrationTests { @Test public void returnsProjectionIfRequested() throws Exception { - Link orders = discoverUnique("orders"); + Link orders = testUtils.discoverUnique("orders"); - MockHttpServletResponse response = request(orders); + MockHttpServletResponse response = testUtils.request(orders); Link orderLink = assertContentLinkWithRel("self", response, true).expand(); UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(orderLink.getHref()); @@ -497,18 +497,18 @@ public class JpaWebTests extends AbstractWebIntegrationTests { @Test public void onlyLinksShouldAppearWhenExecuteSearchCompact() throws Exception { - Link peopleLink = discoverUnique("people"); + Link peopleLink = testUtils.discoverUnique("people"); Person daenerys = new Person("Daenerys", "Targaryen"); String daenerysString = mapper.writeValueAsString(daenerys); MockHttpServletResponse createdPerson = postAndGet(peopleLink, daenerysString, MediaType.APPLICATION_JSON); - Link daenerysLink = assertHasLinkWithRel("self", createdPerson); + Link daenerysLink = testUtils.assertHasLinkWithRel("self", createdPerson); assertJsonPathEquals("$.firstName", "Daenerys", createdPerson); - Link searchLink = discoverUnique(peopleLink, "search"); - Link byFirstNameLink = discoverUnique(searchLink, "findFirstPersonByFirstName"); + Link searchLink = testUtils.discoverUnique(peopleLink, "search"); + Link byFirstNameLink = testUtils.discoverUnique(searchLink, "findFirstPersonByFirstName"); - MockHttpServletResponse response = request(byFirstNameLink.expand("Daenerys"), + MockHttpServletResponse response = testUtils.request(byFirstNameLink.expand("Daenerys"), MediaType.parseMediaType("application/x-spring-data-compact+json")); String responseBody = response.getContentAsString(); @@ -526,9 +526,9 @@ public class JpaWebTests extends AbstractWebIntegrationTests { @Test public void rendersExcerptProjectionsCorrectly() throws Exception { - Link authorsLink = discoverUnique("authors"); + Link authorsLink = testUtils.discoverUnique("authors"); - MockHttpServletResponse response = request(authorsLink); + MockHttpServletResponse response = testUtils.request(authorsLink); String firstAuthorPath = "$._embedded.authors[0]"; // Has main content @@ -542,7 +542,7 @@ public class JpaWebTests extends AbstractWebIntegrationTests { String content = response.getContentAsString(); String href = JsonPath.read(content, firstAuthorPath.concat("._links.self.href")); - follow(new Link(href)).andExpect(hasLinkWithRel("books")); + testUtils.follow(new Link(href)).andExpect(testUtils.hasLinkWithRel("books")); } /** @@ -551,7 +551,7 @@ public class JpaWebTests extends AbstractWebIntegrationTests { @Test public void returns404WhenTryingToDeleteANonExistingResource() throws Exception { - Link authorsLink = discoverUnique("authors"); + Link authorsLink = testUtils.discoverUnique("authors"); mvc.perform(delete(authorsLink.getHref().concat("/{id}"), 4711)).// andExpect(status().isNotFound()); @@ -563,20 +563,20 @@ public class JpaWebTests extends AbstractWebIntegrationTests { @Test public void execturesSearchThatTakesASort() throws Exception { - Link booksLink = discoverUnique("books"); - Link searchLink = discoverUnique(booksLink, "search"); - Link findBySortedLink = discoverUnique(searchLink, "find-by-sorted"); + Link booksLink = testUtils.discoverUnique("books"); + Link searchLink = testUtils.discoverUnique(booksLink, "search"); + Link findBySortedLink = testUtils.discoverUnique(searchLink, "find-by-sorted"); // Assert sort options advertised assertThat(findBySortedLink.isTemplated(), is(true)); assertThat(findBySortedLink.getVariableNames(), contains("sort")); // Assert results returned as specified - follow(findBySortedLink.expand("title,desc")).// + testUtils.follow(findBySortedLink.expand("title,desc")).// andExpect(jsonPath("$._embedded.books[0].title").value("Spring Data (Second Edition)")).// andExpect(jsonPath("$._embedded.books[1].title").value("Spring Data")); - follow(findBySortedLink.expand("title,asc")).// + testUtils.follow(findBySortedLink.expand("title,asc")).// andExpect(jsonPath("$._embedded.books[0].title").value("Spring Data")).// andExpect(jsonPath("$._embedded.books[1].title").value("Spring Data (Second Edition)")); } @@ -590,7 +590,7 @@ public class JpaWebTests extends AbstractWebIntegrationTests { */ private void assertSiblingNames(Link link, String... siblingNames) throws Exception { - String responseBody = request(link).getContentAsString(); + String responseBody = testUtils.request(link).getContentAsString(); List persons = JsonPath.read(responseBody, "$._embedded.people[*].firstName"); assertThat(persons, hasSize(siblingNames.length)); @@ -599,7 +599,7 @@ public class JpaWebTests extends AbstractWebIntegrationTests { private void assertPersonWithNameAndSiblingLink(String name) throws Exception { - MockHttpServletResponse response = request(discoverUnique("people")); + MockHttpServletResponse response = testUtils.request(testUtils.discoverUnique("people")); String jsonPath = String.format("$._embedded.people[?(@.firstName == '%s')][0]", name); @@ -610,7 +610,7 @@ public class JpaWebTests extends AbstractWebIntegrationTests { // Assert sibling link exposed in resource pointed to Link selfLink = new Link(JsonPath. read(john, "$._links.self.href")); - follow(selfLink).// + testUtils.follow(selfLink).// andExpect(status().isOk()).// andExpect(jsonPath("$._links.siblings", is(notNullValue()))); } diff --git a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/mongodb/MongoWebTests.java b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/mongodb/MongoWebTests.java index e20b6c81e..7e7e36498 100644 --- a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/mongodb/MongoWebTests.java +++ b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/mongodb/MongoWebTests.java @@ -25,7 +25,7 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.rest.webmvc.AbstractWebIntegrationTests; +import org.springframework.data.rest.webmvc.CommonWebTests; import org.springframework.data.rest.webmvc.RestMediaTypes; import org.springframework.hateoas.Link; import org.springframework.http.MediaType; @@ -38,9 +38,10 @@ import com.jayway.jsonpath.JsonPath; * Integration tests for MongoDB repositories. * * @author Oliver Gierke + * @author Greg Turnquist */ @ContextConfiguration(classes = MongoDbRepositoryConfig.class) -public class MongoWebTests extends AbstractWebIntegrationTests { +public class MongoWebTests extends CommonWebTests { @Autowired ProfileRepository repository; @Autowired UserRepository userRepository; @@ -88,17 +89,17 @@ public class MongoWebTests extends AbstractWebIntegrationTests { @Test public void foo() throws Exception { - Link profileLink = discoverUnique("profiles"); - follow(profileLink).// + Link profileLink = testUtils.discoverUnique("profiles"); + testUtils.follow(profileLink).// andExpect(jsonPath("$._embedded.profiles").value(hasSize(2))); } @Test public void rendersEmbeddedDocuments() throws Exception { - Link usersLink = discoverUnique("users"); - Link userLink = assertHasContentLinkWithRel("self", request(usersLink)); - follow(userLink).// + Link usersLink = testUtils.discoverUnique("users"); + Link userLink = assertHasContentLinkWithRel("self", testUtils.request(usersLink)); + testUtils.follow(userLink).// andExpect(jsonPath("$.address.zipCode").value(is(notNullValue()))); } @@ -108,22 +109,22 @@ public class MongoWebTests extends AbstractWebIntegrationTests { @Test public void executeQueryMethodWithPrimitiveReturnType() throws Exception { - Link profiles = discoverUnique("profiles"); - Link profileSearches = discoverUnique(profiles, "search"); - Link countByTypeLink = discoverUnique(profileSearches, "countByType"); + Link profiles = testUtils.discoverUnique("profiles"); + Link profileSearches = testUtils.discoverUnique(profiles, "search"); + Link countByTypeLink = testUtils.discoverUnique(profileSearches, "countByType"); assertThat(countByTypeLink.isTemplated(), is(true)); assertThat(countByTypeLink.getVariableNames(), hasItem("type")); - MockHttpServletResponse response = request(countByTypeLink.expand("Twitter")); + MockHttpServletResponse response = testUtils.request(countByTypeLink.expand("Twitter")); assertThat(response.getContentAsString(), is("1")); } @Test public void testname() throws Exception { - Link usersLink = discoverUnique("users"); - Link userLink = assertHasContentLinkWithRel("self", request(usersLink)); + Link usersLink = testUtils.discoverUnique("users"); + Link userLink = assertHasContentLinkWithRel("self", testUtils.request(usersLink)); MockHttpServletResponse response = patchAndGet(userLink, "{\"lastname\" : null, \"address\" : { \"zipCode\" : \"ZIP\"}}", MediaType.APPLICATION_JSON); @@ -135,8 +136,8 @@ public class MongoWebTests extends AbstractWebIntegrationTests { @Test public void testname2() throws Exception { - Link usersLink = discoverUnique("users"); - Link userLink = assertHasContentLinkWithRel("self", request(usersLink)); + Link usersLink = testUtils.discoverUnique("users"); + Link userLink = assertHasContentLinkWithRel("self", testUtils.request(usersLink)); MockHttpServletResponse response = patchAndGet(userLink, "[{ \"op\": \"replace\", \"path\": \"/address/zipCode\", \"value\": \"ZIP\" }," diff --git a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/neo4j/Neo4jWebTests.java b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/neo4j/Neo4jWebTests.java index caf6cb024..38531268e 100644 --- a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/neo4j/Neo4jWebTests.java +++ b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/neo4j/Neo4jWebTests.java @@ -30,7 +30,7 @@ import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.data.neo4j.config.EnableNeo4jRepositories; import org.springframework.data.neo4j.config.Neo4jConfiguration; -import org.springframework.data.rest.webmvc.AbstractWebIntegrationTests; +import org.springframework.data.rest.webmvc.CommonWebTests; import org.springframework.hateoas.Link; import org.springframework.test.context.ContextConfiguration; import org.springframework.transaction.annotation.EnableTransactionManagement; @@ -42,7 +42,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; */ @ContextConfiguration @Ignore -public class Neo4jWebTests extends AbstractWebIntegrationTests { +public class Neo4jWebTests extends CommonWebTests { @Configuration @ComponentScan @@ -86,13 +86,13 @@ public class Neo4jWebTests extends AbstractWebIntegrationTests { public void deletesCustomer() throws Exception { // Lookup customer - Link customers = discoverUnique("customers"); - Link customerLink = assertHasContentLinkWithRel("self", request(customers)); + Link customers = testUtils.discoverUnique("customers"); + Link customerLink = assertHasContentLinkWithRel("self", testUtils.request(customers)); // Delete customer mvc.perform(delete(customerLink.getHref())); // Assert no customers anymore - assertDoesNotHaveContentLinkWithRel("self", request(customers)); + assertDoesNotHaveContentLinkWithRel("self", testUtils.request(customers)); } }