/* * (C) Copyright 2014 Nuxeo SA (http://nuxeo.com/) and others. * * Licensed 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. * * Contributors: * <a href="mailto:grenard@nuxeo.com">Guillaume</a> */ package org.nuxeo.ecm.collections.core.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.List; import org.junit.Test; import org.nuxeo.ecm.collections.core.adapter.Collection; import org.nuxeo.ecm.collections.core.adapter.CollectionMember; import org.nuxeo.ecm.core.api.DocumentModel; import org.nuxeo.ecm.core.api.DocumentRef; import org.nuxeo.ecm.core.api.PathRef; import org.nuxeo.ecm.core.api.VersioningOption; /** * @since 5.9.3 */ public class CollectionAddRemoveTest extends CollectionTestCase { @Test public void testAddOneDocToNewCollectionAndRemove() throws Exception { DocumentModel testWorkspace = session.createDocumentModel("/default-domain/workspaces", "testWorkspace", "Workspace"); testWorkspace = session.createDocument(testWorkspace); DocumentModel testFile = session.createDocumentModel(testWorkspace.getPathAsString(), TEST_FILE_NAME, "File"); testFile = session.createDocument(testFile); collectionManager.addToNewCollection(COLLECTION_NAME, COLLECTION_DESCRIPTION, testFile, session); assertTrue(session.exists(new PathRef(COLLECTION_FOLDER_PATH))); final String newlyCreatedCollectionPath = COLLECTION_FOLDER_PATH + "/" + COLLECTION_NAME; DocumentRef newCollectionRef = new PathRef(newlyCreatedCollectionPath); assertTrue(session.exists(newCollectionRef)); DocumentModel newlyCreatedCollection = session.getDocument(newCollectionRef); final String newlyCreatedCollectionId = newlyCreatedCollection.getId(); assertEquals(COLLECTION_NAME, newlyCreatedCollection.getTitle()); assertEquals(COLLECTION_DESCRIPTION, newlyCreatedCollection.getProperty("dc:description").getValue()); Collection collectionAdapter = newlyCreatedCollection.getAdapter(Collection.class); assertTrue(collectionAdapter.getCollectedDocumentIds().contains(testFile.getId())); testFile = session.getDocument(testFile.getRef()); CollectionMember collectionMemberAdapter = testFile.getAdapter(CollectionMember.class); assertTrue(collectionMemberAdapter.getCollectionIds().contains(newlyCreatedCollectionId)); collectionManager.removeFromCollection(newlyCreatedCollection, testFile, session); assertFalse(collectionAdapter.getCollectedDocumentIds().contains(testFile.getId())); assertFalse(collectionMemberAdapter.getCollectionIds().contains(newlyCreatedCollectionId)); } @Test public void testAddManyDocsToNewCollectionAndRemove() { DocumentModel testWorkspace = session.createDocumentModel("/default-domain/workspaces", "testWorkspace", "Workspace"); testWorkspace = session.createDocument(testWorkspace); List<DocumentModel> files = createTestFiles(session, 3); collectionManager.addToNewCollection(COLLECTION_NAME, COLLECTION_DESCRIPTION, files, session); assertTrue(session.exists(new PathRef(COLLECTION_FOLDER_PATH))); final String newlyCreatedCollectionPath = COLLECTION_FOLDER_PATH + "/" + COLLECTION_NAME; DocumentRef newCollectionRef = new PathRef(newlyCreatedCollectionPath); assertTrue(session.exists(newCollectionRef)); DocumentModel newlyCreatedCollection = session.getDocument(newCollectionRef); final String newlyCreatedCollectionId = newlyCreatedCollection.getId(); assertEquals(COLLECTION_NAME, newlyCreatedCollection.getTitle()); assertEquals(COLLECTION_DESCRIPTION, newlyCreatedCollection.getProperty("dc:description").getValue()); for (DocumentModel file : files) { file = session.getDocument(file.getRef()); Collection collectionAdapter = newlyCreatedCollection.getAdapter(Collection.class); assertTrue(collectionAdapter.getCollectedDocumentIds().contains(file.getId())); CollectionMember collectionMemberAdapter = file.getAdapter(CollectionMember.class); assertTrue(collectionMemberAdapter.getCollectionIds().contains(newlyCreatedCollectionId)); } collectionManager.removeAllFromCollection(newlyCreatedCollection, files, session); for (DocumentModel file : files) { Collection collectionAdapter = newlyCreatedCollection.getAdapter(Collection.class); assertFalse(collectionAdapter.getCollectedDocumentIds().contains(file.getId())); CollectionMember collectionMemberAdapter = file.getAdapter(CollectionMember.class); assertFalse(collectionMemberAdapter.getCollectionIds().contains(newlyCreatedCollectionId)); } } /** * Tests that we cannot add a document of type Collection to a document of Collection. */ @Test public void testCanAddToNotCollection() { DocumentModel testWorkspace = session.createDocumentModel("/default-domain/workspaces", "testWorkspace", "Workspace"); testWorkspace = session.createDocument(testWorkspace); DocumentModel testCollection1 = session.createDocumentModel(testWorkspace.getPathAsString(), COLLECTION_NAME, "Collection"); testCollection1 = session.createDocument(testCollection1); DocumentModel testCollection2 = session.createDocumentModel(testWorkspace.getPathAsString(), TEST_FILE_NAME + 2, "Collection"); testCollection2 = session.createDocument(testCollection2); try { collectionManager.addToCollection(testCollection1, testCollection2, session); } catch (IllegalArgumentException e) { // Expeted behaviour return; } fail("File is not a Collection"); } /** * Tests that we cannot add a document to a document which is not a document of type Collection. */ @Test public void testCanAddCollectionNotCollection() { DocumentModel testWorkspace = session.createDocumentModel("/default-domain/workspaces", "testWorkspace", "Workspace"); testWorkspace = session.createDocument(testWorkspace); DocumentModel testFile = session.createDocumentModel(testWorkspace.getPathAsString(), TEST_FILE_NAME, "File"); testFile = session.createDocument(testFile); collectionManager.addToNewCollection(COLLECTION_NAME, COLLECTION_DESCRIPTION, testFile, session); DocumentModel testFile2 = session.createDocumentModel(testWorkspace.getPathAsString(), TEST_FILE_NAME + 2, "File"); testFile2 = session.createDocument(testFile2); collectionManager.addToNewCollection(COLLECTION_NAME, COLLECTION_DESCRIPTION, testFile2, session); try { collectionManager.addToCollection(testFile, testFile2, session); } catch (IllegalArgumentException e) { // Expeted behaviour return; } fail("File is not a Collection"); } /** * Check that a copied document does not belong to the collections of the original documents. * * @since 7.3 */ @Test public void testCopiedCollectionMember() { DocumentModel testWorkspace = session.createDocumentModel("/default-domain/workspaces", "testWorkspace", "Workspace"); testWorkspace = session.createDocument(testWorkspace); DocumentModel testFile = session.createDocumentModel(testWorkspace.getPathAsString(), TEST_FILE_NAME, "File"); testFile = session.createDocument(testFile); collectionManager.addToNewCollection(COLLECTION_NAME, COLLECTION_DESCRIPTION, testFile, session); DocumentModel copiedTestFile = session.copy(testFile.getRef(), testFile.getParentRef(), TEST_FILE_NAME + "_BIS"); copiedTestFile = session.getDocument(copiedTestFile.getRef()); assertFalse(collectionManager.isCollected(copiedTestFile)); // Let's add to another collection and see it still does not belong to the original one. collectionManager.addToNewCollection(COLLECTION_NAME + "_BIS", COLLECTION_DESCRIPTION + "_BIS", copiedTestFile, session); final String collectionPath = COLLECTION_FOLDER_PATH + "/" + COLLECTION_NAME; DocumentRef collectionPathRef = new PathRef(collectionPath); assertTrue(session.exists(collectionPathRef)); final String collectionPathBis = COLLECTION_FOLDER_PATH + "/" + COLLECTION_NAME + "_BIS"; DocumentRef collectionPathRefBis = new PathRef(collectionPathBis); assertTrue(session.exists(collectionPathRefBis)); final DocumentModel collection = session.getDocument(collectionPathRef); final DocumentModel collectionBis = session.getDocument(collectionPathRefBis); assertFalse(copiedTestFile.getAdapter(CollectionMember.class).getCollectionIds().contains(collection.getId())); assertTrue( copiedTestFile.getAdapter(CollectionMember.class).getCollectionIds().contains(collectionBis.getId())); } /** * @since 8.4 */ @Test public void testAddVersionToNewCollectionAndRemove() throws Exception { DocumentModel testWorkspace = session.createDocumentModel("/default-domain/workspaces", "testWorkspace", "Workspace"); testWorkspace = session.createDocument(testWorkspace); DocumentModel testFile = session.createDocumentModel(testWorkspace.getPathAsString(), TEST_FILE_NAME, "File"); testFile = session.createDocument(testFile); DocumentRef refVersion = testFile.checkIn(VersioningOption.MAJOR, "blbabla"); DocumentModel version = session.getDocument(refVersion); collectionManager.addToNewCollection(COLLECTION_NAME, COLLECTION_DESCRIPTION, version, session); assertTrue(session.exists(new PathRef(COLLECTION_FOLDER_PATH))); final String newlyCreatedCollectionPath = COLLECTION_FOLDER_PATH + "/" + COLLECTION_NAME; DocumentRef newCollectionRef = new PathRef(newlyCreatedCollectionPath); assertTrue(session.exists(newCollectionRef)); DocumentModel newlyCreatedCollection = session.getDocument(newCollectionRef); final String newlyCreatedCollectionId = newlyCreatedCollection.getId(); assertEquals(COLLECTION_NAME, newlyCreatedCollection.getTitle()); assertEquals(COLLECTION_DESCRIPTION, newlyCreatedCollection.getProperty("dc:description").getValue()); Collection collectionAdapter = newlyCreatedCollection.getAdapter(Collection.class); assertTrue(collectionAdapter.getCollectedDocumentIds().contains(version.getId())); version = session.getDocument(version.getRef()); CollectionMember collectionMemberAdapter = version.getAdapter(CollectionMember.class); assertTrue(collectionMemberAdapter.getCollectionIds().contains(newlyCreatedCollectionId)); collectionManager.removeFromCollection(newlyCreatedCollection, version, session); assertFalse(collectionAdapter.getCollectedDocumentIds().contains(testFile.getId())); assertFalse(collectionMemberAdapter.getCollectionIds().contains(newlyCreatedCollectionId)); } /** * @since 8.4 */ @Test public void testAddVProxyToNewCollectionAndRemove() throws Exception { DocumentModel testWorkspace = session.createDocumentModel("/default-domain/workspaces", "testWorkspace", "Workspace"); testWorkspace = session.createDocument(testWorkspace); DocumentModel testFile = session.createDocumentModel(testWorkspace.getPathAsString(), TEST_FILE_NAME, "File"); testFile = session.createDocument(testFile); PathRef sectionsRootRef = new PathRef("/default-domain/sections"); assertTrue(session.exists(sectionsRootRef)); DocumentModel sectionDoc = session.getDocument(sectionsRootRef); sectionDoc = session.createDocumentModel("Section"); sectionDoc.setPathInfo(sectionDoc.getPathAsString(), "section1"); sectionDoc = session.createDocument(sectionDoc); DocumentModel proxy = session.publishDocument(testFile, sectionDoc); collectionManager.addToNewCollection(COLLECTION_NAME, COLLECTION_DESCRIPTION, proxy, session); assertTrue(session.exists(new PathRef(COLLECTION_FOLDER_PATH))); final String newlyCreatedCollectionPath = COLLECTION_FOLDER_PATH + "/" + COLLECTION_NAME; DocumentRef newCollectionRef = new PathRef(newlyCreatedCollectionPath); assertTrue(session.exists(newCollectionRef)); DocumentModel newlyCreatedCollection = session.getDocument(newCollectionRef); final String newlyCreatedCollectionId = newlyCreatedCollection.getId(); assertEquals(COLLECTION_NAME, newlyCreatedCollection.getTitle()); assertEquals(COLLECTION_DESCRIPTION, newlyCreatedCollection.getProperty("dc:description").getValue()); Collection collectionAdapter = newlyCreatedCollection.getAdapter(Collection.class); assertTrue(collectionAdapter.getCollectedDocumentIds().contains(proxy.getId())); proxy = session.getDocument(proxy.getRef()); CollectionMember collectionMemberAdapter = proxy.getAdapter(CollectionMember.class); assertTrue(collectionMemberAdapter.getCollectionIds().contains(newlyCreatedCollectionId)); collectionManager.removeFromCollection(newlyCreatedCollection, proxy, session); assertFalse(collectionAdapter.getCollectedDocumentIds().contains(testFile.getId())); assertFalse(collectionMemberAdapter.getCollectionIds().contains(newlyCreatedCollectionId)); } /* * NXP-22085 */ @Test public void testAddOneDocToNewCollectionAndRemoveDontTriggerAutomaticVersioning() throws Exception { DocumentModel testWorkspace = session.createDocumentModel("/default-domain/workspaces", "testWorkspace", "Workspace"); testWorkspace = session.createDocument(testWorkspace); // use note as they are versioned after each update DocumentModel testNote = session.createDocumentModel(testWorkspace.getPathAsString(), "Note 1", "Note"); testNote = session.createDocument(testNote); List<DocumentModel> versions = session.getVersions(testNote.getRef()); // there should be one version created after document creation assertEquals(1, versions.size()); // check out the note as collection manager disable auto checkout testNote.checkOut(); collectionManager.addToNewCollection(COLLECTION_NAME, COLLECTION_DESCRIPTION, testNote, session); versions = session.getVersions(testNote.getRef()); // there should be one version created after document creation assertEquals(1, versions.size()); DocumentModel newlyCreatedCollection = session.getDocument( new PathRef(COLLECTION_FOLDER_PATH + "/" + COLLECTION_NAME)); testNote = session.getDocument(testNote.getRef()); collectionManager.removeFromCollection(newlyCreatedCollection, testNote, session); versions = session.getVersions(testNote.getRef()); // there should be one version created after document creation assertEquals(1, versions.size()); // a real edition should version the note testNote.setPropertyValue("note:note", "new content"); session.saveDocument(testNote); versions = session.getVersions(testNote.getRef()); // there should be two versions // - created after document creation // - created after document edition assertEquals(2, versions.size()); } /* * NXP-22085 */ @Test public void testCopyDocumentInACollectionDontCreateAVersionOnClean() { DocumentModel testWorkspace = session.createDocumentModel("/default-domain/workspaces", "testWorkspace", "Workspace"); testWorkspace = session.createDocument(testWorkspace); // use note as they are versioned after each update DocumentModel testNote = session.createDocumentModel(testWorkspace.getPathAsString(), "Note 1", "Note"); testNote = session.createDocument(testNote); collectionManager.addToNewCollection(COLLECTION_NAME, COLLECTION_DESCRIPTION, testNote, session); DocumentModel copiedTestNote = session.copy(testNote.getRef(), testNote.getParentRef(), TEST_FILE_NAME + "_BIS"); copiedTestNote = session.getDocument(copiedTestNote.getRef()); List<DocumentModel> versions = session.getVersions(copiedTestNote.getRef()); // there should be 0 version as copy doesn't trigger versioning service assertEquals(0, versions.size()); } }