package com.celements.model.access; import static com.celements.common.test.CelementsTestUtils.*; import static org.easymock.EasyMock.*; import static org.junit.Assert.*; import java.sql.Timestamp; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Map; import org.easymock.Capture; import org.junit.Before; import org.junit.Test; import org.xwiki.model.reference.DocumentReference; import org.xwiki.rendering.syntax.Syntax; import com.celements.common.test.AbstractComponentTest; import com.celements.model.access.exception.AttachmentNotExistsException; import com.celements.model.access.exception.ClassDocumentLoadException; import com.celements.model.access.exception.DocumentAlreadyExistsException; import com.celements.model.access.exception.DocumentLoadException; import com.celements.model.access.exception.DocumentNotExistsException; import com.celements.model.access.exception.DocumentSaveException; import com.celements.model.classes.ClassDefinition; import com.celements.model.classes.TestClassDefinition; import com.celements.model.classes.fields.ClassField; import com.celements.model.classes.fields.DateField; import com.celements.model.classes.fields.StringField; import com.celements.model.context.ModelContext; import com.celements.model.util.ClassFieldValue; import com.celements.rights.access.exceptions.NoAccessRightsException; import com.xpn.xwiki.XWikiException; import com.xpn.xwiki.api.Document; import com.xpn.xwiki.doc.XWikiAttachment; import com.xpn.xwiki.doc.XWikiDocument; import com.xpn.xwiki.objects.BaseObject; import com.xpn.xwiki.objects.BaseProperty; import com.xpn.xwiki.objects.classes.BaseClass; import com.xpn.xwiki.objects.classes.DateClass; import com.xpn.xwiki.objects.classes.NumberClass; import com.xpn.xwiki.objects.classes.StringClass; import com.xpn.xwiki.store.XWikiStoreInterface; import com.xpn.xwiki.user.api.XWikiRightService; import com.xpn.xwiki.web.Utils; public class DefaultModelAccessFacadeTest extends AbstractComponentTest { private DefaultModelAccessFacade modelAccess; private XWikiDocument doc; private DocumentReference classRef; private DocumentReference classRef2; private XWikiStoreInterface storeMock; @Before @Override public void setUp() throws Exception { super.setUp(); registerComponentMock(XWikiDocumentCreator.class, "default", new XWikiDocumentCreator() { @Override public XWikiDocument create(DocumentReference docRef) { return new XWikiDocument(docRef); } }); modelAccess = (DefaultModelAccessFacade) Utils.getComponent(IModelAccessFacade.class); doc = new XWikiDocument(new DocumentReference("db", "space", "doc")); doc.setSyntax(Syntax.XWIKI_1_0); doc.setMetaDataDirty(false); storeMock = createMockAndAddToDefault(XWikiStoreInterface.class); doc.setStore(storeMock); doc.setNew(false); expect(getWikiMock().getStore()).andReturn(storeMock).anyTimes(); classRef = new DocumentReference("db", "class", "any"); classRef2 = new DocumentReference("db", "class", "other"); // important for unstable-2.0 set database because class references are checked for db getContext().setDatabase("db"); } @Test public void test_getDocument() throws Exception { doc.setNew(true); doc.setFromCache(false); expect(getWikiMock().exists(eq(doc.getDocumentReference()), same(getContext()))).andReturn( true).once(); expect(getWikiMock().getDocument(eq(doc.getDocumentReference()), same(getContext()))).andReturn( doc).once(); replayDefault(); XWikiDocument ret = modelAccess.getDocument(doc.getDocumentReference()); verifyDefault(); assertEquals(doc, ret); assertTrue(ret.isNew()); assertFalse(ret.isFromCache()); assertSame("do not clone if isNew", doc, ret); } @Test public void test_getDocument_failed() throws Exception { Throwable cause = new XWikiException(); expect(getWikiMock().exists(eq(doc.getDocumentReference()), same(getContext()))).andReturn( true).once(); expect(getWikiMock().getDocument(eq(doc.getDocumentReference()), same(getContext()))).andThrow( cause).once(); replayDefault(); try { modelAccess.getDocument(doc.getDocumentReference()); fail("expecting DocumentLoadException"); } catch (DocumentLoadException exc) { assertSame(cause, exc.getCause()); } verifyDefault(); } @Test public void test_getDocument_notExists() throws Exception { expect(getWikiMock().exists(eq(doc.getDocumentReference()), same(getContext()))).andReturn( false).once(); replayDefault(); try { modelAccess.getDocument(doc.getDocumentReference()); fail("expecting DocumentNotExistsException"); } catch (DocumentNotExistsException exc) { // expected } verifyDefault(); } @Test public void test_getDocument_null() throws Exception { try { modelAccess.getDocument(null); fail("expecting NullPointerException"); } catch (NullPointerException npe) { // expected } } @Test public void test_getDocument_translatedDocument_defaultLanguage_empty() throws Exception { String lang = "de"; doc.setDefaultLanguage(""); doc.setLanguage(""); getConfigurationSource().setProperty(ModelContext.CFG_KEY_DEFAULT_LANG, lang); Capture<XWikiDocument> captExists = expectExists(true); Capture<XWikiDocument> captLoad = expectLoad(doc); replayDefault(); XWikiDocument theDoc = modelAccess.getDocument(doc.getDocumentReference(), lang); verifyDefault(); assertEquals(doc, theDoc); assertNotSame("must be cloned for cache safety", doc, theDoc); assertCapture(captExists, doc.getDocumentReference(), lang); assertCapture(captLoad, doc.getDocumentReference(), lang); } @Test public void test_getDocument_translatedDocument_noTranslation() throws Exception { String lang = "de"; doc.setDefaultLanguage(lang); doc.setLanguage(""); getConfigurationSource().setProperty(ModelContext.CFG_KEY_DEFAULT_LANG, lang); Capture<XWikiDocument> captExists = expectExists(false); replayDefault(); try { modelAccess.getDocument(doc.getDocumentReference(), "en"); fail("expecting DocumentNotExistsException"); } catch (DocumentNotExistsException exc) { // expected } verifyDefault(); assertCapture(captExists, doc.getDocumentReference(), "en"); } @Test public void test_getDocument_translatedDocument() throws Exception { String lang = "de"; doc.setDefaultLanguage(lang); doc.setLanguage(""); getConfigurationSource().setProperty(ModelContext.CFG_KEY_DEFAULT_LANG, lang); Capture<XWikiDocument> captExists = expectExists(true); XWikiDocument theTdoc = new XWikiDocument(doc.getDocumentReference()); theTdoc.setDefaultLanguage(lang); theTdoc.setLanguage("en"); theTdoc.setNew(false); theTdoc.setSyntax(Syntax.XWIKI_1_0); Capture<XWikiDocument> captLoad = expectLoad(theTdoc); replayDefault(); XWikiDocument theDoc = modelAccess.getDocument(doc.getDocumentReference(), "en"); verifyDefault(); assertEquals(theTdoc, theDoc); assertNotSame("must be cloned for cache safety", theTdoc, theDoc); assertCapture(captExists, doc.getDocumentReference(), "en"); assertCapture(captLoad, doc.getDocumentReference(), "en"); } @Test public void test_createDocument() throws Exception { String lang = "de"; getConfigurationSource().setProperty(ModelContext.CFG_KEY_DEFAULT_LANG, lang); expect(getWikiMock().exists(eq(doc.getDocumentReference()), same(getContext()))).andReturn( false).once(); expect(getWikiMock().isVirtualMode()).andReturn(true).anyTimes(); replayDefault(); // important only call setUser after replayDefault. In unstable-2.0 branch setUser // calls xwiki.isVirtualMode String userName = "XWiki.TestUser"; getContext().setUser(userName); XWikiDocument ret = modelAccess.createDocument(doc.getDocumentReference()); verifyDefault(); assertEquals(doc.getDocumentReference(), ret.getDocumentReference()); assertTrue(ret.isNew()); assertFalse(ret.isFromCache()); } @Test public void test_createDocument_alreadyExists() throws Exception { expect(getWikiMock().exists(eq(doc.getDocumentReference()), same(getContext()))).andReturn( true).once(); replayDefault(); try { modelAccess.createDocument(doc.getDocumentReference()); fail("expecting DocumentAlreadyExistsException"); } catch (DocumentAlreadyExistsException exc) { // expected } verifyDefault(); } @Test public void test_createDocument_null() throws Exception { try { modelAccess.createDocument(null); fail("expecting NullPointerException"); } catch (NullPointerException npe) { // expected } } @Test public void test_getOrCreateDocument_get() throws Exception { doc.setNew(true); doc.setFromCache(false); expect(getWikiMock().exists(eq(doc.getDocumentReference()), same(getContext()))).andReturn( true).once(); expect(getWikiMock().getDocument(eq(doc.getDocumentReference()), same(getContext()))).andReturn( doc).once(); replayDefault(); XWikiDocument ret = modelAccess.getOrCreateDocument(doc.getDocumentReference()); verifyDefault(); assertEquals(doc, ret); assertTrue(ret.isNew()); assertFalse(ret.isFromCache()); assertSame("do not clone if isNew", doc, ret); assertFalse(doc.isMetaDataDirty()); } @Test public void test_getOrCreateDocument_get_failed() throws Exception { Throwable cause = new XWikiException(); expect(getWikiMock().exists(eq(doc.getDocumentReference()), same(getContext()))).andReturn( true).once(); expect(getWikiMock().getDocument(eq(doc.getDocumentReference()), same(getContext()))).andThrow( cause).once(); replayDefault(); try { modelAccess.getOrCreateDocument(doc.getDocumentReference()); fail("expecting DocumentLoadException"); } catch (DocumentLoadException exc) { assertSame(cause, exc.getCause()); } verifyDefault(); } @Test public void test_getOrCreateDocument_create() throws Exception { expect(getWikiMock().exists(eq(doc.getDocumentReference()), same(getContext()))).andReturn( false).once(); replayDefault(); XWikiDocument ret = modelAccess.getOrCreateDocument(doc.getDocumentReference()); verifyDefault(); assertEquals(doc.getDocumentReference(), ret.getDocumentReference()); assertTrue(ret.isNew()); assertFalse(ret.isFromCache()); assertTrue(ret.isMetaDataDirty()); } @Test public void test_getOrCreateDocument_null() throws Exception { try { modelAccess.getOrCreateDocument(null); fail("expecting NullPointerException"); } catch (NullPointerException npe) { // expected } } @Test public void test_exists_true() throws Exception { expect(getWikiMock().exists(eq(doc.getDocumentReference()), same(getContext()))).andReturn( true).once(); replayDefault(); boolean ret = modelAccess.exists(doc.getDocumentReference()); verifyDefault(); assertTrue(ret); } @Test public void test_exists_false() throws Exception { expect(getWikiMock().exists(eq(doc.getDocumentReference()), same(getContext()))).andReturn( false).once(); replayDefault(); boolean ret = modelAccess.exists(doc.getDocumentReference()); verifyDefault(); assertFalse(ret); } @Test public void test_exists_null() throws Exception { replayDefault(); boolean ret = modelAccess.exists(null); verifyDefault(); assertFalse(ret); } @Test public void test_exists_lang_true() throws Exception { String lang = "en"; Capture<XWikiDocument> capt = expectExists(true); replayDefault(); boolean ret = modelAccess.exists(doc.getDocumentReference(), lang); verifyDefault(); assertTrue(ret); assertCapture(capt, doc.getDocumentReference(), lang); } @Test public void test_exists_lang_false() throws Exception { String lang = "en"; Capture<XWikiDocument> capt = expectExists(false); replayDefault(); boolean ret = modelAccess.exists(doc.getDocumentReference(), lang); verifyDefault(); assertFalse(ret); assertCapture(capt, doc.getDocumentReference(), lang); } @Test public void test_exists_lang_none() throws Exception { Capture<XWikiDocument> capt = expectExists(false); replayDefault(); boolean ret = modelAccess.exists(doc.getDocumentReference(), null); verifyDefault(); assertFalse(ret); assertCapture(capt, doc.getDocumentReference(), ""); } @Test public void test_exists_lang_null() throws Exception { replayDefault(); boolean ret = modelAccess.exists(null, null); verifyDefault(); assertFalse(ret); } @Test public void test_saveDocument() throws Exception { getWikiMock().saveDocument(same(doc), eq(""), eq(false), same(getContext())); expectLastCall().once(); replayDefault(); modelAccess.saveDocument(doc); verifyDefault(); } @Test public void test_saveDocument_saveException() throws Exception { Throwable cause = new XWikiException(); getWikiMock().saveDocument(same(doc), eq(""), eq(false), same(getContext())); expectLastCall().andThrow(cause).once(); replayDefault(); try { modelAccess.saveDocument(doc); fail("expecting DocumentSaveException"); } catch (DocumentSaveException exc) { assertSame(cause, exc.getCause()); } verifyDefault(); } @Test public void test_saveDocument_checkAuthor() throws Exception { String username = "XWiki.TestUser"; getContext().setUser(username); doc.setAuthor("XWiki.OldAuthor"); String oldCreator = "XWiki.OldCreator"; doc.setCreator(oldCreator); Capture<XWikiDocument> docCapture = new Capture<>(); getWikiMock().saveDocument(capture(docCapture), eq(""), eq(false), same(getContext())); expectLastCall().once(); doc.setMetaDataDirty(false); replayDefault(); modelAccess.saveDocument(doc); verifyDefault(); XWikiDocument docSaved = docCapture.getValue(); assertEquals(username, docSaved.getAuthor()); assertEquals(oldCreator, docSaved.getCreator()); assertTrue(docSaved.isMetaDataDirty()); } @Test public void test_saveDocument_checkAuthor_Creator_isNew() throws Exception { String username = "XWiki.TestUser"; getContext().setUser(username); doc.setNew(true); doc.setAuthor("XWiki.OldAuthor"); String oldCreator = "XWiki.OldCreator"; doc.setCreator(oldCreator); Capture<XWikiDocument> docCapture = new Capture<>(); getWikiMock().saveDocument(capture(docCapture), eq(""), eq(false), same(getContext())); expectLastCall().once(); doc.setMetaDataDirty(false); replayDefault(); modelAccess.saveDocument(doc); verifyDefault(); XWikiDocument docSaved = docCapture.getValue(); assertEquals(username, docSaved.getAuthor()); assertEquals(username, docSaved.getCreator()); assertTrue(docSaved.isMetaDataDirty()); } @Test public void test_saveDocument_null() throws Exception { try { modelAccess.saveDocument(null); fail("expecting NullPointerException"); } catch (NullPointerException npe) { // expected } } @Test public void test_saveDocument_comment() throws Exception { String comment = "myComment"; getWikiMock().saveDocument(same(doc), eq(comment), eq(false), same(getContext())); expectLastCall().once(); replayDefault(); modelAccess.saveDocument(doc, comment); verifyDefault(); } @Test public void test_saveDocument_comment_isMinorEdit() throws Exception { String comment = "myComment"; boolean isMinorEdit = true; getWikiMock().saveDocument(same(doc), eq(comment), eq(isMinorEdit), same(getContext())); expectLastCall().once(); replayDefault(); modelAccess.saveDocument(doc, comment, isMinorEdit); verifyDefault(); } @Test public void test_isTranslation() throws Exception { assertFalse(modelAccess.isTranslation(doc)); } @Test public void test_isTranslation_false() throws Exception { doc.setTranslation(1); assertTrue(modelAccess.isTranslation(doc)); } @Test public void test_getXObjects_nullDoc() { try { modelAccess.getXObjects((XWikiDocument) null, null); fail("expecting NullPointerException"); } catch (NullPointerException npe) { // expected } } @Test public void test_getXObjects_nullClassRef() { try { modelAccess.getXObjects(doc, null); fail("expecting NullPointerException"); } catch (NullPointerException npe) { // expected } } @Test public void test_getXObjects_emptyDoc() { List<BaseObject> ret = modelAccess.getXObjects(doc, classRef); assertEquals(ret.size(), 0); } @Test public void test_getXObjects_withObj() { BaseObject obj = addObj(classRef, null, null); List<BaseObject> ret = modelAccess.getXObjects(doc, classRef); assertEquals(1, ret.size()); assertSame(obj, ret.get(0)); } @Test public void test_getXObjects_mutlipleObj() { BaseObject obj1 = addObj(classRef, null, null); addObj(classRef2, null, null); BaseObject obj2 = addObj(classRef, null, null); List<BaseObject> ret = modelAccess.getXObjects(doc, classRef); assertEquals(2, ret.size()); assertSame(obj1, ret.get(0)); assertSame(obj2, ret.get(1)); } @Test public void test_getXObjects_otherWikiRef() { BaseObject obj = addObj(classRef, null, null); // IMPORTANT do not use setWikiReference, because it is dropped in xwiki 4.5.4 classRef = new DocumentReference("otherWiki", classRef.getLastSpaceReference().getName(), classRef.getName()); List<BaseObject> ret = modelAccess.getXObjects(doc, classRef); assertEquals(1, ret.size()); assertSame(obj, ret.get(0)); } @Test public void test_getXObjects_key() { String key = "field"; String val = "val"; addObj(classRef, null, null); addObj(classRef2, key, val); BaseObject obj1 = addObj(classRef, key, val); addObj(classRef, key, null); BaseObject obj2 = addObj(classRef, key, val); assertEquals(0, modelAccess.getXObjects(doc, classRef, key, null).size()); assertEquals(0, modelAccess.getXObjects(doc, classRef, key, "").size()); List<BaseObject> ret = modelAccess.getXObjects(doc, classRef, key, val); assertEquals(2, ret.size()); assertSame(obj1, ret.get(0)); assertSame(obj2, ret.get(1)); } @Test public void test_getXObjects_key_values() { String key = "field"; List<String> vals = Arrays.asList("val1", "val2"); addObj(classRef, null, null); addObj(classRef2, key, vals.get(0)); BaseObject obj1 = addObj(classRef, key, vals.get(0)); addObj(classRef, key, null); BaseObject obj2 = addObj(classRef, key, vals.get(1)); List<BaseObject> ret = modelAccess.getXObjects(doc, classRef, key, vals); assertEquals(2, ret.size()); assertSame(obj1, ret.get(0)); assertSame(obj2, ret.get(1)); } @Test public void test_getXObjects_isTranslation() throws Exception { doc.setTranslation(1); replayDefault(); try { modelAccess.getXObjects(doc, classRef); fail("expecting IllegalStateException"); } catch (IllegalStateException ise) { // expected } verifyDefault(); } @Test public void test_getXObjects_undmodifiable() throws Exception { addObj(classRef, null, null); List<BaseObject> ret = modelAccess.getXObjects(doc, classRef); assertEquals(1, ret.size()); try { ret.remove(0); fail("expecting UnsupportedOperationException"); } catch (UnsupportedOperationException exc) { // expected } } @Test public void test_getXObjects_docRef() throws Exception { expect(getWikiMock().exists(eq(doc.getDocumentReference()), same(getContext()))).andReturn( true).once(); expect(getWikiMock().getDocument(eq(doc.getDocumentReference()), same(getContext()))).andReturn( doc).once(); replayDefault(); List<BaseObject> ret = modelAccess.getXObjects(doc.getDocumentReference(), classRef); verifyDefault(); assertEquals(0, ret.size()); } @Test public void test_getXObjects_map() throws Exception { BaseObject obj1 = addObj(classRef, null, null); BaseObject obj2 = addObj(classRef, null, null); BaseObject obj3 = addObj(classRef, null, null); BaseObject obj4 = addObj(classRef2, null, null); Map<DocumentReference, List<BaseObject>> ret = modelAccess.getXObjects(doc); assertEquals(2, ret.size()); assertTrue(ret.containsKey(classRef)); assertEquals(3, ret.get(classRef).size()); assertEquals(obj1, ret.get(classRef).get(0)); assertEquals(obj2, ret.get(classRef).get(1)); assertEquals(obj3, ret.get(classRef).get(2)); assertTrue(ret.containsKey(classRef2)); assertEquals(1, ret.get(classRef2).size()); assertEquals(obj4, ret.get(classRef2).get(0)); try { ret.remove(classRef); fail("expecting UnsupportedOperationException"); } catch (UnsupportedOperationException exc) { // expected } } @Test public void test_getXObjects_map_isTranslation() throws Exception { doc.setTranslation(1); replayDefault(); try { modelAccess.getXObjects(doc); fail("expecting IllegalStateException"); } catch (IllegalStateException ise) { // expected } verifyDefault(); } @Test public void test_newXObject() throws Exception { XWikiDocument docMock = createMockAndAddToDefault(XWikiDocument.class); expect(docMock.getDocumentReference()).andReturn(doc.getDocumentReference()); BaseObject obj = new BaseObject(); expect(docMock.newXObject(eq(classRef), same(getContext()))).andReturn(obj).once(); replayDefault(); BaseObject ret = modelAccess.newXObject(docMock, classRef); verifyDefault(); assertEquals(obj, ret); } @Test public void test_newXObject_loadException() throws Exception { Throwable cause = new XWikiException(); XWikiDocument docMock = createMockAndAddToDefault(XWikiDocument.class); expect(docMock.getDocumentReference()).andReturn(doc.getDocumentReference()); expect(docMock.newXObject(eq(classRef), same(getContext()))).andThrow(cause).once(); replayDefault(); try { modelAccess.newXObject(docMock, classRef); fail("expecting ClassDocumentLoadException"); } catch (ClassDocumentLoadException exc) { assertSame(cause, exc.getCause()); } verifyDefault(); } @Test public void test_newXObject_otherWikiRef() throws Exception { XWikiDocument docMock = createMockAndAddToDefault(XWikiDocument.class); expect(docMock.getDocumentReference()).andReturn(doc.getDocumentReference()); BaseObject obj = new BaseObject(); expect(docMock.newXObject(eq(classRef), same(getContext()))).andReturn(obj).once(); classRef = new DocumentReference("otherWiki", classRef.getLastSpaceReference().getName(), classRef.getName()); replayDefault(); BaseObject ret = modelAccess.newXObject(docMock, classRef); verifyDefault(); assertEquals(obj, ret); } @Test public void test_newXObject_nullDoc() throws Exception { replayDefault(); try { modelAccess.newXObject((XWikiDocument) null, classRef); fail("expecting NullPointerException"); } catch (NullPointerException npe) { // expected } verifyDefault(); } @Test public void test_newXObject_nullClassRef() throws Exception { replayDefault(); try { modelAccess.newXObject(doc, null); fail("expecting NullPointerException"); } catch (NullPointerException npe) { // expected } verifyDefault(); } @Test public void test_getOrgCreateXObject_get() throws Exception { BaseObject obj = addObj(classRef, null, null); replayDefault(); BaseObject ret = modelAccess.getOrCreateXObject(doc, classRef); verifyDefault(); assertSame(obj, ret); } @Test public void test_getOrgCreateXObject_create() throws Exception { expectNewBaseObject(classRef); replayDefault(); BaseObject ret = modelAccess.getOrCreateXObject(doc, classRef); verifyDefault(); assertEquals(classRef, ret.getXClassReference()); } @Test public void test_getOrgCreateXObject_create_set() throws Exception { String key = "field"; String val = "val"; BaseClass bClassMock = expectNewBaseObject(classRef); expect(bClassMock.get(eq(key))).andReturn(new StringClass()).anyTimes(); replayDefault(); BaseObject ret = modelAccess.getOrCreateXObject(doc, classRef, key, val); verifyDefault(); assertEquals(classRef, ret.getXClassReference()); assertEquals(val, ret.getStringValue(key)); } @Test public void test_removeXObjects() { addObj(classRef, null, null); assertTrue(modelAccess.removeXObjects(doc, classRef)); assertEquals(0, modelAccess.getXObjects(doc, classRef).size()); } @Test public void test_removeXObjects_noChange() { addObj(classRef2, null, null); assertFalse(modelAccess.removeXObjects(doc, classRef)); assertEquals(0, modelAccess.getXObjects(doc, classRef).size()); assertEquals(1, modelAccess.getXObjects(doc, classRef2).size()); } @Test public void test_removeXObjects_mutlipleObj() { addObj(classRef, null, null); addObj(classRef2, null, null); addObj(classRef, null, null); assertTrue(modelAccess.removeXObjects(doc, classRef)); assertEquals(0, modelAccess.getXObjects(doc, classRef).size()); assertEquals(1, modelAccess.getXObjects(doc, classRef2).size()); } @Test public void test_getProperty_String() throws Exception { BaseObject obj = new BaseObject(); String name = "name"; String val = "val"; obj.setStringValue(name, val); replayDefault(); Object ret = modelAccess.getProperty(obj, name); verifyDefault(); assertEquals(val, ret); } @Test public void test_getProperty_String_emptyString() throws Exception { BaseObject obj = new BaseObject(); String name = "name"; String val = ""; obj.setStringValue(name, val); replayDefault(); Object ret = modelAccess.getProperty(obj, name); verifyDefault(); assertNull(ret); } @Test public void test_getProperty_Number() throws Exception { BaseObject obj = new BaseObject(); String name = "name"; int val = 5; obj.setIntValue(name, val); replayDefault(); Object ret = modelAccess.getProperty(obj, name); verifyDefault(); assertEquals(val, ret); } @Test public void test_getProperty_Date() throws Exception { BaseObject obj = new BaseObject(); String name = "name"; Date val = new Date(); obj.setDateValue(name, val); replayDefault(); Object ret = modelAccess.getProperty(obj, name); verifyDefault(); assertEquals(val, ret); } @Test public void test_getProperty_Date_Timestamp() throws Exception { BaseObject obj = new BaseObject(); String name = "name"; Date date = new Date(); Timestamp val = new Timestamp(date.getTime()); obj.setDateValue(name, val); replayDefault(); Object ret = modelAccess.getProperty(obj, name); verifyDefault(); assertEquals(date, ret); } @Test public void test_getProperty_ClassField() throws Exception { ClassField<String> field = new StringField.Builder(classRef, "name").build(); String val = "val"; addObj(classRef, field.getName(), val); replayDefault(); String ret = modelAccess.getProperty(doc, field); verifyDefault(); assertEquals(val, ret); } @Test public void test_getProperty_ClassField_illegalField() throws Exception { ClassField<Date> field = new DateField.Builder(classRef, "name").build(); addObj(classRef, field.getName(), "val"); replayDefault(); try { modelAccess.getProperty(doc, field); fail("expecting IllegalArgumentException"); } catch (IllegalArgumentException iae) { assertTrue(iae.getMessage().contains("class.any.name")); assertTrue(iae.getCause().getClass().equals(ClassCastException.class)); } finally { verifyDefault(); } } @Test public void test_getProperty_ClassField_docRef() throws Exception { ClassField<String> field = new StringField.Builder(classRef, "name").build(); String val = "val"; addObj(classRef, field.getName(), val); expect(getWikiMock().exists(eq(doc.getDocumentReference()), same(getContext()))).andReturn( true).once(); expect(getWikiMock().getDocument(eq(doc.getDocumentReference()), same(getContext()))).andReturn( doc).once(); replayDefault(); String ret = modelAccess.getProperty(doc.getDocumentReference(), field); verifyDefault(); assertEquals(val, ret); } @Test public void test_getProperties() { ClassDefinition classDef = Utils.getComponent(ClassDefinition.class, TestClassDefinition.NAME); String val = "value"; addObj(classDef.getClassRef(), TestClassDefinition.FIELD_MY_STRING.getName(), val); replayDefault(); List<ClassFieldValue<?>> ret = modelAccess.getProperties(doc, classDef); verifyDefault(); assertEquals(classDef.getFields().size(), ret.size()); for (int i = 0; i < ret.size(); i++) { ClassField<?> field = classDef.getFields().get(i); assertEquals(field, ret.get(i).getField()); if (field.equals(TestClassDefinition.FIELD_MY_STRING)) { assertEquals(val, ret.get(i).getValue()); } else { assertNull(ret.get(i).getValue()); } } } @Test public void test_setProperty_String() throws Exception { BaseObject obj = new BaseObject(); obj.setXClassReference(classRef); String name = "name"; String val = "val"; expectPropertyClass(classRef, name, new StringClass()); replayDefault(); modelAccess.setProperty(obj, name, val); verifyDefault(); assertEquals(1, obj.getFieldList().size()); assertEquals(val, ((BaseProperty) obj.get(name)).getValue()); } @Test public void test_setProperty_Number() throws Exception { BaseObject obj = new BaseObject(); obj.setXClassReference(classRef); String name = "name"; long val = 5; expectPropertyClass(classRef, name, new NumberClass()); replayDefault(); modelAccess.setProperty(obj, name, val); verifyDefault(); assertEquals(1, obj.getFieldList().size()); assertEquals(val, ((BaseProperty) obj.get(name)).getValue()); } @Test public void test_setProperty_Date() throws Exception { BaseObject obj = new BaseObject(); obj.setXClassReference(classRef); String name = "name"; Date val = new Date(); expectPropertyClass(classRef, name, new DateClass()); replayDefault(); modelAccess.setProperty(obj, name, val); verifyDefault(); assertEquals(1, obj.getFieldList().size()); assertEquals(val, ((BaseProperty) obj.get(name)).getValue()); } @Test public void test_setProperty_List() throws Exception { BaseObject obj = new BaseObject(); obj.setXClassReference(classRef); String name = "name"; expectPropertyClass(classRef, name, new StringClass()); replayDefault(); modelAccess.setProperty(obj, name, Arrays.asList("A", "B")); verifyDefault(); assertEquals(1, obj.getFieldList().size()); assertEquals("A|B", ((BaseProperty) obj.get(name)).getValue()); } @Test public void test_setProperty_ClassField() throws Exception { String val = "val"; ClassField<String> field = new StringField.Builder(classRef, "name").build(); ClassFieldValue<String> fieldValue = new ClassFieldValue<>(field, val); BaseObject obj = addObj(classRef, field.getName(), ""); expectPropertyClass(classRef, field.getName(), new StringClass()); replayDefault(); modelAccess.setProperty(doc, fieldValue); verifyDefault(); assertEquals(1, obj.getFieldList().size()); assertEquals(val, obj.getStringValue(field.getName())); } @Test public void test_setProperty_ClassField_illegalField() throws Exception { ClassField<Date> field = new DateField.Builder(classRef, "name").build(); ClassFieldValue<Date> fieldValue = new ClassFieldValue<>(field, new Date()); BaseClass bClass = expectNewBaseObject(classRef); expectPropertyClass(bClass, field.getName(), new StringClass()); replayDefault(); try { modelAccess.setProperty(doc, fieldValue); fail("expecting IllegalArgumentException"); } catch (IllegalArgumentException iae) { assertTrue(iae.getMessage().contains("class.any.name")); assertTrue(iae.getCause().getClass().equals(ClassCastException.class)); } finally { verifyDefault(); } } @Test public void test_setProperty_ClassField_newObj() throws Exception { String val = "val"; ClassField<String> field = new StringField.Builder(classRef, "name").build(); ClassFieldValue<String> fieldValue = new ClassFieldValue<>(field, val); BaseClass bClass = expectNewBaseObject(classRef); expectPropertyClass(bClass, field.getName(), new StringClass()); replayDefault(); modelAccess.setProperty(doc, fieldValue); verifyDefault(); BaseObject obj = doc.getXObject(classRef); assertEquals(1, obj.getFieldList().size()); assertEquals(val, obj.getStringValue(field.getName())); } @Test public void test_setProperty_getProperty_customField() throws Exception { ClassField<DocumentReference> field = TestClassDefinition.FIELD_MY_DOCREF; DocumentReference toStoreRef = new DocumentReference("myDB", "mySpace", "myDoc"); BaseClass bClass = expectNewBaseObject(field.getClassRef()); expectPropertyClass(bClass, field.getName(), new StringClass()); replayDefault(); modelAccess.setProperty(doc, new ClassFieldValue<>(field, toStoreRef)); DocumentReference ret = modelAccess.getProperty(doc, field); verifyDefault(); assertEquals(toStoreRef, ret); String objValue = modelAccess.getXObject(doc, field.getClassRef()).getStringValue( field.getName()); assertEquals(modelAccess.modelUtils.serializeRef(toStoreRef), objValue); } @Test public void test_getAttachmentNameEqual() throws Exception { String filename = "image.jpg"; XWikiAttachment firstAtt = new XWikiAttachment(doc, filename + ".zip"); XWikiAttachment imageAtt = new XWikiAttachment(doc, filename); XWikiAttachment lastAtt = new XWikiAttachment(doc, "bli.gaga"); List<XWikiAttachment> attList = Arrays.asList(firstAtt, imageAtt, lastAtt); doc.setAttachmentList(attList); replayDefault(); XWikiAttachment att = modelAccess.getAttachmentNameEqual(doc, filename); verifyDefault(); assertNotNull("Expected image.jpg attachment - not null", att); assertEquals(filename, att.getFilename()); } @Test public void test_getAttachmentNameEqual_not_exists() { String filename = "image.jpg"; XWikiAttachment firstAtt = new XWikiAttachment(doc, filename + ".zip"); XWikiAttachment lastAtt = new XWikiAttachment(doc, "bli.gaga"); List<XWikiAttachment> attList = Arrays.asList(firstAtt, lastAtt); doc.setAttachmentList(attList); replayDefault(); try { modelAccess.getAttachmentNameEqual(doc, filename); fail("AttachmentNotExistsException expected"); } catch (AttachmentNotExistsException exp) { // expected } verifyDefault(); } @Test public void test_getApiDocument_hasAccess() throws Exception { XWikiRightService mockRightSrv = createMockAndAddToDefault(XWikiRightService.class); expect(getWikiMock().getRightService()).andReturn(mockRightSrv).anyTimes(); expect(mockRightSrv.hasAccessLevel(eq("view"), eq(getContext().getUser()), eq("db:space.doc"), same(getContext()))).andReturn(true).atLeastOnce(); replayDefault(); Document apiDoc = modelAccess.getApiDocument(doc); assertNotNull("Expected Attachment api object - not null", apiDoc); verifyDefault(); } @Test public void test_getApiDocument_noAccess() throws Exception { XWikiRightService mockRightSrv = createMockAndAddToDefault(XWikiRightService.class); expect(getWikiMock().getRightService()).andReturn(mockRightSrv).anyTimes(); expect(mockRightSrv.hasAccessLevel(eq("view"), eq(getContext().getUser()), eq("db:space.doc"), same(getContext()))).andReturn(false).atLeastOnce(); replayDefault(); try { modelAccess.getApiDocument(doc); fail("NoAccessRightsException expected"); } catch (NoAccessRightsException exp) { // expected } verifyDefault(); } private BaseObject addObj(DocumentReference classRef, String key, String value) { BaseObject obj = new BaseObject(); obj.setXClassReference(classRef); if (key != null) { obj.setStringValue(key, value); } doc.addXObject(obj); return obj; } private Capture<XWikiDocument> expectExists(boolean result) throws XWikiException { Capture<XWikiDocument> capt = new Capture<>(); expect(storeMock.exists(capture(capt), same(getContext()))).andReturn(result).once(); return capt; } private Capture<XWikiDocument> expectLoad(XWikiDocument result) throws XWikiException { Capture<XWikiDocument> capt = new Capture<>(); expect(storeMock.loadXWikiDoc(capture(capt), same(getContext()))).andReturn(result).once(); result.setFromCache(!result.isNew()); return capt; } private void assertCapture(Capture<XWikiDocument> capt, DocumentReference docRef, String lang) { assertNotNull(capt.getValue()); assertEquals(docRef, capt.getValue().getDocumentReference()); assertEquals(lang, capt.getValue().getLanguage()); } }