package org.multibit.mbm.resources.item;
import com.google.common.base.Optional;
import com.google.common.collect.Lists;
import org.junit.Test;
import org.multibit.mbm.api.hal.HalMediaType;
import org.multibit.mbm.api.request.AdminDeleteEntityRequest;
import org.multibit.mbm.api.request.item.AdminCreateItemRequest;
import org.multibit.mbm.api.request.item.AdminUpdateItemRequest;
import org.multibit.mbm.db.DatabaseLoader;
import org.multibit.mbm.db.dao.ItemDao;
import org.multibit.mbm.core.model.Item;
import org.multibit.mbm.core.model.User;
import org.multibit.mbm.test.BaseJerseyHmacResourceTest;
import org.multibit.mbm.test.FixtureAsserts;
import javax.ws.rs.core.MediaType;
import java.util.List;
import static org.mockito.Matchers.isNotNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class AdminItemResourceTest extends BaseJerseyHmacResourceTest {
private final ItemDao itemDao=mock(ItemDao.class);
private final AdminItemResource testObject=new AdminItemResource();
@Override
protected void setUpResources() {
// Create the User for authenticated access
User adminUser = setUpTrentHmacAuthenticator();
adminUser.setId(1L);
// Create the customer Items
Item book1 = DatabaseLoader.buildBookItemCryptonomicon();
book1.setId(1L);
Item book2 = DatabaseLoader.buildBookItemQuantumThief();
book2.setId(2L);
// Create pages
List<Item> itemsPage1 = Lists.newArrayList();
itemsPage1.add(book1);
List<Item> itemsPage2 = Lists.newArrayList();
itemsPage2.add(book2);
// Configure the mock DAO
// Create
when(itemDao.saveOrUpdate((Item) isNotNull())).thenReturn(book1);
when(itemDao.getBySKU("sku123")).thenReturn(Optional.<Item>absent());
// Retrieve
when(itemDao.getAllByPage(1,0)).thenReturn(itemsPage1);
when(itemDao.getAllByPage(1,1)).thenReturn(itemsPage2);
// Update
when(itemDao.getById(1L)).thenReturn(Optional.of(book1));
when(itemDao.getById(2L)).thenReturn(Optional.of(book2));
when(itemDao.getBySKU("0099410672")).thenReturn(Optional.of(book1));
testObject.setItemDao(itemDao);
// Configure resources
addSingleton(testObject);
}
@Test
public void adminCreateItemAsHalJson() throws Exception {
AdminCreateItemRequest createItemRequest = new AdminCreateItemRequest();
createItemRequest.setSKU("sku123");
String actualResponse = configureAsClient(AdminItemResource.class)
.accept(HalMediaType.APPLICATION_HAL_JSON)
.entity(createItemRequest, MediaType.APPLICATION_JSON_TYPE)
.post(String.class);
FixtureAsserts.assertStringMatchesJsonFixture("CreateItem by admin response render to HAL+JSON",actualResponse, "/fixtures/hal/item/expected-admin-create-item.json");
}
@Test
public void adminRetrieveItemAsHalJson() throws Exception {
String actualResponse = configureAsClient(AdminItemResource.class)
.queryParam("ps","1")
.queryParam("pn", "0")
.accept(HalMediaType.APPLICATION_HAL_JSON)
.get(String.class);
FixtureAsserts.assertStringMatchesJsonFixture("Item list 1 can be retrieved as HAL+JSON", actualResponse, "/fixtures/hal/item/expected-admin-retrieve-items-page-1.json");
actualResponse = configureAsClient(AdminItemResource.class)
.queryParam("ps","1")
.queryParam("pn", "1")
.accept(HalMediaType.APPLICATION_HAL_JSON)
.get(String.class);
FixtureAsserts.assertStringMatchesJsonFixture("Item list 2 can be retrieved as HAL+JSON", actualResponse, "/fixtures/hal/item/expected-admin-retrieve-items-page-2.json");
}
@Test
public void adminUpdateItemAsHalJson() throws Exception {
AdminUpdateItemRequest updateItemRequest = new AdminUpdateItemRequest();
updateItemRequest.setSKU("sku123");
updateItemRequest.setGTIN("gtin123");
String actualResponse = configureAsClient("/admin/item/1")
.accept(HalMediaType.APPLICATION_HAL_JSON)
.entity(updateItemRequest, MediaType.APPLICATION_JSON_TYPE)
.put(String.class);
FixtureAsserts.assertStringMatchesJsonFixture("UpdateItem by admin response render to HAL+JSON",actualResponse, "/fixtures/hal/item/expected-admin-update-item.json");
}
@Test
public void adminDeleteItemAsHalJson() throws Exception {
AdminDeleteEntityRequest deleteItemRequest = new AdminDeleteEntityRequest();
deleteItemRequest.setReason("No longer available");
String actualResponse = configureAsClient("/admin/item/1")
.accept(HalMediaType.APPLICATION_HAL_JSON)
.entity(deleteItemRequest, MediaType.APPLICATION_JSON_TYPE)
.delete(String.class);
FixtureAsserts.assertStringMatchesJsonFixture("DeleteItem by admin response render to HAL+JSON",actualResponse, "/fixtures/hal/item/expected-admin-delete-item.json");
}
}