/**
* ***************************************************************************
* Copyright (c) 2010 Qcadoo Limited
* Project: Qcadoo MES
* Version: 1.4
*
* This file is part of Qcadoo.
*
* Qcadoo is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation; either version 3 of the License,
* or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* ***************************************************************************
*/
package com.qcadoo.mes.productionCountingWithCosts;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.util.Locale;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.springframework.test.util.ReflectionTestUtils;
import com.qcadoo.mes.costCalculation.CostCalculationService;
import com.qcadoo.mes.orders.constants.OrderFields;
import com.qcadoo.mes.productionCounting.ProductionBalanceService;
import com.qcadoo.mes.productionCounting.constants.ProductionBalanceFields;
import com.qcadoo.mes.productionCountingWithCosts.constants.ProductionBalanceFieldsPCWC;
import com.qcadoo.mes.productionCountingWithCosts.pdf.ProductionBalanceWithCostsPdfService;
import com.qcadoo.model.api.DataDefinition;
import com.qcadoo.model.api.Entity;
import com.qcadoo.model.api.NumberService;
import com.qcadoo.model.api.file.FileService;
public class GenerateProductionBalanceWithCostsTest {
private GenerateProductionBalanceWithCosts generateProductionBalanceWithCosts;
@Mock
private CostCalculationService costCalculationService;
@Mock
private NumberService numberService;
@Mock
private FileService fileService;
@Mock
private ProductionBalanceService productionBalanceService;
@Mock
private ProductionBalanceWithCostsPdfService productionBalanceWithCostsPdfService;
@Mock
private Entity productionBalance, order, technology, productionLine;
@Mock
private DataDefinition productionBalanceDD;
@Before
public void init() {
MockitoAnnotations.initMocks(this);
generateProductionBalanceWithCosts = new GenerateProductionBalanceWithCosts();
ReflectionTestUtils.setField(generateProductionBalanceWithCosts, "costCalculationService", costCalculationService);
ReflectionTestUtils.setField(generateProductionBalanceWithCosts, "numberService", numberService);
ReflectionTestUtils.setField(generateProductionBalanceWithCosts, "fileService", fileService);
ReflectionTestUtils.setField(generateProductionBalanceWithCosts, "productionBalanceService", productionBalanceService);
ReflectionTestUtils.setField(generateProductionBalanceWithCosts, "productionBalanceWithCostsPdfService",
productionBalanceWithCostsPdfService);
given(numberService.getMathContext()).willReturn(MathContext.DECIMAL64);
given(numberService.setScale(Mockito.any(BigDecimal.class))).willAnswer(new Answer<BigDecimal>() {
@Override
public BigDecimal answer(InvocationOnMock invocation) throws Throwable {
Object[] args = invocation.getArguments();
BigDecimal number = (BigDecimal) args[0];
return number.setScale(5, RoundingMode.HALF_EVEN);
}
});
given(productionBalance.getBelongsToField(ProductionBalanceFields.ORDER)).willReturn(order);
given(order.getBelongsToField(OrderFields.TECHNOLOGY)).willReturn(technology);
given(productionBalance.getDataDefinition()).willReturn(productionBalanceDD);
}
@Test
public void shouldSetQuantityTechnologyProductionLineAndTechnicalProductionCostPerUnitFieldsAndSaveEntity() {
// given
BigDecimal quantity = BigDecimal.TEN;
BigDecimal doneQuantity = BigDecimal.TEN;
given(productionBalance.getDecimalField(ProductionBalanceFieldsPCWC.TOTAL_TECHNICAL_PRODUCTION_COSTS)).willReturn(
BigDecimal.valueOf(100));
given(order.getDecimalField(OrderFields.PLANNED_QUANTITY)).willReturn(quantity);
given(order.getDecimalField(OrderFields.DONE_QUANTITY)).willReturn(doneQuantity);
given(order.getBelongsToField(OrderFields.PRODUCTION_LINE)).willReturn(productionLine);
// when
generateProductionBalanceWithCosts.doTheCostsPart(productionBalance);
// then
verify(productionBalance).setField(ProductionBalanceFieldsPCWC.QUANTITY, quantity);
verify(productionBalance).setField(ProductionBalanceFieldsPCWC.TECHNOLOGY, technology);
verify(productionBalance).setField(ProductionBalanceFieldsPCWC.PRODUCTION_LINE, productionLine);
verify(productionBalance).setField(ProductionBalanceFieldsPCWC.TOTAL_TECHNICAL_PRODUCTION_COST_PER_UNIT,
BigDecimal.TEN.setScale(5, RoundingMode.HALF_EVEN));
}
@Test
public void shouldGenerateReportCorrectly() throws Exception {
// given
Locale locale = Locale.getDefault();
String localePrefix = "productionCounting.productionBalanceWithCosts.report.fileName";
Entity productionBalanceWithFileName = mock(Entity.class);
given(productionBalanceWithFileName.getDataDefinition()).willReturn(productionBalanceDD);
given(fileService.updateReportFileName(productionBalance, ProductionBalanceFields.DATE, localePrefix)).willReturn(
productionBalanceWithFileName);
// when
generateProductionBalanceWithCosts.generateBalanceWithCostsReport(productionBalance);
// then
verify(productionBalanceWithCostsPdfService).generateDocument(productionBalanceWithFileName, locale, localePrefix);
verify(productionBalanceWithFileName).setField(ProductionBalanceFieldsPCWC.GENERATED_WITH_COSTS, Boolean.TRUE);
verify(productionBalanceDD).save(productionBalanceWithFileName);
}
}