001    /**
002     * Copyright 2005-2014 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.kim.test.service;
017    
018    import org.junit.Test;
019    import org.kuali.rice.core.api.resourceloader.GlobalResourceLoader;
020    import org.kuali.rice.kim.api.identity.Person;
021    import org.kuali.rice.kim.api.identity.principal.Principal;
022    import org.kuali.rice.kim.api.services.KimApiServiceLocator;
023    import org.kuali.rice.kim.impl.identity.PersonImpl;
024    import org.kuali.rice.kim.impl.identity.PersonServiceImpl;
025    import org.kuali.rice.kim.impl.identity.external.EntityExternalIdentifierBo;
026    import org.kuali.rice.kim.test.KIMTestCase;
027    import org.kuali.rice.krad.bo.BusinessObject;
028    import org.kuali.rice.krad.data.KradDataServiceLocator;
029    import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
030    import org.kuali.rice.test.BaselineTestCase;
031    import org.springframework.util.AutoPopulatingList;
032    
033    import javax.xml.namespace.QName;
034    
035    import java.util.HashMap;
036    import java.util.List;
037    import java.util.Map;
038    
039    import static org.junit.Assert.*;
040    
041    /**
042     * This is a description of what this class does - kellerj don't forget to fill this in.
043     *
044     * @author Kuali Rice Team (rice.collab@kuali.org)
045     *
046     */
047    @BaselineTestCase.BaselineMode(BaselineTestCase.Mode.NONE)
048    public class PersonServiceImplTest extends KIMTestCase {
049    
050            private PersonServiceImpl personService;
051    
052            public void setUp() throws Exception {
053                    super.setUp();
054                    personService = GlobalResourceLoader.getService(new QName("personService"));
055                    
056            }
057    
058            /**
059             * Test method for {@link org.kuali.rice.kim.impl.identity.PersonServiceImpl#getPersonByExternalIdentifier(java.lang.String, java.lang.String)}.
060             */
061            @Test
062            public void testGetPersonByExternalIdentifier() {
063                    //insert external identifier
064                    Principal principal = KimApiServiceLocator.getIdentityService().getPrincipal("p1");
065    
066            EntityExternalIdentifierBo externalIdentifier = new EntityExternalIdentifierBo();
067                    externalIdentifier.setId("externalIdentifierId");
068                    externalIdentifier.setEntityId(principal.getEntityId());
069                    externalIdentifier.setExternalId("000-00-0000");
070                    externalIdentifier.setExternalIdentifierTypeCode("SSN");
071            KradDataServiceLocator.getDataObjectService().save(externalIdentifier);
072                    
073                    List<Person> people = personService.getPersonByExternalIdentifier( "SSN", "000-00-0000" );
074                    assertNotNull( "result object must not be null", people );
075                    assertEquals( "exactly one record should be returned", 1, people.size() );
076                    assertEquals( "the returned principal is not correct", "p1", people.get(0).getPrincipalId() );
077            }
078    
079    //      @Test
080    //      public void testHasRole_Inherited() {
081    //              Person p = personService.getPersonByPrincipalName( "wwren" );
082    //              assertNotNull( "person object must not be null", p );
083    //              assertTrue( "person must be a member of PA_MAINTENANCE_USERS", personService.hasRole( p, org.kuali.rice.kim.util.KimApiConstants.KIM_GROUP_DEFAULT_NAMESPACE_CODE, "PA_AP_MAINTENANCE_USERS" ) );
084    //              assertTrue( "person must be NOT a member of PA_MAINTENANCE_USERS", !personService.hasRole( p, org.kuali.rice.kim.util.KimApiConstants.KIM_GROUP_DEFAULT_NAMESPACE_CODE, "PA_MAINTENANCE_USERS" ) );
085    //      }
086    //
087    //      @Test
088    //      public void testGetPersonRoles() {
089    //              Person p = personService.getPerson( "KULUSER" );
090    //              assertNotNull( "person object must not be null", p );
091    //              List<KimRole> roles = personService.getPersonRoles( p, null );
092    //              assertNotNull( "role list must not be null", roles );
093    //              System.out.println( roles );
094    //              assertTrue( "role list must have non-zero length", roles.size() > 0 );
095    //              KimRole r = KimImplServiceLocator.getAuthorizationService().getRoleByNamespaceCodeAndName( org.kuali.rice.kim.util.KimApiConstants.KIM_GROUP_DEFAULT_NAMESPACE_CODE, "SY_FUNCTIONAL_SUPER_USERS" );
096    //              assertTrue( "one of the roles must be SY_FUNCTIONAL_SUPER_USERS", roles.contains( r ) );
097    //      }
098    //
099    //      @Test
100    //      public void testHasRole() {
101    //              Person p = personService.getPerson( "KULUSER" );
102    //              assertTrue( "person must have role SY_FUNCTIONAL_SUPER_USERS", personService.hasRole( p, org.kuali.rice.kim.util.KimApiConstants.KIM_GROUP_DEFAULT_NAMESPACE_CODE, "SY_FUNCTIONAL_SUPER_USERS" ) );
103    //      }
104    
105            @Test
106            public void testGetPerson() {
107                    Person p = personService.getPerson( "KULUSER" );
108                    assertNotNull( "person object must not be null", p );
109                    assertEquals( "class must match implementation class defined on service", personService.getPersonImplementationClass(), p.getClass() );
110                    assertEquals( "person name does not match", "KULUSER", p.getFirstNameUnmasked() );
111                    assertEquals( "principal name does not match", "kuluser", p.getPrincipalName() );
112                    assertEquals( "KULUSER should have no address record", "", p.getAddressLine1Unmasked() );
113                    assertEquals( "KULUSER should have no campus code", "", p.getCampusCode() );
114                    assertEquals( "KULUSER should have no email address", "", p.getEmailAddressUnmasked() );
115                    assertNotNull( "entity ID should be set", p.getEntityId() );
116                    assertNotNull( "principal ID should be set", p.getPrincipalId() );
117                    
118                    // check an employee id
119                    Person p1Person = personService.getPerson( "p1" );
120                    assertNotNull( "person object must not be null", p );
121                    assertEquals("employee ID does not match", "p1emplId", p1Person.getEmployeeId());
122            }
123    
124            @Test
125            public void testGetPersonInactive() {
126                    Person p = personService.getPerson( "inactiveuserid" );
127                    assertNotNull( "person object must not be null", p );
128            assertEquals("principal ID does not match", "inactiveusernm", p.getPrincipalName());
129    
130            }
131            
132            @Test
133            public void testGetPersonByPrincipalName() {
134                    Person p = personService.getPersonByPrincipalName( "kuluser" );
135                    assertNotNull( "person object must not be null", p );
136                    assertEquals( "person name does not match", "KULUSER", p.getFirstName() );
137                    assertEquals( "principal id does not match", "KULUSER", p.getPrincipalId() );
138            }
139            
140            @Test
141            public void testGetPersonByPrincipalNameInactive() {
142                    Person p = personService.getPersonByPrincipalName( "inactiveusernm" );
143            assertEquals("principal ID does not match", "inactiveuserid", p.getPrincipalId());
144        }
145            
146        @Test
147        public void testGetPersonByEmployeeIdNoInfo() {
148            Person p = personService.getPersonByEmployeeId( "" );
149            assertNull( "person object will be null", p );
150        }
151        
152        @Test
153        public void testGetPersonByEmployeeIdNotFound() {
154            Person p = personService.getPersonByEmployeeId( "NotFound" );
155            assertNull( "person object will be null", p );
156        }
157        
158        @Test
159        public void testGetPersonByEmployeeIdActive() {
160            Person p = personService.getPersonByEmployeeId( "0000001138" );
161            assertNotNull( "person object must not be null", p );
162            assertEquals( "person name does not match", "activeUserFirst", p.getFirstName() );
163            assertEquals( "principal id does not match", "activeuserid", p.getPrincipalId() );
164        }
165        
166        @Test
167        public void testGetPersonByEmployeeIdInactiveUser() {
168            Person p = personService.getPersonByEmployeeId( "0000001139" );
169            assertNotNull( "person object must not be null", p );
170            assertEquals( "person name does not match", "InactiveUserFirst", p.getFirstName() );
171            assertEquals( "principal id does not match", "inactiveuserid", p.getPrincipalId() );
172        }
173        
174        @Test
175        public void testGetPersonByEmployeeIdInactiveEmp() {
176            Person p = personService.getPersonByEmployeeId( "0000001140" );
177            assertNotNull( "person object must not be null", p );
178            assertEquals( "person name does not match", "InactiveEmplFirst", p.getFirstName() );
179            assertEquals( "principal id does not match", "inactiveempid", p.getPrincipalId() );
180        }
181        
182            @Test
183            public void testConvertPersonPropertiesToEntityProperties() {
184                    HashMap<String,String> criteria = new HashMap<String,String>();
185                    criteria.put( "firstName", "System User" );
186                    Map<String,String> entityCriteria = personService.convertPersonPropertiesToEntityProperties( criteria );
187                    assertEquals( "number of criteria is not correct", 5, entityCriteria.size() );
188                    assertNotNull( "criteria must filter for active entity types", entityCriteria.get( "entityTypeContactInfos.active" ) );
189                    assertNotNull( "criteria must filter on entity type code", entityCriteria.get( "entityTypeContactInfos.entityTypeCode" ) );
190                    assertNotNull( "criteria must filter for first name", entityCriteria.get( "names.firstName" ) );
191                    assertNotNull( "criteria must filter for active names", entityCriteria.get( "names.active" ) );
192                    assertNotNull( "criteria must filter for the default name", entityCriteria.get( "names.defaultValue" ) );
193            }
194    
195            /**
196             * Test method for {@link org.kuali.rice.kim.impl.identity.PersonServiceImpl#findPeople(Map)}.
197             */
198        @Test
199        public void testFindPeople() {
200            HashMap<String,String> criteria = new HashMap<String,String>();
201            criteria.put( "firstName", "KULUSER" );
202            List<Person> people = personService.findPeople( criteria );
203            assertNotNull( "result must not be null", people );
204            assertEquals( "wrong number of people returned", 1, people.size() );
205            Person p = people.get( 0 );
206            assertEquals( "name must match criteria", "KULUSER", p.getFirstName() );
207            assertEquals( "principal name must be kuluser", "kuluser", p.getPrincipalName() );
208        }
209            
210        @Test
211        public void testFindPeopleInactive() {
212            HashMap<String,String> criteria = new HashMap<String,String>();
213            criteria.put( "principals.active", "N" );
214            List<Person> people = personService.findPeople( criteria );
215            assertNotNull( "result must not be null", people );
216            assertEquals( "wrong number of people returned", 1, people.size() );
217        }
218    
219        @Test
220        public void testFindPeopleBothInactiveAndActive() {
221            HashMap<String,String> criteria = new HashMap<String,String>();
222            criteria.put( "firstName", "InactiveUserFirst" );
223            List<Person> people = personService.findPeople( criteria );
224            assertNotNull( "result must not be null", people );
225            assertEquals( "wrong number of people returned", 1, people.size() );
226        }    
227        
228        @Test
229        public void testFindPeopleByWildcard() {
230            HashMap<String,String> criteria = new HashMap<String,String>();
231            criteria.put( "principalName", "!quick*" );
232            List<Person> people = personService.findPeople( criteria );
233            assertNotNull( "result must not be null", people );
234            assertEquals( "wrong number of people returned", 53, people.size() );
235            for (Person p: people) {
236                if (p.getPrincipalName().startsWith("quick")) {
237                    fail("Invalid wildcard search results");
238                }
239            }
240        }
241    
242            @Test
243            public void testResolvePrincipalNamesToPrincipalIds() throws Exception {
244                    
245                    KRADServiceLocatorWeb.getDataDictionaryService().getDataDictionary().addConfigFileLocation("KR-KIM", "classpath:org/kuali/rice/kim/bo/datadictionary/test/SampleBO.xml" );
246                    KRADServiceLocatorWeb.getDataDictionaryService().getDataDictionary().parseDataDictionaryConfigurationFiles( false );
247    
248                    Map<String,String> criteria = new HashMap<String,String>();
249                    criteria.put( "anAttribute", "aValue" );
250                    criteria.put( "anotherAttribute", "anotherValue" );
251                    criteria.put( "personAttribute.principalName", "kuluser" );
252                    System.out.println( "Before: " + criteria );
253                    Map<String,String> newCritiera = personService.resolvePrincipalNamesToPrincipalIds( new SampleBO(), criteria );
254                    assertNotNull( "returned map must not be null", newCritiera );
255                    System.out.println( "After:  " + newCritiera );
256                    assertTrue( "new criteria must have a personPrincipalId entry", newCritiera.containsKey( "personPrincipalId" ) );
257                    assertEquals( "resulting principal ID is not that expected", "KULUSER", newCritiera.get( "personPrincipalId" ) );
258                    assertFalse( "new criteria must not contain the original PrincipalName entry", newCritiera.containsKey( "personAttribute.principalName" ) );
259    
260                    // check when already has value in result field
261                    criteria.put( "personPrincipalId", "NOT KULUSER" );
262                    System.out.println( "Before: " + criteria );
263                    newCritiera = personService.resolvePrincipalNamesToPrincipalIds( new SampleBO(), criteria );
264                    assertNotNull( "returned map must not be null", newCritiera );
265                    System.out.println( "After:  " + newCritiera );
266                    assertTrue( "new criteria must have a personPrincipalId entry", newCritiera.containsKey( "personPrincipalId" ) );
267                    assertEquals( "resulting principal ID should have been changed", "KULUSER", newCritiera.get( "personPrincipalId" ) );
268            }
269    
270            @Test
271            public void testResolvePrincipalNamesToPrincipalIds_Nested() throws Exception {
272    
273            KRADServiceLocatorWeb.getDataDictionaryService().getDataDictionary().addConfigFileLocation( "", "classpath:org/kuali/rice/kim/bo/datadictionary/test/SampleBO.xml" );
274            KRADServiceLocatorWeb.getDataDictionaryService().getDataDictionary().parseDataDictionaryConfigurationFiles( false );
275    
276                    Map<String,String> criteria = new HashMap<String,String>();
277                    criteria.put( "add.childBos.childsPersonAttribute.principalName", "kuluser" );
278                    System.out.println( "Before: " + criteria );
279                    Map<String,String> newCritiera = personService.resolvePrincipalNamesToPrincipalIds( new SampleBO(), criteria );
280                    assertNotNull( "returned map must not be null", newCritiera );
281                    System.out.println( "After:  " + newCritiera );
282                    // TODO: property is being appended in the wrong place - fix
283                    assertTrue( "new criteria must have a childsPersonPrincipalId entry", newCritiera.containsKey( "add.childBos.childsPersonPrincipalId" ) );
284                    assertFalse( "new criteria must not contain the original PrincipalName entry", newCritiera.containsKey( "add.childBos.childsPersonAttribute.principalName" ) );
285            }
286    
287            @Test
288            public void testUpdateWhenNecessary() {
289                    SampleBO bo = new SampleBO();
290                    bo.setPersonPrincipalId( "KULUSER" );
291                    Person p = bo.getPersonAttribute();
292                    assertNotNull( "person object must not be null", p );
293                    assertEquals( "principal IDs do not match", bo.getPersonPrincipalId(), p.getPrincipalId() );
294                    assertSame( "second retrieval must return same object since ID not changed", p, bo.getPersonAttribute() );
295            }
296    
297            @Test
298            public void testUpdatePersonIfNecessary() throws Exception {
299            Person person = personService.updatePersonIfNecessary("p1", null);
300            assertNotNull("person object must not be null", person);
301                    assertEquals("principalId does not match", "p1", person.getPrincipalId() );
302            assertEquals("principalName does not match", "principal1", person.getPrincipalName());
303            }
304    
305    //      @Test
306    //      public void testConfirmOnlyPKUsed() {
307    //              HashMap<String,String> criteria = new HashMap<String,String>();
308    //              criteria.put( "lastName", "HUNTLEY" );
309    //              criteria.put( "firstName", "KEISHA" );
310    //              Collection<Person> people = (Collection<Person>)KRADServiceLocatorInternal.getLookupService().findCollectionBySearchUnbounded(Person.class, criteria);
311    //              personService.findPeople( criteria );
312    //              assertNotNull( "result must not be null", people );
313    //              assertEquals( "wrong number of people returned", 1, people.size() );
314    //              Person p = people.iterator().next();
315    //              assertEquals( "principal name does not match", "khuntley", p.getPrincipalName() );
316    //
317    //              criteria.put( "principalName", "kuluser" );
318    //              people = people = (Collection<Person>)KRADServiceLocatorInternal.getLookupService().findCollectionBySearchUnbounded(Person.class, criteria);
319    //              assertNotNull( "result must not be null", people );
320    //              assertEquals( "wrong number of people returned", 1, people.size() );
321    //              p = people.iterator().next();
322    //              assertEquals( "principal name must be kuluser", "kuluser", p.getPrincipalName() );
323    //      }
324    
325            public static class SampleBO implements BusinessObject {
326                    private String anAttribute;
327                    private String anotherAttribute;
328                    private String personPrincipalId;
329                    private PersonImpl personAttribute;
330                    private List<SampleChildBOWithPerson> childBos = new AutoPopulatingList(SampleChildBOWithPerson.class);
331                    public String getAnAttribute() {
332                            return this.anAttribute;
333                    }
334                    public void setAnAttribute(String anAttribute) {
335                            this.anAttribute = anAttribute;
336                    }
337                    public String getAnotherAttribute() {
338                            return this.anotherAttribute;
339                    }
340                    public void setAnotherAttribute(String anotherAttribute) {
341                            this.anotherAttribute = anotherAttribute;
342                    }
343                    public String getPersonPrincipalId() {
344                            return this.personPrincipalId;
345                    }
346                    public void setPersonPrincipalId(String personPrincipalId) {
347                            this.personPrincipalId = personPrincipalId;
348                    }
349                    public PersonImpl getPersonAttribute() {
350                            personAttribute = (PersonImpl) KimApiServiceLocator.getPersonService().updatePersonIfNecessary( personPrincipalId, personAttribute );
351                            return personAttribute;
352                    }
353                    public void setPersonAttribute(PersonImpl personAttribute) {
354                            this.personAttribute = personAttribute;
355                    }
356                    public void refresh() {}
357                    public List<SampleChildBOWithPerson> getChildBos() {
358                            return this.childBos;
359                    }
360                    public void setChildBos(List<SampleChildBOWithPerson> childBos) {
361                            this.childBos = childBos;
362                    }
363            }
364    
365            public static class SampleChildBOWithPerson implements BusinessObject {
366    
367                    private String childsAttribute;
368                    private String childsPersonPrincipalId;
369                    private PersonImpl childsPersonAttribute;
370    
371    
372    
373                    public String getChildsAttribute() {
374                            return this.childsAttribute;
375                    }
376                    public void setChildsAttribute(String childsAttribute) {
377                            this.childsAttribute = childsAttribute;
378                    }
379                    public String getChildsPersonPrincipalId() {
380                            return this.childsPersonPrincipalId;
381                    }
382                    public void setChildsPersonPrincipalId(String childsPersonPrincipalId) {
383                            this.childsPersonPrincipalId = childsPersonPrincipalId;
384                    }
385                    public PersonImpl getChildsPersonAttribute() {
386                            childsPersonAttribute = (PersonImpl) KimApiServiceLocator.getPersonService().updatePersonIfNecessary( childsPersonPrincipalId, childsPersonAttribute );
387                            return childsPersonAttribute;
388                    }
389                    public void setChildsPersonAttribute(PersonImpl childsPersonAttribute) {
390                            this.childsPersonAttribute = childsPersonAttribute;
391                    }
392                    public void refresh() {}
393            }
394    }