package com.constellio.model.services.tasks;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.HashMap;
import org.joda.time.LocalDateTime;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.Mockito;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.ApprovalTask;
import com.constellio.model.entities.records.wrappers.WorkflowTask;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.MetadataSchema;
import com.constellio.model.entities.schemas.MetadataSchemaType;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.entities.workflows.execution.WorkflowExecution;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.records.RecordServicesException;
import com.constellio.model.services.schemas.MetadataSchemasManager;
import com.constellio.model.services.search.SearchServices;
import com.constellio.model.services.search.query.logical.condition.LogicalSearchCondition;
import com.constellio.model.services.workflows.execution.WorkflowExecutionService;
import com.constellio.sdk.tests.ConstellioTest;
public class TaskServicesUnitTest extends ConstellioTest {
@Mock RecordServices recordServices;
@Mock WorkflowExecutionService workflowExecutionService;
@Mock SearchServices searchServices;
@Mock MetadataSchemasManager metadataSchemasManager;
@Mock MetadataSchemaTypes metadataSchemaTypes;
@Mock MetadataSchemaType metadataSchemaType;
@Mock MetadataSchema defaultSchema;
@Mock MetadataSchema taskSchema;
@Mock Metadata workflowIdMetadata;
@Mock LogicalSearchCondition condition;
@Mock Record record;
@Mock
WorkflowTask task;
@Mock ApprovalTask approvalTask;
@Mock User user;
@Mock WorkflowExecution execution;
TaskServices taskServices;
@Before
public void setup()
throws Exception {
when(execution.getCollection()).thenReturn(zeCollection);
when(execution.getVariables()).thenReturn(new HashMap<String, String>());
when(metadataSchemasManager.getSchemaTypes(zeCollection)).thenReturn(metadataSchemaTypes);
when(metadataSchemaTypes.getSchemaType(WorkflowTask.SCHEMA_TYPE)).thenReturn(metadataSchemaType);
when(metadataSchemaType.getDefaultSchema()).thenReturn(defaultSchema);
when(defaultSchema.getMetadata(WorkflowTask.WORKFLOW_ID)).thenReturn(workflowIdMetadata);
taskServices = spy(new TaskServices(recordServices, searchServices, workflowExecutionService, metadataSchemasManager));
doReturn(condition).when(taskServices).newCondition(execution, metadataSchemaType, workflowIdMetadata);
doReturn(record).when(searchServices).searchSingleResult(condition);
doReturn(task).when(taskServices).newTask(record, metadataSchemaTypes);
doReturn(approvalTask).when(taskServices).newAprovalTask(record, metadataSchemaTypes);
}
@Test
public void whenNewTaskThenReturnIt()
throws Exception {
when(record.getSchemaCode()).thenReturn(WorkflowTask.SCHEMA_TYPE);
taskServices.newRelativeTask(record, metadataSchemaTypes);
verify(taskServices).newTask(record, metadataSchemaTypes);
}
@Test
public void givenAprovalRecordSchemaCodeWhenNewTaskThenReturnIt()
throws Exception {
when(record.getSchemaCode()).thenReturn(ApprovalTask.SCHEMA_CODE);
taskServices.newRelativeTask(record, metadataSchemaTypes);
verify(taskServices).newAprovalTask(record, metadataSchemaTypes);
}
@Test
public void whenGetCurrentWorkflowManualTaskThenReturnTask()
throws Exception {
when(record.getSchemaCode()).thenReturn(ApprovalTask.SCHEMA_CODE);
doReturn(task).when(taskServices).newRelativeTask(record, metadataSchemaTypes);
taskServices.getCurrentWorkflowManualTask(execution);
InOrder inOrder = Mockito.inOrder(execution, metadataSchemasManager, metadataSchemaTypes, metadataSchemaType,
defaultSchema, searchServices, taskServices);
inOrder.verify(execution).getCollection();
inOrder.verify(metadataSchemasManager).getSchemaTypes(zeCollection);
inOrder.verify(metadataSchemaTypes).getSchemaType(WorkflowTask.SCHEMA_TYPE);
inOrder.verify(metadataSchemaType).getDefaultSchema();
inOrder.verify(defaultSchema).getMetadata(WorkflowTask.WORKFLOW_ID);
inOrder.verify(searchServices).searchSingleResult(condition);
inOrder.verify(taskServices).newRelativeTask(record, metadataSchemaTypes);
}
@Test
public void givenNullRecordWhenGetCurrentWorkflowManualTaskThenReturnNull()
throws Exception {
when(searchServices.searchSingleResult(condition)).thenReturn(null);
WorkflowTask retrievedTask = taskServices.getCurrentWorkflowManualTask(execution);
assertThat(retrievedTask).isNull();
}
@Test
public void whenFinishThenOk()
throws Exception {
when(task.getWorkflowId()).thenReturn("workflowId");
when(task.getSchema()).thenReturn(taskSchema);
when(taskSchema.getCollection()).thenReturn(zeCollection);
InOrder inOrder = verifyCalledMethodsOrder();
inOrder.verify(workflowExecutionService).markAsWaitingForSystem(task.getSchema().getCollection(), "workflowId");
}
@Test
public void givenWorkflowIdNullWhenFinishThenOk()
throws Exception {
when(workflowExecutionService.getWorkflow(anyString(), anyString())).thenReturn(execution);
taskServices.finish(task, user);
verifyCalledMethodsOrder();
}
private InOrder verifyCalledMethodsOrder()
throws RecordServicesException {
when(workflowExecutionService.getWorkflow(anyString(), anyString())).thenReturn(execution);
taskServices.finish(task, user);
InOrder inOrder = Mockito.inOrder(task, taskSchema, recordServices, workflowExecutionService);
inOrder.verify(task).set(WorkflowTask.FINISHED_BY, user.getId());
inOrder.verify(task).set(eq(WorkflowTask.FINISHED_ON), any(LocalDateTime.class));
inOrder.verify(recordServices).update(task);
inOrder.verify(task).getWorkflowId();
return inOrder;
}
}