001    /**
002     * Copyright 2004-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.hr.time.clock.location.validation;
017    
018    import java.sql.Date;
019    import java.sql.Timestamp;
020    import java.util.ArrayList;
021    import java.util.Collection;
022    import java.util.HashMap;
023    import java.util.List;
024    import java.util.Map;
025    
026    import org.apache.log4j.Logger;
027    import org.junit.Assert;
028    import org.junit.Before;
029    import org.junit.Test;
030    import org.kuali.hr.job.Job;
031    import org.kuali.hr.test.KPMETestCase;
032    import org.kuali.hr.time.clock.location.ClockLocationRule;
033    import org.kuali.hr.time.clock.location.ClockLocationRuleIpAddress;
034    import org.kuali.hr.time.clocklog.ClockLog;
035    import org.kuali.hr.time.service.base.TkServiceLocator;
036    import org.kuali.rice.krad.service.BusinessObjectService;
037    import org.kuali.rice.krad.service.KRADServiceLocator;
038    import org.kuali.rice.krad.util.GlobalVariables;
039    
040    /**
041     * A really basic unit test testing persistence and searching over persisted business objects.
042     */
043    public class ClockLocationRuleTest extends KPMETestCase {
044    
045        private static final Logger LOG = Logger.getLogger(ClockLocationRuleTest.class);
046    
047        private static final String IP_ADDRESS_ONE = "127.0.0.1";
048        private static final String IP_ADDRESS_TWO = "127.0.1.1";
049    
050        private BusinessObjectService boService;
051    
052        @Before
053        public void setUp() throws Exception {
054            super.setUp();
055            boService = KRADServiceLocator.getBusinessObjectService();
056            clearBusinessObjects(ClockLocationRule.class);
057        }
058    
059        public ClockLocationRule createClr(String ipAddress, Long workArea, String principalId, Long jobNumber ) {
060            Timestamp ts_now = new Timestamp(System.currentTimeMillis());
061            Date date_now = new Date(System.currentTimeMillis());
062            ClockLocationRule clr = new ClockLocationRule();
063            clr.setDept("TEST");
064            clr.setWorkArea(1234L);
065            clr.setPrincipalId("12345");
066            clr.setJobNumber(0L);
067            clr.setActive(true);
068            clr.setTimestamp(ts_now);
069            clr.setEffectiveDate(date_now);
070            ClockLocationRuleIpAddress anIp = new ClockLocationRuleIpAddress();
071            anIp.setIpAddress(ipAddress);
072            List<ClockLocationRuleIpAddress> aList = new ArrayList<ClockLocationRuleIpAddress>();
073            aList.add(anIp);
074            clr.setIpAddresses(aList);
075    
076            boService.save(clr);
077            for(ClockLocationRuleIpAddress ip : clr.getIpAddresses()) {
078                    ip.setTkClockLocationRuleId(clr.getTkClockLocationRuleId());
079                    boService.save(ip);
080            }
081            return clr;
082        }
083        
084        public void deleteCLR(ClockLocationRule clr) {
085            boService.delete(clr);
086            for(ClockLocationRuleIpAddress ip : clr.getIpAddresses()) {
087                    boService.delete(ip);
088            }
089        }
090        
091        @SuppressWarnings("unchecked")
092        @Test
093        public void testSave() throws Exception {
094            ClockLocationRule clr = new ClockLocationRule();
095            Timestamp ts_now = new Timestamp(System.currentTimeMillis());
096            Date date_now = new Date(System.currentTimeMillis());
097            clr.setPrincipalId("12345");
098            clr.setJobNumber(0L);
099            clr.setActive(true);
100            clr.setTimestamp(ts_now);
101            clr.setEffectiveDate(date_now);
102            ClockLocationRuleIpAddress anIp = new ClockLocationRuleIpAddress();
103            anIp.setIpAddress(IP_ADDRESS_ONE);
104            List<ClockLocationRuleIpAddress> aList = new ArrayList<ClockLocationRuleIpAddress>();
105            aList.add(anIp);
106            clr.setIpAddresses(aList);
107                    
108            Assert.assertNull("Should not have ObjectId before persist.", clr.getObjectId());
109            boService.save(clr);
110            Assert.assertNotNull("Should have ObjectId after persist.", clr.getObjectId());
111            
112            for(ClockLocationRuleIpAddress ip : clr.getIpAddresses()) {
113                    ip.setTkClockLocationRuleId(clr.getTkClockLocationRuleId());
114                    boService.save(ip);
115            }
116    
117            Collection<ClockLocationRule> collection = boService.findAll(ClockLocationRule.class);
118            Assert.assertEquals("One entry should be in list.", 1, collection.size());
119            
120            for (ClockLocationRule crule : collection) {
121                    // There is only one
122                    TkServiceLocator.getClockLocationRuleService().populateIPAddressesForCLR(crule);
123                    Assert.assertEquals(crule.getIpAddresses().size(), 1);
124                    Assert.assertEquals(crule.getIpAddresses().get(0).getIpAddress(), IP_ADDRESS_ONE);
125            }
126        }
127    
128        @SuppressWarnings("unchecked")
129        @Test
130        public void testFindMatching() throws Exception {           
131            ClockLocationRule clr = this.createClr(IP_ADDRESS_ONE, 1234L, "1234", 0L);
132            
133            LOG.info("ID:"  + clr.getTkClockLocationRuleId() + " oID: "  + clr.getObjectId());
134            for(ClockLocationRuleIpAddress ip : clr.getIpAddresses()) {
135                    ip.setTkClockLocationRuleId(clr.getTkClockLocationRuleId());
136                    boService.save(ip);
137            }
138            clr = this.createClr(IP_ADDRESS_TWO,1234L, "1234", 0L);
139            
140            LOG.info("ID:"  + clr.getTkClockLocationRuleId() + " oID: "  + clr.getObjectId());
141            Assert.assertEquals("Should have two records saved", 2, boService.findAll(ClockLocationRule.class).size());
142            Map<String, Object> matchMap = new HashMap<String, Object>();
143                    matchMap = new HashMap<String, Object>();
144                    matchMap.put("dept", "TEST");
145                    Collection<ClockLocationRule> found = boService.findMatching(ClockLocationRule.class, matchMap);
146                    Assert.assertEquals(2, found.size());
147    
148        }
149        
150        @Test
151        public void testClockLocationRuleFetch() throws Exception{
152            ClockLocationRule clr = this.createClr(IP_ADDRESS_ONE, 1234L, "1234", 0L);
153            List<ClockLocationRule> clockLocationRule = TkServiceLocator.getClockLocationRuleService().getClockLocationRule("TEST", 1234L, 
154                                                                                            "12345", 0L, new Date(System.currentTimeMillis()));
155            
156            Assert.assertTrue("Clock Location Rule pulled back correctly",clockLocationRule.size()==1);
157            boService.delete(clr);
158            clr = this.createClr(IP_ADDRESS_ONE, -1L, "%", -1L);
159            
160            clockLocationRule = TkServiceLocator.getClockLocationRuleService().getClockLocationRule("TEST", 1234L, 
161                                    "12345", 0L, new Date(System.currentTimeMillis()));
162            Assert.assertTrue("Clock Location Rule pulled back correctly",clockLocationRule.size()==1);
163        }
164        
165        @Test
166        public void testClockLocationRuleProcessing() {
167            ClockLocationRule clr = this.createClr(IP_ADDRESS_ONE, 1234L, "1234", 0L);
168            
169            //Test for exact match
170            ClockLog clockLog = new ClockLog();
171            clockLog.setDocumentId("1111");
172            clockLog.setJob(new Job());
173            clockLog.setIpAddress(IP_ADDRESS_ONE);
174            clockLog.setWorkArea(1234L);
175            clockLog.setPrincipalId("12345");
176            clockLog.setJobNumber(0L);
177            clockLog.getJob().setDept("TEST");
178            
179            TkServiceLocator.getClockLocationRuleService().processClockLocationRule(clockLog, new Date(System.currentTimeMillis()));
180            
181            Assert.assertTrue("clock location rule no error",GlobalVariables.getMessageMap().hasNoWarnings());
182            Assert.assertFalse("clock log should have 'false' as unapprovedIP.", clockLog.getUnapprovedIP());
183    
184            boService.delete(clr);
185            
186            clr = this.createClr(IP_ADDRESS_ONE, 1234L, "1234", 0L);
187            
188            clockLog = new ClockLog();
189            clockLog.setDocumentId("1111");
190            clockLog.setJob(new Job());
191            clockLog.setIpAddress("127.127.127.127");
192            clockLog.setWorkArea(1234L);
193            clockLog.setPrincipalId("12345");
194            clockLog.setJobNumber(0L);
195            clockLog.getJob().setDept("TEST");
196            
197            TkServiceLocator.getClockLocationRuleService().processClockLocationRule(clockLog, new Date(System.currentTimeMillis()));
198            
199            Assert.assertTrue("clock location rule no error",GlobalVariables.getMessageMap().hasWarnings());
200            Assert.assertTrue("clock log should have 'true' as unapprovedIP.", clockLog.getUnapprovedIP());
201    
202        }
203        
204        @Test
205        public void testClockLocationIPAddress() {
206            //Test for exact match
207            ClockLog clockLog = new ClockLog();
208            clockLog.setDocumentId("1111");
209            clockLog.setJob(new Job());
210            clockLog.setIpAddress(IP_ADDRESS_ONE);
211            clockLog.setWorkArea(1234L);
212            clockLog.setPrincipalId("12345");
213            clockLog.setJobNumber(0L);
214            clockLog.getJob().setDept("TEST");
215            
216            this.processRuleWithIPNoWarning(clockLog, "%");
217            this.processRuleWithIPNoWarning(clockLog, "127.%");
218            this.processRuleWithIPNoWarning(clockLog, "127.0.%");
219            this.processRuleWithIPNoWarning(clockLog, "127.0.0.%");
220            this.processRuleWithIPNoWarning(clockLog, IP_ADDRESS_ONE);
221            this.processRuleWithIPNoWarning(clockLog, "%.%.%.%");
222            
223            this.processRuleWithIPWithWarning(clockLog, "128.%");
224        }
225        
226        public void processRuleWithIPNoWarning(ClockLog clockLog, String ipAddress) {
227            ClockLocationRule clr = this.createClr(ipAddress, 1234L, "1234", 0L);
228            TkServiceLocator.getClockLocationRuleService().processClockLocationRule(clockLog, new Date(System.currentTimeMillis()));
229            Assert.assertTrue("clock location rule no warning message",GlobalVariables.getMessageMap().hasNoWarnings());
230            Assert.assertFalse("clock log should have 'false' as unapprovedIP.", clockLog.getUnapprovedIP());
231        }
232        
233        public void processRuleWithIPWithWarning(ClockLog clockLog, String ipAddress) {
234            clearBusinessObjects(ClockLocationRule.class);
235            ClockLocationRule clr = this.createClr(ipAddress, 1234L, "12345", 0L);
236            TkServiceLocator.getClockLocationRuleService().processClockLocationRule(clockLog, new Date(System.currentTimeMillis()));
237            Assert.assertFalse("clock location rule with warning message",GlobalVariables.getMessageMap().hasNoWarnings());
238            Assert.assertTrue("clock location rule with 1 warning message",(GlobalVariables.getMessageMap().getWarningCount()== 1));
239            Assert.assertTrue("clock log should have 'true' as unapprovedIP.", clockLog.getUnapprovedIP());
240        }
241    
242        @SuppressWarnings("unchecked")
243        public void clearBusinessObjects(Class clazz) {
244            boService.deleteMatching(clazz, new HashMap());
245        }
246        
247     
248    }