public void shouldUploadEditThenCompleteDocument()

in component-test/src/main/java/org/apache/fineract/cn/customer/TestDocuments.java [80:201]


  public void shouldUploadEditThenCompleteDocument() throws InterruptedException, IOException {
    logger.info("Prepare test");
    final Customer customer = CustomerGenerator.createRandomCustomer();
    customerManager.createCustomer(customer);
    Assert.assertTrue(eventRecorder.wait(CustomerEventConstants.POST_CUSTOMER, customer.getIdentifier()));


    logger.info("Check that document \"stub\" can be created");
    final CustomerDocument customerDocument = CustomerDocumentGenerator.createRandomCustomerDocument();
    customerDocumentsManager.createDocument(customer.getIdentifier(), customerDocument.getIdentifier(), customerDocument);
    Assert.assertTrue(eventRecorder.wait(CustomerEventConstants.POST_DOCUMENT,
        new DocumentEvent(customer.getIdentifier(), customerDocument.getIdentifier())));

    final CustomerDocument createdCustomerDocument = customerDocumentsManager.getDocument(
        customer.getIdentifier(), customerDocument.getIdentifier());
    Assert.assertEquals(customerDocument, createdCustomerDocument);


    logger.info("Check that pages can be created");
    for (int i = 0; i < 10; i++) {
      createDocumentPage(customer.getIdentifier(), customerDocument.getIdentifier(), i);
    }

    List<Integer> pageNumbers = customerDocumentsManager.getDocumentPageNumbers(
        customer.getIdentifier(), customerDocument.getIdentifier());
    final List<Integer> expectedPageNumbers = IntStream.range(0, 10).boxed().collect(Collectors.toList());
    Assert.assertEquals(expectedPageNumbers, pageNumbers);


    logger.info("Check that a page can be deleted");
    customerDocumentsManager.deleteDocumentPage(customer.getIdentifier(), customerDocument.getIdentifier(), 9);
    Assert.assertTrue(eventRecorder.wait(CustomerEventConstants.DELETE_DOCUMENT_PAGE,
        new DocumentPageEvent(customer.getIdentifier(), customerDocument.getIdentifier(), 9)));

    final List<Integer> changedPageNumbers = customerDocumentsManager.getDocumentPageNumbers(
        customer.getIdentifier(), customerDocument.getIdentifier());
    final List<Integer> changedExpectedPageNumbers = IntStream.range(0, 9).boxed().collect(Collectors.toList());
    Assert.assertEquals(changedExpectedPageNumbers, changedPageNumbers);

    try {
      customerDocumentsManager.getDocumentPage(customer.getIdentifier(), customerDocument.getIdentifier(), 9);
      Assert.fail("Getting the 9th document page should throw a NotFoundException after the 9th page was removed.");
    }
    catch (final NotFoundException ignored) {}


    logger.info("Check that a document which is missing pages cannot be completed");
    customerDocumentsManager.deleteDocumentPage(customer.getIdentifier(), customerDocument.getIdentifier(), 2);
    Assert.assertTrue(eventRecorder.wait(CustomerEventConstants.DELETE_DOCUMENT_PAGE,
        new DocumentPageEvent(customer.getIdentifier(), customerDocument.getIdentifier(), 2)));

    try {
      customerDocumentsManager.completeDocument(customer.getIdentifier(), customerDocument.getIdentifier(), true);
      Assert.fail("It shouldn't be possible to complete a document with missing pages.");
    }
    catch (final DocumentValidationException ignored) {}

    createDocumentPage(customer.getIdentifier(), customerDocument.getIdentifier(), 2);


    logger.info("Check that a document's description can be changed.");
    customerDocument.setDescription("new description");
    customerDocumentsManager.changeDocument(customer.getIdentifier(), customerDocument.getIdentifier(), customerDocument);
    Assert.assertTrue(eventRecorder.wait(CustomerEventConstants.PUT_DOCUMENT,
        new DocumentEvent(customer.getIdentifier(), customerDocument.getIdentifier())));

    {
      final CustomerDocument changedCustomerDocument = customerDocumentsManager.getDocument(customer.getIdentifier(), customerDocument.getIdentifier());
      Assert.assertEquals(customerDocument, changedCustomerDocument);
    }


    logger.info("Check that a valid document can be completed");
    final TimeStampChecker timeStampChecker = TimeStampChecker.roughlyNow();
    customerDocumentsManager.completeDocument(customer.getIdentifier(), customerDocument.getIdentifier(), true);
    Assert.assertTrue(eventRecorder.wait(CustomerEventConstants.POST_DOCUMENT_COMPLETE,
        new DocumentEvent(customer.getIdentifier(), customerDocument.getIdentifier())));

    final CustomerDocument completedDocument = customerDocumentsManager.getDocument(
        customer.getIdentifier(), customerDocument.getIdentifier());
    Assert.assertEquals(true, completedDocument.isCompleted());
    timeStampChecker.assertCorrect(completedDocument.getCreatedOn());


    logger.info("Check that document can't be changed or removed after completion");
    try {
      createDocumentPage(customer.getIdentifier(), customerDocument.getIdentifier(), 9);
      Assert.fail("Adding another page after the document is completed shouldn't be possible.");
    }
    catch (final CompletedDocumentCannotBeChangedException ignored) {}
    try {
      customerDocumentsManager.deleteDocumentPage(customer.getIdentifier(), customerDocument.getIdentifier(), 8);
      Assert.fail("Deleting a page after the document is completed shouldn't be possible.");
    }
    catch (final CompletedDocumentCannotBeChangedException ignored) {}
    try {
      customerDocumentsManager.changeDocument(customer.getIdentifier(), customerDocument.getIdentifier(), customerDocument);
      Assert.fail("Changing a document after it is completed shouldn't be possible.");
    }
    catch (final CompletedDocumentCannotBeChangedException ignored) {}
    try {
      customerDocumentsManager.deleteDocument(customer.getIdentifier(), customerDocument.getIdentifier());
      Assert.fail("Changing a document after it is completed shouldn't be possible.");
    }
    catch (final CompletedDocumentCannotBeChangedException ignored) {}


    logger.info("Check that document can't be uncompleted");
    try {
      customerDocumentsManager.completeDocument(customer.getIdentifier(), customerDocument.getIdentifier(), false);
      Assert.fail("It shouldn't be possible to change a document from completed to uncompleted.");
    }
    catch (final CompletedDocumentCannotBeChangedException ignored) {}


    logger.info("Check that document is in the list");
    final List<CustomerDocument> documents = customerDocumentsManager.getDocuments(customer.getIdentifier());
    final boolean documentIsInList = documents.stream().anyMatch(x ->
        (x.getIdentifier().equals(customerDocument.getIdentifier())) &&
            (x.isCompleted()));
    Assert.assertTrue("The document we just completed should be in the list", documentIsInList);
  }