001/**
002 * Copyright 2005-2016 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.kuali.rice.krad.datadictionary.validation.constraint;
017
018
019
020import java.util.ArrayList;
021import java.util.List;
022import java.util.Properties;
023
024import org.junit.Assert;
025import org.junit.Before;
026import org.junit.Test;
027import org.kuali.rice.core.api.CoreConstants;
028import org.kuali.rice.core.api.config.property.Config;
029import org.kuali.rice.core.api.config.property.ConfigContext;
030import org.kuali.rice.core.framework.config.property.SimpleConfig;
031import org.kuali.rice.core.framework.config.property.SimpleConfig;
032import org.kuali.rice.krad.datadictionary.AttributeDefinition;
033import org.kuali.rice.krad.datadictionary.validation.AttributeValueReader;
034import org.kuali.rice.krad.datadictionary.validation.ErrorLevel;
035import org.kuali.rice.krad.datadictionary.validation.SingleAttributeValueReader;
036import org.kuali.rice.krad.datadictionary.validation.constraint.ValidCharactersConstraint;
037import org.kuali.rice.krad.datadictionary.validation.processor.ValidCharactersConstraintProcessor;
038import org.kuali.rice.krad.datadictionary.validation.result.ConstraintValidationResult;
039import org.kuali.rice.krad.datadictionary.validation.result.DictionaryValidationResult;
040
041
042/**
043 * Things this test should check:
044 *
045 * 1. empty value check. (failure) {@link #testValueInvalidDateEmpty()}
046 * 2. value with valid date. (success) {@link #testValueValidDate()}
047 * 3. value with valid date. (success) {@link #testValueValidDate1()}
048 * 4. value with invalid date. (failure) {@link #testValueInvalidDate()}
049 * 5. value with invalid date. (failure) {@link #testValueInvalidDate1()}
050 * 6. value with invalid date. (failure) {@link #testValueInvalidDate2()}
051 * 7. value with invalid date. (failure) {@link #testValueInvalidDate3()}
052 *
053 * @author Kuali Rice Team (rice.collab@kuali.org)
054 */
055public class DatePatternConstraintTest {
056
057        private AttributeDefinition dateDefinition;
058
059        private DictionaryValidationResult dictionaryValidationResult;
060
061        private ValidCharactersConstraintProcessor processor;
062
063        private String validDate;
064        private String validDate1;
065        private String invalidDateEmpty;
066        private String invalidDate;
067        private String invalidDate1;
068        private String invalidDate2;
069        private String invalidDate3;
070
071        private DatePatternConstraint datePatternConstraint;
072
073        @Before
074        public void setUp() throws Exception {
075
076                String formats = "MM/dd/yy;MM/dd/yyyy;MM-dd-yy;MM-dd-yyyy";
077
078                Properties props = new Properties();
079                props.put(CoreConstants.STRING_TO_DATE_FORMATS, formats);
080                Config config = new SimpleConfig(props);
081
082                ConfigContext.init(config);
083                ConfigContext.getCurrentContextConfig().putProperty(CoreConstants.STRING_TO_DATE_FORMATS, formats);
084
085                processor = new ValidCharactersConstraintProcessor();
086
087                dictionaryValidationResult = new DictionaryValidationResult();
088                dictionaryValidationResult.setErrorLevel(ErrorLevel.NOCONSTRAINT);
089
090                validDate = "07-28-2011";
091                validDate1 = "12-31-83";
092                invalidDateEmpty = "";
093                invalidDate = "31-12-2010";
094                invalidDate1 = "31-12-2010 12:30:45.456";
095                invalidDate2 = "2011-07-28 IST";
096                invalidDate3 = "12/31/2011";
097
098                List<String> allowedFormats = new ArrayList<String>();
099                allowedFormats.add("MM-dd-yy");
100                allowedFormats.add("MM-dd-yyyy");
101
102                datePatternConstraint = new DatePatternConstraint();
103        datePatternConstraint.setMessageKey("validate.dummykey");
104        datePatternConstraint.setValidationMessageParams( new ArrayList<String>());
105                datePatternConstraint.setAllowedFormats(allowedFormats);
106
107                dateDefinition = new AttributeDefinition();
108                dateDefinition.setName("date");
109                dateDefinition.setValidCharactersConstraint(datePatternConstraint);
110        }
111
112        @Test
113        public void testValueInvalidDateEmpty() {
114                ConstraintValidationResult result = process(invalidDateEmpty, "date", datePatternConstraint);
115                Assert.assertEquals(0, dictionaryValidationResult.getNumberOfWarnings());
116                Assert.assertEquals(0, dictionaryValidationResult.getNumberOfErrors());
117                Assert.assertEquals(ErrorLevel.INAPPLICABLE, result.getStatus());
118                Assert.assertEquals(new ValidCharactersConstraintProcessor().getName(), result.getConstraintName());
119        }
120
121        @Test
122        public void testValueValidDate() {
123                ConstraintValidationResult result = process(validDate, "date", datePatternConstraint);
124                Assert.assertEquals(0, dictionaryValidationResult.getNumberOfWarnings());
125                Assert.assertEquals(0, dictionaryValidationResult.getNumberOfErrors());
126                Assert.assertEquals(ErrorLevel.OK, result.getStatus());
127                Assert.assertEquals(new ValidCharactersConstraintProcessor().getName(), result.getConstraintName());
128        }
129
130        @Test
131        public void testValueValidDate1() {
132                ConstraintValidationResult result = process(validDate1, "Mdate", datePatternConstraint);
133                Assert.assertEquals(0, dictionaryValidationResult.getNumberOfWarnings());
134                Assert.assertEquals(0, dictionaryValidationResult.getNumberOfErrors());
135                Assert.assertEquals(ErrorLevel.OK, result.getStatus());
136                Assert.assertEquals(new ValidCharactersConstraintProcessor().getName(), result.getConstraintName());
137        }
138
139        @Test
140        public void testValueInvalidDate() {
141                ConstraintValidationResult result = process(invalidDate, "date", datePatternConstraint);
142                Assert.assertEquals(0, dictionaryValidationResult.getNumberOfWarnings());
143                Assert.assertEquals(1, dictionaryValidationResult.getNumberOfErrors());
144                Assert.assertEquals(ErrorLevel.ERROR, result.getStatus());
145                Assert.assertEquals(new ValidCharactersConstraintProcessor().getName(), result.getConstraintName());
146        }
147
148        @Test
149        public void testValueInvalidDate1() {
150                ConstraintValidationResult result = process(invalidDate1, "date", datePatternConstraint);
151                Assert.assertEquals(0, dictionaryValidationResult.getNumberOfWarnings());
152                Assert.assertEquals(1, dictionaryValidationResult.getNumberOfErrors());
153                Assert.assertEquals(ErrorLevel.ERROR, result.getStatus());
154                Assert.assertEquals(new ValidCharactersConstraintProcessor().getName(), result.getConstraintName());
155        }
156
157        @Test
158        public void testValueInvalidDate2() {
159                ConstraintValidationResult result = process(invalidDate2, "date", datePatternConstraint);
160                Assert.assertEquals(0, dictionaryValidationResult.getNumberOfWarnings());
161                Assert.assertEquals(1, dictionaryValidationResult.getNumberOfErrors());
162                Assert.assertEquals(ErrorLevel.ERROR, result.getStatus());
163                Assert.assertEquals(new ValidCharactersConstraintProcessor().getName(), result.getConstraintName());
164        }
165
166        @Test
167        public void testValueInvalidDate3() {
168                ConstraintValidationResult result = process(invalidDate3, "date", datePatternConstraint);
169                Assert.assertEquals(0, dictionaryValidationResult.getNumberOfWarnings());
170                Assert.assertEquals(1, dictionaryValidationResult.getNumberOfErrors());
171                Assert.assertEquals(ErrorLevel.ERROR, result.getStatus());
172                Assert.assertEquals(new ValidCharactersConstraintProcessor().getName(), result.getConstraintName());
173        }
174
175        private ConstraintValidationResult process(Object object, String attributeName, ValidCharactersConstraint constraint) {
176                AttributeValueReader attributeValueReader = new SingleAttributeValueReader(object, "org.kuali.rice.kns.datadictionary.validation.MockAddress", attributeName,  dateDefinition);
177                Object value = attributeValueReader.getValue();
178                return processor.process(dictionaryValidationResult, value, constraint, attributeValueReader).getFirstConstraintValidationResult();
179        }
180}