package com.celements.validation;
import static org.easymock.EasyMock.*;
import static org.junit.Assert.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.junit.Before;
import org.junit.Test;
import org.xwiki.configuration.ConfigurationSource;
import org.xwiki.model.reference.DocumentReference;
import com.celements.common.test.AbstractBridgedComponentTestCase;
import com.xpn.xwiki.XWikiException;
import com.xpn.xwiki.doc.XWikiDocument;
import com.xpn.xwiki.objects.BaseProperty;
import com.xpn.xwiki.objects.StringProperty;
import com.xpn.xwiki.objects.classes.BaseClass;
import com.xpn.xwiki.objects.classes.PropertyClass;
import com.xpn.xwiki.web.Utils;
public class XClassRegexRuleTest extends AbstractBridgedComponentTestCase {
private XClassRegexRule xClassRegexRule;
private DocumentReference bclassDocRef;
@Before
public void setUp_XClassRegeRuleTest() throws Exception {
xClassRegexRule = (XClassRegexRule) Utils.getComponent(IRequestValidationRuleRole.class,
"XClassRegexValidation");
bclassDocRef = new DocumentReference(getContext().getDatabase(), "Test", "TestClass");
}
@Test
public void testValidate_empty() throws XWikiException {
Map<RequestParameter, String[]> requestMap = new HashMap<RequestParameter, String[]>();
replayDefault();
Map<String, Map<ValidationType, Set<String>>> result = xClassRegexRule.validateRequest(
requestMap);
verifyDefault();
assertTrue("Successful validation should result in an empty map", (result != null)
&& result.isEmpty());
}
@Test
public void testValidate_valid() throws XWikiException {
BaseClass bclass = getBaseClass("testField");
DocumentReference bclassDocRef1 = new DocumentReference(getContext().getDatabase(), "Test",
"TestClass1");
DocumentReference bclassDocRef2 = new DocumentReference(getContext().getDatabase(), "Test",
"TestClass2");
XWikiDocument doc1 = new XWikiDocument(bclassDocRef1);
XWikiDocument doc2 = new XWikiDocument(bclassDocRef2);
doc1.setXClass(bclass);
doc2.setXClass(bclass);
Map<RequestParameter, String[]> requestMap = new HashMap<RequestParameter, String[]>();
String param1 = "Test.TestClass1_0_testField";
String param2 = "Test.TestClass2_0_testField";
requestMap.put(RequestParameter.create(param1), new String[] { "value1" });
requestMap.put(RequestParameter.create(param2), new String[] { "value2", "asdf" });
expect(getWikiMock().getDocument(eq(bclassDocRef1), same(getContext()))).andReturn(doc1).once();
expect(getWikiMock().getDocument(eq(bclassDocRef2), same(getContext()))).andReturn(doc2).times(
2);
replayDefault();
Map<String, Map<ValidationType, Set<String>>> result = xClassRegexRule.validateRequest(
requestMap);
verifyDefault();
assertTrue("Successful validation should result in an empty map", (result != null)
&& result.isEmpty());
}
@Test
public void testValidate_invalid() throws XWikiException {
BaseClass bclass = getBaseClass("testField");
DocumentReference bclassDocRef1 = new DocumentReference(getContext().getDatabase(), "Test",
"TestClass1");
DocumentReference bclassDocRef2 = new DocumentReference(getContext().getDatabase(), "Test",
"TestClass2");
XWikiDocument doc1 = new XWikiDocument(bclassDocRef1);
XWikiDocument doc2 = new XWikiDocument(bclassDocRef2);
doc1.setXClass(bclass);
doc2.setXClass(bclass);
Map<RequestParameter, String[]> requestMap = new HashMap<RequestParameter, String[]>();
String param1 = "Test.TestClass1_0_testField";
String param2 = "Test.TestClass2_0_testField";
requestMap.put(RequestParameter.create(param1), new String[] { "" });
requestMap.put(RequestParameter.create(param2), new String[] { "", "" });
expect(getWikiMock().getDocument(eq(bclassDocRef1), same(getContext()))).andReturn(doc1).once();
expect(getWikiMock().getDocument(eq(bclassDocRef2), same(getContext()))).andReturn(doc2).times(
2);
replayDefault();
Map<String, Map<ValidationType, Set<String>>> result = xClassRegexRule.validateRequest(
requestMap);
verifyDefault();
assertNotNull(result);
assertEquals(2, result.size());
Set<String> set1 = result.get(param1).get(ValidationType.ERROR);
assertNotNull(set1);
assertEquals(1, set1.size());
assertTrue(set1.contains("testValMsg"));
Set<String> set2 = result.get(param1).get(ValidationType.ERROR);
assertNotNull(set2);
assertEquals(1, set2.size());
assertTrue(set2.contains("testValMsg"));
}
@Test
public void testValidateField_valid() throws XWikiException {
BaseClass bclass = getBaseClass("testField");
XWikiDocument doc = new XWikiDocument(bclassDocRef);
doc.setXClass(bclass);
expect(getWikiMock().getDocument(eq(bclassDocRef), same(getContext()))).andReturn(doc).once();
replayDefault();
Map<ValidationType, Set<String>> result = xClassRegexRule.validateField("Test.TestClass",
"testField", "value");
verifyDefault();
assertNull("Successful validation should result in null", result);
}
@Test
public void testValidateField_invalid() throws XWikiException {
BaseClass bclass = getBaseClass("testField");
XWikiDocument doc = new XWikiDocument(bclassDocRef);
doc.setXClass(bclass);
expect(getWikiMock().getDocument(eq(bclassDocRef), same(getContext()))).andReturn(doc).once();
replayDefault();
Map<ValidationType, Set<String>> result = xClassRegexRule.validateField("Test.TestClass",
"testField", "");
verifyDefault();
assertNotNull(result);
assertEquals(1, result.size());
assertTrue(result.containsKey(ValidationType.ERROR));
assertEquals(1, result.get(ValidationType.ERROR).size());
assertEquals("testValMsg", result.get(ValidationType.ERROR).iterator().next());
}
@Test
public void testValidateField_invalidKey_class() throws XWikiException {
XWikiDocument doc = new XWikiDocument(bclassDocRef);
expect(getWikiMock().getDocument(eq(bclassDocRef), same(getContext()))).andReturn(doc).once();
replayDefault();
Map<ValidationType, Set<String>> result = xClassRegexRule.validateField("Test.TestClass",
"testField", "");
verifyDefault();
assertNull("Not existing class should be ignored by default", result);
}
@Test
public void testValidateField_invalidKey_field() throws XWikiException {
BaseClass bclass = getBaseClass("testFieldOther");
XWikiDocument doc = new XWikiDocument(bclassDocRef);
doc.setXClass(bclass);
expect(getWikiMock().getDocument(eq(bclassDocRef), same(getContext()))).andReturn(doc).once();
replayDefault();
Map<ValidationType, Set<String>> result = xClassRegexRule.validateField("Test.TestClass",
"testField", "");
verifyDefault();
assertNull("Not existing field should be ignored by default", result);
}
@Test
public void testValidateField_invalidKey_notIgnore() throws XWikiException {
xClassRegexRule.configSrc = createMockAndAddToDefault(ConfigurationSource.class);
XWikiDocument doc = new XWikiDocument(bclassDocRef);
expect(getWikiMock().getDocument(eq(bclassDocRef), same(getContext()))).andReturn(doc).once();
expect(xClassRegexRule.configSrc.getProperty(eq(
"celements.validation.xClassRegex.ignoreInvalidKey"), eq(true))).andReturn(false).once();
replayDefault();
Map<ValidationType, Set<String>> result = xClassRegexRule.validateField("Test.TestClass",
"testField", "");
verifyDefault();
assertNotNull(result);
assertEquals(1, result.size());
assertTrue(result.containsKey(ValidationType.ERROR));
assertEquals(1, result.get(ValidationType.ERROR).size());
assertEquals("cel_validation_xclassregex_invalidkey", result.get(
ValidationType.ERROR).iterator().next());
xClassRegexRule.configSrc = Utils.getComponent(ConfigurationSource.class);
}
private BaseClass getBaseClass(String fieldName) {
BaseProperty regexProp = new StringProperty();
regexProp.setValue("/.+/");
BaseProperty msgProp = new StringProperty();
msgProp.setValue("testValMsg");
Map<String, BaseProperty> propfields = new HashMap<String, BaseProperty>();
PropertyClass property = new PropertyClass();
propfields.put("validationRegExp", regexProp);
propfields.put("validationMessage", msgProp);
property.setFields(propfields);
Map<String, PropertyClass> fields = new HashMap<String, PropertyClass>();
fields.put(fieldName, property);
BaseClass bclass = new BaseClass();
bclass.setFields(fields);
return bclass;
}
@Test
public void testGetFieldFromProperty_null() throws XWikiException {
PropertyClass propclass = new PropertyClass();
assertEquals("", xClassRegexRule.getFieldFromProperty(propclass, "test"));
propclass.put("test", null);
assertEquals("", xClassRegexRule.getFieldFromProperty(propclass, "test"));
}
@Test
public void testGetFieldFromProperty() throws XWikiException {
BaseProperty prop = new StringProperty();
prop.setValue("value");
PropertyClass propclass = new PropertyClass();
propclass.put("test", prop);
assertEquals("value", xClassRegexRule.getFieldFromProperty(propclass, "test"));
}
}