@Test
  public void shouldTransitionToMenuRepeatWhenCallStateIs_EndOfFlow() {
    tamaIVRContext.callState(CallState.PUSH_MESSAGES_COMPLETE);
    tamaIVRContext.callDirection(CallDirection.Outbound);

    assertEquals(ControllerURLs.MENU_REPEAT, tamaCallFlowController.urlFor(kooKooIVRContext));
  }
 @Test
 public void completionOfSymptomReportingTreeOrPreviousDosageReminderTreeShouldCompleteTheTrees() {
   tamaIVRContext.callDirection(CallDirection.Inbound);
   when(treeRegistry.isLeafTree(TAMATreeRegistry.REGIMEN_1_TO_6)).thenReturn(true);
   tamaCallFlowController.treeComplete(TAMATreeRegistry.REGIMEN_1_TO_6, kooKooIVRContext);
   assertEquals(CallState.ALL_TREES_COMPLETED, tamaIVRContext.callState());
 }
 @Test
 public void
     whenCurrentDosageIsConfirmedAndWhenPreviousDosageHasBeenCaptured_AllTreesAreCompleted() {
   tamaIVRContext.callDirection(CallDirection.Outbound);
   tamaIVRContext.callState(CallState.AUTHENTICATED);
   when(pillModuleStrategy.previousDosageCaptured(tamaIVRContext)).thenReturn(true);
   tamaCallFlowController.treeComplete(TAMATreeRegistry.CURRENT_DOSAGE_CONFIRM, kooKooIVRContext);
   assertEquals(CallState.ALL_TREES_COMPLETED, tamaIVRContext.callState());
 }
  @Test
  public void shouldTransitionToCurrentDosageReminderTreeForPatientOnDailyPillReminder() {
    tamaIVRContext.callState(CallState.AUTHENTICATED);
    when(allPatients.get(null))
        .thenReturn(
            PatientBuilder.startRecording()
                .withDefaults()
                .withCallPreference(CallPreference.DailyPillReminder)
                .build());
    tamaIVRContext.callDirection(CallDirection.Outbound);

    assertEquals(
        TAMATreeRegistry.CURRENT_DOSAGE_REMINDER,
        tamaCallFlowController.decisionTreeName(kooKooIVRContext));
  }
  @Test
  public void shouldNotRepeatOutboxCallTreeMoreThanOnceDuringOutboxCall() {
    tamaIVRContext.callState(CallState.AUTHENTICATED);
    when(allPatients.get(null))
        .thenReturn(
            PatientBuilder.startRecording()
                .withDefaults()
                .withCallPreference(CallPreference.DailyPillReminder)
                .build());
    tamaIVRContext.addLastCompletedTreeToListOfCompletedTrees(TAMATreeRegistry.OUTBOX_CALL);
    tamaIVRContext.callDirection(CallDirection.Outbound);

    assertEquals(
        TAMATreeRegistry.MENU_TREE, tamaCallFlowController.decisionTreeName(kooKooIVRContext));
  }
  @Test
  public void shouldTransitionToMenuTreeOnceFourDayRecallTreeIsPlayed() {
    tamaIVRContext.callState(CallState.AUTHENTICATED);
    when(allPatients.get(null))
        .thenReturn(
            PatientBuilder.startRecording()
                .withDefaults()
                .withCallPreference(CallPreference.FourDayRecall)
                .build());
    tamaIVRContext.addLastCompletedTreeToListOfCompletedTrees(TAMATreeRegistry.FOUR_DAY_RECALL);
    tamaIVRContext.callDirection(CallDirection.Outbound);

    assertEquals(
        TAMATreeRegistry.MENU_TREE, tamaCallFlowController.decisionTreeName(kooKooIVRContext));
  }
  @Test
  public void shouldNotTransitionToCurrentDosageReminderTreeIsPlayed_AndUserEntersWillTakeLater() {
    tamaIVRContext.callState(CallState.AUTHENTICATED);
    when(allPatients.get(null))
        .thenReturn(
            PatientBuilder.startRecording()
                .withDefaults()
                .withCallPreference(CallPreference.DailyPillReminder)
                .build());
    tamaIVRContext.addLastCompletedTreeToListOfCompletedTrees(
        TAMATreeRegistry.CURRENT_DOSAGE_REMINDER);
    tamaIVRContext.callDirection(CallDirection.Outbound);

    assertEquals(
        TAMATreeRegistry.MENU_TREE, tamaCallFlowController.decisionTreeName(kooKooIVRContext));
  }
  @Test
  public void shouldReturnFourDayRecallIncomingTreeWhenPatientIsSuspendedButOnWeeklyAdherence() {
    tamaIVRContext.callState(CallState.AUTHENTICATED);
    when(allPatients.get(null))
        .thenReturn(
            PatientBuilder.startRecording()
                .withDefaults()
                .withStatus(Status.Suspended)
                .withCallPreference(CallPreference.FourDayRecall)
                .build());
    tamaIVRContext.callDirection(CallDirection.Inbound);

    assertEquals(
        TAMATreeRegistry.FOUR_DAY_RECALL_INCOMING_CALL,
        tamaCallFlowController.decisionTreeName(kooKooIVRContext));
  }
  @Test
  public void shouldReturnMenuTreeWhenPatientIsSuspendedAndIsOnDailyPillReminder() {
    tamaIVRContext.callState(CallState.AUTHENTICATED);
    when(allPatients.get(null))
        .thenReturn(
            PatientBuilder.startRecording()
                .withDefaults()
                .withCallPreference(CallPreference.DailyPillReminder)
                .withStatus(Status.Suspended)
                .build());
    tamaIVRContext.callDirection(CallDirection.Inbound);

    assertEquals(
        TAMATreeRegistry.INCOMING_MENU_TREE,
        tamaCallFlowController.decisionTreeName(kooKooIVRContext));
  }
  @Test
  public void shouldReturnPullMessagesTreeWhenCallStateIsPullMessages() {
    tamaIVRContext.callState(CallState.PULL_MESSAGES_TREE);
    tamaIVRContext.callDirection(CallDirection.Inbound);
    tamaIVRContext.lastCompletedTree(TAMATreeRegistry.CURRENT_DOSAGE_CONFIRM);

    when(allPatients.get(anyString()))
        .thenReturn(
            PatientBuilder.startRecording()
                .withDefaults()
                .withCallPreference(CallPreference.DailyPillReminder)
                .build());

    String treeName = tamaCallFlowController.decisionTreeName(kooKooIVRContext);
    assertEquals(TAMATreeRegistry.PULL_MESSAGES_TREE, treeName);
  }
  @Test
  public void outboxURLShouldBeReturnedWhenTheDecisionTreesAreComplete() {
    tamaIVRContext.callState(CallState.ALL_TREES_COMPLETED);
    tamaIVRContext.callDirection(CallDirection.Outbound);
    String patientId = "1234";
    tamaIVRContext.patientDocumentId(patientId);

    Patient patient =
        PatientBuilder.startRecording()
            .withDefaults()
            .withId(patientId)
            .withCallPreference(CallPreference.DailyPillReminder)
            .build();
    when(allPatients.get(patientId)).thenReturn(patient);

    assertEquals(ControllerURLs.PUSH_MESSAGES_URL, tamaCallFlowController.urlFor(kooKooIVRContext));
  }