package org.bonitasoft.web.rest.server.api.bpm.flownode; import static net.javacrumbs.jsonunit.JsonAssert.assertJsonEquals; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Matchers.anyLong; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.verify; import org.bonitasoft.engine.api.ProcessAPI; import org.bonitasoft.engine.bpm.data.DataDefinition; import org.bonitasoft.engine.bpm.data.DataInstance; import org.bonitasoft.engine.bpm.data.DataNotFoundException; import org.bonitasoft.engine.bpm.data.impl.DataInstanceImpl; import org.bonitasoft.engine.bpm.data.impl.DoubleDataInstanceImpl; import org.bonitasoft.engine.bpm.data.impl.FloatDataInstanceImpl; import org.bonitasoft.engine.bpm.data.impl.LongDataInstanceImpl; import org.bonitasoft.engine.bpm.data.impl.ShortTextDataInstanceImpl; import org.bonitasoft.engine.bpm.process.ModelFinderVisitor; import org.bonitasoft.engine.expression.Expression; import org.bonitasoft.web.rest.server.BonitaRestletApplication; import org.bonitasoft.web.rest.server.utils.RestletTest; import org.bonitasoft.web.toolkit.client.common.exception.api.APIException; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; import org.restlet.Response; import org.restlet.resource.ServerResource; @RunWith(MockitoJUnitRunner.class) public class ActivityVariableResourceTest extends RestletTest { @Mock ProcessAPI processAPI; @Spy @InjectMocks private ActivityVariableResource activityVariableResource; @Override protected ServerResource configureResource() { return new ActivityVariableResource(processAPI); } @Test(expected = APIException.class) public void shouldDoGetWithNothingThowsAnApiException() throws DataNotFoundException { //when activityVariableResource.getTaskVariable(); } @Test(expected = APIException.class) public void should_throw_exception_if_attribute_is_not_found() throws Exception { // given: doReturn(null).when(activityVariableResource).getAttribute(anyString()); // when: activityVariableResource.getTaskVariable(); } @Test public void should_do_get_call_getAttribute() throws DataNotFoundException { //given doReturn("").when(activityVariableResource).getAttribute(ActivityVariableResource.ACTIVITYDATA_DATA_NAME); doReturn("1").when(activityVariableResource).getAttribute(ActivityVariableResource.ACTIVITYDATA_ACTIVITY_ID); doReturn(null).when(processAPI).getActivityDataInstance(anyString(), anyLong()); //when activityVariableResource.getTaskVariable(); //then verify(activityVariableResource).getAttribute(ActivityVariableResource.ACTIVITYDATA_ACTIVITY_ID); verify(activityVariableResource).getAttribute(ActivityVariableResource.ACTIVITYDATA_DATA_NAME); } @Test public void should_return() throws DataNotFoundException { // given doReturn("").when(activityVariableResource).getAttribute(ActivityVariableResource.ACTIVITYDATA_DATA_NAME); doReturn("1").when(activityVariableResource).getAttribute(ActivityVariableResource.ACTIVITYDATA_ACTIVITY_ID); final DataInstanceImpl dataInstance = createLongDataInstance(123L); doReturn(dataInstance).when(processAPI).getActivityDataInstance(anyString(), anyLong()); // when final DataInstance dataInstanceResult = activityVariableResource.getTaskVariable(); // then assertThat(dataInstanceResult).isEqualTo(dataInstance); } private DataInstanceImpl createShortTextDataInstance(String value) { final ShortTextDataInstanceImpl dataInstance = new ShortTextDataInstanceImpl(createDataDefinition(), value); fillIds(dataInstance); return dataInstance; } private DataInstanceImpl createLongDataInstance(Long value) { final LongDataInstanceImpl dataInstance = new LongDataInstanceImpl(createDataDefinition(), value); fillIds(dataInstance); return dataInstance; } private DataInstanceImpl createFloatDataInstance(float value) { final FloatDataInstanceImpl dataInstance = new FloatDataInstanceImpl(createDataDefinition(), value); fillIds(dataInstance); return dataInstance; } private DataInstanceImpl createDoubleDataInstance(double value) { final DoubleDataInstanceImpl dataInstance = new DoubleDataInstanceImpl(createDataDefinition(), value); fillIds(dataInstance); return dataInstance; } private void fillIds(final DataInstanceImpl dataInstance) { dataInstance.setId(5L); dataInstance.setTenantId(2L); dataInstance.setContainerId(7L); } private DataDefinition createDataDefinition() { return new DataDefinition() { @Override public String getClassName() { return "com.company.Model"; } @Override public boolean isTransientData() { return false; } @Override public Expression getDefaultValueExpression() { return null; } @Override public String getDescription() { return "description"; } @Override public String getName() { return "dataInstanceName"; } @Override public void accept(ModelFinderVisitor visitor, long modelId) { } }; } @Test public void should_DataInstance_return_number_as_strings() throws Exception { checkJsonDataInstance(createLongDataInstance(123L), "longDataInstance.json"); checkJsonDataInstance(createShortTextDataInstance("abc"), "stringDataInstance.json"); checkJsonDataInstance(createFloatDataInstance(123.456F), "floatDataInstance.json"); checkJsonDataInstance(createDoubleDataInstance(123.5D), "doubleDataInstance.json"); checkJsonDataInstance(createLongDataInstance(null), "nullDataInstance.json"); } private void checkJsonDataInstance(final DataInstanceImpl dataInstance, final String jsonFile) throws Exception { //given doReturn(dataInstance).when(processAPI).getActivityDataInstance(anyString(), anyLong()); //when final Response response = request(BonitaRestletApplication.BPM_ACTIVITY_VARIABLE_URL + "/10/variableName").get(); //then assertJsonEquals(getJson(jsonFile), response.getEntityAsText()); } }