package com.constellio.app.modules.tasks.ui.pages;
import com.constellio.app.modules.tasks.model.wrappers.Task;
import com.constellio.app.modules.tasks.model.wrappers.structures.TaskFollower;
import com.constellio.app.modules.tasks.model.wrappers.types.TaskStatus;
import com.constellio.app.modules.tasks.services.TasksSchemasRecordsServices;
import com.constellio.app.ui.entities.RecordVO;
import com.constellio.app.ui.framework.data.RecordVODataProvider;
import com.constellio.app.ui.pages.base.SessionContext;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.search.SearchServices;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.FakeSessionContext;
import com.constellio.sdk.tests.MockedNavigation;
import com.constellio.sdk.tests.setups.Users;
import org.joda.time.LocalDate;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.Mockito;
import java.util.List;
import java.util.Locale;
import static com.constellio.sdk.tests.TestUtils.asList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.*;
public class TaskManagementPresenterAcceptanceTest extends ConstellioTest {
Users users = new Users();
@Mock TaskManagementView view;
MockedNavigation navigator;
SessionContext sessionContext;
private RecordServices recordServices;
private Task zeTask;
private TasksSchemasRecordsServices tasksSchemas;
private SearchServices searchServices;
TaskManagementPresenter presenter;
private User aliceHasWriteAccessOnZeTask;
private User bobHasReadAccessOnTask;
private User chuckNorrisHasDeleteAccessOnTask;
private User charlesWithNoAccessOnTask;
@Before
public void setUp()
throws Exception {
prepareSystem(withZeCollection().withTasksModule().withAllTest(users));
recordServices = getModelLayerFactory().newRecordServices();
searchServices = getModelLayerFactory().newSearchServices();
sessionContext = FakeSessionContext.chuckNorrisInCollection(zeCollection);
sessionContext.setCurrentLocale(Locale.FRENCH);
when(view.getSessionContext()).thenReturn(sessionContext);
when(view.getCollection()).thenReturn(zeCollection);
when(view.getConstellioFactories()).thenReturn(getConstellioFactories());
when(view.navigate()).thenReturn(navigator);
bobHasReadAccessOnTask = users.bobIn(zeCollection);
aliceHasWriteAccessOnZeTask = users.aliceIn(zeCollection);
chuckNorrisHasDeleteAccessOnTask = users.chuckNorrisIn(zeCollection);
charlesWithNoAccessOnTask = users.charlesIn(zeCollection);
presenter = new TaskManagementPresenter(view);
tasksSchemas = new TasksSchemasRecordsServices(zeCollection, getAppLayerFactory());
zeTask = tasksSchemas.newTask();
recordServices.add(zeTask.setTitle("zeTitle").setStatus(CLOSED())
.setTaskFollowers(asList(new TaskFollower().setFollowerId(bobHasReadAccessOnTask.getId())))
.setAssignee(aliceHasWriteAccessOnZeTask.getId()).setAssigner(chuckNorrisHasDeleteAccessOnTask.getId())
.setAssignationDate(LocalDate.now())
.setCreatedBy(chuckNorrisHasDeleteAccessOnTask.getId()));
}
@Test
public void givenFolderIdMetadataWhenIsRecordIdMetadataThenReturnTrue()
throws Exception {
//assertThat(presenter.isRecordIdMetadata(metadataValueVO)).isTrue();
}
@Test
public void givenWorkflowsAreActivatedThenOnlyUsersWithNeededPermissionCanSeeTheTab()
throws Exception {
sessionContext = FakeSessionContext.adminInCollection(zeCollection);
when(view.getSessionContext()).thenReturn(sessionContext);
TaskManagementPresenter presenter = Mockito.spy(new TaskManagementPresenter(view));
doReturn(true).when(presenter).areWorkflowsEnabled();
assertThat(presenter.getTabs()).contains(presenter.WORKFLOWS_STARTED);
sessionContext = FakeSessionContext.aliceInCollection(zeCollection);
presenter = Mockito.spy(new TaskManagementPresenter(view));
assertThat(presenter.getTabs()).doesNotContain(presenter.WORKFLOWS_STARTED);
}
@Test
public void givenUserCreatedClosedTaskThenVisibleInRecentlyClosedTask ()
throws Exception {
ArgumentCaptor<RecordVODataProvider> argumentCaptor = ArgumentCaptor.forClass(RecordVODataProvider.class);
doNothing().when(view).displayTasks(argumentCaptor.capture());
recordServices.add(zeTask.setStatus(CLOSED()).setAssignee(null).setAssignationDate(null)
.setAssigneeGroupsCandidates(null).setAssigneeUsersCandidates(null).setAssigner(null));
presenter.tabSelected(presenter.TASKS_RECENTLY_COMPLETED);
RecordVODataProvider recordVODataProvider = argumentCaptor.getValue();
List<RecordVO> recordVOList = recordVODataProvider.listRecordVOs(0, recordVODataProvider.size());
assertThat(recordVOList).hasSize(1);
assertThat(recordVOList.get(0).getId()).isEqualTo(zeTask.getId());
}
@Test
public void givenUserAssignedToClosedTaskThenVisibleInRecentlyClosedTask ()
throws Exception {
sessionContext = FakeSessionContext.aliceInCollection(zeCollection);
sessionContext.setCurrentLocale(Locale.FRENCH);
ArgumentCaptor<RecordVODataProvider> argumentCaptor = ArgumentCaptor.forClass(RecordVODataProvider.class);
doNothing().when(view).displayTasks(argumentCaptor.capture());
recordServices.add(zeTask.setStatus(CLOSED()).setAssignee(null).setAssignationDate(null)
.setAssigneeGroupsCandidates(null).setAssigneeUsersCandidates(null).setAssigner(null));
presenter.tabSelected(presenter.TASKS_RECENTLY_COMPLETED);
RecordVODataProvider recordVODataProvider = argumentCaptor.getValue();
List<RecordVO> recordVOList = recordVODataProvider.listRecordVOs(0, recordVODataProvider.size());
assertThat(recordVOList).hasSize(1);
assertThat(recordVOList.get(0).getId()).isEqualTo(zeTask.getId());
}
@Test
public void givenUserNotAssignedToClosedTaskAndIsNotTheCreatorThenInvisibleInRecentlyClosedTask ()
throws Exception {
sessionContext = FakeSessionContext.chuckNorrisInCollection(zeCollection);
sessionContext.setCurrentLocale(Locale.FRENCH);
ArgumentCaptor<RecordVODataProvider> argumentCaptor = ArgumentCaptor.forClass(RecordVODataProvider.class);
doNothing().when(view).displayTasks(argumentCaptor.capture());
recordServices.add(zeTask.setStatus(CLOSED()).setAssignee(null).setAssignationDate(null)
.setAssigneeGroupsCandidates(null).setAssigneeUsersCandidates(null).setAssigner(null));
presenter.tabSelected(presenter.TASKS_RECENTLY_COMPLETED);
RecordVODataProvider recordVODataProvider = argumentCaptor.getValue();
List<RecordVO> recordVOList = recordVODataProvider.listRecordVOs(0, recordVODataProvider.size());
assertThat(recordVOList).hasSize(1);
assertThat(recordVOList.get(0).getId()).isEqualTo(zeTask.getId());
}
public String CLOSED() {
TaskStatus frenchType = tasksSchemas.getTaskStatusWithCode(TaskStatus.CLOSED_CODE);
assertThat(frenchType.isAfterFinished()).isTrue();
return frenchType.getId();
}
}