package org.nuxeo.ecm.core.version.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.util.List; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.nuxeo.ecm.core.api.DocumentModel; import org.nuxeo.ecm.core.api.DocumentModelList; import org.nuxeo.ecm.core.api.DocumentRef; import org.nuxeo.ecm.core.api.VersioningOption; import org.nuxeo.ecm.core.api.facet.VersioningDocument; import org.nuxeo.ecm.core.event.EventService; import org.nuxeo.ecm.core.storage.sql.SQLRepositoryTestCase; import org.nuxeo.runtime.api.Framework; public class TestVersioningRemovalPolicy extends SQLRepositoryTestCase { @Before public void setUp() throws Exception { super.setUp(); openSession(); } @After public void tearDown() throws Exception { closeSession(); super.tearDown(); } protected DocumentModelList getVersion() throws Exception { return session.query("select * from Document where ecm:isCheckedInVersion=1"); } @Test public void shouldRemoveOrphanVersions() throws Exception { DocumentModel doc = session.createDocumentModel("/", "testfile1", "File"); doc = session.createDocument(doc); VersioningDocument vdoc = doc.getAdapter(VersioningDocument.class); assertNotNull(vdoc); assertTrue(doc.isCheckedOut()); assertEquals("0.0", vdoc.getVersionLabel()); doc.checkIn(VersioningOption.MINOR, ""); assertFalse(doc.isCheckedOut()); assertEquals("0.1", vdoc.getVersionLabel()); doc.checkOut(); assertTrue(doc.isCheckedOut()); assertEquals("0.1+", vdoc.getVersionLabel()); List<DocumentModel> versions = session.getVersions(doc.getRef()); assertEquals(1, versions.size()); DocumentModelList vs = getVersion(); assertEquals(1, vs.size()); // now remove the doc session.removeDocument(doc.getRef()); session.save(); Framework.getLocalService(EventService.class).waitForAsyncCompletion(); session.save(); vs = getVersion(); assertEquals(0, vs.size()); } @Test public void shouldRemoveOrphanVersionsWhenProxyRemovedLast() throws Exception { DocumentModel doc = session.createDocumentModel("/", "testfile1", "File"); doc = session.createDocument(doc); DocumentRef ver = doc.checkIn(VersioningOption.MINOR, ""); DocumentModel proxy = session.createProxy(ver, session.getRootDocument().getRef()); // remove the doc first session.removeDocument(doc.getRef()); session.save(); waitForAsyncCompletion(); session.save(); DocumentModelList vs = getVersion(); assertEquals(1, vs.size()); // 1 version remains due to proxu // remove proxy second session.removeDocument(proxy.getRef()); session.save(); waitForAsyncCompletion(); session.save(); vs = getVersion(); assertEquals(0, vs.size()); // version deleted through last proxy } @Test public void shouldNotRemoveOrphanVersionsWhenProxyRemovedButLiveRemains() throws Exception { DocumentModel doc = session.createDocumentModel("/", "testfile1", "File"); doc = session.createDocument(doc); DocumentRef ver = doc.checkIn(VersioningOption.MINOR, ""); DocumentModel proxy = session.createProxy(ver, session.getRootDocument().getRef()); // remove last proxy, but live doc still remains session.removeDocument(proxy.getRef()); session.save(); waitForAsyncCompletion(); session.save(); DocumentModelList vs = getVersion(); assertEquals(1, vs.size()); // version not deleted } @Test public void shouldNotRemoveOrphanVersions() throws Exception { deployContrib("org.nuxeo.ecm.core.test.tests", "test-versioning-removal-nullcontrib.xml"); DocumentModel doc = session.createDocumentModel("/", "testfile1", "File"); doc = session.createDocument(doc); VersioningDocument vdoc = doc.getAdapter(VersioningDocument.class); assertNotNull(vdoc); assertTrue(doc.isCheckedOut()); assertEquals("0.0", vdoc.getVersionLabel()); doc.checkIn(VersioningOption.MINOR, ""); assertFalse(doc.isCheckedOut()); assertEquals("0.1", vdoc.getVersionLabel()); doc.checkOut(); assertTrue(doc.isCheckedOut()); assertEquals("0.1+", vdoc.getVersionLabel()); List<DocumentModel> versions = session.getVersions(doc.getRef()); assertEquals(1, versions.size()); DocumentModelList vs = getVersion(); assertEquals(1, vs.size()); // now remove the doc session.removeDocument(doc.getRef()); session.save(); Framework.getLocalService(EventService.class).waitForAsyncCompletion(); session.save(); vs = getVersion(); assertEquals(1, vs.size()); } @Test public void shouldRemoveOrphanFileVersionsOnly() throws Exception { deployContrib("org.nuxeo.ecm.core.test.tests", "test-versioning-removal-filtercontrib.xml"); DocumentModel doc = session.createDocumentModel("/", "testfile1", "File"); doc = session.createDocument(doc); VersioningDocument vdoc = doc.getAdapter(VersioningDocument.class); assertNotNull(vdoc); assertTrue(doc.isCheckedOut()); assertEquals("0.0", vdoc.getVersionLabel()); doc.checkIn(VersioningOption.MINOR, ""); assertFalse(doc.isCheckedOut()); assertEquals("0.1", vdoc.getVersionLabel()); doc.checkOut(); assertTrue(doc.isCheckedOut()); assertEquals("0.1+", vdoc.getVersionLabel()); DocumentModel note = session.createDocumentModel("/", "testnote1", "Note"); note = session.createDocument(note); VersioningDocument vnote = note.getAdapter(VersioningDocument.class); assertNotNull(vnote); assertTrue(note.isCheckedOut()); assertEquals("0.0", vnote.getVersionLabel()); note.checkIn(VersioningOption.MINOR, ""); assertFalse(note.isCheckedOut()); assertEquals("0.1", vnote.getVersionLabel()); note.checkOut(); assertTrue(note.isCheckedOut()); assertEquals("0.1+", vnote.getVersionLabel()); List<DocumentModel> versions = session.getVersions(doc.getRef()); assertEquals(1, versions.size()); DocumentModelList vs = getVersion(); assertEquals(2, vs.size()); // now remove the doc session.removeDocument(doc.getRef()); session.removeDocument(note.getRef()); session.save(); Framework.getLocalService(EventService.class).waitForAsyncCompletion(); session.save(); vs = getVersion(); assertEquals(1, vs.size()); } }