/**
* ***************************************************************************
* 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.orders;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.verify;
import static org.springframework.test.util.ReflectionTestUtils.setField;
import java.util.Iterator;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Answers;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import com.qcadoo.localization.api.TranslationService;
import com.qcadoo.mes.basic.ParameterService;
import com.qcadoo.mes.orders.constants.OrderFields;
import com.qcadoo.mes.orders.states.constants.OrderState;
import com.qcadoo.mes.technologies.constants.TechnologyFields;
import com.qcadoo.mes.technologies.constants.TechnologyOperationComponentFields;
import com.qcadoo.model.api.DataDefinitionService;
import com.qcadoo.model.api.Entity;
import com.qcadoo.view.api.ViewDefinitionState;
import com.qcadoo.view.api.components.CheckBoxComponent;
import com.qcadoo.view.api.components.FieldComponent;
public class OrderServiceImplTest {
private OrderService orderService;
@Mock
private DataDefinitionService dataDefinitionService;
@Mock
private TranslationService translationService;
@Mock
private ParameterService parameterService;
@Mock
private TechnologyServiceO technologyServiceO;
@Mock
private ViewDefinitionState view;
@Mock
private CheckBoxComponent booleanCheckBoxComponent;
@Mock
private FieldComponent fieldComponent;
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Entity order, technology, genealogy, operationComponent, operationProductInComponent;
@Mock
private Iterator<Entity> iterator, iterator2;
@Before
public void init() {
MockitoAnnotations.initMocks(this);
orderService = new OrderServiceImpl();
setField(orderService, "dataDefinitionService", dataDefinitionService);
setField(orderService, "translationService", translationService);
setField(orderService, "parameterService", parameterService);
setField(orderService, "technologyServiceO", technologyServiceO);
}
@Test
public final void shouldRecognizeIfOrderWasStarted() {
mustNotBeStarted(null);
mustNotBeStarted(OrderState.PENDING.getStringValue());
mustNotBeStarted(OrderState.ACCEPTED.getStringValue());
mustNotBeStarted(OrderState.DECLINED.getStringValue());
mustNotBeStarted(OrderState.ABANDONED.getStringValue());
mustBeStarted(OrderState.IN_PROGRESS.getStringValue());
mustBeStarted(OrderState.COMPLETED.getStringValue());
mustBeStarted(OrderState.INTERRUPTED.getStringValue());
}
private void mustBeStarted(final String state) {
assertTrue(orderService.isOrderStarted(state));
}
private void mustNotBeStarted(final String state) {
assertFalse(orderService.isOrderStarted(state));
}
@Test
public void shouldChangeFieldStateIfCheckboxIsSelected() {
// given
String booleanFieldComponentName = "booleanFieldComponentName";
String fieldComponentName = "fieldComponentName";
given(view.getComponentByReference(booleanFieldComponentName)).willReturn(booleanCheckBoxComponent);
given(view.getComponentByReference(fieldComponentName)).willReturn(fieldComponent);
given(booleanCheckBoxComponent.isChecked()).willReturn(true);
// when
orderService.changeFieldState(view, booleanFieldComponentName, fieldComponentName);
// then
verify(fieldComponent).setEnabled(true);
}
@Test
public void shouldntChangeFieldStateIfCheckboxIsntSelected() {
// given
String booleanFieldComponentName = "booleanFieldComponentName";
String fieldComponentName = "fieldComponentName";
given(view.getComponentByReference(booleanFieldComponentName)).willReturn(booleanCheckBoxComponent);
given(view.getComponentByReference(fieldComponentName)).willReturn(fieldComponent);
given(booleanCheckBoxComponent.isChecked()).willReturn(false);
// when
orderService.changeFieldState(view, booleanFieldComponentName, fieldComponentName);
// then
verify(fieldComponent).setEnabled(false);
}
@Test
public void shouldFailCheckingRequiredBatchForBatchRequired() throws Exception {
// given
given(order.getBelongsToField(OrderFields.TECHNOLOGY)).willReturn(technology);
given(order.getHasManyField("genealogies").isEmpty()).willReturn(true);
given(technology.getBooleanField("batchRequired")).willReturn(true);
// when
boolean result = orderService.checkRequiredBatch(order);
// then
assertFalse(result);
}
@Test
public void shouldFailCheckingRequiredBatchForPostBatchRequired() throws Exception {
// given
given(order.getBelongsToField(OrderFields.TECHNOLOGY)).willReturn(technology);
given(order.getHasManyField("genealogies").isEmpty()).willReturn(true);
given(technology.getBooleanField("batchRequired")).willReturn(false);
given(technology.getBooleanField("shiftFeatureRequired")).willReturn(false);
given(technology.getBooleanField("postFeatureRequired")).willReturn(true);
// when
boolean result = orderService.checkRequiredBatch(order);
// then
assertFalse(result);
}
@Test
public void shouldFailCheckingRequiredBatchForOtherBatchRequired() throws Exception {
// given
given(order.getBelongsToField(OrderFields.TECHNOLOGY)).willReturn(technology);
given(order.getHasManyField("genealogies").isEmpty()).willReturn(true);
given(technology.getBooleanField("batchRequired")).willReturn(false);
given(technology.getBooleanField("shiftFeatureRequired")).willReturn(false);
given(technology.getBooleanField("postFeatureRequired")).willReturn(false);
given(technology.getBooleanField("otherFeatureRequired")).willReturn(true);
// when
boolean result = orderService.checkRequiredBatch(order);
// then
assertFalse(result);
}
@Test
public void shouldFailCheckingRequiredBatchForOperationComponentBatchRequired() throws Exception {
// given
given(order.getBelongsToField(OrderFields.TECHNOLOGY)).willReturn(technology);
given(order.getHasManyField("genealogies").isEmpty()).willReturn(true);
given(technology.getBooleanField("batchRequired")).willReturn(false);
given(technology.getBooleanField("shiftFeatureRequired")).willReturn(false);
given(technology.getBooleanField("postFeatureRequired")).willReturn(false);
given(technology.getBooleanField("otherFeatureRequired")).willReturn(false);
given(technology.getTreeField(TechnologyFields.OPERATION_COMPONENTS).iterator()).willReturn(iterator);
given(iterator.hasNext()).willReturn(true, false);
given(iterator.next()).willReturn(operationComponent);
given(operationComponent.getHasManyField(TechnologyOperationComponentFields.OPERATION_PRODUCT_IN_COMPONENTS).iterator())
.willReturn(iterator2);
given(iterator2.hasNext()).willReturn(true, false);
given(iterator2.next()).willReturn(operationProductInComponent);
given(operationProductInComponent.getBooleanField("batchRequired")).willReturn(true);
// when
boolean result = orderService.checkRequiredBatch(order);
// then
assertFalse(result);
}
@Test
public void shouldFailCheckingRequiredBatchForGenealogyBatchRequired() throws Exception {
// given
given(order.getBelongsToField(OrderFields.TECHNOLOGY)).willReturn(technology);
given(order.getHasManyField("genealogies").isEmpty()).willReturn(false);
given(order.getHasManyField("genealogies").iterator()).willReturn(iterator);
given(iterator.hasNext()).willReturn(true, false);
given(iterator.next()).willReturn(genealogy);
given(technology.getBooleanField("batchRequired")).willReturn(true);
given(genealogy.getField("batch")).willReturn(null);
// when
boolean result = orderService.checkRequiredBatch(order);
// then
assertFalse(result);
}
@Test
public void shouldFailCheckingRequiredBatchForGenealogyShiftBatchRequired() throws Exception {
// given
given(order.getBelongsToField(OrderFields.TECHNOLOGY)).willReturn(technology);
given(order.getHasManyField("genealogies").isEmpty()).willReturn(false);
given(order.getHasManyField("genealogies").iterator()).willReturn(iterator);
given(iterator.hasNext()).willReturn(true, false);
given(iterator.next()).willReturn(genealogy);
given(technology.getBooleanField("batchRequired")).willReturn(true);
given(technology.getBooleanField("shiftFeatureRequired")).willReturn(true);
given(genealogy.getHasManyField("shiftFeatures").isEmpty()).willReturn(true);
// when
boolean result = orderService.checkRequiredBatch(order);
// then
assertFalse(result);
}
@Test
public void shouldFailCheckingRequiredBatchForGenealogyPostBatchRequired() throws Exception {
// given
given(order.getBelongsToField(OrderFields.TECHNOLOGY)).willReturn(technology);
given(order.getHasManyField("genealogies").isEmpty()).willReturn(false);
given(order.getHasManyField("genealogies").iterator()).willReturn(iterator);
given(iterator.hasNext()).willReturn(true, false);
given(iterator.next()).willReturn(genealogy);
given(technology.getBooleanField("batchRequired")).willReturn(false);
given(technology.getBooleanField("shiftFeatureRequired")).willReturn(true);
given(genealogy.getHasManyField("shiftFeatures").isEmpty()).willReturn(false);
given(technology.getBooleanField("postFeatureRequired")).willReturn(true);
given(genealogy.getHasManyField("postFeatures").isEmpty()).willReturn(true);
// when
boolean result = orderService.checkRequiredBatch(order);
// then
assertFalse(result);
}
@Test
public void shouldFailCheckingRequiredBatchForGenealogyOtherBatchRequired() throws Exception {
// given
given(order.getBelongsToField(OrderFields.TECHNOLOGY)).willReturn(technology);
given(order.getHasManyField("genealogies").size()).willReturn(1);
given(order.getHasManyField("genealogies").iterator()).willReturn(iterator);
given(iterator.hasNext()).willReturn(true, false);
given(iterator.next()).willReturn(genealogy);
given(technology.getBooleanField("batchRequired")).willReturn(false);
given(technology.getBooleanField("shiftFeatureRequired")).willReturn(false);
given(technology.getBooleanField("postFeatureRequired")).willReturn(true);
given(genealogy.getHasManyField("postFeatures").isEmpty()).willReturn(false);
given(technology.getBooleanField("otherFeatureRequired")).willReturn(true);
given(genealogy.getHasManyField("otherFeatures").isEmpty()).willReturn(true);
// when
boolean result = orderService.checkRequiredBatch(order);
// then
assertFalse(result);
}
@Test
public void shouldFailCheckingRequiredBatchForGenealogyComponentsBatchRequired() throws Exception {
// given
given(order.getBelongsToField(OrderFields.TECHNOLOGY)).willReturn(technology);
given(order.getHasManyField("genealogies").isEmpty()).willReturn(false);
given(order.getHasManyField("genealogies").iterator()).willReturn(iterator);
given(iterator.hasNext()).willReturn(true, false);
given(iterator.next()).willReturn(genealogy);
given(technology.getBooleanField("batchRequired")).willReturn(false);
given(technology.getBooleanField("shiftFeatureRequired")).willReturn(false);
given(technology.getBooleanField("postFeatureRequired")).willReturn(false);
given(technology.getBooleanField("otherFeatureRequired")).willReturn(true);
given(genealogy.getHasManyField("otherFeatures").isEmpty()).willReturn(false);
given(genealogy.getHasManyField("productInComponents").iterator()).willReturn(iterator2);
given(iterator2.hasNext()).willReturn(true, false);
given(iterator2.next()).willReturn(operationProductInComponent);
given(operationProductInComponent.getBelongsToField("productInComponent").getBooleanField("batchRequired")).willReturn(
true);
given(operationProductInComponent.getHasManyField("batch").isEmpty()).willReturn(true);
// when
boolean result = orderService.checkRequiredBatch(order);
// then
assertFalse(result);
}
@Test
public void shouldFailCheckingRequiredBatchForGenealogyComponentsBatchRequired2() throws Exception {
// given
given(order.getBelongsToField(OrderFields.TECHNOLOGY)).willReturn(technology);
given(order.getHasManyField("genealogies").size()).willReturn(1);
given(order.getHasManyField("genealogies").iterator()).willReturn(iterator);
given(iterator.hasNext()).willReturn(true, false);
given(iterator.next()).willReturn(genealogy);
given(technology.getBooleanField("batchRequired")).willReturn(false);
given(technology.getBooleanField("shiftFeatureRequired")).willReturn(false);
given(technology.getBooleanField("postFeatureRequired")).willReturn(false);
given(technology.getBooleanField("otherFeatureRequired")).willReturn(true);
given(genealogy.getHasManyField("otherFeatures").size()).willReturn(1);
given(genealogy.getHasManyField("productInComponents").iterator()).willReturn(iterator2);
given(iterator2.hasNext()).willReturn(true, false);
given(iterator2.next()).willReturn(operationProductInComponent);
given(operationProductInComponent.getBelongsToField("productInComponent").getBooleanField("batchRequired")).willReturn(
true);
given(operationProductInComponent.getHasManyField("batch").size()).willReturn(1);
// when
boolean result = orderService.checkRequiredBatch(order);
// then
assertTrue(result);
}
@Test
public void shouldFailCheckingRequiredBatchForGenealogyComponentsBatchRequired3() throws Exception {
// given
given(order.getBelongsToField(OrderFields.TECHNOLOGY)).willReturn(technology);
given(order.getHasManyField("genealogies").size()).willReturn(1);
given(order.getHasManyField("genealogies").iterator()).willReturn(iterator);
given(iterator.hasNext()).willReturn(true, false);
given(iterator.next()).willReturn(genealogy);
given(technology.getBooleanField("batchRequired")).willReturn(false);
given(technology.getBooleanField("shiftFeatureRequired")).willReturn(false);
given(technology.getBooleanField("postFeatureRequired")).willReturn(false);
given(technology.getBooleanField("otherFeatureRequired")).willReturn(true);
given(genealogy.getHasManyField("otherFeatures").size()).willReturn(1);
given(genealogy.getHasManyField("productInComponents").iterator()).willReturn(iterator2);
given(iterator2.hasNext()).willReturn(true, false);
given(iterator2.next()).willReturn(operationProductInComponent);
given(operationProductInComponent.getBelongsToField("productInComponent").getBooleanField("batchRequired")).willReturn(
false);
// when
boolean result = orderService.checkRequiredBatch(order);
// then
assertTrue(result);
}
@Test
public void shouldSuccessCheckingRequiredBatch() throws Exception {
// given
given(order.getBelongsToField(OrderFields.TECHNOLOGY)).willReturn(technology);
given(order.getHasManyField("genealogies").size()).willReturn(1);
// when
boolean result = orderService.checkRequiredBatch(order);
// then
assertTrue(result);
}
@Test
public void shouldSuccessCheckingRequiredBatchIfThereIsNoTechnology() throws Exception {
// given
given(order.getField(OrderFields.TECHNOLOGY)).willReturn(null);
// when
boolean result = orderService.checkRequiredBatch(order);
// then
assertTrue(result);
}
}