001    /**
002     * Copyright 2005-2013 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     */
016    package org.kuali.rice.krad.datadictionary.validation.constraint;
017    
018    import java.io.IOException;
019    import java.io.InputStream;
020    import java.util.ArrayList;
021    import java.util.List;
022    import java.util.Properties;
023    
024    import org.junit.Assert;
025    import org.junit.Before;
026    import org.junit.Ignore;
027    import org.junit.Test;
028    import org.kuali.rice.krad.datadictionary.AttributeDefinition;
029    import org.kuali.rice.krad.datadictionary.BusinessObjectEntry;
030    import org.kuali.rice.krad.datadictionary.validation.Account;
031    import org.kuali.rice.krad.datadictionary.validation.AttributeValueReader;
032    import org.kuali.rice.krad.datadictionary.validation.DictionaryObjectAttributeValueReader;
033    import org.kuali.rice.krad.datadictionary.validation.ErrorLevel;
034    import org.kuali.rice.krad.datadictionary.validation.constraint.ValidCharactersConstraint;
035    import org.kuali.rice.krad.datadictionary.validation.processor.ValidCharactersConstraintProcessor;
036    import org.kuali.rice.krad.datadictionary.validation.result.ConstraintValidationResult;
037    import org.kuali.rice.krad.datadictionary.validation.result.DictionaryValidationResult;
038    
039    
040    /**
041     * Things this test should check:
042     *
043     * 1. empty value check. (failure) {@link #testValueEmpty()}
044     * 2. value with valid positive number. (success) {@link #testValueValidPositiveNumber()}
045     * 3. value with invalid negative number as allowNegative set to false. (failure) {@link #testValueInvalidNegativeNumber()}
046     * 4. value with valid negative number as allowNegative set to true. (success) {@link #testValueValidNegativeNumber()}
047     * 5. value with invalid negative number as allowNegative set to true.. (failure) {@link #testValueInvalidNegativeNumber1()}
048     * 6. value with invalid positive number. (failure) {@link #testValueInvalidPositiveNumber()}
049     * 7. value with valid negative number as allowNegative set to true. (success) {@link #testValueValidNegativeNumber1)}
050     *
051     * @author Kuali Rice Team (rice.collab@kuali.org)
052     */
053    public class FloatingPointPatternConstraintTest {
054    
055            private final String PATTERN_CONSTRAINT = "validationPatternRegex.floatingPoint";
056    
057            private AttributeDefinition totalBalanceDefinition;
058            private AttributeDefinition debitBalanceDefinition;
059    
060            private BusinessObjectEntry addressEntry;
061            private DictionaryValidationResult dictionaryValidationResult;
062    
063            private ValidCharactersConstraintProcessor processor;
064    
065            private Account iciciAccount = new Account("11111111","ICICI","5000.00","15000","-10000");
066            private Account citibankAccount = new Account("22222222","Citi Bank","15000.70","14999.70","1.");
067            private Account wellsFargoAccount = new Account("33333333","Wells Fargo","",".25","-.25");
068            private Account morganAccount = new Account("44444444","J P Morgan","-1000.00","1000.00","(2000.00)");
069    
070            private FloatingPointPatternConstraint totalBalanceFloatingPointPatternConstraint;
071            private FloatingPointPatternConstraint debitBalanceFloatingPointPatternConstraint;
072    
073            @Before
074            public void setUp() throws Exception {
075    
076                    String regex = getProperty(PATTERN_CONSTRAINT);
077    
078                    processor = new ValidCharactersConstraintProcessor();
079    
080                    dictionaryValidationResult = new DictionaryValidationResult();
081                    dictionaryValidationResult.setErrorLevel(ErrorLevel.NOCONSTRAINT);
082    
083                    addressEntry = new BusinessObjectEntry();
084    
085                    List<AttributeDefinition> attributes = new ArrayList<AttributeDefinition>();
086    
087                    totalBalanceFloatingPointPatternConstraint = new FloatingPointPatternConstraint();
088            totalBalanceFloatingPointPatternConstraint.setMessageKey("validate.dummykey");
089            totalBalanceFloatingPointPatternConstraint.setValidationMessageParams( new ArrayList<String>());
090                    totalBalanceFloatingPointPatternConstraint.setValue(regex);
091    
092                    totalBalanceDefinition = new AttributeDefinition();
093                    totalBalanceDefinition.setName("totalBalance");
094                    totalBalanceDefinition.setValidCharactersConstraint(totalBalanceFloatingPointPatternConstraint);
095                    attributes.add(totalBalanceDefinition);
096    
097                    debitBalanceFloatingPointPatternConstraint = new FloatingPointPatternConstraint();
098            debitBalanceFloatingPointPatternConstraint.setMessageKey("validate.dummykey");
099            debitBalanceFloatingPointPatternConstraint.setValidationMessageParams( new ArrayList<String>());
100                    debitBalanceFloatingPointPatternConstraint.setValue("-?"+regex);
101                    debitBalanceFloatingPointPatternConstraint.setAllowNegative(true);
102    
103                    debitBalanceDefinition = new AttributeDefinition();
104                    debitBalanceDefinition.setName("debitBalance");
105                    debitBalanceDefinition.setValidCharactersConstraint(debitBalanceFloatingPointPatternConstraint);
106                    attributes.add(debitBalanceDefinition);
107    
108    
109                    addressEntry.setAttributes(attributes);
110            }
111    
112            @Test
113            public void testValueEmpty() {
114                    ConstraintValidationResult result = process(wellsFargoAccount, "totalBalance", totalBalanceFloatingPointPatternConstraint);
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 testValueValidPositiveNumber() {
123                    ConstraintValidationResult result = process(citibankAccount, "totalBalance", totalBalanceFloatingPointPatternConstraint);
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 testValueInvalidNegativeNumber() {
132                    ConstraintValidationResult result = process(morganAccount, "totalBalance", totalBalanceFloatingPointPatternConstraint);
133                    Assert.assertEquals(0, dictionaryValidationResult.getNumberOfWarnings());
134                    Assert.assertEquals(1, dictionaryValidationResult.getNumberOfErrors());
135                    Assert.assertEquals(ErrorLevel.ERROR, result.getStatus());
136                    Assert.assertEquals(new ValidCharactersConstraintProcessor().getName(), result.getConstraintName());
137            }
138    
139            @Test
140            public void testValueValidNegativeNumber() {
141                    ConstraintValidationResult result = process(iciciAccount, "debitBalance", debitBalanceFloatingPointPatternConstraint);
142                    Assert.assertEquals(0, dictionaryValidationResult.getNumberOfWarnings());
143                    Assert.assertEquals(0, dictionaryValidationResult.getNumberOfErrors());
144                    Assert.assertEquals(ErrorLevel.OK, result.getStatus());
145                    Assert.assertEquals(new ValidCharactersConstraintProcessor().getName(), result.getConstraintName());
146            }
147    
148            @Test
149            public void testValueInvalidNegativeNumber1() {
150                    ConstraintValidationResult result = process(morganAccount, "debitBalance", debitBalanceFloatingPointPatternConstraint);
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 testValueInvalidPositiveNumber() {
159                    ConstraintValidationResult result = process(citibankAccount, "debitBalance", debitBalanceFloatingPointPatternConstraint);
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 testValueValidNegativeNumber1() {
168                    ConstraintValidationResult result = process(wellsFargoAccount, "debitBalance", debitBalanceFloatingPointPatternConstraint);
169                    Assert.assertEquals(0, dictionaryValidationResult.getNumberOfWarnings());
170                    Assert.assertEquals(0, dictionaryValidationResult.getNumberOfErrors());
171                    Assert.assertEquals(ErrorLevel.OK, 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 DictionaryObjectAttributeValueReader(object, "org.kuali.rice.kns.datadictionary.validation.MockAddress", addressEntry);
177                    attributeValueReader.setAttributeName(attributeName);
178    
179                    Object value = attributeValueReader.getValue();
180                    return processor.process(dictionaryValidationResult, value, constraint, attributeValueReader).getFirstConstraintValidationResult();
181            }
182    
183            private String getProperty(String key) {
184                    String value = null;
185                    String filePath = "org/kuali/rice/krad/ApplicationResources.properties";
186                    Properties properties = new Properties();
187                    try {
188                            InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(filePath);
189                            properties.load(in);
190                            value = properties.getProperty(key);
191                    } catch (IOException e) {
192                    }
193                    return value;
194            }
195    }