001 /**
002 * Copyright 2005-2015 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.uif.util;
017
018 import java.util.List;
019 import java.util.Map;
020 import java.util.Set;
021
022 import javax.xml.namespace.QName;
023
024 import org.kuali.rice.core.api.config.property.ConfigContext;
025 import org.kuali.rice.core.api.reflect.ObjectDefinition;
026 import org.kuali.rice.core.api.resourceloader.GlobalResourceLoader;
027 import org.kuali.rice.core.api.resourceloader.ResourceLoader;
028 import org.kuali.rice.core.api.util.type.KualiDecimal;
029 import org.kuali.rice.core.framework.config.property.SimpleConfig;
030 import org.kuali.rice.kim.api.identity.Person;
031 import org.kuali.rice.kim.api.identity.PersonService;
032 import org.kuali.rice.kim.api.services.KimApiServiceLocator;
033 import org.kuali.rice.krad.UserSession;
034 import org.kuali.rice.krad.uif.container.CollectionGroup;
035 import org.kuali.rice.krad.uif.container.Group;
036 import org.kuali.rice.krad.uif.element.Action;
037 import org.kuali.rice.krad.uif.field.DataField;
038 import org.kuali.rice.krad.uif.field.Field;
039 import org.kuali.rice.krad.uif.view.View;
040 import org.kuali.rice.krad.uif.view.ViewAuthorizer;
041 import org.kuali.rice.krad.uif.view.ViewModel;
042 import org.kuali.rice.krad.uif.widget.Widget;
043 import org.kuali.rice.krad.util.GlobalVariables;
044
045 /**
046 * Utilities class for establishing a minimal environment for testing operations involving Uif
047 * components.
048 *
049 * @author Kuali Rice Team (rice.collab@kuali.org)
050 */
051 public class UifUnitTestUtils {
052
053 /**
054 * Mock person implementation.
055 */
056 private static class MockPerson implements Person {
057
058 private static final long serialVersionUID = 5330488987382249417L;
059
060 private final String id;
061
062 private MockPerson(String id) {
063 this.id = id;
064 }
065
066 @Override
067 public void refresh() {}
068
069 @Override
070 public String getPrincipalId() {
071 return id;
072 }
073
074 @Override
075 public String getPrincipalName() {
076 return id;
077 }
078
079 @Override
080 public String getEntityId() {
081 return id;
082 }
083
084 @Override
085 public String getEntityTypeCode() {
086 return null;
087 }
088
089 @Override
090 public String getFirstName() {
091 return "Test";
092 }
093
094 @Override
095 public String getFirstNameUnmasked() {
096 return "Test";
097 }
098
099 @Override
100 public String getMiddleName() {
101 return "User";
102 }
103
104 @Override
105 public String getMiddleNameUnmasked() {
106 return "User";
107 }
108
109 @Override
110 public String getLastName() {
111 return id;
112 }
113
114 @Override
115 public String getLastNameUnmasked() {
116 return id;
117 }
118
119 @Override
120 public String getName() {
121 return "Test User " + id;
122 }
123
124 @Override
125 public String getNameUnmasked() {
126 return "Test User " + id;
127 }
128
129 @Override
130 public String getEmailAddress() {
131 return null;
132 }
133
134 @Override
135 public String getEmailAddressUnmasked() {
136 return null;
137 }
138
139 @Override
140 public String getAddressLine1() {
141 return null;
142 }
143
144 @Override
145 public String getAddressLine1Unmasked() {
146 return null;
147 }
148
149 @Override
150 public String getAddressLine2() {
151 return null;
152 }
153
154 @Override
155 public String getAddressLine2Unmasked() {
156 return null;
157 }
158
159 @Override
160 public String getAddressLine3() {
161 return null;
162 }
163
164 @Override
165 public String getAddressLine3Unmasked() {
166 return null;
167 }
168
169 @Override
170 public String getAddressCity() {
171 return null;
172 }
173
174 @Override
175 public String getAddressCityUnmasked() {
176 return null;
177 }
178
179 @Override
180 public String getAddressStateProvinceCode() {
181 return null;
182 }
183
184 @Override
185 public String getAddressStateProvinceCodeUnmasked() {
186 return null;
187 }
188
189 @Override
190 public String getAddressPostalCode() {
191 return null;
192 }
193
194 @Override
195 public String getAddressPostalCodeUnmasked() {
196 return null;
197 }
198
199 @Override
200 public String getAddressCountryCode() {
201 return null;
202 }
203
204 @Override
205 public String getAddressCountryCodeUnmasked() {
206 return null;
207 }
208
209 @Override
210 public String getPhoneNumber() {
211 return null;
212 }
213
214 @Override
215 public String getPhoneNumberUnmasked() {
216 return null;
217 }
218
219 @Override
220 public String getCampusCode() {
221 return null;
222 }
223
224 @Override
225 public Map<String, String> getExternalIdentifiers() {
226 return null;
227 }
228
229 @Override
230 public boolean hasAffiliationOfType(String affiliationTypeCode) {
231 return false;
232 }
233
234 @Override
235 public List<String> getCampusCodesForAffiliationOfType(String affiliationTypeCode) {
236 return null;
237 }
238
239 @Override
240 public String getEmployeeStatusCode() {
241 return null;
242 }
243
244 @Override
245 public String getEmployeeTypeCode() {
246 return null;
247 }
248
249 @Override
250 public KualiDecimal getBaseSalaryAmount() {
251 return null;
252 }
253
254 @Override
255 public String getExternalId(String externalIdentifierTypeCode) {
256 return null;
257 }
258
259 @Override
260 public String getPrimaryDepartmentCode() {
261 return null;
262 }
263
264 @Override
265 public String getEmployeeId() {
266 return null;
267 }
268
269 @Override
270 public boolean isActive() {
271 return false;
272 }
273 }
274
275 /**
276 * Mock person service implementation.
277 */
278 private static class MockPersonService implements PersonService {
279
280 @Override
281 public Person getPerson(String principalId) {
282 return getMockPerson(principalId);
283 }
284
285 @Override
286 public List<Person> getPersonByExternalIdentifier(String externalIdentifierTypeCode,
287 String externalId) {
288 return null;
289 }
290
291 @Override
292 public Person getPersonByPrincipalName(String principalName) {
293 return getMockPerson(principalName);
294 }
295
296 @Override
297 public Person getPersonByEmployeeId(String employeeId) {
298 return null;
299 }
300
301 @Override
302 public List<Person> findPeople(Map<String, String> criteria) {
303 return null;
304 }
305
306 @Override
307 public List<Person> findPeople(Map<String, String> criteria, boolean unbounded) {
308 return null;
309 }
310
311 @Override
312 public Class<? extends Person> getPersonImplementationClass() {
313 return null;
314 }
315
316 @SuppressWarnings("deprecation")
317 @Override
318 public Map<String, String> resolvePrincipalNamesToPrincipalIds(
319 org.kuali.rice.krad.bo.BusinessObject businessObject,
320 Map<String, String> fieldValues) {
321 return null;
322 }
323
324 @Override
325 public Person updatePersonIfNecessary(String sourcePrincipalId, Person currentPerson) {
326 return null;
327 }
328 }
329
330 /**
331 * Get a mock person object for use in a JUnit test case.
332 *
333 * @param id The ID to use for principal name, principal ID, and entity ID.
334 * @return A mock person with the supplied ID.
335 */
336 public static Person getMockPerson(String id) {
337 return new MockPerson(id);
338 }
339
340 /**
341 * Establish a Rice configuration providing enough mock services via
342 * {@link GlobalResourceLoader} to support the use of KRAD UIF components in unit tests.
343 *
344 * @param applicationId The application ID for the fake environment.
345 */
346 public static void establishMockConfig(String applicationId) {
347 SimpleConfig config = new SimpleConfig();
348 config.putProperty("application.id", applicationId);
349 ConfigContext.init(config);
350 GlobalResourceLoader.addResourceLoader(new ResourceLoader() {
351
352 @Override
353 public <T> T getObject(ObjectDefinition definition) {
354 return null;
355 }
356
357 @SuppressWarnings("unchecked")
358 @Override
359 public <T> T getService(QName qname) {
360 if (KimApiServiceLocator.KIM_PERSON_SERVICE.equals(qname.getLocalPart())) {
361 return (T) new MockPersonService();
362 }
363 return null;
364 }
365
366 @Override
367 public void start() throws Exception {}
368
369 @Override
370 public void stop() throws Exception {}
371
372 @Override
373 public boolean isStarted() {
374 return true;
375 }
376
377 @Override
378 public void addResourceLoader(ResourceLoader resourceLoader) {}
379
380 @Override
381 public void addResourceLoaderFirst(ResourceLoader resourceLoader) {}
382
383 @Override
384 public ResourceLoader getResourceLoader(QName name) {
385 return null;
386 }
387
388 @Override
389 public List<QName> getResourceLoaderNames() {
390 return null;
391 }
392
393 @Override
394 public List<ResourceLoader> getResourceLoaders() {
395 return null;
396 }
397
398 @Override
399 public void removeResourceLoader(QName name) {}
400
401 @Override
402 public void setName(QName name) {}
403
404 @Override
405 public QName getName() {
406 return new QName("TEST");
407 }
408
409 @Override
410 public String getContents(String indent, boolean servicePerLine) {
411 return null;
412 }
413 });
414 }
415
416 private static class MockViewAuthorizer implements ViewAuthorizer {
417
418 @Override
419 public Set<String> getActionFlags(View view, ViewModel model, Person user, Set<String> actions) {
420 return new java.util.HashSet<String>();
421 }
422
423 @Override
424 public Set<String> getEditModes(View view, ViewModel model, Person user, Set<String> editModes) {
425 return new java.util.HashSet<String>();
426 }
427
428 @Override
429 public boolean canOpenView(View view, ViewModel model, Person user) {
430 return true;
431 }
432
433 @Override
434 public boolean canEditView(View view, ViewModel model, Person user) {
435 return true;
436 }
437
438 @Override
439 public boolean canUnmaskField(View view, ViewModel model, DataField field, String propertyName, Person user) {
440 return true;
441 }
442
443 @Override
444 public boolean canPartialUnmaskField(View view, ViewModel model, DataField field, String propertyName,
445 Person user) {
446 return true;
447 }
448
449 @Override
450 public boolean canEditField(View view, ViewModel model, Field field, String propertyName, Person user) {
451 return true;
452 }
453
454 @Override
455 public boolean canViewField(View view, ViewModel model, Field field, String propertyName, Person user) {
456 return true;
457 }
458
459 @Override
460 public boolean canEditGroup(View view, ViewModel model, Group group, String groupId, Person user) {
461 return true;
462 }
463
464 @Override
465 public boolean canViewGroup(View view, ViewModel model, Group group, String groupId, Person user) {
466 return true;
467 }
468
469 @Override
470 public boolean canEditWidget(View view, ViewModel model, Widget widget, String widgetId, Person user) {
471 return true;
472 }
473
474 @Override
475 public boolean canViewWidget(View view, ViewModel model, Widget widget, String widgetId, Person user) {
476 return true;
477 }
478
479 @Override
480 public boolean canPerformAction(View view, ViewModel model, Action action, String actionEvent, String actionId,
481 Person user) {
482 return true;
483 }
484
485 @Override
486 public boolean canEditLine(View view, ViewModel model, CollectionGroup collectionGroup,
487 String collectionPropertyName, Object line, Person user) {
488 return true;
489 }
490
491 @Override
492 public boolean canViewLine(View view, ViewModel model, CollectionGroup collectionGroup,
493 String collectionPropertyName, Object line, Person user) {
494 return true;
495 }
496
497 @Override
498 public boolean canEditLineField(View view, ViewModel model, CollectionGroup collectionGroup,
499 String collectionPropertyName, Object line, Field field, String propertyName, Person user) {
500 return true;
501 }
502
503 @Override
504 public boolean canViewLineField(View view, ViewModel model, CollectionGroup collectionGroup,
505 String collectionPropertyName, Object line, Field field, String propertyName, Person user) {
506 return true;
507 }
508
509 @Override
510 public boolean canPerformLineAction(View view, ViewModel model, CollectionGroup collectionGroup,
511 String collectionPropertyName, Object line, Action action, String actionEvent, String actionId,
512 Person user) {
513 return true;
514 }
515 }
516
517 /**
518 * Establish a user session with the given principal name.
519 *
520 * <p>
521 * This method will use KIM API calls to look up a person with the provided principal name. Use
522 * {@link #establishMockConfig(String)} to set up a mock KIM environment if needed.
523 * </p>
524 *
525 * @param principalName The principal name of the user to establish a session with.
526 */
527 public static void establishMockUserSession(String principalName) {
528 UserSession session = new UserSession(principalName);
529 GlobalVariables.setUserSession(session);
530 }
531
532 /**
533 * Get a view authorizer allowing most operations.
534 * @return A view authorizer allowing most operations.
535 */
536 public static ViewAuthorizer getAllowMostViewAuthorizer() {
537 return new MockViewAuthorizer();
538 }
539
540 }