package fr.mch.mdo.restaurant.web.config;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import org.mockito.Mockito;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.JstlView;
import org.springframework.web.servlet.view.UrlBasedViewResolver;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import fr.mch.mdo.logs.ILogger;
import fr.mch.mdo.restaurant.beans.dto.DinnerTableDto;
import fr.mch.mdo.restaurant.beans.dto.OrderLineDto;
import fr.mch.mdo.restaurant.exception.MdoBusinessException;
import fr.mch.mdo.restaurant.exception.MdoException;
import fr.mch.mdo.restaurant.services.business.managers.IOrdersManager;
import fr.mch.mdo.restaurant.services.business.managers.TableState;
import fr.mch.mdo.restaurant.services.logs.LoggerServiceImpl;
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "fr.mch.mdo.restaurant.controller")
public class MvcContextTestConfig extends WebMvcConfigurerAdapter {
/**
* This also enables log configuration.
*/
private ILogger logger = LoggerServiceImpl.getInstance().getLogger(MvcContextTestConfig.class.getName());
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource result = new ReloadableResourceBundleMessageSource();
result.setBasename("fr/mch/mdo/restaurant/resources/i18n/ApplicationMessages");
result.setDefaultEncoding("UTF-8");
result.setFallbackToSystemLocale(false);
logger.debug("Inject message ressource " + result.getMessage("logon.title", null, Locale.FRANCE));
return result;
}
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
return objectMapper;
}
@Bean
public ViewResolver viewResolver() {
UrlBasedViewResolver urlBasedViewResolver = new UrlBasedViewResolver();
urlBasedViewResolver.setSuffix(".jspx");
urlBasedViewResolver.setViewClass(JstlView.class);
urlBasedViewResolver.setPrefix("/WEB-INF/views/");
urlBasedViewResolver.setOrder(2);
return urlBasedViewResolver;
}
@Bean
public ClientHttpRequestFactory clientHttpRequestFactory() {
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
return factory;
}
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
restTemplate.setRequestFactory(clientHttpRequestFactory());
return restTemplate;
}
@Bean(name="OrdersManager")
public IOrdersManager ordersService() throws MdoException {
IOrdersManager result = null;
result = Mockito.mock(IOrdersManager.class);
// result = WebRestaurantBeanFactory.getInstance().getOrdersManager();
Long restaurantId = 1L;
Long userAuthenticationId = 1L;
String state = TableState.ALTERABLE.name();
List<DinnerTableDto> tables = new ArrayList<DinnerTableDto>();
DinnerTableDto table = new DinnerTableDto();
tables.add(table);
Mockito.when(result.findAllTables(Mockito.eq(restaurantId), Mockito.eq(userAuthenticationId), Mockito.eq(TableState.valueOf(state)))).thenReturn(tables);
tables = new ArrayList<DinnerTableDto>();
table = new DinnerTableDto();
tables.add(table);
table = new DinnerTableDto();
tables.add(table);
Mockito.when(result.findAllTables(Mockito.eq(restaurantId), Mockito.eq((Long) null), Mockito.eq(TableState.valueOf(state)))).thenReturn(tables);
table = new DinnerTableDto();
table.setId(1L);
table.setNumber("1");
table.setCustomersNumber(2);
List<OrderLineDto> orders = new ArrayList<OrderLineDto>();
OrderLineDto order = new OrderLineDto();
orders.add(order);
table.setOrders(orders);
Mockito.when(result.findTableHeader(Mockito.eq(restaurantId), Mockito.eq(userAuthenticationId), Mockito.eq(table.getNumber()))).thenReturn(table);
Mockito.when(result.findTableHeader(Mockito.eq(restaurantId), Mockito.eq(table.getNumber()))).thenReturn(table);
Mockito.when(result.getTableOrdersSize(Mockito.eq(table.getId()))).thenReturn(orders.size());
Mockito.when(result.createTable(Mockito.eq(restaurantId), Mockito.eq(userAuthenticationId), Mockito.eq(table.getNumber()), Mockito.eq(table.getCustomersNumber()))).thenReturn(table);
Mockito.when(result.findTable(Mockito.eq(table.getId()), Mockito.any(Locale.class))).thenReturn(table);
Mockito.doThrow(new MdoBusinessException("test")).when(result).resetTable(Mockito.eq(table.getId()), Mockito.eq(restaurantId), Mockito.eq(userAuthenticationId), Mockito.eq(table.getNumber()), Mockito.eq(table.getCustomersNumber()));
Mockito.doThrow(new MdoBusinessException("test")).when(result).updateTableCustomersNumber(Mockito.eq(table.getId()), Mockito.eq(table.getCustomersNumber()));
Mockito.doThrow(new MdoBusinessException("test")).when(result).deleteOrderLine(Mockito.eq(table.getId()));
String orderCode = "#11";
BigDecimal quantity = BigDecimal.TEN;
Long locId = 1L;
OrderLineDto orderLine = new OrderLineDto();
orderLine.setCode(orderCode);
Mockito.when(result.getOrderLine(Mockito.eq(restaurantId), Mockito.eq(quantity),
Mockito.eq(orderCode), Mockito.eq(locId))).thenReturn(orderLine);
Long orderLineSavedId = 1L;
Mockito.when(result.saveOrderLine(Mockito.any(OrderLineDto.class))).thenReturn(orderLineSavedId);
return result;
}
}