package com.celements.validation; 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 com.celements.common.test.AbstractBridgedComponentTestCase; import com.xpn.xwiki.XWiki; import com.xpn.xwiki.XWikiContext; import com.xpn.xwiki.web.Utils; public class FormValidationServiceTest extends AbstractBridgedComponentTestCase { private XWikiContext context; private XWiki xwiki; private FormValidationService formValidationService; private IRequestValidationRuleRole requestValidationRuleMock1; private IRequestValidationRuleRole requestValidationRuleMock2; private IFieldValidationRuleRole fieldValidationRuleMock1; private IFieldValidationRuleRole fieldValidationRuleMock2; @Before public void setUp_FormValidationServiceTest() throws Exception { context = getContext(); xwiki = createMock(XWiki.class); context.setWiki(xwiki); formValidationService = (FormValidationService) Utils.getComponent( IFormValidationServiceRole.class); requestValidationRuleMock1 = createMock(IRequestValidationRuleRole.class); requestValidationRuleMock2 = createMock(IRequestValidationRuleRole.class); fieldValidationRuleMock1 = createMock(IFieldValidationRuleRole.class); fieldValidationRuleMock2 = createMock(IFieldValidationRuleRole.class); Map<String, IRequestValidationRuleRole> requestValidationRules = new HashMap<String, IRequestValidationRuleRole>(); Map<String, IFieldValidationRuleRole> fieldValidationRules = new HashMap<String, IFieldValidationRuleRole>(); requestValidationRules.put("mock1", requestValidationRuleMock1); requestValidationRules.put("mock2", requestValidationRuleMock2); fieldValidationRules.put("mock1", fieldValidationRuleMock1); fieldValidationRules.put("mock2", fieldValidationRuleMock2); formValidationService.injectValidationRules(requestValidationRules, fieldValidationRules); } @Test public void testValidateMap_valid() { Map<String, String[]> requestMap = new HashMap<String, String[]>(); requestMap.put("asdf", new String[] { "1" }); requestMap.put("qwer", new String[] { "2", "3" }); expect(requestValidationRuleMock1.validateRequest(formValidationService.convertMapKeys( requestMap))).andReturn(getEmptyRetMap()).once(); expect(requestValidationRuleMock2.validateRequest(formValidationService.convertMapKeys( requestMap))).andReturn(getEmptyRetMap()).once(); replayAll(); Map<String, Map<ValidationType, Set<String>>> validationMap = formValidationService.validateMap( requestMap); verifyAll(); assertNotNull(validationMap); assertEquals(0, validationMap.size()); } @Test public void testValidateMap_invalid() { Map<String, String[]> requestMap = new HashMap<String, String[]>(); requestMap.put("asdf", new String[] { "1" }); requestMap.put("qwer", new String[] { "2", "3" }); Map<String, Map<ValidationType, Set<String>>> map = getEmptyRetMap(); Map<ValidationType, Set<String>> innerMap = new HashMap<ValidationType, Set<String>>(); Set<String> set = new HashSet<String>(); set.add("invalid"); innerMap.put(ValidationType.ERROR, set); map.put("asdf", innerMap); expect(requestValidationRuleMock1.validateRequest(formValidationService.convertMapKeys( requestMap))).andReturn(map).once(); expect(requestValidationRuleMock2.validateRequest(formValidationService.convertMapKeys( requestMap))).andReturn(getEmptyRetMap()).once(); replayAll(); Map<String, Map<ValidationType, Set<String>>> validationMap = formValidationService.validateMap( requestMap); verifyAll(); assertNotNull(validationMap); assertEquals(1, validationMap.size()); Map<ValidationType, Set<String>> mapResult = validationMap.get("asdf"); assertNotNull(mapResult); assertEquals(1, mapResult.size()); Set<String> setResult = mapResult.get(ValidationType.ERROR); assertNotNull(setResult); assertEquals(1, setResult.size()); assertTrue(setResult.contains("invalid")); } @Test public void testValidateMap_invalid_both() { Map<String, String[]> requestMap = new HashMap<String, String[]>(); requestMap.put("asdf", new String[] { "1" }); requestMap.put("qwer", new String[] { "2", "3" }); Map<String, Map<ValidationType, Set<String>>> map1 = getEmptyRetMap(); Map<ValidationType, Set<String>> innerMap = new HashMap<ValidationType, Set<String>>(); Set<String> set = new HashSet<String>(); set.add("invalid1"); innerMap.put(ValidationType.ERROR, set); map1.put("asdf", innerMap); innerMap = new HashMap<ValidationType, Set<String>>(); set = new HashSet<String>(); set.add("invalid2"); innerMap.put(ValidationType.ERROR, set); map1.put("qwer", innerMap); Map<String, Map<ValidationType, Set<String>>> map2 = getEmptyRetMap(); innerMap = new HashMap<ValidationType, Set<String>>(); set = new HashSet<String>(); set.add("invalid3"); innerMap.put(ValidationType.ERROR, set); map2.put("qwer", innerMap); expect(requestValidationRuleMock1.validateRequest(formValidationService.convertMapKeys( requestMap))).andReturn(map1).once(); expect(requestValidationRuleMock2.validateRequest(formValidationService.convertMapKeys( requestMap))).andReturn(map2).once(); replayAll(); Map<String, Map<ValidationType, Set<String>>> validationMap = formValidationService.validateMap( requestMap); verifyAll(); assertNotNull(validationMap); assertEquals(2, validationMap.size()); Map<ValidationType, Set<String>> mapResult = validationMap.get("asdf"); assertNotNull(mapResult); assertEquals(1, mapResult.size()); Set<String> setResult = mapResult.get(ValidationType.ERROR); assertNotNull(setResult); assertEquals(1, setResult.size()); assertTrue(setResult.contains("invalid1")); mapResult = validationMap.get("qwer"); assertNotNull(mapResult); assertEquals(1, mapResult.size()); setResult = mapResult.get(ValidationType.ERROR); assertNotNull(setResult); assertEquals(2, setResult.size()); assertTrue(setResult.contains("invalid2")); assertTrue(setResult.contains("invalid3")); } @Test public void testValidateField_valid() { String className = "myClassName"; String fieldName = "myFieldName"; String value = "myValue"; expect(fieldValidationRuleMock1.validateField(eq(className), eq(fieldName), eq( value))).andReturn(new HashMap<ValidationType, Set<String>>()).once(); expect(fieldValidationRuleMock2.validateField(eq(className), eq(fieldName), eq( value))).andReturn(new HashMap<ValidationType, Set<String>>()).once(); replayAll(); Map<ValidationType, Set<String>> validationSet = formValidationService.validateField(className, fieldName, value); verifyAll(); assertNotNull(validationSet); assertEquals(0, validationSet.size()); } @Test public void testValidateField_invalid() { String className = "myClassName"; String fieldName = "myFieldName"; String value = "myValue"; Map<ValidationType, Set<String>> map = new HashMap<ValidationType, Set<String>>(); Set<String> set = new HashSet<String>(); set.add("invalid"); map.put(ValidationType.ERROR, set); expect(fieldValidationRuleMock1.validateField(eq(className), eq(fieldName), eq( value))).andReturn(map).once(); expect(fieldValidationRuleMock2.validateField(eq(className), eq(fieldName), eq( value))).andReturn(new HashMap<ValidationType, Set<String>>()).once(); replayAll(); Map<ValidationType, Set<String>> validationMap = formValidationService.validateField(className, fieldName, value); verifyAll(); assertNotNull(validationMap); assertEquals(1, validationMap.size()); set = validationMap.get(ValidationType.ERROR); assertEquals(1, set.size()); assertTrue(set.contains("invalid")); } @Test public void testValidateField_invalid_both() { String className = "myClassName"; String fieldName = "myFieldName"; String value = "myValue"; Map<ValidationType, Set<String>> map1 = new HashMap<ValidationType, Set<String>>(); Set<String> set = new HashSet<String>(); set.add("invalid1"); map1.put(ValidationType.ERROR, set); Map<ValidationType, Set<String>> map2 = new HashMap<ValidationType, Set<String>>(); set = new HashSet<String>(); set.add("invalid2"); set.add("invalid3"); map2.put(ValidationType.ERROR, set); expect(fieldValidationRuleMock1.validateField(eq(className), eq(fieldName), eq( value))).andReturn(map1).once(); expect(fieldValidationRuleMock2.validateField(eq(className), eq(fieldName), eq( value))).andReturn(map2).once(); replayAll(); Map<ValidationType, Set<String>> validationMap = formValidationService.validateField(className, fieldName, value); verifyAll(); assertNotNull(validationMap); assertEquals(1, validationMap.size()); set = validationMap.get(ValidationType.ERROR); assertEquals(3, set.size()); assertTrue(set.contains("invalid1")); assertTrue(set.contains("invalid2")); assertTrue(set.contains("invalid3")); } private Map<String, Map<ValidationType, Set<String>>> getEmptyRetMap() { return new HashMap<String, Map<ValidationType, Set<String>>>(); } private void replayAll(Object... mocks) { replay(xwiki, requestValidationRuleMock1, requestValidationRuleMock2, fieldValidationRuleMock1, fieldValidationRuleMock2); replay(mocks); } private void verifyAll(Object... mocks) { verify(xwiki, requestValidationRuleMock1, requestValidationRuleMock2, fieldValidationRuleMock1, fieldValidationRuleMock2); verify(mocks); } }