@Test(groups = {"webservice"})
  public void testSubmitReportRnRWithoutFillingInactiveRegimen() throws SQLException, IOException {
    dbWrapper.insertRegimenTemplateColumnsForProgram("HIV");
    dbWrapper.insertRegimenTemplateConfiguredForProgram(
        "HIV", "ADULTS", "Regimen", "Regimen1", false);
    dbWrapper.updateFieldValue("programs", "regimenTemplateConfigured", "true", null, null);
    HttpClient client = new HttpClient();
    client.createContext();

    Report reportFromJson = readObjectFromFile(FULL_JSON_TXT_FILE_NAME, Report.class);
    reportFromJson.setAgentCode("V10");
    reportFromJson.setProgramCode("HIV");
    reportFromJson.getProducts().get(0).setProductCode("P10");
    reportFromJson.getProducts().get(0).setBeginningBalance(10);
    reportFromJson.getProducts().get(0).setQuantityDispensed(10);
    reportFromJson.getProducts().get(0).setQuantityReceived(10);

    String jsonStringFor = getJsonStringFor(reportFromJson);
    ResponseEntity responseEntity =
        client.SendJSON(
            jsonStringFor,
            "http://localhost:9091/rest-api/requisitions.json",
            POST,
            "commTrack",
            "Admin123");

    assertEquals(201, responseEntity.getStatus());
    assertTrue(responseEntity.getResponse().contains("{\"requisitionId\":"));
  }
  @Test(groups = {"webservice"})
  public void testMultipleSubmitReportForParentFacility() throws SQLException, IOException {
    dbWrapper.updateProgramsSupportedByField("startDate", "NOW()", "F10");
    HttpClient client = new HttpClient();
    client.createContext();

    Report reportFromJson = JsonUtility.readObjectFromFile(FULL_JSON_TXT_FILE_NAME, Report.class);
    reportFromJson.setAgentCode("F10");
    reportFromJson.setProgramCode("HIV");
    reportFromJson.getProducts().get(0).setProductCode("P10");

    ResponseEntity responseEntity =
        client.SendJSON(
            getJsonStringFor(reportFromJson),
            "http://localhost:9091/rest-api/requisitions.json",
            POST,
            "commTrack",
            "Admin123");

    assertEquals(201, responseEntity.getStatus());
    assertTrue(responseEntity.getResponse().contains("{\"requisitionId\":"));

    responseEntity =
        client.SendJSON(
            getJsonStringFor(reportFromJson),
            "http://localhost:9091/rest-api/requisitions.json",
            POST,
            "commTrack",
            "Admin123");
    assertEquals(400, responseEntity.getStatus());
    assertEquals("{\"error\":\"Program configuration missing\"}", responseEntity.getResponse());
  }
  @Test(groups = {"webservice"})
  public void testCommTrackSubmitReportValidRnR() throws SQLException, IOException {
    dbWrapper.deleteConfigureTemplate("HIV");
    dbWrapper.configureTemplateForCommTrack("HIV");
    dbWrapper.insertPastPeriodRequisitionAndLineItems("F10", "HIV", "Period1", "P10");
    HttpClient client = new HttpClient();
    client.createContext();

    Report reportFromJson = readObjectFromFile("CommTrackReportJson.txt", Report.class);
    reportFromJson.setAgentCode("V10");
    reportFromJson.setProgramCode("HIV");
    reportFromJson.getProducts().get(0).setProductCode("P10");
    reportFromJson.getProducts().get(0).setBeginningBalance(10);
    reportFromJson.getProducts().get(0).setQuantityDispensed(10);
    reportFromJson.getProducts().get(0).setQuantityReceived(10);

    ResponseEntity responseEntity =
        client.SendJSON(
            getJsonStringFor(reportFromJson),
            "http://localhost:9091/rest-api/requisitions.json",
            "POST",
            "commTrack",
            "Admin123");

    assertEquals(201, responseEntity.getStatus());
    assertTrue(responseEntity.getResponse().contains("{\"requisitionId\":"));
  }
  @Test(groups = {"webservice"})
  public void shouldSubmitDuplicateReport() throws IOException {
    HttpClient client = new HttpClient();
    client.createContext();

    Report reportFromJson = readObjectFromFile(FULL_JSON_TXT_FILE_NAME, Report.class);
    reportFromJson.setAgentCode("V10");
    reportFromJson.setProgramCode("HIV");
    reportFromJson.getProducts().get(0).setProductCode("P10");

    String jsonStringFor = getJsonStringFor(reportFromJson);
    client.SendJSON(
        jsonStringFor,
        "http://localhost:9091/rest-api/requisitions.json",
        POST,
        "commTrack",
        "Admin123");

    ResponseEntity responseEntity =
        client.SendJSON(
            jsonStringFor,
            "http://localhost:9091/rest-api/requisitions.json",
            POST,
            "commTrack",
            "Admin123");

    assertEquals(201, responseEntity.getStatus());
    assertTrue(responseEntity.getResponse().contains("{\"requisitionId\":"));
  }
  @Test(groups = {"webservice"})
  public void testSubmitReportMandatoryFieldsMissing() throws IOException {
    HttpClient client = new HttpClient();
    client.createContext();
    Report reportFromJson = JsonUtility.readObjectFromFile(FULL_JSON_TXT_FILE_NAME, Report.class);
    reportFromJson.setAgentCode("V10");

    ResponseEntity responseEntity =
        client.SendJSON(
            getJsonStringFor(reportFromJson),
            "http://localhost:9091/rest-api/requisitions.json",
            POST,
            "commTrack",
            "Admin123");

    assertEquals(400, responseEntity.getStatus());
    assertEquals("{\"error\":\"Missing mandatory fields\"}", responseEntity.getResponse());

    reportFromJson = JsonUtility.readObjectFromFile(FULL_JSON_TXT_FILE_NAME, Report.class);
    reportFromJson.setProgramCode("HIV");

    responseEntity =
        client.SendJSON(
            getJsonStringFor(reportFromJson),
            "http://localhost:9091/rest-api/requisitions.json",
            POST,
            "commTrack",
            "Admin123");

    assertEquals(400, responseEntity.getStatus());
    assertEquals("{\"error\":\"Missing mandatory fields\"}", responseEntity.getResponse());
  }
  @Test(groups = {"webservice"})
  public void testSubmitReportWithoutHeaders() throws IOException {
    HttpClient client = new HttpClient();
    client.createContext();
    Report reportFromJson = readObjectFromFile(FULL_JSON_TXT_FILE_NAME, Report.class);
    reportFromJson.setAgentCode("V10");
    reportFromJson.setProgramCode("HIV");

    ResponseEntity responseEntity =
        client.SendJSONWithoutHeaders(
            getJsonStringFor(reportFromJson),
            "http://localhost:9091/rest-api/requisitions.json",
            POST,
            "",
            "");
    assertEquals(401, responseEntity.getStatus());
  }
  @Test(groups = {"webserviceSmoke"})
  public void shouldReturn401StatusWhenSubmittingReportWithInvalidAPIUser() throws IOException {
    HttpClient client = new HttpClient();
    client.createContext();

    Report reportFromJson =
        JsonUtility.readObjectFromFile(MINIMUM_JSON_TXT_FILE_NAME, Report.class);
    reportFromJson.setAgentCode("V10");
    reportFromJson.setProgramCode("HIV");

    ResponseEntity responseEntity =
        client.SendJSON(
            getJsonStringFor(reportFromJson),
            "http://localhost:9091/rest-api/requisitions.json",
            POST,
            "commTrack1000",
            "Admin123");

    assertEquals(401, responseEntity.getStatus());
  }
  @Test(groups = {"webservice"})
  public void testSubmitReportWhenParentFacilityInactive() throws SQLException, IOException {
    dbWrapper.updateFieldValue("facilities", "active", "false", "code", "V10");
    HttpClient client = new HttpClient();
    client.createContext();
    Report reportFromJson = JsonUtility.readObjectFromFile(FULL_JSON_TXT_FILE_NAME, Report.class);
    reportFromJson.setAgentCode("V10");
    reportFromJson.setProgramCode("HIV");

    ResponseEntity responseEntity =
        client.SendJSON(
            getJsonStringFor(reportFromJson),
            "http://localhost:9091/rest-api/requisitions.json",
            POST,
            "commTrack",
            "Admin123");

    assertEquals(400, responseEntity.getStatus());
    assertEquals("{\"error\":\"Facility is inoperative\"}", responseEntity.getResponse());
  }
  @Test(groups = {"webservice"})
  public void testSubmitReportWhenUserWithoutRights() throws IOException, SQLException {
    dbWrapper.deleteSupervisoryRoleFromRoleAssignment();
    HttpClient client = new HttpClient();
    client.createContext();

    Report reportFromJson = readObjectFromFile(FULL_JSON_TXT_FILE_NAME, Report.class);
    reportFromJson.setAgentCode("V10");
    reportFromJson.setProgramCode("HIV");

    ResponseEntity responseEntity =
        client.SendJSON(
            getJsonStringFor(reportFromJson),
            "http://localhost:9091/rest-api/requisitions.json",
            POST,
            "commTrack",
            "Admin123");

    assertEquals(400, responseEntity.getStatus());
    assertEquals(responseEntity.getResponse(), "{\"error\":\"User does not have permission\"}");
  }
  @Test(groups = {"webservice"})
  public void testMasterTemplateValidationMissingBothMandatoryUserInputFields()
      throws SQLException, IOException {
    HttpClient client = new HttpClient();
    client.createContext();
    dbWrapper.updateConfigureTemplate("HIV", "source", "U", "true", "stockInHand");
    dbWrapper.updateConfigureTemplate("HIV", "source", "U", "true", "quantityDispensed");
    Report reportFromJson =
        JsonUtility.readObjectFromFile(MINIMUM_JSON_TXT_FILE_NAME, Report.class);
    reportFromJson.setAgentCode("V10");
    reportFromJson.setProgramCode("HIV");
    reportFromJson.getProducts().get(0).setProductCode("P10");
    reportFromJson.getProducts().get(0).setBeginningBalance(1);
    reportFromJson.getProducts().get(0).setQuantityReceived(4);
    reportFromJson.getProducts().get(0).setQuantityDispensed(null);
    reportFromJson.getProducts().get(0).setStockInHand(null);
    ResponseEntity responseEntity =
        client.SendJSON(
            getJsonStringFor(reportFromJson),
            "http://localhost:9091/rest-api/requisitions.json",
            POST,
            "commTrack",
            "Admin123");

    assertEquals(400, responseEntity.getStatus());
    assertEquals(
        "{\"error\":\"R&R has errors, please correct them to proceed.\"}",
        responseEntity.getResponse());
  }
  @Test(groups = {"webservice"})
  public void testInitiateRnrWhenProgramStartDateIsAfterCurrentDateAndInCurrentPeriod()
      throws SQLException, IOException {
    dbWrapper.updateProgramsSupportedByField("startDate", "2015-01-01", "V10");
    HttpClient client = new HttpClient();
    client.createContext();
    Report reportFromJson =
        JsonUtility.readObjectFromFile(PRODUCT_JSON_TXT_FILE_NAME, Report.class);
    reportFromJson.setAgentCode("V10");
    reportFromJson.setProgramCode("HIV");
    reportFromJson.getProducts().get(0).setProductCode("P10");
    reportFromJson.getProducts().get(0).setBeginningBalance(1);
    reportFromJson.getProducts().get(0).setQuantityDispensed(1);
    reportFromJson.getProducts().get(0).setQuantityReceived(4);
    reportFromJson.getProducts().get(0).setStockInHand(4);

    ResponseEntity responseEntity =
        client.SendJSON(
            getJsonStringFor(reportFromJson),
            "http://localhost:9091/rest-api/requisitions.json",
            POST,
            "commTrack",
            "Admin123");

    assertEquals(201, responseEntity.getStatus());
    assertTrue(responseEntity.getResponse().contains("{\"requisitionId\":"));
  }
  @Test(groups = {"webservice"})
  public void testProductNotAvailableAtFacilitySubmitReport() throws SQLException, IOException {
    dbWrapper.deleteProductAvailableAtFacility("P10", "HIV", "V10");
    HttpClient client = new HttpClient();
    client.createContext();

    Report reportFromJson = JsonUtility.readObjectFromFile(FULL_JSON_TXT_FILE_NAME, Report.class);
    reportFromJson.setAgentCode("V10");
    reportFromJson.setProgramCode("HIV");
    reportFromJson.getProducts().get(0).setProductCode("P10");

    ResponseEntity responseEntity =
        client.SendJSON(
            getJsonStringFor(reportFromJson),
            "http://localhost:9091/rest-api/requisitions.json",
            POST,
            "commTrack",
            "Admin123");

    assertEquals(400, responseEntity.getStatus());
    assertEquals("{\"error\":\"Invalid product codes [P10]\"}", responseEntity.getResponse());
  }
  @Test(groups = {"webservice"})
  public void testInitiateRnrWhenCurrentPeriodNotDefined() throws IOException, SQLException {
    dbWrapper.deleteCurrentPeriod();
    HttpClient client = new HttpClient();
    client.createContext();
    Report reportFromJson =
        JsonUtility.readObjectFromFile(PRODUCT_JSON_TXT_FILE_NAME, Report.class);
    reportFromJson.setAgentCode("V10");
    reportFromJson.setProgramCode("HIV");
    reportFromJson.getProducts().get(0).setProductCode("P10");

    ResponseEntity responseEntity =
        client.SendJSON(
            getJsonStringFor(reportFromJson),
            "http://localhost:9091/rest-api/requisitions.json",
            POST,
            "commTrack",
            "Admin123");

    assertEquals(400, responseEntity.getStatus());
    assertEquals(responseEntity.getResponse(), "{\"error\":\"Program configuration missing\"}");
  }
  @Test(groups = {"webservice"})
  public void testSubmitReportWhenTemplateNotConfigured() throws SQLException, IOException {
    dbWrapper.deleteTable("program_rnr_columns");
    HttpClient client = new HttpClient();
    client.createContext();
    Report reportFromJson = JsonUtility.readObjectFromFile(FULL_JSON_TXT_FILE_NAME, Report.class);
    reportFromJson.setAgentCode("V10");
    reportFromJson.setProgramCode("HIV");

    ResponseEntity responseEntity =
        client.SendJSON(
            getJsonStringFor(reportFromJson),
            "http://localhost:9091/rest-api/requisitions.json",
            POST,
            "commTrack",
            "Admin123");

    assertEquals(400, responseEntity.getStatus());
    assertEquals(
        "{\"error\":\"Please contact admin to define R&R template for this program\"}",
        responseEntity.getResponse());
  }
  @Test(groups = {"webservice"})
  public void testPreviousPeriodSubmitReportForParentFacility() throws IOException {
    HttpClient client = new HttpClient();
    client.createContext();

    Report reportFromJson = JsonUtility.readObjectFromFile(FULL_JSON_TXT_FILE_NAME, Report.class);
    reportFromJson.setAgentCode("F10");
    reportFromJson.setProgramCode("HIV");
    reportFromJson.getProducts().get(0).setProductCode("P10");

    ResponseEntity responseEntity =
        client.SendJSON(
            getJsonStringFor(reportFromJson),
            "http://localhost:9091/rest-api/requisitions.json",
            POST,
            "commTrack",
            "Admin123");

    assertEquals(400, responseEntity.getStatus());
    assertEquals(
        "{\"error\":\"Please finish all R&R of previous period(s)\"}",
        responseEntity.getResponse());
  }
  @Test(groups = {"webservice"})
  public void testInitiateRnrWhenProgramStartDateIsAfterCurrentDateAndCurrentPeriodEndDate()
      throws SQLException, IOException {
    dbWrapper.insertProcessingPeriod("future", "future period", "2016-01-30", "2017-01-30", 1, "M");
    dbWrapper.updateProgramsSupportedByField("startDate", "2017-01-01", "V10");
    HttpClient client = new HttpClient();
    client.createContext();
    Report reportFromJson =
        JsonUtility.readObjectFromFile(PRODUCT_JSON_TXT_FILE_NAME, Report.class);
    reportFromJson.setAgentCode("V10");
    reportFromJson.setProgramCode("HIV");
    reportFromJson.getProducts().get(0).setProductCode("P10");

    ResponseEntity responseEntity =
        client.SendJSON(
            getJsonStringFor(reportFromJson),
            "http://localhost:9091/rest-api/requisitions.json",
            POST,
            "commTrack",
            "Admin123");

    assertEquals(400, responseEntity.getStatus());
    assertEquals(responseEntity.getResponse(), "{\"error\":\"Program configuration missing\"}");
  }