/** * Copyright (C) 2014 BonitaSoft S.A. * BonitaSoft, 32 rue Gustave Eiffel - 38000 Grenoble * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2.0 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 General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.bonitasoft.web.rest.server.api.bpm.cases; import static org.junit.Assert.*; import static org.mockito.Matchers.*; import static org.mockito.Mockito.*; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.bonitasoft.engine.bpm.process.ProcessInstanceCriterion; import org.bonitasoft.web.rest.model.ModelFactory; import org.bonitasoft.web.rest.model.bpm.cases.CaseItem; import org.bonitasoft.web.rest.model.bpm.flownode.FlowNodeItem; import org.bonitasoft.web.rest.model.bpm.process.ProcessItem; import org.bonitasoft.web.rest.model.identity.UserItem; import org.bonitasoft.web.rest.server.datastore.bpm.cases.CaseDatastore; import org.bonitasoft.web.rest.server.datastore.bpm.flownode.FlowNodeDatastore; import org.bonitasoft.web.rest.server.datastore.bpm.process.ProcessDatastore; import org.bonitasoft.web.rest.server.datastore.organization.UserDatastore; import org.bonitasoft.web.rest.server.framework.search.ItemSearchResult; import org.bonitasoft.web.toolkit.client.ItemDefinitionFactory; import org.bonitasoft.web.toolkit.client.common.exception.api.APIException; import org.bonitasoft.web.toolkit.client.data.APIID; import org.bonitasoft.web.toolkit.client.data.item.Item; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; /** * @author Celine Souchet */ @RunWith(MockitoJUnitRunner.class) public class APICaseTest { @Mock private UserDatastore userDatastore; @Mock private ProcessDatastore processDatastore; @Mock private FlowNodeDatastore flowNodeDatastore; @Mock private CaseDatastore caseDatastore; private APICase apiCase; @Before public void before() { ItemDefinitionFactory.setDefaultFactory(new ModelFactory()); apiCase = spy(new APICase()); doReturn(userDatastore).when(apiCase).getUserDatastore(); doReturn(processDatastore).when(apiCase).getProcessDatastore(); doReturn(flowNodeDatastore).when(apiCase).getFlowNodeDatastore(); doReturn(caseDatastore).when(apiCase).getCaseDatastore(); } /** * Test method for {@link org.bonitasoft.web.rest.server.api.bpm.cases.APICase#defineDefaultSearchOrder()}. */ @Test public final void defineDefaultSearchOrder_should_be_descending_creation_date() { // When final String defineDefaultSearchOrder = apiCase.defineDefaultSearchOrder(); // Then assertEquals(ProcessInstanceCriterion.CREATION_DATE_DESC.name(), defineDefaultSearchOrder); } /** * Test method for {@link org.bonitasoft.web.rest.server.api.bpm.cases.APICase#delete(java.util.List)}. */ @Test public final void delete_should_delete_case_items_on_CaseDatastore() { // Given final List<APIID> ids = Arrays.asList(APIID.makeAPIID(78L)); // When apiCase.delete(ids); // Then verify(caseDatastore).delete(ids); } /** * Test method for {@link org.bonitasoft.web.rest.server.api.bpm.cases.APICase#add(org.bonitasoft.web.rest.model.bpm.cases.CaseItem)}. */ @Test public final void add_should_add_case_item_on_CaseDatastore() { // Given final CaseItem item = mock(CaseItem.class); doReturn(item).when(caseDatastore).add(item); // When final CaseItem result = apiCase.add(item); // Then assertEquals(item, result); verify(caseDatastore).add(item); } /** * Test method for {@link org.bonitasoft.web.rest.server.api.bpm.cases.APICase#get(org.bonitasoft.web.toolkit.client.data.APIID)}. */ @Test public final void get_should_get_case_item_on_CaseDatastore() { // Given final APIID id = APIID.makeAPIID(78L); final CaseItem item = mock(CaseItem.class); doReturn(item).when(caseDatastore).get(id); // When final CaseItem result = apiCase.get(id); // Then assertEquals(item, result); verify(caseDatastore).get(id); } /** * Test method for {@link org.bonitasoft.web.rest.server.api.bpm.cases.APICase#search(int, int, java.lang.String, java.lang.String, java.util.Map)}. */ @Test public final void search_should_search_case_items_on_CaseDatastore() { final int page = 6; final int resultsByPage = 10; final String search = "plop"; final String orders = CaseItem.ATTRIBUTE_END_DATE; final Map<String, String> filters = new HashMap<String, String>(); final ItemSearchResult<CaseItem> searchResult = new ItemSearchResult<CaseItem>(page, resultsByPage, resultsByPage, Arrays.asList(new CaseItem())); doReturn(searchResult).when(caseDatastore).search(page, resultsByPage, search, orders, filters); // When final ItemSearchResult<CaseItem> result = apiCase.search(page, resultsByPage, search, orders, filters); // Then verify(caseDatastore).search(page, resultsByPage, search, orders, filters); assertEquals(searchResult, result); } /** * Test method for {@link org.bonitasoft.web.rest.server.api.bpm.cases.APICase#search(int, int, java.lang.String, java.lang.String, java.util.Map)}. */ @Test public final void search_should_search_case_items_on_CaseDatastore_when_supervisor_filter_is_used_without_team_manager_filter() { final int page = 6; final int resultsByPage = 10; final String search = "plop"; final String orders = CaseItem.ATTRIBUTE_END_DATE; final Map<String, String> filters = Collections.singletonMap(CaseItem.FILTER_SUPERVISOR_ID, "3"); final ItemSearchResult<CaseItem> searchResult = new ItemSearchResult<CaseItem>(page, resultsByPage, resultsByPage, Arrays.asList(new CaseItem())); doReturn(searchResult).when(caseDatastore).search(page, resultsByPage, search, orders, filters); // When final ItemSearchResult<CaseItem> result = apiCase.search(page, resultsByPage, search, orders, filters); // Then verify(caseDatastore).search(page, resultsByPage, search, orders, filters); assertEquals(searchResult, result); } /** * Test method for {@link org.bonitasoft.web.rest.server.api.bpm.cases.APICase#search(int, int, java.lang.String, java.lang.String, java.util.Map)}. */ @Test public final void search_should_search_case_items_on_CaseDatastore_when_team_manager_filter_is_used_without_supervisor_filter() { final int page = 6; final int resultsByPage = 10; final String search = "plop"; final String orders = CaseItem.ATTRIBUTE_END_DATE; final Map<String, String> filters = Collections.singletonMap(CaseItem.FILTER_TEAM_MANAGER_ID, "9"); final ItemSearchResult<CaseItem> searchResult = new ItemSearchResult<CaseItem>(page, resultsByPage, resultsByPage, Arrays.asList(new CaseItem())); doReturn(searchResult).when(caseDatastore).search(page, resultsByPage, search, orders, filters); // When final ItemSearchResult<CaseItem> result = apiCase.search(page, resultsByPage, search, orders, filters); // Then verify(caseDatastore).search(page, resultsByPage, search, orders, filters); assertEquals(searchResult, result); } /** * Test method for {@link org.bonitasoft.web.rest.server.api.bpm.cases.APICase#search(int, int, java.lang.String, java.lang.String, java.util.Map)}. */ @Test(expected = APIException.class) public final void search_should_throw_exception_when_team_manager_and_supervisor_filters_are_used_together() { final int page = 6; final int resultsByPage = 10; final String search = "plop"; final String orders = CaseItem.ATTRIBUTE_END_DATE; final Map<String, String> filters = new HashMap<String, String>(); filters.put(CaseItem.FILTER_TEAM_MANAGER_ID, "9"); filters.put(CaseItem.FILTER_SUPERVISOR_ID, "3"); // When apiCase.search(page, resultsByPage, search, orders, filters); } /** * Test method for * {@link org.bonitasoft.web.rest.server.api.bpm.cases.APICase#fillDeploys(org.bonitasoft.web.rest.model.bpm.cases.CaseItem, java.util.List)}. */ @Test public final void fillDeploys_should_fill_user_who_start_case_when_deploy_of_started_by_is_active() { // Given final APIID startedByUserID = APIID.makeAPIID(3L); final CaseItem item = mock(CaseItem.class); doReturn(CaseItem.ATTRIBUTE_STARTED_BY_USER_ID).when(item).getAttributeValue(CaseItem.ATTRIBUTE_STARTED_BY_USER_ID); doReturn(startedByUserID).when(item).getStartedByUserId(); final List<String> deploys = Arrays.asList(CaseItem.ATTRIBUTE_STARTED_BY_USER_ID); final UserItem userItem = new UserItem(); doReturn(userItem).when(userDatastore).get(startedByUserID); // When apiCase.fillDeploys(item, deploys); // Then verify(item).setDeploy(CaseItem.ATTRIBUTE_STARTED_BY_USER_ID, userItem); } /** * Test method for * {@link org.bonitasoft.web.rest.server.api.bpm.cases.APICase#fillDeploys(org.bonitasoft.web.rest.model.bpm.cases.CaseItem, java.util.List)}. */ @Test public final void fillDeploys_should_do_nothing_when_deploy_of_started_by_is_not_active() { // Given final CaseItem item = mock(CaseItem.class); final List<String> deploys = new ArrayList<String>(); // When apiCase.fillDeploys(item, deploys); // Then verify(item, never()).setDeploy(anyString(), any(Item.class)); } /** * Test method for * {@link org.bonitasoft.web.rest.server.api.bpm.cases.APICase#fillDeploys(org.bonitasoft.web.rest.model.bpm.cases.CaseItem, java.util.List)}. */ @Test public final void fillDeploys_should_fill_substitute_user_who_start_case_when_deploy_of_started_by_substitute_is_active() { // Given final APIID startedBySubstituteUserID = APIID.makeAPIID(6L); final CaseItem item = mock(CaseItem.class); doReturn(CaseItem.ATTRIBUTE_STARTED_BY_SUBSTITUTE_USER_ID).when(item).getAttributeValue(CaseItem.ATTRIBUTE_STARTED_BY_SUBSTITUTE_USER_ID); doReturn(startedBySubstituteUserID).when(item).getStartedBySubstituteUserId(); final List<String> deploys = Arrays.asList(CaseItem.ATTRIBUTE_STARTED_BY_SUBSTITUTE_USER_ID); final UserItem userItem = new UserItem(); doReturn(userItem).when(userDatastore).get(startedBySubstituteUserID); // When apiCase.fillDeploys(item, deploys); // Then verify(item).setDeploy(CaseItem.ATTRIBUTE_STARTED_BY_SUBSTITUTE_USER_ID, userItem); } /** * Test method for * {@link org.bonitasoft.web.rest.server.api.bpm.cases.APICase#fillDeploys(org.bonitasoft.web.rest.model.bpm.cases.CaseItem, java.util.List)}. */ @Test public final void fillDeploys_should_do_nothing_when_deploy_of_started_by_substitute_is_not_active() { // Given final CaseItem item = mock(CaseItem.class); final List<String> deploys = new ArrayList<String>(); // When apiCase.fillDeploys(item, deploys); // Then verify(item, never()).setDeploy(anyString(), any(Item.class)); } /** * Test method for * {@link org.bonitasoft.web.rest.server.api.bpm.cases.APICase#fillDeploys(org.bonitasoft.web.rest.model.bpm.cases.CaseItem, java.util.List)}. */ @Test public final void fillDeploys_should_fill_process_when_deploy_of_process_is_active() { // Given final APIID processId = APIID.makeAPIID(9L); final CaseItem item = mock(CaseItem.class); doReturn(CaseItem.ATTRIBUTE_PROCESS_ID).when(item).getAttributeValue(CaseItem.ATTRIBUTE_PROCESS_ID); doReturn(processId).when(item).getProcessId(); final List<String> deploys = Arrays.asList(CaseItem.ATTRIBUTE_PROCESS_ID); final ProcessItem processItem = new ProcessItem(); doReturn(processItem).when(processDatastore).get(processId); // When apiCase.fillDeploys(item, deploys); // Then verify(item).setDeploy(CaseItem.ATTRIBUTE_PROCESS_ID, processItem); } /** * Test method for * {@link org.bonitasoft.web.rest.server.api.bpm.cases.APICase#fillDeploys(org.bonitasoft.web.rest.model.bpm.cases.CaseItem, java.util.List)}. */ @Test public final void fillDeploys_should_do_nothing_when_deploy_of_process_is_not_active() { // Given final CaseItem item = mock(CaseItem.class); final List<String> deploys = new ArrayList<String>(); // When apiCase.fillDeploys(item, deploys); // Then verify(item, never()).setDeploy(anyString(), any(Item.class)); } /** * Test method for * {@link org.bonitasoft.web.rest.server.api.bpm.cases.APICase#fillCounters(org.bonitasoft.web.rest.model.bpm.cases.CaseItem, java.util.List)}. */ @Test public final void fillCounters_should_fill_number_of_failed_flow_nodes_when_counter_of_failed_flow_nodes_is_active() { // Given final APIID id = APIID.makeAPIID(78L); final CaseItem item = mock(CaseItem.class); doReturn(id).when(item).getId(); final List<String> counters = Arrays.asList(CaseItem.COUNTER_FAILED_FLOW_NODES); final Map<String, String> filters = new HashMap<String, String>(); filters.put(FlowNodeItem.ATTRIBUTE_STATE, FlowNodeItem.VALUE_STATE_FAILED); filters.put(FlowNodeItem.ATTRIBUTE_PARENT_CASE_ID, String.valueOf(id.toLong())); final long numberOfFailedFlowNodes = 2L; doReturn(numberOfFailedFlowNodes).when(flowNodeDatastore).count(null, null, filters); // When apiCase.fillCounters(item, counters); // Then verify(item).setAttribute(CaseItem.COUNTER_FAILED_FLOW_NODES, numberOfFailedFlowNodes); } /** * Test method for * {@link org.bonitasoft.web.rest.server.api.bpm.cases.APICase#fillCounters(org.bonitasoft.web.rest.model.bpm.cases.CaseItem, java.util.List)}. */ @Test public final void fillCounters_should_do_nothing_when_counter_of_failed_flow_nodes_is_not_active() { // Given final CaseItem item = mock(CaseItem.class); final List<String> counters = new ArrayList<String>(); // When apiCase.fillCounters(item, counters); // Then verify(item, never()).setAttribute(anyString(), anyLong()); } /** * Test method for * {@link org.bonitasoft.web.rest.server.api.bpm.cases.APICase#fillCounters(org.bonitasoft.web.rest.model.bpm.cases.CaseItem, java.util.List)}. */ @Test public void fillNumberOfActiveFlowNodesIfActiveCounterExists() { // Given final APIID id = APIID.makeAPIID(78L); final CaseItem item = mock(CaseItem.class); doReturn(id).when(item).getId(); final List<String> counters = Arrays.asList(CaseItem.COUNTER_ACTIVE_FLOW_NODES); final Map<String, String> filters = new HashMap<String, String>(); filters.put(FlowNodeItem.ATTRIBUTE_PARENT_CASE_ID, String.valueOf(id.toLong())); final long numberOfFailedFlowNodes = 2L; doReturn(numberOfFailedFlowNodes).when(flowNodeDatastore).count(null, null, filters); // When apiCase.fillCounters(item, counters); // Then verify(item).setAttribute(CaseItem.COUNTER_ACTIVE_FLOW_NODES, numberOfFailedFlowNodes); } }