/**
* Copyright (C) 2012 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.datastore.bpm.process;
import static java.util.Arrays.*;
import static java.util.Collections.*;
import static junit.framework.Assert.*;
import static org.bonitasoft.web.rest.model.bpm.process.ProcessConnectorItem.*;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;
import static org.mockito.MockitoAnnotations.*;
import java.util.HashMap;
import org.bonitasoft.engine.api.ProcessAPI;
import org.bonitasoft.engine.bpm.connector.ConnectorCriterion;
import org.bonitasoft.engine.bpm.connector.ConnectorImplementationDescriptor;
import org.bonitasoft.engine.bpm.connector.ConnectorNotFoundException;
import org.bonitasoft.web.rest.model.bpm.process.ProcessConnectorDefinition;
import org.bonitasoft.web.rest.model.bpm.process.ProcessConnectorItem;
import org.bonitasoft.web.rest.server.APITestWithMock;
import org.bonitasoft.web.rest.server.framework.search.ItemSearchResult;
import org.bonitasoft.web.toolkit.client.common.exception.api.APIException;
import org.bonitasoft.web.toolkit.client.data.APIID;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
/**
* @author Colin PUY
*
*/
@SuppressWarnings("unchecked")
public class ProcessConnectorDatastoreTest extends APITestWithMock {
@Mock
private ProcessAPI processAPI;
private ProcessConnectorDatastore processConnectorDatastore;
@Before
public void initializeMocks() {
initMocks(this);
this.processConnectorDatastore = spy(new ProcessConnectorDatastore(null));
doReturn(this.processAPI).when(this.processConnectorDatastore).getProcessAPI();
}
private APIID anAPIID(final String id, final String name, final String version) {
final APIID apiid = APIID.makeAPIID(id, name, version);
apiid.setItemDefinition(ProcessConnectorDefinition.get());
return apiid;
}
private ConnectorImplementationDescriptor aConnectorImplementationDescriptor(final String name) {
final ConnectorImplementationDescriptor descriptor = new ConnectorImplementationDescriptor("implementationClassName",
name, "version", "definitionId", "definitionVersion", EMPTY_LIST);
return descriptor;
}
private HashMap<String, String> aProcessIdFilter(final String processId) {
final HashMap<String, String> filters = new HashMap<String, String>();
filters.put(ATTRIBUTE_PROCESS_ID, processId);
return filters;
}
private ProcessConnectorItem convertToItem(final ConnectorImplementationDescriptor descriptor1, final String processId) {
final ProcessConnectorItem item = this.processConnectorDatastore.convertEngineToConsoleItem(descriptor1);
item.setProcessId(processId);
return item;
}
@Test
public void getRetrieveConnectorImplementationAndSetProcessId() throws Exception {
final ConnectorImplementationDescriptor descriptor = aConnectorImplementationDescriptor("aName");
when(this.processAPI.getConnectorImplementation(1L, "name", "1")).thenReturn(descriptor);
final ProcessConnectorItem fetchedItem = this.processConnectorDatastore.get(anAPIID("1", "name", "1"));
final ProcessConnectorItem expectedItem = convertToItem(descriptor, "1");
assertTrue(areEquals(expectedItem, fetchedItem));
}
@Test(expected = APIException.class)
public void getThrowExceptionIfProcessDefinitionIsNotFound() throws Exception {
when(this.processAPI.getConnectorImplementation(anyLong(), anyString(), anyString()))
.thenThrow(new ConnectorNotFoundException(null));
this.processConnectorDatastore.get(anAPIID("1", "name", "1"));
}
@Test(expected = APIException.class)
public void searchThrowExceptionIfProcessDefinitionIsNotFound() throws Exception {
when(this.processAPI.getConnectorImplementations(anyLong(), anyInt(), anyInt(), any(ConnectorCriterion.class)))
.thenThrow(new NullPointerException());
this.processConnectorDatastore.search(0, 10, null, null, aProcessIdFilter("1"));
}
@Test
public void searchReturnAllProcessConnectorForAProcessDefinitionId() throws Exception {
final ConnectorImplementationDescriptor descriptor1 = aConnectorImplementationDescriptor("aName");
final ConnectorImplementationDescriptor descriptor2 = aConnectorImplementationDescriptor("anOtherName");
when(this.processAPI.getConnectorImplementations(anyLong(), anyInt(), anyInt(), any(ConnectorCriterion.class)))
.thenReturn(asList(descriptor1, descriptor2));
final ItemSearchResult<ProcessConnectorItem> search =
this.processConnectorDatastore.search(0, 10, null, "DEFINITION_ID_ASC", aProcessIdFilter("1"));
final ProcessConnectorItem expectedItem1 = convertToItem(descriptor1, "1");
final ProcessConnectorItem expectedItem2 = convertToItem(descriptor2, "1");
assertTrue(areEquals(search.getResults().get(0), expectedItem1));
assertTrue(areEquals(search.getResults().get(1), expectedItem2));
}
@Test
public void testConvertEngineToConsoleItem() throws Exception {
final ConnectorImplementationDescriptor descriptor = new ConnectorImplementationDescriptor("implementationClassName",
"name", "version", "definitionId", "definitionVersion", EMPTY_LIST);
final ProcessConnectorItem expectedItem = new ProcessConnectorItem();
expectedItem.setName("definitionId");
expectedItem.setVersion("definitionVersion");
expectedItem.setImplementationName("name");
expectedItem.setImplementationVersion("version");
expectedItem.setClassname("implementationClassName");
final ProcessConnectorItem convertedItem = this.processConnectorDatastore.convertEngineToConsoleItem(descriptor);
assertTrue(areEquals(expectedItem, convertedItem));
}
}