package be.swsb.fiazard.ordering.preparation; import be.swsb.fiazard.common.mongo.MongoDBRule; import be.swsb.fiazard.common.test.ClientRule; import be.swsb.fiazard.main.FiazardApp; import be.swsb.fiazard.main.FiazardConfig; import be.swsb.fiazard.util.representation.LocalDateTimeUtil; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.core.util.MultivaluedMapImpl; import io.dropwizard.testing.junit.DropwizardAppRule; import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; import java.time.LocalDateTime; import static be.swsb.fiazard.ddd.AggregateIdTestBuilder.randomId; import static org.assertj.core.api.Assertions.assertThat; public class OrderItemToBePreparedViewModelResourceIntegrationTest { public static final LocalDateTime DATE_TIME1 = toDate("2015-04-21T15:00:17.123Z"); public static final LocalDateTime DATE_TIME2 = toDate("2015-04-22T15:00:17.123Z"); public static final LocalDateTime DATE_TIME3 = toDate("2015-04-23T15:00:17.123Z"); public static final String DESCRIPTION_1 = "someDescription1"; public static final String DESCRIPTION_2 = "someDescription2"; public static final String DESCRIPTION_3 = "someDescription3"; private static final String BASE_URL = "http://localhost:8080"; private static final String PATH = "/ordering/itemsToBePrepared"; @ClassRule public static final DropwizardAppRule<FiazardConfig> appRule = new DropwizardAppRule<>(FiazardApp.class, "src/test/resources/test.yml"); @Rule public MongoDBRule mongoDBRule = MongoDBRule.create(); @Rule public ClientRule clientRule = new ClientRule(); @Test public void findWithoutQueryParams_ReturnsOrderItemsAsJSON() throws Exception { OrderItemToBePreparedViewModel item1 = orderItemToBePrepared("1", DATE_TIME1, DESCRIPTION_1); OrderItemToBePreparedViewModel item2 = orderItemToBePrepared("2", DATE_TIME2, DESCRIPTION_2); OrderItemToBePreparedViewModel item3 = orderItemToBePrepared("3", DATE_TIME3, DESCRIPTION_3); mongoDBRule.persistAll(item1, item2, item3); OrderItemToBePreparedViewModel[] foundOrderItems = queryForOrderItems(noParams()); assertThat(foundOrderItems).hasSize(3); } @Test public void findWithOnlyDateFromQueryParam_FiltersOrderItems() throws Exception { OrderItemToBePreparedViewModel item1 = orderItemToBePrepared("1", DATE_TIME1, DESCRIPTION_1); OrderItemToBePreparedViewModel item2 = orderItemToBePrepared("2", DATE_TIME2, DESCRIPTION_2); OrderItemToBePreparedViewModel item3 = orderItemToBePrepared("3", DATE_TIME3, DESCRIPTION_3); mongoDBRule.persistAll(item1, item2, item3); OrderItemToBePreparedViewModel[] foundOrderItems = queryForOrderItems(queryParams(DATE_TIME1.plusSeconds(1), null)); assertThat(foundOrderItems).hasSize(2); } @Test public void findWithOnlyDateUntilQueryParam_FiltersOrderItems() throws Exception { OrderItemToBePreparedViewModel item1 = orderItemToBePrepared("1", DATE_TIME1, DESCRIPTION_1); OrderItemToBePreparedViewModel item2 = orderItemToBePrepared("2", DATE_TIME2, DESCRIPTION_2); OrderItemToBePreparedViewModel item3 = orderItemToBePrepared("3", DATE_TIME3, DESCRIPTION_3); mongoDBRule.persistAll(item1, item2, item3); OrderItemToBePreparedViewModel[] foundOrderItems = queryForOrderItems(queryParams(null, DATE_TIME3.minusSeconds(1))); assertThat(foundOrderItems).hasSize(2); } private OrderItemToBePreparedViewModel[] queryForOrderItems(MultivaluedMap<String, String> params) { ClientResponse clientResponse = clientRule.getClient() .resource(BASE_URL) .path(PATH) .queryParams(params) .type(MediaType.APPLICATION_JSON_TYPE) .accept(MediaType.APPLICATION_JSON_TYPE) .get(ClientResponse.class); return clientResponse.getEntity(OrderItemToBePreparedViewModel[].class); } private OrderItemToBePreparedViewModel orderItemToBePrepared(String id, LocalDateTime dateTime, String description) { return new OrderItemToBePreparedViewModel(id, randomId(), dateTime, description); } private static LocalDateTime toDate(String dateTime) { return LocalDateTime.parse(dateTime, LocalDateTimeUtil.FORMATTER); } private MultivaluedMap<String, String> queryParams(LocalDateTime dateFrom, LocalDateTime dateUntil) { MultivaluedMapImpl result = new MultivaluedMapImpl(); addParamIfNotNull(result, "dateFrom", dateFrom); addParamIfNotNull(result, "dateUntil", dateUntil); return result; } private void addParamIfNotNull(MultivaluedMapImpl result, String key, LocalDateTime value) { if (value==null) { return; } result.putSingle(key, LocalDateTimeUtil.toString(value)); } private MultivaluedMap<String, String> noParams() { return new MultivaluedMapImpl(); } }