package com.celements.model.util;
import static com.celements.common.test.CelementsTestUtils.*;
import static org.easymock.EasyMock.*;
import static org.junit.Assert.*;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.junit.Before;
import org.junit.Test;
import org.xwiki.component.descriptor.ComponentDescriptor;
import org.xwiki.component.manager.ComponentRepositoryException;
import org.xwiki.model.reference.DocumentReference;
import com.celements.common.test.AbstractComponentTest;
import com.celements.model.access.IModelAccessFacade;
import com.celements.model.classes.TestClassDefinition;
import com.celements.web.service.IWebUtilsService;
import com.google.common.collect.ImmutableSet;
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.StringClass;
import com.xpn.xwiki.web.Utils;
public class DefaultXObjectUpdateServiceTest extends AbstractComponentTest {
private IXObjectUpdateRole xObjUpdateService;
private XWikiDocument doc;
private DocumentReference classRef;
private IModelAccessFacade modelAccessMock;
@Override
@Before
public void setUp() throws Exception {
super.setUp();
init(false);
doc = new XWikiDocument(new DocumentReference("xwikidb", "space", "doc"));
classRef = new DocumentReference("xwikidb", "class", "any");
}
private void init(boolean withModelAccessMock) throws ComponentRepositoryException {
if (withModelAccessMock) {
modelAccessMock = registerComponentMock(IModelAccessFacade.class);
}
ComponentDescriptor<IXObjectUpdateRole> descr = Utils.getComponentManager().getComponentDescriptor(
IXObjectUpdateRole.class, "default");
Utils.getComponentManager().registerComponent(descr);
xObjUpdateService = Utils.getComponent(IXObjectUpdateRole.class);
}
@Test
public void test_updateFromMap() throws Exception {
Map<String, Object> fieldMap = new HashMap<>();
String fieldName = "someField";
String value = "asdf";
fieldMap.put(getWebUtils().serializeRef(classRef, true) + "." + fieldName, value);
BaseObject obj = new BaseObject();
obj.setXClassReference(classRef);
doc.addXObject(obj);
expectPropertyClass(classRef, fieldName, new StringClass());
replayDefault();
assertTrue(xObjUpdateService.updateFromMap(doc, fieldMap));
verifyDefault();
assertEquals(1, doc.getXObjects(classRef).size());
assertEquals(value, obj.getStringValue(fieldName));
}
@Test
public void test_updateFromMap_newObj() throws Exception {
Map<String, Object> fieldMap = new HashMap<>();
String fieldName = "someField";
String value = "asdf";
fieldMap.put(getWebUtils().serializeRef(classRef, true) + "." + fieldName, value);
BaseClass bClass = expectNewBaseObject(classRef);
expectPropertyClass(bClass, fieldName, new StringClass());
replayDefault();
assertTrue(xObjUpdateService.updateFromMap(doc, fieldMap));
verifyDefault();
assertEquals(1, doc.getXObjects(classRef).size());
assertEquals(value, doc.getXObject(classRef).getStringValue(fieldName));
}
@Test
public void test_updateFromMap_aleadySet() throws Exception {
Map<String, Object> fieldMap = new HashMap<>();
String fieldName = "someField";
String value = "asdf";
fieldMap.put(getWebUtils().serializeRef(classRef, true) + "." + fieldName, value);
BaseObject obj = new BaseObject();
obj.setXClassReference(classRef);
obj.setStringValue(fieldName, value);
doc.addXObject(obj);
replayDefault();
assertFalse(xObjUpdateService.updateFromMap(doc, fieldMap));
verifyDefault();
assertEquals(1, doc.getXObjects(classRef).size());
assertEquals(value, obj.getStringValue(fieldName));
}
@Test
public void test_updateFromMap_empty() throws Exception {
Map<String, Object> fieldMap = new HashMap<>();
replayDefault();
assertFalse(xObjUpdateService.updateFromMap(doc, fieldMap));
verifyDefault();
assertNull(doc.getXObject(classRef));
}
@Test
public void test_updateFromMap_invalidClassName() throws Exception {
Map<String, Object> fieldMap = new HashMap<>();
fieldMap.put("invalidString", "asdf");
replayDefault();
try {
xObjUpdateService.updateFromMap(doc, fieldMap);
fail("should throw IllegalArgumentException, invalid fieldMap entry");
} catch (IllegalArgumentException iae) {
// expected
}
verifyDefault();
assertNull(doc.getXObject(classRef));
}
@Test
public void test_update_empty() throws Exception {
Set<ClassFieldValue<?>> fieldValues = new HashSet<>();
replayDefault();
assertFalse(xObjUpdateService.update(doc, fieldValues));
verifyDefault();
}
@Test
public void test_update() throws Exception {
init(true);
ClassFieldValue<String> fieldVal1 = new ClassFieldValue<>(TestClassDefinition.FIELD_MY_STRING,
"val");
ClassFieldValue<Boolean> fieldVal2 = new ClassFieldValue<>(TestClassDefinition.FIELD_MY_BOOL,
true);
ClassFieldValue<Integer> fieldVal3 = new ClassFieldValue<>(TestClassDefinition.FIELD_MY_INT, 1);
expect(modelAccessMock.getProperty(same(doc), eq(fieldVal1.getField()))).andReturn(null).once();
expect(modelAccessMock.setProperty(same(doc), eq(fieldVal1))).andReturn(true).once();
expect(modelAccessMock.getProperty(same(doc), eq(fieldVal2.getField()))).andReturn(
false).once();
expect(modelAccessMock.setProperty(same(doc), eq(fieldVal2))).andReturn(true).once();
expect(modelAccessMock.getProperty(same(doc), eq(fieldVal3.getField()))).andReturn(1).once();
replayDefault();
assertTrue(xObjUpdateService.update(doc, ImmutableSet.<ClassFieldValue<?>>of(fieldVal1,
fieldVal2, fieldVal3)));
verifyDefault();
}
private IWebUtilsService getWebUtils() {
return Utils.getComponent(IWebUtilsService.class);
}
}