/** * *************************************************************************** * 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.materialFlowResources; import static com.qcadoo.mes.materialFlow.constants.TransferFields.LOCATION_FROM; import static com.qcadoo.mes.materialFlow.constants.TransferFields.LOCATION_TO; import static com.qcadoo.mes.materialFlow.constants.TransferFields.PRODUCT; import static com.qcadoo.mes.materialFlow.constants.TransferFields.QUANTITY; import static com.qcadoo.mes.materialFlow.constants.TransferFields.TYPE; import static com.qcadoo.mes.materialFlow.constants.TransferType.CONSUMPTION; import static com.qcadoo.mes.materialFlow.constants.TransferType.PRODUCTION; import static com.qcadoo.mes.materialFlow.constants.TransferType.TRANSPORT; import static com.qcadoo.mes.materialFlowResources.constants.ResourceFields.TIME; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.springframework.test.util.ReflectionTestUtils.setField; import java.math.BigDecimal; import java.math.MathContext; import java.util.Date; import java.util.Iterator; import java.util.List; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import com.qcadoo.mes.materialFlowResources.constants.MaterialFlowResourcesConstants; import com.qcadoo.model.api.DataDefinition; import com.qcadoo.model.api.DataDefinitionService; import com.qcadoo.model.api.Entity; import com.qcadoo.model.api.NumberService; import com.qcadoo.model.api.search.SearchCriteriaBuilder; import com.qcadoo.model.api.search.SearchCriterion; import com.qcadoo.model.api.search.SearchOrder; import com.qcadoo.model.api.search.SearchRestrictions; import com.qcadoo.model.api.search.SearchResult; // TODO lupo fix problem with test @Ignore @RunWith(PowerMockRunner.class) @PrepareForTest(SearchRestrictions.class) public class MaterialFlowResourceServiceTest { private MaterialFlowResourcesService materialFlowResourceService; private static final long L_ID = 1L; @Mock private DataDefinitionService dataDefinitionService; @Mock private NumberService numberService; @Mock private DataDefinition resourceDD; @Mock private Entity resource, resource1, resource2, location, product, transfer, locationFrom, locationTo; @Mock private SearchCriteriaBuilder searchCriteriaBuilder; @Mock private SearchResult searchResult; private BigDecimal quantity, resourceQuantity; @Mock private Date time; @Mock private List<Entity> resources; @Mock private Iterator<Entity> resourcesIterator; @Before public void init() { MockitoAnnotations.initMocks(this); materialFlowResourceService = new MaterialFlowResourcesServiceImpl(); setField(materialFlowResourceService, "dataDefinitionService", dataDefinitionService); setField(materialFlowResourceService, "numberService", numberService); PowerMockito.mockStatic(SearchRestrictions.class); } @Test public void shouldReturnFalseWhenAreResourcesSufficientIfResourcesAreNull() { // given given( dataDefinitionService.get(MaterialFlowResourcesConstants.PLUGIN_IDENTIFIER, MaterialFlowResourcesConstants.MODEL_RESOURCE)).willReturn(resourceDD); given(resourceDD.find()).willReturn(searchCriteriaBuilder); given(searchCriteriaBuilder.add(Mockito.any(SearchCriterion.class))).willReturn(searchCriteriaBuilder); given(searchCriteriaBuilder.addOrder(Mockito.any(SearchOrder.class))).willReturn(searchCriteriaBuilder); given(searchCriteriaBuilder.list()).willReturn(searchResult); given(searchResult.getEntities()).willReturn(null); // when boolean result = materialFlowResourceService.areResourcesSufficient(location, product, quantity); // then assertFalse(result); } @Test public void shouldReturnFalseWhenAreResourcesSufficientIfResourcesArentNull() { // given quantity = BigDecimal.ONE; resourceQuantity = BigDecimal.ZERO; given( dataDefinitionService.get(MaterialFlowResourcesConstants.PLUGIN_IDENTIFIER, MaterialFlowResourcesConstants.MODEL_RESOURCE)).willReturn(resourceDD); given(resourceDD.find()).willReturn(searchCriteriaBuilder); given(searchCriteriaBuilder.add(Mockito.any(SearchCriterion.class))).willReturn(searchCriteriaBuilder); given(searchCriteriaBuilder.addOrder(Mockito.any(SearchOrder.class))).willReturn(searchCriteriaBuilder); given(searchCriteriaBuilder.list()).willReturn(searchResult); given(searchResult.getEntities()).willReturn(resources); given(resourcesIterator.hasNext()).willReturn(true, true, false); given(resourcesIterator.next()).willReturn(resource1, resource2); given(resources.iterator()).willReturn(resourcesIterator); given(resource1.getDecimalField(QUANTITY)).willReturn(resourceQuantity); given(resource2.getDecimalField(QUANTITY)).willReturn(resourceQuantity); given(numberService.getMathContext()).willReturn(MathContext.DECIMAL64); // when boolean result = materialFlowResourceService.areResourcesSufficient(location, product, quantity); // then assertFalse(result); } @Test public void shouldReturnTrueWhenAreResourcesSufficientIfResourcesArentNull() { // given quantity = BigDecimal.ONE; resourceQuantity = BigDecimal.ONE; given( dataDefinitionService.get(MaterialFlowResourcesConstants.PLUGIN_IDENTIFIER, MaterialFlowResourcesConstants.MODEL_RESOURCE)).willReturn(resourceDD); given(resourceDD.find()).willReturn(searchCriteriaBuilder); given(searchCriteriaBuilder.add(Mockito.any(SearchCriterion.class))).willReturn(searchCriteriaBuilder); given(searchCriteriaBuilder.addOrder(Mockito.any(SearchOrder.class))).willReturn(searchCriteriaBuilder); given(searchCriteriaBuilder.list()).willReturn(searchResult); given(searchResult.getEntities()).willReturn(resources); given(resourcesIterator.hasNext()).willReturn(true, true, false); given(resourcesIterator.next()).willReturn(resource1, resource2); given(resources.iterator()).willReturn(resourcesIterator); given(resource1.getDecimalField(QUANTITY)).willReturn(resourceQuantity); given(resource2.getDecimalField(QUANTITY)).willReturn(resourceQuantity); given(numberService.getMathContext()).willReturn(MathContext.DECIMAL64); // when boolean result = materialFlowResourceService.areResourcesSufficient(location, product, quantity); // then assertTrue(result); } @Test public void shouldReturnWhenManageResourcesAndTranserIsNull() { // given // when materialFlowResourceService.manageResources(null); // then verify(resource, never()).setField(Mockito.anyString(), Mockito.any()); verify(resourceDD, never()).save(Mockito.any(Entity.class)); } @Test public void shouldAddResoruceWhenManageResourcesAndTranserIsntNullAndTypeIsProduction() { // given quantity = BigDecimal.ONE; given(transfer.getStringField(TYPE)).willReturn(PRODUCTION.getStringValue()); given(transfer.getBelongsToField(LOCATION_FROM)).willReturn(locationFrom); given(transfer.getBelongsToField(LOCATION_TO)).willReturn(locationTo); given(transfer.getBelongsToField(PRODUCT)).willReturn(product); given(transfer.getDecimalField(QUANTITY)).willReturn(quantity); given(transfer.getField(TIME)).willReturn(time); given( dataDefinitionService.get(MaterialFlowResourcesConstants.PLUGIN_IDENTIFIER, MaterialFlowResourcesConstants.MODEL_RESOURCE)).willReturn(resourceDD); given(resourceDD.create()).willReturn(resource); given(resource.getDataDefinition()).willReturn(resourceDD); // when materialFlowResourceService.manageResources(transfer); // then verify(resource, times(4)).setField(Mockito.anyString(), Mockito.any()); verify(resourceDD).save(Mockito.any(Entity.class)); } @Test public void shouldntUpdateResoruceWhenManageResourcesAndTranserIsntNullAndTypeIsConsumptionAndResourcesAreNull() { // given quantity = BigDecimal.ONE; given(transfer.getStringField(TYPE)).willReturn(CONSUMPTION.getStringValue()); given(transfer.getBelongsToField(LOCATION_FROM)).willReturn(locationFrom); given(transfer.getBelongsToField(LOCATION_TO)).willReturn(locationTo); given(transfer.getBelongsToField(PRODUCT)).willReturn(product); given(transfer.getDecimalField(QUANTITY)).willReturn(quantity); given(transfer.getField(TIME)).willReturn(time); given( dataDefinitionService.get(MaterialFlowResourcesConstants.PLUGIN_IDENTIFIER, MaterialFlowResourcesConstants.MODEL_RESOURCE)).willReturn(resourceDD); given(resourceDD.find()).willReturn(searchCriteriaBuilder); given(searchCriteriaBuilder.add(Mockito.any(SearchCriterion.class))).willReturn(searchCriteriaBuilder); given(searchCriteriaBuilder.addOrder(Mockito.any(SearchOrder.class))).willReturn(searchCriteriaBuilder); given(searchCriteriaBuilder.list()).willReturn(searchResult); given(searchResult.getEntities()).willReturn(null); // when materialFlowResourceService.manageResources(transfer); // then verify(resourceDD, never()).save(Mockito.any(Entity.class)); verify(resourceDD, never()).delete(Mockito.anyLong()); } @Test public void shouldUpdateResoruceAndDeleteResourceWhenManageResourcesAndTranserIsntNullAndTypeIsConsumptionAndResourcesArentNull() { // given quantity = BigDecimal.ONE; resourceQuantity = BigDecimal.ONE; given(transfer.getStringField(TYPE)).willReturn(CONSUMPTION.getStringValue()); given(transfer.getBelongsToField(LOCATION_FROM)).willReturn(locationFrom); given(transfer.getBelongsToField(LOCATION_TO)).willReturn(locationTo); given(transfer.getBelongsToField(PRODUCT)).willReturn(product); given(transfer.getDecimalField(QUANTITY)).willReturn(quantity); given(transfer.getField(TIME)).willReturn(time); given( dataDefinitionService.get(MaterialFlowResourcesConstants.PLUGIN_IDENTIFIER, MaterialFlowResourcesConstants.MODEL_RESOURCE)).willReturn(resourceDD); given(resourceDD.find()).willReturn(searchCriteriaBuilder); given(searchCriteriaBuilder.add(Mockito.any(SearchCriterion.class))).willReturn(searchCriteriaBuilder); given(searchCriteriaBuilder.addOrder(Mockito.any(SearchOrder.class))).willReturn(searchCriteriaBuilder); given(searchCriteriaBuilder.list()).willReturn(searchResult); given(searchResult.getEntities()).willReturn(resources); given(resourcesIterator.hasNext()).willReturn(true, true, false); given(resourcesIterator.next()).willReturn(resource1, resource2); given(resources.iterator()).willReturn(resourcesIterator); given(resource1.getDecimalField(QUANTITY)).willReturn(resourceQuantity); given(resource2.getDecimalField(QUANTITY)).willReturn(resourceQuantity); given(numberService.getMathContext()).willReturn(MathContext.DECIMAL64); given(resource1.getDataDefinition()).willReturn(resourceDD); given(resource1.getId()).willReturn(L_ID); // when materialFlowResourceService.manageResources(transfer); // then verify(resourceDD, never()).save(Mockito.any(Entity.class)); verify(resourceDD).delete(Mockito.anyLong()); } @Test public void shouldUpdateResoruceWhenManageResourcesAndTranserIsntNullAndTypeIsConsumptionAndResourcesArentNull() { // given quantity = BigDecimal.ONE; resourceQuantity = BigDecimal.TEN; given(transfer.getStringField(TYPE)).willReturn(CONSUMPTION.getStringValue()); given(transfer.getBelongsToField(LOCATION_FROM)).willReturn(locationFrom); given(transfer.getBelongsToField(LOCATION_TO)).willReturn(locationTo); given(transfer.getBelongsToField(PRODUCT)).willReturn(product); given(transfer.getDecimalField(QUANTITY)).willReturn(quantity); given(transfer.getField(TIME)).willReturn(time); given( dataDefinitionService.get(MaterialFlowResourcesConstants.PLUGIN_IDENTIFIER, MaterialFlowResourcesConstants.MODEL_RESOURCE)).willReturn(resourceDD); given(resourceDD.find()).willReturn(searchCriteriaBuilder); given(searchCriteriaBuilder.add(Mockito.any(SearchCriterion.class))).willReturn(searchCriteriaBuilder); given(searchCriteriaBuilder.addOrder(Mockito.any(SearchOrder.class))).willReturn(searchCriteriaBuilder); given(searchCriteriaBuilder.list()).willReturn(searchResult); given(searchResult.getEntities()).willReturn(resources); given(resourcesIterator.hasNext()).willReturn(true, true, false); given(resourcesIterator.next()).willReturn(resource1, resource2); given(resources.iterator()).willReturn(resourcesIterator); given(resource1.getDecimalField(QUANTITY)).willReturn(resourceQuantity); given(resource2.getDecimalField(QUANTITY)).willReturn(resourceQuantity); given(numberService.getMathContext()).willReturn(MathContext.DECIMAL64); given(resource1.getDataDefinition()).willReturn(resourceDD); // when materialFlowResourceService.manageResources(transfer); // then verify(resourceDD).save(Mockito.any(Entity.class)); verify(resourceDD, never()).delete(Mockito.anyLong()); } @Test public void shouldntUpdateResourceAndShouldAddResourceWhenManageResourcesAndTranserIsntNullAndTypeIsTransportAndResourcesAreNull() { // given quantity = BigDecimal.ONE; given(transfer.getStringField(TYPE)).willReturn(TRANSPORT.getStringValue()); given(transfer.getBelongsToField(LOCATION_FROM)).willReturn(locationFrom); given(transfer.getBelongsToField(LOCATION_TO)).willReturn(locationTo); given(transfer.getBelongsToField(PRODUCT)).willReturn(product); given(transfer.getDecimalField(QUANTITY)).willReturn(quantity); given(transfer.getField(TIME)).willReturn(time); given( dataDefinitionService.get(MaterialFlowResourcesConstants.PLUGIN_IDENTIFIER, MaterialFlowResourcesConstants.MODEL_RESOURCE)).willReturn(resourceDD); given(resourceDD.find()).willReturn(searchCriteriaBuilder); given(searchCriteriaBuilder.add(Mockito.any(SearchCriterion.class))).willReturn(searchCriteriaBuilder); given(searchCriteriaBuilder.addOrder(Mockito.any(SearchOrder.class))).willReturn(searchCriteriaBuilder); given(searchCriteriaBuilder.list()).willReturn(searchResult); given(searchResult.getEntities()).willReturn(null); given(resourceDD.create()).willReturn(resource); given(resource.getDataDefinition()).willReturn(resourceDD); // when materialFlowResourceService.manageResources(transfer); // then verify(resourceDD).save(Mockito.any(Entity.class)); verify(resource, times(4)).setField(Mockito.anyString(), Mockito.any()); verify(resourceDD, never()).delete(Mockito.anyLong()); } @Test public void shouldUpdateResoruceAndDeleteResourceAndAddResoruceWhenManageResourcesAndTranserIsntNullAndTypeIsTransportAndResourcesArentNull() { // given quantity = BigDecimal.ONE; resourceQuantity = BigDecimal.ONE; given(transfer.getStringField(TYPE)).willReturn(TRANSPORT.getStringValue()); given(transfer.getBelongsToField(LOCATION_FROM)).willReturn(locationFrom); given(transfer.getBelongsToField(LOCATION_TO)).willReturn(locationTo); given(transfer.getBelongsToField(PRODUCT)).willReturn(product); given(transfer.getDecimalField(QUANTITY)).willReturn(quantity); given(transfer.getField(TIME)).willReturn(time); given( dataDefinitionService.get(MaterialFlowResourcesConstants.PLUGIN_IDENTIFIER, MaterialFlowResourcesConstants.MODEL_RESOURCE)).willReturn(resourceDD); given(resourceDD.find()).willReturn(searchCriteriaBuilder); given(searchCriteriaBuilder.add(Mockito.any(SearchCriterion.class))).willReturn(searchCriteriaBuilder); given(searchCriteriaBuilder.addOrder(Mockito.any(SearchOrder.class))).willReturn(searchCriteriaBuilder); given(searchCriteriaBuilder.list()).willReturn(searchResult); given(searchResult.getEntities()).willReturn(resources); given(resourcesIterator.hasNext()).willReturn(true, true, false); given(resourcesIterator.next()).willReturn(resource1, resource2); given(resources.iterator()).willReturn(resourcesIterator); given(resource1.getDecimalField(QUANTITY)).willReturn(resourceQuantity); given(resource2.getDecimalField(QUANTITY)).willReturn(resourceQuantity); given(numberService.getMathContext()).willReturn(MathContext.DECIMAL64); given(resource1.getDataDefinition()).willReturn(resourceDD); given(resource1.getId()).willReturn(L_ID); given(resourceDD.create()).willReturn(resource); given(resource.getDataDefinition()).willReturn(resourceDD); // when materialFlowResourceService.manageResources(transfer); // then verify(resourceDD).save(Mockito.any(Entity.class)); verify(resource, times(4)).setField(Mockito.anyString(), Mockito.any()); verify(resourceDD).delete(Mockito.anyLong()); } @Test public void shouldUpdateResoruceAndAddResourceWhenManageResourcesAndTranserIsntNullAndTypeIsTransferAndResourcesArentNull() { // given quantity = BigDecimal.ONE; resourceQuantity = BigDecimal.TEN; given(transfer.getStringField(TYPE)).willReturn(TRANSPORT.getStringValue()); given(transfer.getBelongsToField(LOCATION_FROM)).willReturn(locationFrom); given(transfer.getBelongsToField(LOCATION_TO)).willReturn(locationTo); given(transfer.getBelongsToField(PRODUCT)).willReturn(product); given(transfer.getDecimalField(QUANTITY)).willReturn(quantity); given(transfer.getField(TIME)).willReturn(time); given( dataDefinitionService.get(MaterialFlowResourcesConstants.PLUGIN_IDENTIFIER, MaterialFlowResourcesConstants.MODEL_RESOURCE)).willReturn(resourceDD); given(resourceDD.find()).willReturn(searchCriteriaBuilder); given(searchCriteriaBuilder.add(Mockito.any(SearchCriterion.class))).willReturn(searchCriteriaBuilder); given(searchCriteriaBuilder.addOrder(Mockito.any(SearchOrder.class))).willReturn(searchCriteriaBuilder); given(searchCriteriaBuilder.list()).willReturn(searchResult); given(searchResult.getEntities()).willReturn(null); given(resourcesIterator.hasNext()).willReturn(true, true, false); given(resourcesIterator.next()).willReturn(resource1, resource2); given(resources.iterator()).willReturn(resourcesIterator); given(resource1.getDecimalField(QUANTITY)).willReturn(resourceQuantity); given(resource2.getDecimalField(QUANTITY)).willReturn(resourceQuantity); given(numberService.getMathContext()).willReturn(MathContext.DECIMAL64); given(resource1.getDataDefinition()).willReturn(resourceDD); given(resource1.getId()).willReturn(L_ID); given(resourceDD.create()).willReturn(resource); given(resource.getDataDefinition()).willReturn(resourceDD); // when materialFlowResourceService.manageResources(transfer); // then verify(resourceDD).save(Mockito.any(Entity.class)); verify(resource, times(4)).setField(Mockito.anyString(), Mockito.any()); verify(resourceDD, never()).delete(Mockito.anyLong()); } }