package org.multibit.mbm.resources.purchaseorder;
import com.google.common.base.Optional;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.xeiam.xchange.currency.MoneyUtils;
import org.joda.money.BigMoney;
import org.junit.Test;
import org.multibit.mbm.api.hal.HalMediaType;
import org.multibit.mbm.api.request.cart.purchaseorder.BuyerPurchaseOrderItem;
import org.multibit.mbm.api.request.cart.purchaseorder.BuyerUpdatePurchaseOrderRequest;
import org.multibit.mbm.core.model.*;
import org.multibit.mbm.db.DatabaseLoader;
import org.multibit.mbm.db.dao.ItemDao;
import org.multibit.mbm.db.dao.PurchaseOrderDao;
import org.multibit.mbm.test.BaseJerseyHmacResourceTest;
import org.multibit.mbm.test.FixtureAsserts;
import javax.ws.rs.core.MediaType;
import java.util.Set;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class AdminPurchaseOrderResourceTest extends BaseJerseyHmacResourceTest {
private final PurchaseOrderDao purchaseOrderDao = mock(PurchaseOrderDao.class);
private final ItemDao itemDao = mock(ItemDao.class);
private final AdminPurchaseOrderResource testObject = new AdminPurchaseOrderResource();
@Override
protected void setUpResources() {
// Create the User for authenticated access
User adminUser = setUpTrentHmacAuthenticator();
adminUser.setId(1L);
// Create the supporting Role
Role supplierRole = DatabaseLoader.buildSupplierRole();
// Configure Steve Supplier
User steveUser = DatabaseLoader.buildSteveSupplier(supplierRole);
steveUser.setId(1L);
steveUser.getSupplier().setId(1L);
// Configure Steve's PurchaseOrder with Items
Item book1 = DatabaseLoader.buildBookItemCryptonomicon();
book1.setId(1L);
Item book2 = DatabaseLoader.buildBookItemQuantumThief();
book2.setId(2L);
// TODO Pull this into DatabaseLoader
BigMoney book1UnitPrice = MoneyUtils.parse("GBP 1.23");
BigMoney book1UnitTax = MoneyUtils.parse("GBP 0.20");
BigMoney book2UnitPrice = MoneyUtils.parse("GBP 2.46");
BigMoney book2UnitTax = MoneyUtils.parse("GBP 0.40");
PurchaseOrder stevePurchaseOrder1 = PurchaseOrderBuilder
.newInstance()
.withSupplier(steveUser.getSupplier())
.withPurchaseOrderItem(book1, 1, book1UnitPrice, book1UnitTax)
.withPurchaseOrderItem(book2, 2, book2UnitPrice, book2UnitTax)
.build();
stevePurchaseOrder1.setId(1L);
steveUser.getSupplier().getPurchaseOrders().add(stevePurchaseOrder1);
// Configure Sam Supplier
User samUser = DatabaseLoader.buildSamSupplier(supplierRole);
samUser.setId(1L);
samUser.getSupplier().setId(1L);
// Configure Sam's PurchaseOrder with Items
Item book3 = DatabaseLoader.buildBookItemCompleteWorks();
book3.setId(3L);
Item book4 = DatabaseLoader.buildBookItemPlumbing();
book4.setId(4L);
// TODO Pull this into DatabaseLoader
BigMoney book3UnitPrice = MoneyUtils.parse("GBP 1.23");
BigMoney book3UnitTax = MoneyUtils.parse("GBP 0.20");
BigMoney book4UnitPrice = MoneyUtils.parse("GBP 2.46");
BigMoney book4UnitTax = MoneyUtils.parse("GBP 0.40");
PurchaseOrder samPurchaseOrder1 = PurchaseOrderBuilder
.newInstance()
.withSupplier(samUser.getSupplier())
.withPurchaseOrderItem(book3, 3, book3UnitPrice, book3UnitTax)
.withPurchaseOrderItem(book4, 4, book4UnitPrice, book4UnitTax)
.build();
samPurchaseOrder1.setId(1L);
samUser.getSupplier().getPurchaseOrders().add(samPurchaseOrder1);
// Create some mock results
Set<PurchaseOrder> stevePurchaseOrders = Sets.newHashSet(steveUser.getSupplier().getPurchaseOrders());
Set<PurchaseOrder> samPurchaseOrders = Sets.newHashSet(samUser.getSupplier().getPurchaseOrders());
// Configure PurchaseOrder DAO
when(purchaseOrderDao.getById(stevePurchaseOrder1.getId())).thenReturn(Optional.of(stevePurchaseOrder1));
when(purchaseOrderDao.getById(samPurchaseOrder1.getId())).thenReturn(Optional.of(samPurchaseOrder1));
when(purchaseOrderDao.getAllByPage(1, 0)).thenReturn(Lists.newLinkedList(stevePurchaseOrders));
when(purchaseOrderDao.getAllByPage(1, 1)).thenReturn(Lists.newLinkedList(samPurchaseOrders));
when(purchaseOrderDao.saveOrUpdate(stevePurchaseOrder1)).thenReturn(stevePurchaseOrder1);
when(purchaseOrderDao.saveOrUpdate(samPurchaseOrder1)).thenReturn(samPurchaseOrder1);
// Configure Item DAO
when(itemDao.getBySKU(book1.getSKU())).thenReturn(Optional.of(book1));
when(itemDao.getBySKU(book2.getSKU())).thenReturn(Optional.of(book2));
when(itemDao.getBySKU(book3.getSKU())).thenReturn(Optional.of(book3));
when(itemDao.getBySKU(book4.getSKU())).thenReturn(Optional.of(book4));
testObject.setPurchaseOrderDao(purchaseOrderDao);
testObject.setItemDao(itemDao);
// Configure resources
addSingleton(testObject);
}
@Test
public void adminRetrievePurchaseOrdersAsHalJson() throws Exception {
String actualResponse = configureAsClient(AdminPurchaseOrderResource.class)
.queryParam("ps", "1")
.queryParam("pn", "0")
.accept(HalMediaType.APPLICATION_HAL_JSON)
.get(String.class);
FixtureAsserts.assertStringMatchesJsonFixture("PurchaseOrder list 1 can be retrieved as HAL+JSON", actualResponse, "/fixtures/hal/purchaseorder/expected-admin-retrieve-purchase-orders-page-1.json");
actualResponse = configureAsClient(AdminPurchaseOrderResource.class)
.queryParam("ps", "1")
.queryParam("pn", "1")
.accept(HalMediaType.APPLICATION_HAL_JSON)
.get(String.class);
FixtureAsserts.assertStringMatchesJsonFixture("PurchaseOrder list 2 can be retrieved as HAL+JSON", actualResponse, "/fixtures/hal/purchaseorder/expected-admin-retrieve-purchase-orders-page-2.json");
}
@Test
public void adminUpdatePurchaseOrderAsHalJson() throws Exception {
// Starting condition is Belinda requires {book1: 1, book2: 2}
// Ending condition is Belinda requires {book1: 0, book2: 2, book3: 3}
BuyerUpdatePurchaseOrderRequest updatePurchaseOrderRequest = new BuyerUpdatePurchaseOrderRequest();
// TODO Consider providing ID (sequences etc)
//updatePurchaseOrderRequest.setId(1L);
// Add a few new items
updatePurchaseOrderRequest.getPurchaseOrderItems().add(new BuyerPurchaseOrderItem("0316184136", 3, "1.1", "GBP"));
// Remove by setting to zero
updatePurchaseOrderRequest.getPurchaseOrderItems().add(new BuyerPurchaseOrderItem("0099410672", 0, "2.2", "GBP"));
String actualResponse = configureAsClient("/admin/purchase-orders/1")
.accept(HalMediaType.APPLICATION_HAL_JSON)
.entity(updatePurchaseOrderRequest, MediaType.APPLICATION_JSON_TYPE)
.put(String.class);
FixtureAsserts.assertStringMatchesJsonFixture("UpdatePurchaseOrder by admin response render to HAL+JSON", actualResponse, "/fixtures/hal/purchaseorder/expected-admin-update-purchase-order.json");
}
}