package com.celements.copydoc; import static com.celements.common.test.CelementsTestUtils.*; import static org.easymock.EasyMock.*; import static org.junit.Assert.*; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Set; import org.junit.Before; import org.junit.Test; import org.xwiki.model.reference.DocumentReference; import com.celements.common.test.AbstractBridgedComponentTestCase; import com.celements.model.access.IModelAccessFacade; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.xpn.xwiki.doc.XWikiDocument; import com.xpn.xwiki.objects.BaseObject; import com.xpn.xwiki.objects.classes.BaseClass; import com.xpn.xwiki.objects.classes.DateClass; import com.xpn.xwiki.objects.classes.PropertyClass; import com.xpn.xwiki.objects.classes.StringClass; import com.xpn.xwiki.web.Utils; public class CopyDocumentServiceTest extends AbstractBridgedComponentTestCase { private CopyDocumentService copyDocService; private List<BaseObject> emptyList; private DocumentReference docRef; private XWikiDocument docMock; private DocumentReference classRef; @Before public void setUp_CopyDocumentServiceTest() throws Exception { copyDocService = (CopyDocumentService) Utils.getComponent(ICopyDocumentRole.class); emptyList = new ArrayList<>(); docRef = new DocumentReference("db", "Space", "SomeDoc"); docMock = createMockAndAddToDefault(XWikiDocument.class); expect(docMock.getDocumentReference()).andReturn(docRef).anyTimes(); classRef = new DocumentReference("db", "Classes", "SomeClass"); // important for unstable-2.0 set database because class references are checked for db getContext().setDatabase("db"); } @Test public void testCopyObjects_none() throws Exception { boolean set = true; DocumentReference srcDocRef = new DocumentReference("odb", "Space", "SomeSrcDoc"); XWikiDocument srcDoc = new XWikiDocument(srcDocRef); XWikiDocument trgDoc = new XWikiDocument(docRef); Set<BaseObject> toIgnore = Sets.newHashSet(); replayDefault(); boolean ret = copyDocService.copyObjects(srcDoc, trgDoc, toIgnore, set); verifyDefault(); assertFalse(ret); } @Test public void testCopyObjects_added() throws Exception { boolean set = true; String name = "name"; String val = "val"; DocumentReference srcDocRef = new DocumentReference("odb", "Space", "SomeSrcDoc"); // IMPORTANT do not use setWikiReference, because it is dropped in xwiki 4.5.4 DocumentReference srcClassRef = new DocumentReference("odb", classRef.getLastSpaceReference().getName(), classRef.getName()); XWikiDocument srcDoc = new XWikiDocument(srcDocRef); srcDoc.addXObject(createObj(srcClassRef, name, val)); XWikiDocument trgDoc = new XWikiDocument(docRef); Set<BaseObject> toIgnore = Sets.newHashSet(); BaseClass bClass = expectNewBaseObject(classRef); expectPropertyClass(bClass, name, new StringClass()); replayDefault(); boolean ret = copyDocService.copyObjects(srcDoc, trgDoc, toIgnore, set); verifyDefault(); assertTrue(ret); assertEquals(1, getModelAccess().getXObjects(trgDoc, classRef, name, val).size()); } @Test public void testCopyObjects_added_notSet() throws Exception { boolean set = false; String name = "name"; String val = "val"; DocumentReference srcDocRef = new DocumentReference("odb", "Space", "SomeSrcDoc"); // IMPORTANT do not use setWikiReference, because it is dropped in xwiki 4.5.4 DocumentReference srcClassRef = new DocumentReference("odb", classRef.getLastSpaceReference().getName(), classRef.getName()); XWikiDocument srcDoc = new XWikiDocument(srcDocRef); srcDoc.addXObject(createObj(srcClassRef, name, val)); XWikiDocument trgDoc = new XWikiDocument(docRef); Set<BaseObject> toIgnore = Sets.newHashSet(); expectNewBaseObject(classRef); replayDefault(); boolean ret = copyDocService.copyObjects(srcDoc, trgDoc, toIgnore, set); verifyDefault(); assertTrue(ret); assertEquals(0, getModelAccess().getXObjects(trgDoc, classRef).size()); } @Test public void testCopyObjects_removed() throws Exception { boolean set = true; String name1 = "name1"; String val1 = "val1"; String name2 = "name2"; String val2 = "val2"; DocumentReference srcDocRef = new DocumentReference("odb", "Space", "SomeSrcDoc"); // IMPORTANT do not use setWikiReference, because it is dropped in xwiki 4.5.4 DocumentReference srcClassRef = new DocumentReference("odb", classRef.getLastSpaceReference().getName(), classRef.getName()); XWikiDocument srcDoc = new XWikiDocument(srcDocRef); srcDoc.addXObject(createObj(srcClassRef, name1, val1)); XWikiDocument trgDoc = new XWikiDocument(docRef); trgDoc.addXObject(createObj(classRef, name1, val1)); trgDoc.addXObject(createObj(classRef, name2, val2)); Set<BaseObject> toIgnore = Sets.newHashSet(); replayDefault(); boolean ret = copyDocService.copyObjects(srcDoc, trgDoc, toIgnore, set); verifyDefault(); assertTrue(ret); assertEquals(1, getModelAccess().getXObjects(trgDoc, classRef).size()); assertEquals(1, getModelAccess().getXObjects(trgDoc, classRef, name1, val1).size()); } @Test public void testCopyObjects_removed_notSet() throws Exception { boolean set = false; DocumentReference srcDocRef = new DocumentReference("odb", "Space", "SomeSrcDoc"); // IMPORTANT do not use setWikiReference, because it is dropped in xwiki 4.5.4 DocumentReference srcClassRef = new DocumentReference("odb", classRef.getLastSpaceReference().getName(), classRef.getName()); XWikiDocument srcDoc = new XWikiDocument(srcDocRef); srcDoc.addXObject(createObj(srcClassRef)); XWikiDocument trgDoc = new XWikiDocument(docRef); trgDoc.addXObject(createObj(classRef)); trgDoc.addXObject(createObj(classRef)); Set<BaseObject> toIgnore = Sets.newHashSet(); replayDefault(); boolean ret = copyDocService.copyObjects(srcDoc, trgDoc, toIgnore, set); verifyDefault(); assertTrue(ret); assertEquals(2, getModelAccess().getXObjects(trgDoc, classRef).size()); } @Test public void testCopyObjects_removed_multiple() throws Exception { boolean set = true; DocumentReference srcDocRef = new DocumentReference("odb", "Space", "SomeSrcDoc"); XWikiDocument srcDoc = new XWikiDocument(srcDocRef); XWikiDocument trgDoc = new XWikiDocument(docRef); trgDoc.addXObject(createObj(classRef)); trgDoc.addXObject(createObj(classRef)); trgDoc.addXObject(createObj(classRef)); Set<BaseObject> toIgnore = Sets.newHashSet(); replayDefault(); boolean ret = copyDocService.copyObjects(srcDoc, trgDoc, toIgnore, set); verifyDefault(); assertTrue(ret); assertEquals(0, getModelAccess().getXObjects(trgDoc, classRef).size()); } @Test public void testCopyObjects_removed_multiple_notSet() throws Exception { boolean set = false; DocumentReference srcDocRef = new DocumentReference("odb", "Space", "SomeSrcDoc"); XWikiDocument srcDoc = new XWikiDocument(srcDocRef); XWikiDocument trgDoc = new XWikiDocument(docRef); trgDoc.addXObject(createObj(classRef)); trgDoc.addXObject(createObj(classRef)); trgDoc.addXObject(createObj(classRef)); Set<BaseObject> toIgnore = Sets.newHashSet(); replayDefault(); boolean ret = copyDocService.copyObjects(srcDoc, trgDoc, toIgnore, set); verifyDefault(); assertTrue(ret); assertEquals(3, getModelAccess().getXObjects(trgDoc, classRef).size()); } @Test public void testCopyObjects_noChange() throws Exception { boolean set = true; DocumentReference srcDocRef = new DocumentReference("odb", "Space", "SomeSrcDoc"); // IMPORTANT do not use setWikiReference, because it is dropped in xwiki 4.5.4 DocumentReference srcClassRef = new DocumentReference("odb", classRef.getLastSpaceReference().getName(), classRef.getName()); XWikiDocument srcDoc = new XWikiDocument(srcDocRef); srcDoc.addXObject(createObj(srcClassRef)); XWikiDocument trgDoc = new XWikiDocument(docRef); trgDoc.addXObject(createObj(classRef)); Set<BaseObject> toIgnore = Sets.newHashSet(); replayDefault(); boolean ret = copyDocService.copyObjects(srcDoc, trgDoc, toIgnore, set); verifyDefault(); assertFalse(ret); assertEquals(1, getModelAccess().getXObjects(srcDoc, srcClassRef).size()); assertEquals(1, getModelAccess().getXObjects(trgDoc, classRef).size()); } @Test public void testCopyObjects_toIgnore_add() throws Exception { boolean set = true; String name = "name"; String val = "val"; DocumentReference srcDocRef = new DocumentReference("odb", "Space", "SomeSrcDoc"); // IMPORTANT do not use setWikiReference, because it is dropped in xwiki 4.5.4 DocumentReference srcClassRef = new DocumentReference("odb", classRef.getLastSpaceReference().getName(), classRef.getName()); XWikiDocument srcDoc = new XWikiDocument(srcDocRef); srcDoc.addXObject(createObj(srcClassRef, name, val)); BaseObject ignoreObj = createObj(srcClassRef); srcDoc.addXObject(ignoreObj); XWikiDocument trgDoc = new XWikiDocument(docRef); trgDoc.addXObject(createObj(classRef, name, val)); Set<BaseObject> toIgnore = Sets.newHashSet(ignoreObj); replayDefault(); boolean ret = copyDocService.copyObjects(srcDoc, trgDoc, toIgnore, set); verifyDefault(); assertFalse(ret); assertEquals(1, getModelAccess().getXObjects(trgDoc, classRef).size()); assertFalse(getModelAccess().getXObjects(trgDoc, classRef).contains(ignoreObj)); } @Test public void testCopyObjects_toIgnore_remove() throws Exception { boolean set = true; String name = "name"; String val = "val"; DocumentReference srcDocRef = new DocumentReference("odb", "Space", "SomeSrcDoc"); // IMPORTANT do not use setWikiReference, because it is dropped in xwiki 4.5.4 DocumentReference srcClassRef = new DocumentReference("odb", classRef.getLastSpaceReference().getName(), classRef.getName()); XWikiDocument srcDoc = new XWikiDocument(srcDocRef); srcDoc.addXObject(createObj(srcClassRef, name, val)); XWikiDocument trgDoc = new XWikiDocument(docRef); trgDoc.addXObject(createObj(classRef, name, val)); BaseObject ignoreObj = createObj(classRef); trgDoc.addXObject(ignoreObj); Set<BaseObject> toIgnore = Sets.newHashSet(ignoreObj); replayDefault(); boolean ret = copyDocService.copyObjects(srcDoc, trgDoc, toIgnore, set); verifyDefault(); assertFalse(ret); assertEquals(2, getModelAccess().getXObjects(trgDoc, classRef).size()); assertTrue(getModelAccess().getXObjects(trgDoc, classRef).contains(ignoreObj)); } @Test public void testGetAllClassRefs() throws Exception { DocumentReference srcDocRef = new DocumentReference("odb", "Space", "SomeSrcDoc"); XWikiDocument srcDoc = new XWikiDocument(srcDocRef); DocumentReference classRef1 = new DocumentReference("odb", "Classes", "SomeClass1"); srcDoc.addXObject(createObj(classRef1)); DocumentReference classRef2 = new DocumentReference("odb", "Classes", "SomeClass2"); srcDoc.addXObject(createObj(classRef2)); XWikiDocument trgDoc = new XWikiDocument(docRef); DocumentReference classRef3 = new DocumentReference("db", "Classes", "SomeClass3"); trgDoc.addXObject(createObj(classRef3)); DocumentReference classRef4 = new DocumentReference("db", "Classes", "SomeClass1"); trgDoc.addXObject(createObj(classRef4)); replayDefault(); Set<DocumentReference> ret = copyDocService.getAllClassRefs(srcDoc, trgDoc); verifyDefault(); assertEquals(3, ret.size()); assertTrue(ret.contains(classRef3)); assertTrue(ret.contains(classRef4)); // IMPORTANT do not use setWikiReference, because it is dropped in xwiki 4.5.4 classRef2 = new DocumentReference("db", classRef2.getLastSpaceReference().getName(), classRef2.getName()); assertTrue(ret.contains(classRef2)); } @Test public void testCreateOrUpdateObjects_none() throws Exception { boolean set = true; BaseObject obj = createObj(classRef); replayDefault(); boolean ret = copyDocService.createOrUpdateObjects(docMock, emptyList, Lists.newArrayList(obj), set); verifyDefault(); assertFalse(ret); } @Test public void testCreateOrUpdateObjects_create() throws Exception { boolean set = true; BaseObject obj = createObj(classRef); expect(docMock.newXObject(eq(classRef), same(getContext()))).andReturn(obj).once(); replayDefault(); boolean ret = copyDocService.createOrUpdateObjects(docMock, Lists.newArrayList(obj), emptyList, set); verifyDefault(); assertTrue(ret); } @Test public void testCreateOrUpdateObjects_create_notSet() throws Exception { boolean set = false; BaseObject obj = createObj(classRef); replayDefault(); boolean ret = copyDocService.createOrUpdateObjects(docMock, Lists.newArrayList(obj), emptyList, set); verifyDefault(); assertTrue(ret); } @Test public void testCreateOrUpdateObjects_update() throws Exception { boolean set = true; String name = "name"; String val = "val"; BaseObject srcObj = createObj(classRef, name, val); List<BaseObject> srcObjs = Lists.newArrayList(srcObj); BaseObject trgObj = createObj(classRef); List<BaseObject> trgObjs = Lists.newArrayList(trgObj); expectPropertyClass(classRef, name, new StringClass()); replayDefault(); boolean ret = copyDocService.createOrUpdateObjects(docMock, srcObjs, trgObjs, set); verifyDefault(); assertTrue(ret); assertEquals(val, trgObj.getStringValue(name)); assertEquals(1, srcObjs.size()); assertEquals(0, trgObjs.size()); } @Test public void testCreateOrUpdateObjects_update_notSet() throws Exception { boolean set = false; String name = "name"; String val = "val"; BaseObject srcObj = createObj(classRef, name, val); BaseObject trgObj = createObj(classRef); replayDefault(); boolean ret = copyDocService.createOrUpdateObjects(docMock, Lists.newArrayList(srcObj), Lists.newArrayList(trgObj), set); verifyDefault(); assertTrue(ret); assertEquals("", trgObj.getStringValue(name)); } @Test public void testCopyObject_added() throws Exception { boolean set = true; String name1 = "name1"; String val1 = "val1"; BaseObject srcObj = createObj(classRef, name1, val1); String name2 = "name2"; Date val2 = new Date(); srcObj.setDateValue(name2, val2); BaseObject trgObj = createObj(classRef); expectPropertyClasses(classRef, ImmutableMap.<String, PropertyClass>builder().put(name1, new StringClass()).put(name2, new DateClass()).build()); replayDefault(); boolean ret = copyDocService.copyObject(srcObj, trgObj, set); verifyDefault(); assertTrue(ret); assertEquals(2, trgObj.getFieldList().size()); assertEquals(val1, trgObj.getStringValue(name1)); assertEquals(val2, trgObj.getDateValue(name2)); } @Test public void testCopyObject_removed() throws Exception { boolean set = true; String name1 = "name1"; String val1 = "val1"; BaseObject srcObj = createObj(classRef, name1, val1); BaseObject trgObj = createObj(classRef, name1, val1); String name2 = "name2"; String val2 = "val2"; trgObj.setStringValue(name2, val2); assertEquals(2, trgObj.getFieldList().size()); replayDefault(); boolean ret = copyDocService.copyObject(srcObj, trgObj, set); verifyDefault(); assertTrue(ret); assertEquals(1, trgObj.getFieldList().size()); assertEquals(val1, trgObj.getStringValue(name1)); assertNull(trgObj.get(name2)); } @Test public void testCopyObject_noChange() throws Exception { boolean set = true; String name = "name"; String val = "val"; BaseObject srcObj = createObj(classRef, name, val); BaseObject trgObj = createObj(classRef, name, val); replayDefault(); boolean ret = copyDocService.copyObject(srcObj, trgObj, set); verifyDefault(); assertFalse(ret); assertEquals(1, trgObj.getFieldList().size()); assertEquals(val, trgObj.getStringValue(name)); } private BaseObject createObj(DocumentReference classRef, String name, Object val) { BaseObject obj = createObj(classRef); obj.setStringValue(name, val.toString()); return obj; } private BaseObject createObj(DocumentReference classRef) { BaseObject obj = new BaseObject(); obj.setXClassReference(classRef); return obj; } private IModelAccessFacade getModelAccess() { return Utils.getComponent(IModelAccessFacade.class); } }