package org.multibit.mbm.resources.purchaseorder;
import com.google.common.base.Optional;
import org.junit.Test;
import org.multibit.mbm.api.hal.HalMediaType;
import org.multibit.mbm.api.request.delivery.SupplierDeliveryItem;
import org.multibit.mbm.api.request.delivery.SupplierUpdateDeliveryRequest;
import org.multibit.mbm.core.model.*;
import org.multibit.mbm.db.DatabaseLoader;
import org.multibit.mbm.db.dao.DeliveryDao;
import org.multibit.mbm.db.dao.ItemDao;
import org.multibit.mbm.resources.delivery.SupplierDeliveryResource;
import org.multibit.mbm.test.BaseJerseyHmacResourceTest;
import org.multibit.mbm.test.FixtureAsserts;
import javax.ws.rs.core.MediaType;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class SupplierPurchaseOrderResourceTest extends BaseJerseyHmacResourceTest {
private final DeliveryDao deliveryDao=mock(DeliveryDao.class);
private final ItemDao itemDao=mock(ItemDao.class);
private final SupplierDeliveryResource testObject=new SupplierDeliveryResource();
@Override
protected void setUpResources() {
// Use Alice for Supplier access
User supplierUser = setUpSteveHmacAuthenticator();
supplierUser.setId(1L);
Supplier supplier = supplierUser.getSupplier();
supplier.setId(1L);
// Configure the Delivery with Items
Item book1 = DatabaseLoader.buildBookItemCryptonomicon();
book1.setId(1L);
Item book2 = DatabaseLoader.buildBookItemQuantumThief();
book2.setId(2L);
Item book3 = DatabaseLoader.buildBookItemCompleteWorks();
book3.setId(3L);
Item book4 = DatabaseLoader.buildBookItemPlumbing();
book4.setId(4L);
// Include some books into the Supplier Delivery
Delivery supplierDelivery = DeliveryBuilder
.newInstance()
.withSupplier(supplier)
.withDeliveryItem(book1,1)
.withDeliveryItem(book2,2)
.build();
supplierDelivery.setId(1L);
supplier.getDeliveries().add(supplierDelivery);
// Configure Delivery DAO
when(deliveryDao.saveOrUpdate(supplierDelivery)).thenReturn(supplierDelivery);
// 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.setDeliveryDao(deliveryDao);
testObject.setItemDao(itemDao);
// Configure resources
addSingleton(testObject);
}
@Test
public void retrieveDeliveryAsHalJson() throws Exception {
String actualResponse = configureAsClient("/supplier/delivery/1234")
.accept(HalMediaType.APPLICATION_HAL_JSON)
.get(String.class);
FixtureAsserts.assertStringMatchesJsonFixture("Supplier retrieve Delivery as HAL+JSON", actualResponse, "/fixtures/hal/delivery/expected-supplier-retrieve-delivery.json");
}
@Test
public void updateDeliveryAsHalJson() throws Exception {
// Starting condition is Supplier has {book1: 1, book2: 2}
// Ending condition is Supplier has {book1: 0, book2: 2, book3: 3}
SupplierUpdateDeliveryRequest updateDeliveryRequest = new SupplierUpdateDeliveryRequest();
// Add a few new items
updateDeliveryRequest.getDeliveryItems().add(new SupplierDeliveryItem("0316184136",3));
// Remove by setting to zero
updateDeliveryRequest.getDeliveryItems().add(new SupplierDeliveryItem("0099410672",0));
String actualResponse = configureAsClient(SupplierDeliveryResource.class)
.accept(HalMediaType.APPLICATION_HAL_JSON)
.entity(updateDeliveryRequest, MediaType.APPLICATION_JSON_TYPE)
.put(String.class);
FixtureAsserts.assertStringMatchesJsonFixture("UpdateDelivery by admin response render to HAL+JSON",actualResponse, "/fixtures/hal/delivery/expected-supplier-update-delivery.json");
}
}