/*
* Copyright 2016-2017 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.tests.shop;
import static org.hamcrest.CoreMatchers.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import java.util.Collections;
import java.util.Map;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.data.rest.tests.AbstractWebIntegrationTests;
import org.springframework.hateoas.Link;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.web.servlet.ResultActions;
import com.jayway.jsonpath.JsonPath;
/**
* Integration tests for projections.
*
* @author Oliver Gierke
* @author Craig Andrews
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = ShopConfiguration.class)
public class ShopIntegrationTests extends AbstractWebIntegrationTests {
@Test
public void rendersRepresentationCorrectly() throws Exception {
Link ordersLink = client.discoverUnique("orders");
String selfLink = JsonPath.parse(client.request(ordersLink).getContentAsString())
.read("$._embedded.orders[0]._links.self.href");
ResultActions actions = client.follow(selfLink)
// Lookup type is rendered as String
.andExpect(jsonPath("items[0].type", is("good")))//
// Invokes ResourceProcessor for nested Resource
.andExpect(jsonPath("items[0]._links.bar").exists());//
// Adds excerpt projection for related product
expectRelatedResource("items[0].product", actions);
expectRelatedResource("items[0].products", actions);
// Adds excerpt projection for root level reference
expectRelatedResource("customer", actions);
}
@Test // DATAREST-221
public void renderProductNameOnlyProjection() throws Exception {
Map<String, Object> arguments = Collections.singletonMap("projection", "nameOnly");
client.follow(client.discoverUnique("products").expand(arguments))//
.andExpect(status().isOk())//
.andExpect(jsonPath("$._embedded.products[0].name", notNullValue()))//
.andExpect(jsonPath("$._embedded.products[0].price").doesNotExist());
}
@Test // DATAREST-221
public void renderProductNameOnlyProjectionResourceProcessor() throws Exception {
Map<String, Object> arguments = Collections.singletonMap("projection", "nameOnly");
client.follow(client.discoverUnique("products").expand(arguments))//
.andExpect(status().isOk())//
.andExpect(jsonPath("$._embedded.products[0]._links.beta").exists());
}
@Test // DATAREST-221
public void renderOrderItemsOnlyProjectionResourceProcessor() throws Exception {
Map<String, Object> arguments = Collections.singletonMap("projection", "itemsOnly");
client.follow(client.discoverUnique("orders").expand(arguments))//
.andExpect(status().isOk())//
.andExpect(jsonPath("$._embedded.orders[0].items[0].products[0].name").exists())//
.andExpect(jsonPath("$._embedded.orders[0].items[0].products[0]._links.beta").exists());
}
private static void expectRelatedResource(String name, ResultActions actions) throws Exception {
int dotIndex = name.lastIndexOf('.');
String prefix = dotIndex == -1 ? "" : name.substring(0, dotIndex);
String suffix = dotIndex == -1 ? name : name.substring(dotIndex);
actions.andExpect(jsonPath(prefix.concat(suffix)).doesNotExist());
actions.andExpect(jsonPath(prefix.concat("_links.").concat(suffix)).exists());
actions.andExpect(jsonPath(prefix.concat("_embedded.").concat(suffix)).exists());
}
}