package org.multibit.mbm.resources.delivery; import com.google.common.base.Optional; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import org.junit.Test; import org.multibit.mbm.api.hal.HalMediaType; import org.multibit.mbm.api.request.delivery.AdminUpdateDeliveryRequest; import org.multibit.mbm.api.request.delivery.SupplierDeliveryItem; 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.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 AdminDeliveryResourceTest extends BaseJerseyHmacResourceTest { private final DeliveryDao deliveryDao=mock(DeliveryDao.class); private final ItemDao itemDao=mock(ItemDao.class); private final AdminDeliveryResource testObject=new AdminDeliveryResource(); @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 Delivery with Items Item book1 = DatabaseLoader.buildBookItemCryptonomicon(); book1.setId(1L); Item book2 = DatabaseLoader.buildBookItemQuantumThief(); book2.setId(2L); Delivery steveDelivery1 = DeliveryBuilder .newInstance() .withSupplier(steveUser.getSupplier()) .withDeliveryItem(book1, 1) .withDeliveryItem(book2,2) .build(); steveDelivery1.setId(1L); steveUser.getSupplier().getDeliveries().add(steveDelivery1); // Configure Sam Supplier User samUser = DatabaseLoader.buildSamSupplier(supplierRole); samUser.setId(1L); samUser.getSupplier().setId(1L); // Configure Sam's Delivery with Items Item book3 = DatabaseLoader.buildBookItemCompleteWorks(); book3.setId(3L); Item book4 = DatabaseLoader.buildBookItemPlumbing(); book4.setId(4L); Delivery samDelivery1 = DeliveryBuilder .newInstance() .withSupplier(samUser.getSupplier()) .withDeliveryItem(book3, 3) .withDeliveryItem(book4,4) .build(); samDelivery1.setId(1L); samUser.getSupplier().getDeliveries().add(samDelivery1); // Create some mock results Set<Delivery> steveDeliveries = Sets.newHashSet(steveUser.getSupplier().getDeliveries()); Set<Delivery> samDeliveries = Sets.newHashSet(samUser.getSupplier().getDeliveries()); // Configure Delivery DAO when(deliveryDao.getById(steveDelivery1.getId())).thenReturn(Optional.of(steveDelivery1)); when(deliveryDao.getById(samDelivery1.getId())).thenReturn(Optional.of(samDelivery1)); when(deliveryDao.getAllByPage(1, 0)).thenReturn(Lists.newLinkedList(steveDeliveries)); when(deliveryDao.getAllByPage(1, 1)).thenReturn(Lists.newLinkedList(samDeliveries)); when(deliveryDao.saveOrUpdate(steveDelivery1)).thenReturn(steveDelivery1); when(deliveryDao.saveOrUpdate(samDelivery1)).thenReturn(samDelivery1); // 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 adminRetrieveDeliverysAsHalJson() throws Exception { String actualResponse = configureAsClient(AdminDeliveryResource.class) .queryParam("ps","1") .queryParam("pn", "0") .accept(HalMediaType.APPLICATION_HAL_JSON) .get(String.class); FixtureAsserts.assertStringMatchesJsonFixture("Delivery list 1 can be retrieved as HAL+JSON", actualResponse, "/fixtures/hal/delivery/expected-admin-retrieve-deliveries-page-1.json"); actualResponse = configureAsClient(AdminDeliveryResource.class) .queryParam("ps","1") .queryParam("pn", "1") .accept(HalMediaType.APPLICATION_HAL_JSON) .get(String.class); FixtureAsserts.assertStringMatchesJsonFixture("Delivery list 2 can be retrieved as HAL+JSON", actualResponse, "/fixtures/hal/delivery/expected-admin-retrieve-deliveries-page-2.json"); } @Test public void adminUpdateDeliveryAsHalJson() throws Exception { // Starting condition is Alice has {book1: 1, book2: 2} // Ending condition is Alice has {book1: 0, book2: 2, book3: 3} AdminUpdateDeliveryRequest updateDeliveryRequest = new AdminUpdateDeliveryRequest(); updateDeliveryRequest.setId(1L); // 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("/admin/deliveries/1") .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-admin-update-delivery.json"); } }