@Test
  public void testHomeFolderDeleteEvent() throws CvqException {

    FakeHomeFolder fake = new FakeHomeFolder(false);

    SecurityContext.setCurrentSite(localAuthorityName, SecurityContext.FRONT_OFFICE_CONTEXT);
    SecurityContext.setCurrentEcitizen(fake.responsibleId);

    DocumentType documentType =
        documentTypeService.getDocumentTypeByType(IDocumentTypeService.ADOPTION_JUDGMENT_TYPE);

    Document document = BusinessObjectsFactory.gimmeDocument("", null, null, documentType);
    document.setHomeFolderId(fake.id);
    documentService.create(document);

    continueWithNewTransaction();

    SecurityContext.setCurrentSite(localAuthorityName, SecurityContext.BACK_OFFICE_CONTEXT);
    SecurityContext.setCurrentAgent(agentNameWithCategoriesRoles);

    userWorkflowService.delete(fake.id);

    continueWithNewTransaction();

    List<Document> documents = documentService.getHomeFolderDocuments(fake.id, -1);
    assertTrue(documents.isEmpty());
  }
  @Test
  public void mergeImageToPdf() throws CvqException, IOException {
    SecurityContext.setCurrentSite(localAuthorityName, SecurityContext.ADMIN_CONTEXT);

    Long docId = gimmeImageDocument();
    documentService.mergeDocumentBinary(documentService.getById(docId));

    // test
    Document doc = documentService.getById(docId);
    assertEquals("The merge didn't work", 1, doc.getDatas().size());
    assertEquals(
        "The content type is not available",
        ContentType.PDF,
        doc.getDatas().get(0).getContentType());
  }
  @Test
  public void testCreate() throws CvqException {

    SecurityContext.setCurrentSite(localAuthorityName, SecurityContext.FRONT_OFFICE_CONTEXT);
    SecurityContext.setCurrentEcitizen(fake.responsibleId);

    continueWithNewTransaction();

    Individual individual = userSearchService.getHomeFolderResponsible(fake.id);
    DocumentType documentType =
        documentTypeService.getDocumentTypeByType(IDocumentTypeService.ADOPTION_JUDGMENT_TYPE);

    Document document = BusinessObjectsFactory.gimmeDocument("", null, null, documentType);
    document.setHomeFolderId(fake.id);
    document.setIndividualId(new Long(individual.getId().longValue()));
    documentService.create(document);
    Long documentId = document.getId();

    try {
      documentService.check(documentId, null);
      fail("should have thrown an exception");
    } catch (PermissionException pe) {
      // that was expected
    }

    document = BusinessObjectsFactory.gimmeDocument("", null, null, documentType);
    document.setHomeFolderId(Long.valueOf("0"));
    try {
      documentService.create(document);
      fail("should have thrown an exception");
    } catch (PermissionException pe) {
      // that was expected
    }

    continueWithNewTransaction();

    SecurityContext.setCurrentSite(localAuthorityName, SecurityContext.BACK_OFFICE_CONTEXT);
    SecurityContext.setCurrentAgent(agentNameWithCategoriesRoles);

    documentService.check(documentId, null);
    documentService.getById(documentId);
  }
 protected void completeValidateAndDelete(TicketBookingRequest request)
     throws CvqException, IOException {
   // add a document to the request
   ///////////////////////////////
   Document doc = new Document();
   doc.setEcitizenNote("Ma carte d'identité !");
   doc.setDepositOrigin(DepositOrigin.ECITIZEN);
   doc.setDepositType(DepositType.PC);
   doc.setHomeFolderId(request.getHomeFolderId());
   doc.setIndividualId(request.getRequesterId());
   doc.setDocumentType(
       documentTypeService.getDocumentTypeByType(IDocumentTypeService.IDENTITY_RECEIPT_TYPE));
   Long documentId = documentService.create(doc);
   requestDocumentService.addDocument(request.getId(), documentId);
   Set<RequestDocument> documentsSet =
       requestDocumentService.getAssociatedDocuments(request.getId());
   assertEquals(documentsSet.size(), 1);
   // FIXME : test list of pending / in-progress registrations
   Critere testCrit = new Critere();
   testCrit.setAttribut(Request.SEARCH_BY_HOME_FOLDER_ID);
   testCrit.setComparatif(Critere.EQUALS);
   testCrit.setValue(request.getHomeFolderId());
   Set<Critere> testCritSet = new HashSet<Critere>();
   testCritSet.add(testCrit);
   List<Request> allRequests = requestSearchService.get(testCritSet, null, null, -1, 0, false);
   assertNotNull(allRequests);
   // close current session and re-open a new one
   continueWithNewTransaction();
   SecurityContext.setCurrentSite(localAuthorityName, SecurityContext.BACK_OFFICE_CONTEXT);
   SecurityContext.setCurrentAgent(agentNameWithCategoriesRoles);
   requestWorkflowService.updateRequestState(request.getId(), RequestState.COMPLETE, null);
   requestWorkflowService.updateRequestState(request.getId(), RequestState.VALIDATED, null);
   // close current session and re-open a new one
   continueWithNewTransaction();
   byte[] generatedCertificate =
       requestSearchService.getCertificate(request.getId(), RequestState.PENDING);
   if (generatedCertificate == null) fail("No certificate found");
   //     Write tele-service xml data file
   File xmlFile = File.createTempFile("tmp" + request.getId(), ".xml");
   FileOutputStream xmlFos = new FileOutputStream(xmlFile);
   xmlFos.write(requestSearchService.getById(request.getId(), true).modelToXmlString().getBytes());
   File file = File.createTempFile("tmp" + request.getId(), ".pdf");
   FileOutputStream fos = new FileOutputStream(file);
   fos.write(generatedCertificate);
   // close current session and re-open a new one
   continueWithNewTransaction();
   // delete request
   requestWorkflowService.delete(request.getId());
 }
  @Test
  public void testMergeBinariesToPdf()
      throws CvqObjectNotFoundException, CvqException, IOException {

    SecurityContext.setCurrentSite(localAuthorityName, SecurityContext.FRONT_OFFICE_CONTEXT);

    // create document
    DocumentType docType =
        documentTypeService.getDocumentTypeByType(IDocumentTypeService.IDENTITY_RECEIPT_TYPE);
    Document doc = BusinessObjectsFactory.gimmeDocument("", null, null, docType);
    Long docId = documentService.create(doc);

    // first : add binaries encrypted

    File filePdf = getResourceFile("encrypted.pdf");
    byte[] dataPdf = new byte[(int) filePdf.length()];
    FileInputStream fis = new FileInputStream(filePdf);
    fis.read(dataPdf);
    try {
      documentService.addPage(docId, dataPdf);
    } catch (CvqModelException cme) {
      fail("thrown cvq model exception : " + cme.getI18nKey());
    }

    try {
      documentService.addPage(docId, dataPdf);
    } catch (CvqModelException cme) {
      fail("thrown cvq model exception : " + cme.getI18nKey());
    }

    continueWithNewTransaction();

    SecurityContext.setCurrentSite(localAuthorityName, SecurityContext.BACK_OFFICE_CONTEXT);
    SecurityContext.setCurrentAgent(agentNameWithCategoriesRoles);

    // change state of doc
    documentService.updateDocumentState(docId, DocumentState.VALIDATED, null, null);

    continueWithNewTransaction();

    // tests
    doc = documentService.getById(docId);
    assertEquals("The merge worked whereas the binaries were encrypted", 2, doc.getDatas().size());

    // remove all binaries from document
    doc.getDatas().clear();

    // second : add pdf binaries not encrypted
    try {
      documentService.addPage(docId, getPdfDocumentBinary());
    } catch (CvqModelException cme) {
      fail("thrown cvq model exception : " + cme.getI18nKey());
    }
    try {
      documentService.addPage(docId, getPdfDocumentBinary());
    } catch (CvqModelException cme) {
      fail("thrown cvq model exception : " + cme.getI18nKey());
    }

    continueWithNewTransaction();

    SecurityContext.setCurrentSite(localAuthorityName, SecurityContext.BACK_OFFICE_CONTEXT);
    SecurityContext.setCurrentAgent(agentNameWithCategoriesRoles);

    // change state of doc
    documentService.updateDocumentState(docId, DocumentState.VALIDATED, null, null);

    continueWithNewTransaction();

    // tests
    doc = documentService.getById(docId);
    assertEquals("The merge didn't work", 1, doc.getDatas().size());
    assertEquals(
        "Content type is not equal to PDF",
        ContentType.PDF,
        doc.getDatas().get(0).getContentType());

    // remove all binaries from document
    doc.getDatas().clear();

    // third : add image binary
    filePdf = getResourceFile("test.jpg");
    dataPdf = new byte[(int) filePdf.length()];
    fis = new FileInputStream(filePdf);
    fis.read(dataPdf);
    try {
      documentService.addPage(docId, dataPdf);
    } catch (CvqModelException cme) {
      fail("thrown cvq model exception : " + cme.getI18nKey());
    }

    try {
      documentService.addPage(docId, dataPdf);
    } catch (CvqModelException cme) {
      fail("thrown cvq model exception : " + cme.getI18nKey());
    }

    continueWithNewTransaction();

    SecurityContext.setCurrentSite(localAuthorityName, SecurityContext.ADMIN_CONTEXT);

    // change state of doc
    documentService.mergeDocumentBinary(documentService.getById(docId));

    continueWithNewTransaction();

    // tests
    doc = documentService.getById(docId);
    assertEquals("The merge didn't work", 1, doc.getDatas().size());
    assertEquals(
        "Content type is not equal to PDF",
        ContentType.PDF,
        doc.getDatas().get(0).getContentType());
  }
  @Test
  public void testAll() throws CvqException, java.io.IOException, java.io.FileNotFoundException {

    SecurityContext.setCurrentSite(localAuthorityName, SecurityContext.FRONT_OFFICE_CONTEXT);

    // ensure document digitalization is enabled
    assertTrue(SecurityContext.getCurrentSite().isDocumentDigitalizationEnabled());

    // ensure document types have been bootstrapped
    List<DocumentType> allDocumentTypes = documentTypeService.getAllDocumentTypes();
    assertTrue(allDocumentTypes.size() > 0);

    SecurityContext.setCurrentEcitizen(fake.responsibleId);

    Individual anIndividual = userSearchService.getAdults(fake.id).get(0);

    // create a document
    Document doc =
        BusinessObjectsFactory.gimmeDocument(
            "",
            DepositOrigin.ECITIZEN,
            DepositType.PC,
            documentTypeService.getDocumentTypeByType(IDocumentTypeService.IDENTITY_RECEIPT_TYPE));
    doc.setDepositId(anIndividual.getId());
    doc.setHomeFolderId(fake.id);
    doc.setIndividualId(anIndividual.getId());
    Long docId = documentService.create(doc);

    // add binary data
    try {
      documentService.addPage(docId, getImageDocumentBinary());
    } catch (CvqModelException cme) {
      fail("thrown cvq model exception : " + cme.getI18nKey());
    }

    // and another one ...
    try {
      documentService.addPage(docId, getImageDocumentBinary());
    } catch (CvqModelException cme) {
      fail("thrown cvq model exception : " + cme.getI18nKey());
    }

    continueWithNewTransaction();

    // check the document and its two binary have been successfully added ...
    // ... to the home folder
    List<Document> documentsList = documentService.getHomeFolderDocuments(fake.id, -1);
    assertEquals("Bad number of associated documents on home folder", 1, documentsList.size());
    List<DocumentBinary> docBinarys = documentService.getById(docId).getDatas();
    assertEquals("Bad number of associated data on document", 2, doc.getDatas().size());

    // ... and to the individual
    documentsList = documentService.getIndividualDocuments(anIndividual.getId());
    assertEquals("Bad number of associated documents on individual", 1, documentsList.size());
    try {
      documentsList = documentService.getIndividualDocuments(new Long(0));
      fail("should have thrown an exception");
    } catch (PermissionException pe) {
      // that was expected
    }

    // modify a page
    try {
      documentService.modifyPage(docId, 0, getImageDocumentBinary());
    } catch (CvqModelException cme) {
      fail("thrown cvq model exception : " + cme.getI18nKey());
    }

    // remove a page
    doc.getDatas().remove(1);
    assertEquals("Bad number of associated data on document", 1, doc.getDatas().size());
    assertNotNull("Could find page", doc.getDatas().get(0));

    // try to retrieve the list of identity pieces for home folder
    DocumentType docType =
        documentTypeService.getDocumentTypeByType(IDocumentTypeService.IDENTITY_RECEIPT_TYPE);
    documentsList = documentService.getProvidedDocuments(docType, fake.id, null);
    assertEquals("Bad number of docs for home folder (1)", 1, documentsList.size());
    // and try other successful and unsuccessful searches among provided documents
    documentsList = documentService.getProvidedDocuments(docType, fake.id, anIndividual.getId());
    assertEquals("Bad number of docs for home folder and individual", 1, documentsList.size());
    docType =
        documentTypeService.getDocumentTypeByType(IDocumentTypeService.MEDICAL_CERTIFICATE_TYPE);
    documentsList = documentService.getProvidedDocuments(docType, fake.id, null);
    assertEquals("Bad number of docs for home folder (2)", 0, documentsList.size());

    // test end validity durations by creating different sort of doc types
    // based on example data from $BASE_DIR/db/init_ref_data.sql

    // ... a permanently durable
    doc =
        BusinessObjectsFactory.gimmeDocument(
            "",
            DepositOrigin.ECITIZEN,
            DepositType.PC,
            documentTypeService.getDocumentTypeByType(IDocumentTypeService.IDENTITY_RECEIPT_TYPE));
    doc.setDepositId(anIndividual.getId());
    doc.setHomeFolderId(fake.id);
    doc.setIndividualId(anIndividual.getId());
    documentService.create(doc);

    // ... a 3-year valid
    doc =
        BusinessObjectsFactory.gimmeDocument(
            "",
            DepositOrigin.ECITIZEN,
            DepositType.PC,
            documentTypeService.getDocumentTypeByType(IDocumentTypeService.DOMICILE_RECEIPT_TYPE));
    doc.setDepositId(anIndividual.getId());
    doc.setHomeFolderId(fake.id);
    documentService.create(doc);

    // ... a 2-month valid
    doc =
        BusinessObjectsFactory.gimmeDocument(
            "",
            DepositOrigin.ECITIZEN,
            DepositType.PC,
            documentTypeService.getDocumentTypeByType(
                IDocumentTypeService.ID_CARD_LOSS_DECLARATION_TYPE));
    doc.setDepositId(anIndividual.getId());
    doc.setHomeFolderId(fake.id);
    Long docId3 = documentService.create(doc);

    // ... an end-of-the-year valid
    doc = new Document();
    doc.setDepositId(anIndividual.getId());
    doc.setDepositOrigin(DepositOrigin.ECITIZEN);
    doc.setDepositType(DepositType.PC);
    doc.setDocumentType(
        documentTypeService.getDocumentTypeByType(IDocumentTypeService.TAXES_NOTIFICATION_TYPE));
    doc.setHomeFolderId(fake.id);
    Long docId4 = documentService.create(doc);

    // ... an end-of-the-school-year valid
    doc =
        BusinessObjectsFactory.gimmeDocument(
            "",
            DepositOrigin.ECITIZEN,
            DepositType.PC,
            documentTypeService.getDocumentTypeByType(
                IDocumentTypeService.VACATING_CERTIFICATE_TYPE));
    doc.setDepositId(anIndividual.getId());
    doc.setHomeFolderId(fake.id);
    documentService.create(doc);

    // delete a document
    documentService.delete(docId3);

    continueWithNewTransaction();

    // test modifications on a document
    Document docToModify = documentService.getById(docId4);
    doc.setDepositType(DepositType.TERMINAL);
    doc.setAgentNote("Quelle belle PJ");
    Calendar calendar = new GregorianCalendar();
    Date currentDate = new Date();
    calendar.setTime(currentDate);
    calendar.add(Calendar.MONTH, 3);
    doc.setEndValidityDate(calendar.getTime());
    documentService.modify(docToModify);
    docToModify = documentService.getById(docId4);
    assertNotNull("Argh, where my f****** document has gone ??!");
    assertEquals(doc.getAgentNote(), "Quelle belle PJ");

    // hmm ? just a test :-)
    try {
      documentService.modify(null);
      fail("should have thrown an exception");
    } catch (PermissionException pe) {
      // that was expected
    }

    // retrieve all known document types
    allDocumentTypes = documentTypeService.getAllDocumentTypes();
    assertNotNull(allDocumentTypes);

    SecurityContext.setCurrentEcitizen(fake.responsibleId);
    int count = documentService.searchCount(null);
    assertNotSame(count, 0);

    List<Document> docs = new ArrayList<Document>();
    Hashtable<String, Object> params = new Hashtable<String, Object>();
    params.put(
        "documentType",
        documentTypeService.getDocumentTypeByType(IDocumentTypeService.TAXES_NOTIFICATION_TYPE));

    docs = documentService.search(params, -1, -1);
    assertNotSame(docs.size(), 0);

    params = new Hashtable<String, Object>();
    params.put("homeFolderId", fake.id);

    count = documentService.searchCount(params);
    docs = documentService.search(params, -1, -1);
    assertEquals(docs.size(), count);
  }
  @Test
  public void testDocumentAddPage() throws CvqException, IOException {

    SecurityContext.setCurrentSite(localAuthorityName, SecurityContext.FRONT_OFFICE_CONTEXT);

    // create document
    DocumentType docType =
        documentTypeService.getDocumentTypeByType(IDocumentTypeService.IDENTITY_RECEIPT_TYPE);
    Document doc = BusinessObjectsFactory.gimmeDocument("", null, null, docType);
    Long docId = documentService.create(doc);

    continueWithNewTransaction();

    // first : add binaries with allowed content type (image)
    try {
      documentService.addPage(docId, getImageDocumentBinary());
    } catch (CvqModelException cme) {
      fail("thrown cvq model exception : " + cme.getI18nKey());
    }
    try {
      documentService.addPage(docId, getImageDocumentBinary());
    } catch (CvqModelException cme) {
      fail("thrown cvq model exception : " + cme.getI18nKey());
    }

    continueWithNewTransaction();

    // tests
    doc = documentService.getById(docId);
    assertEquals("There was a problem during add page to document", 2, doc.getDatas().size());
    assertEquals(
        "Problems with the content type of binaries",
        ContentType.JPEG,
        doc.getDatas().get(0).getContentType());

    // remove all binarie from document
    doc.getDatas().clear();
    assertEquals("There are binaries in document", true, doc.getDatas().isEmpty());

    continueWithNewTransaction();

    // second : add binaries with allowed content type (pdf)
    try {
      documentService.addPage(docId, getPdfDocumentBinary());
    } catch (CvqModelException cme) {
      fail("thrown cvq model exception : " + cme.getI18nKey());
    }
    try {
      documentService.addPage(docId, getPdfDocumentBinary());
    } catch (CvqModelException cme) {
      fail("thrown cvq model exception : " + cme.getI18nKey());
    }

    continueWithNewTransaction();

    // tests
    doc = documentService.getById(docId);
    assertEquals("There was a problem during add page to document", 2, doc.getDatas().size());
    assertEquals(
        "Problems with the content type of binaries",
        ContentType.PDF,
        doc.getDatas().get(0).getContentType());

    continueWithNewTransaction();

    // third : add a binary with a content type allowed but different from binaries in document
    try {
      documentService.addPage(docId, getImageDocumentBinary());
      fail("We must have an error");
    } catch (CvqModelException cme) {
      // that was expected
    }

    continueWithNewTransaction();

    // tests
    doc = documentService.getById(docId);
    assertEquals(
        "The binary was added whereas it haven't a good content type", 2, doc.getDatas().size());

    continueWithNewTransaction();

    // fourth : add a binary with content type not allowed
    try {
      documentService.addPage(docId, getBadTypeDocumentBinary());
      fail("We must have an error");
    } catch (CvqModelException cme) {
      // that was expected
    }

    continueWithNewTransaction();

    // tests
    doc = documentService.getById(docId);
    assertEquals(
        "The binary was added whereas it haven't a good content type", 2, doc.getDatas().size());

    continueWithNewTransaction();

    // fifth : test if the preview has been created for all binaries
    for (DocumentBinary bin : doc.getDatas()) {
      assertNotNull("The preview is not created", bin.getPreview());
    }
  }
  @Test
  public void testUnauthenticatedUseCases() throws CvqException, IOException {

    SecurityContext.setCurrentSite(localAuthorityName, SecurityContext.FRONT_OFFICE_CONTEXT);

    DocumentType documentType =
        documentTypeService.getDocumentTypeByType(IDocumentTypeService.ADOPTION_JUDGMENT_TYPE);
    Document document = new Document(null, "coucou", documentType, DocumentState.PENDING);
    documentService.create(document);

    continueWithNewTransaction();

    document = documentService.getById(document.getId());
    assertEquals("coucou", document.getEcitizenNote());

    document.setEcitizenNote("hello buddy");
    documentService.modify(document);

    continueWithNewTransaction();

    document = documentService.getById(document.getId());
    assertEquals("hello buddy", document.getEcitizenNote());

    try {
      documentService.addPage(document.getId(), getImageDocumentBinary());
    } catch (CvqModelException cme) {
      fail("thrown cvq model exception : " + cme.getI18nKey());
    }

    continueWithNewTransaction();

    document = documentService.getById(document.getId());
    try {
      documentService.modifyPage(document.getId(), 0, new byte[] {});
    } catch (CvqModelException cme) {
      fail("thrown cvq model exception : " + cme.getI18nKey());
    }

    continueWithNewTransaction();

    document = documentService.getById(document.getId());
    assertEquals(1, document.getDatas().size());

    documentService.deletePage(document.getId(), 0);

    continueWithNewTransaction();

    document = documentService.getById(document.getId());
    assertEquals(0, document.getDatas().size());

    documentService.delete(document.getId());

    continueWithNewTransaction();
    // TODO: test deletion
  }