package fr.mch.mdo.restaurant.controller;
import java.math.BigDecimal;
import junit.framework.Assert;
import org.junit.Test;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import fr.mch.mdo.restaurant.beans.dto.AcknowledgmentMessage;
import fr.mch.mdo.restaurant.beans.dto.DinnerTableDto;
import fr.mch.mdo.restaurant.beans.dto.OrderLineDto;
import fr.mch.mdo.restaurant.services.business.managers.TableState;
import fr.mch.mdo.restaurant.ui.forms.FindOrderLineForm;
import fr.mch.mdo.restaurant.ui.forms.ResetTableForm;
import fr.mch.mdo.restaurant.ui.forms.SaveOrderLineForm;
import fr.mch.mdo.restaurant.ui.forms.TableHeaderForm;
import fr.mch.mdo.restaurant.web.AbstractControllerTest;
public final class OrdersControllerTest extends AbstractControllerTest
{
public static final String context = SERVER_URL + OrdersController.ORDERS_CONTROLLER;
@Test
public void tables() {
String state = TableState.ALTERABLE.name();
Long restaurantId = 1L;
Long userAuthenticationId = 1L;
StringBuilder sb = new StringBuilder(context).append(OrdersController.RESTAURANT_ID_TABLES_STATE);
DinnerTableDto[] dinnerTables = restTemplate.getForObject(sb.toString(), DinnerTableDto[].class, restaurantId, state);
Assert.assertNotNull("dinnerTables", dinnerTables);
Assert.assertTrue("dinnerTables size", dinnerTables.length == 2);
sb = new StringBuilder(context).append(OrdersController.RESTAURANT_ID_USER_AUTHENTICATION_ID_TABLES_STATE);
dinnerTables = restTemplate.getForObject(sb.toString(), DinnerTableDto[].class, userAuthenticationId, restaurantId, state);
Assert.assertNotNull(dinnerTables);
Assert.assertNotNull("dinnerTables", dinnerTables);
Assert.assertTrue("dinnerTables size", dinnerTables.length == 1);
state = TableState.CASHED.name();
sb = new StringBuilder(context).append(OrdersController.RESTAURANT_ID_USER_AUTHENTICATION_ID_TABLES_STATE);
dinnerTables = restTemplate.getForObject(sb.toString(), DinnerTableDto[].class, userAuthenticationId, restaurantId, state);
Assert.assertNotNull(dinnerTables);
Assert.assertTrue("dinnerTables size", dinnerTables.length == 0);
}
@Test
public void deleteTable() {
Long tableId = 1L;
StringBuilder sb = new StringBuilder(context).append(OrdersController.DELETE_TABLE_ID);
// Do not use restTemplate.delete method because the service returns nothing
ResponseEntity<AcknowledgmentMessage> response = restTemplate.exchange(sb.toString(), HttpMethod.DELETE, null, AcknowledgmentMessage.class, tableId);
Assert.assertNotNull("Ack delete table", response.getBody());
Assert.assertNotNull("Ack delete table", response.getBody().getType());
Assert.assertTrue("Ack delete table", AcknowledgmentMessage.Type.SUCCESS.equals(response.getBody().getType()));
}
@Test
public void tableHeader() {
Long restaurantId = 1L;
Long userAuthenticationId = 1L;
String tableNumber = "1";
this.tableHeader(restaurantId, null, tableNumber);
this.tableHeader(restaurantId, userAuthenticationId, tableNumber);
}
private DinnerTableDto tableHeader(Long restaurantId, Long userAuthenticationId, String tableNumber) {
ResponseEntity<DinnerTableDto> response = null;
if (userAuthenticationId == null) {
StringBuilder sb = new StringBuilder(context).append(OrdersController.RESTAURANT_ID_TABLE_HEADER_BY_NUMBER_NUMBER);
response = restTemplate.getForEntity(sb.toString(), DinnerTableDto.class, restaurantId, tableNumber);
} else {
StringBuilder sb = new StringBuilder(context).append(OrdersController.RESTAURANT_ID_USER_AUTHENTICATION_ID_TABLE_HEADER_BY_NUMBER_NUMBER);
response = restTemplate.getForEntity(sb.toString(), DinnerTableDto.class, restaurantId, userAuthenticationId, tableNumber);
}
Assert.assertNotNull(response.getBody());
return response.getBody();
}
@Test
public void createTable() {
Long restaurantId = 1L;
Long userAuthenticationId = 1L;
TableHeaderForm form = new TableHeaderForm();
form.setNumber("1");
form.setCustomersNumber(2);
Assert.assertNotNull(this.createTable(restaurantId, userAuthenticationId, form));
}
private DinnerTableDto createTable(Long restaurantId, Long userAuthenticationId, TableHeaderForm table) {
StringBuilder sb = new StringBuilder(context).append(OrdersController.CREATE_TABLE_RESTAURANT_ID_USER_AUTHENTICATION_ID);
ResponseEntity<DinnerTableDto> response = restTemplate.postForEntity(sb.toString(), table, DinnerTableDto.class, restaurantId, userAuthenticationId);
return response.getBody();
}
@Test
public void findTable() {
Long id = 1L;
DinnerTableDto table = this.findTable(id);
Assert.assertNotNull(table);
}
private DinnerTableDto findTable(Long id) {
StringBuilder sb = new StringBuilder(context).append(OrdersController.FIND_TABLE_ID);
ResponseEntity<DinnerTableDto> response = restTemplate.getForEntity(sb.toString(), DinnerTableDto.class, id);
return response.getBody();
}
@Test
public void resetTable() {
Long dinnerTableId = 1L;
AcknowledgmentMessage message = this.resetTable(dinnerTableId);
Assert.assertNotNull(message);
Assert.assertTrue(AcknowledgmentMessage.Type.ERROR.equals(message.getType()));
}
private AcknowledgmentMessage resetTable(Long dinnerTableId) {
StringBuilder sb = new StringBuilder(context).append(OrdersController.RESET_TABLE_DINNER_TABLE_ID);
ResetTableForm form = new ResetTableForm();
form.setCustomersNumber(2);
form.setNumber("1");
form.setRestaurantId(1L);
form.setUserAuthenticationId(1L);
ResponseEntity<AcknowledgmentMessage> response = restTemplate.postForEntity(sb.toString(), form, AcknowledgmentMessage.class, dinnerTableId);
return response.getBody();
}
@Test
public void updateTableCustomersNumber() {
Long id = 1L;
Integer customersNumber = 2;
AcknowledgmentMessage message = this.updateTableCustomersNumber(id, customersNumber);
Assert.assertNotNull(message);
Assert.assertTrue(AcknowledgmentMessage.Type.ERROR.equals(message.getType()));
}
private AcknowledgmentMessage updateTableCustomersNumber(Long id, Integer customersNumber) {
StringBuilder sb = new StringBuilder(context).append(OrdersController.UPDATE_TABLE_ID_CUSTOMERS_NUMBER_CUSTOMERS_NUMBER);
ResponseEntity<AcknowledgmentMessage> response = restTemplate.postForEntity(sb.toString(), null, AcknowledgmentMessage.class, id, customersNumber);
return response.getBody();
}
@Test
public void tableOrdersSize() {
Long id = 1L;
Integer size = this.tableOrdersSize(id);
Assert.assertNotNull(size);
Assert.assertTrue("Order size", size > 0);
}
private Integer tableOrdersSize(Long id) {
StringBuilder sb = new StringBuilder(context).append(OrdersController.TABLE_ORDERS_SIZE_ID);
ResponseEntity<Integer> response = restTemplate.getForEntity(sb.toString(), Integer.class, id);
return response.getBody();
}
@Test
public void saveOrderLine() {
SaveOrderLineForm form = new SaveOrderLineForm();
OrderLineDto orderLine = new OrderLineDto();
form.setOrderLine(orderLine);
StringBuilder sb = new StringBuilder(context).append(OrdersController.SAVE_ORDER_LINE);
AcknowledgmentMessage ack = restTemplate.postForObject(sb.toString(), form, AcknowledgmentMessage.class);
Assert.assertNotNull(ack);
Assert.assertNotNull(ack.getAttachment());
}
@Test
public void deleteOrderLine() {
Long orderLineId = 1L;
StringBuilder sb = new StringBuilder(context).append(OrdersController.DELETE_ORDER_LINE_ID);
// Do not use delete method because the service returns nothing
ResponseEntity<AcknowledgmentMessage> response = restTemplate.exchange(sb.toString(), HttpMethod.DELETE, null, AcknowledgmentMessage.class, orderLineId);
Assert.assertNotNull(response.getBody());
Assert.assertTrue(AcknowledgmentMessage.Type.ERROR.equals(response.getBody().getType()));
}
@Test
public void findOrderLine() {
Long restaurantId = 1L;
BigDecimal quantity = BigDecimal.TEN;
String orderCode = "#11";
Long locId = 1L;
StringBuilder sb = new StringBuilder(context).append(OrdersController.RESTAURANT_ID_FIND_ORDER_LINE_CODE_LOC_ID);
FindOrderLineForm form = new FindOrderLineForm();
form.setQuantity(quantity);
form.setOrderCode(orderCode);
OrderLineDto orderLine = restTemplate.postForObject(sb.toString(), form, OrderLineDto.class, restaurantId, locId);
Assert.assertNotNull(orderLine);
Assert.assertEquals("OrderLineDto orderCode", orderCode, orderLine.getCode());
}
@Test
public void tablesView() {
Long restaurantId = 1L;
StringBuilder sb = new StringBuilder(context).append(OrdersController.RESTAURANT_ID_TABLES_STATE_VIEW);
ResponseEntity<String> response = restTemplate.getForEntity(sb.toString(), String.class, restaurantId, TableState.ALTERABLE.name());
Assert.assertNotNull(response.getBody());
}
}