blob: 46adfa69e0405f419872a3b9c51413a2b03272cc [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.fineract.cn.customer;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.fineract.cn.api.util.NotFoundException;
import org.apache.fineract.cn.customer.api.v1.CustomerEventConstants;
import org.apache.fineract.cn.customer.api.v1.client.CompletedDocumentCannotBeChangedException;
import org.apache.fineract.cn.customer.api.v1.client.DocumentValidationException;
import org.apache.fineract.cn.customer.api.v1.domain.Customer;
import org.apache.fineract.cn.customer.api.v1.domain.CustomerDocument;
import org.apache.fineract.cn.customer.api.v1.events.DocumentEvent;
import org.apache.fineract.cn.customer.api.v1.events.DocumentPageEvent;
import org.apache.fineract.cn.customer.util.CustomerDocumentGenerator;
import org.apache.fineract.cn.customer.util.CustomerGenerator;
import org.apache.fineract.cn.test.domain.TimeStampChecker;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.http.MediaType;
import org.springframework.mock.web.MockMultipartFile;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
/**
* @author Myrle Krantz
*/
public class TestDocuments extends AbstractCustomerTest {
@Test
public void shouldUploadThenDeleteInCompleteDocument() throws InterruptedException, IOException {
logger.info("Prepare test");
final Customer customer = CustomerGenerator.createRandomCustomer();
customerManager.createCustomer(customer);
Assert.assertTrue(eventRecorder.wait(CustomerEventConstants.POST_CUSTOMER, customer.getIdentifier()));
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())));
for (int i = 0; i < 5; i++) {
createDocumentPage(customer.getIdentifier(), customerDocument.getIdentifier(), i);
}
logger.info("Delete document");
customerDocumentsManager.deleteDocument(customer.getIdentifier(), customerDocument.getIdentifier());
Assert.assertTrue(eventRecorder.wait(CustomerEventConstants.DELETE_DOCUMENT,
new DocumentEvent(customer.getIdentifier(), customerDocument.getIdentifier())));
try {
customerDocumentsManager.getDocument(customer.getIdentifier(), customerDocument.getIdentifier());
Assert.fail("Deleted document should not be findable");
}
catch (final NotFoundException ignored) {}
final List<CustomerDocument> customersDocuments = customerDocumentsManager.getDocuments(customer.getIdentifier());
Assert.assertFalse(customersDocuments.contains(customerDocument));
}
@Test
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);
}
private void createDocumentPage(
final String customerIdentifier,
final String documentIdentifier,
final int pageNumber) throws InterruptedException, IOException {
final MockMultipartFile page = new MockMultipartFile(
"page",
"test.png",
MediaType.IMAGE_PNG_VALUE,
RandomStringUtils.randomAlphanumeric(20).getBytes());
customerDocumentsManager.createDocumentPage(customerIdentifier, documentIdentifier, pageNumber, page);
eventRecorder.wait(CustomerEventConstants.POST_DOCUMENT_PAGE,
new DocumentPageEvent(customerIdentifier, documentIdentifier, pageNumber));
Thread.sleep(100);
final byte[] uploadedPage = customerDocumentsManager.getDocumentPage(customerIdentifier, documentIdentifier, pageNumber);
Assert.assertTrue("Page " + pageNumber, Arrays.equals(page.getBytes(), uploadedPage));
}
}