@Test
  public void shouldNotRemoveAnyActivitiesWhenTaskHasNotActivities() {
    when(taskActivitiesDataService.byTask(TASK_ID)).thenReturn(new ArrayList<TaskActivity>());

    activityService.deleteActivitiesForTask(TASK_ID);

    verify(taskActivitiesDataService, never()).delete(any(TaskActivity.class));
  }
  @Test
  public void shouldDeleteAllTaskActivitiesForGivenTask() {
    when(taskActivitiesDataService.byTask(TASK_ID)).thenReturn(activities);

    activityService.deleteActivitiesForTask(TASK_ID);

    verify(taskActivitiesDataService, times(activities.size())).delete(any(TaskActivity.class));
  }
  @Test
  public void shouldReturnPaginatedActivitiesForGivenTask() {
    Set<TaskActivityType> types = new HashSet<>();
    types.addAll(Arrays.asList(TaskActivityType.values()));
    QueryParams queryParams = new QueryParams((Order) null);
    when(taskActivitiesDataService.byTaskAndActivityTypes(TASK_ID, types, queryParams))
        .thenReturn(activities);

    List<TaskActivity> actual = activityService.getTaskActivities(TASK_ID, types, queryParams);

    assertNotNull(actual);
    assertEquals(activities, actual);
  }
  @Test
  public void shouldAddTaskWarningActivityWithGivenKeyAndField() {
    String messageKey = "warning.manipulation";

    ArgumentCaptor<TaskActivity> captor = ArgumentCaptor.forClass(TaskActivity.class);

    activityService.addWarning(task, messageKey, ERROR_FIELD.get(0));

    verify(taskActivitiesDataService).create(captor.capture());

    assertActivity(
        messageKey, ERROR_FIELD, TASK_ID, TaskActivityType.WARNING, null, null, captor.getValue());
  }
  /**
   * Executes the action for the given task.
   *
   * @param task the task for which its action should be executed, not null
   * @param actionInformation the information about the action, not null
   * @param actionIndex the order of the task action
   * @param taskContext the context of the current task execution, not null
   * @param activityId the ID of the activity associated with this execution
   * @throws TaskHandlerException when the task couldn't be executed
   */
  public void execute(
      Task task,
      TaskActionInformation actionInformation,
      Integer actionIndex,
      TaskContext taskContext,
      long activityId)
      throws TaskHandlerException {
    LOGGER.info(
        "Executing task action: {} from task: {}", actionInformation.getName(), task.getName());
    KeyEvaluator keyEvaluator = new KeyEvaluator(taskContext);

    ActionEvent action = getActionEvent(actionInformation);
    Map<String, Object> parameters = createParameters(actionInformation, action, keyEvaluator);
    addTriggerParameters(task, action, parameters, taskContext.getTriggerParameters());

    LOGGER.debug(
        "Parameters created: {} for task action: {}", parameters.toString(), action.getName());
    if (action.hasService() && bundleContext != null) {
      if (callActionServiceMethod(action, actionIndex, parameters, taskContext)) {
        LOGGER.info(
            "Action: {} from task: {} was executed through an OSGi service call",
            actionInformation.getName(),
            task.getName());
        postExecutionHandler.handleActionExecuted(
            taskContext.getTriggerParameters(), taskContext.getMetadata(), activityId);
        return;
      }
      LOGGER.info("There is no service: {}", action.getServiceInterface());

      activityService.addWarning(
          task, "task.warning.serviceUnavailable", action.getServiceInterface());
    }
    if (!action.hasSubject()) {
      throw new TaskHandlerException(ACTION, "task.error.cantExecuteAction");
    } else {
      eventRelay.sendEventMessage(
          new MotechEvent(
              action.getSubject(),
              parameters,
              TasksEventCallbackService.TASKS_EVENT_CALLBACK_NAME,
              taskContext.getMetadata()));
      LOGGER.info("Event: {} was sent", action.getSubject());
    }
  }
  @Test
  public void shouldAddTaskSuccessActivity() {
    String messageKey = "task.success.ok";

    ArgumentCaptor<TaskActivity> captor = ArgumentCaptor.forClass(TaskActivity.class);

    activityService.addSuccess(task);

    verify(taskActivitiesDataService).create(captor.capture());

    assertActivity(
        messageKey,
        Collections.<String>emptyList(),
        TASK_ID,
        TaskActivityType.SUCCESS,
        null,
        null,
        captor.getValue());
  }
  @Test
  public void shouldAddTaskWarningActivity() {
    String messageKey = "task.warning.taskDisabled";

    ArgumentCaptor<TaskActivity> captor = ArgumentCaptor.forClass(TaskActivity.class);

    activityService.addWarning(task);

    verify(taskActivitiesDataService).create(captor.capture());

    assertActivity(
        messageKey,
        Collections.<String>emptyList(),
        TASK_ID,
        TaskActivityType.WARNING,
        null,
        null,
        captor.getValue());
  }
  @Test
  public void shouldAddTaskWarningActivityWithGivenException() {
    TaskHandlerException exception =
        new TaskHandlerException(
            TRIGGER, "trigger.exception", new TaskHandlerException(TRIGGER, "task.exception"));
    String messageKey = "warning.manipulation";

    ArgumentCaptor<TaskActivity> captor = ArgumentCaptor.forClass(TaskActivity.class);

    activityService.addWarning(task, messageKey, ERROR_FIELD.get(0), exception);

    verify(taskActivitiesDataService).create(captor.capture());

    assertActivity(
        messageKey,
        ERROR_FIELD,
        TASK_ID,
        TaskActivityType.WARNING,
        getStackTrace(exception.getCause()),
        null,
        captor.getValue());
  }
  @Test
  public void shouldAddErrorActivityWithTaskException() {
    String messageKey = "error.notFoundTrigger";
    TaskHandlerException exception =
        new TaskHandlerException(TRIGGER, messageKey, ERROR_FIELD.get(0));
    Map<String, Object> errorParameters = new HashMap<>();
    errorParameters.put("errorKey", "errorValue");

    ArgumentCaptor<TaskActivity> captor = ArgumentCaptor.forClass(TaskActivity.class);

    activityService.addError(task, exception, errorParameters);

    verify(taskActivitiesDataService).create(captor.capture());

    assertActivity(
        messageKey,
        ERROR_FIELD,
        TASK_ID,
        TaskActivityType.ERROR,
        getStackTrace(exception),
        errorParameters,
        captor.getValue());
  }