001 /** 002 * Copyright 2012 The Kuali Foundation 003 * 004 * Licensed under the the Educational Community License, Version 1.0 005 * (the "License"); you may not use this file except in compliance 006 * with the License. You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl1.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.student.enrollment.class2.courseoffering.service.impl; 017 018 import org.apache.log4j.Logger; 019 import org.junit.After; 020 import org.junit.Assert; 021 import org.junit.Before; 022 import org.junit.Ignore; 023 import org.junit.Test; 024 import org.junit.runner.RunWith; 025 import org.kuali.student.enrollment.acal.service.AcademicCalendarService; 026 import org.kuali.student.enrollment.courseoffering.dto.ActivityOfferingClusterInfo; 027 import org.kuali.student.enrollment.courseoffering.dto.ActivityOfferingInfo; 028 import org.kuali.student.enrollment.courseoffering.dto.ActivityOfferingSetInfo; 029 import org.kuali.student.enrollment.courseoffering.dto.CourseOfferingInfo; 030 import org.kuali.student.enrollment.courseoffering.dto.FormatOfferingInfo; 031 import org.kuali.student.enrollment.courseoffering.dto.OfferingInstructorInfo; 032 import org.kuali.student.enrollment.courseoffering.dto.RegistrationGroupInfo; 033 import org.kuali.student.enrollment.courseoffering.dto.SeatPoolDefinitionInfo; 034 import org.kuali.student.enrollment.courseoffering.service.CourseOfferingService; 035 import org.kuali.student.enrollment.test.util.AttributeTester; 036 import org.kuali.student.enrollment.test.util.ListOfStringTester; 037 import org.kuali.student.enrollment.test.util.MetaTester; 038 import org.kuali.student.r2.common.dto.AttributeInfo; 039 import org.kuali.student.r2.common.dto.ContextInfo; 040 import org.kuali.student.r2.common.dto.StatusInfo; 041 import org.kuali.student.r2.common.exceptions.AlreadyExistsException; 042 import org.kuali.student.r2.common.exceptions.DataValidationErrorException; 043 import org.kuali.student.r2.common.exceptions.DependentObjectsExistException; 044 import org.kuali.student.r2.common.exceptions.DoesNotExistException; 045 import org.kuali.student.r2.common.exceptions.InvalidParameterException; 046 import org.kuali.student.r2.common.exceptions.MissingParameterException; 047 import org.kuali.student.r2.common.exceptions.OperationFailedException; 048 import org.kuali.student.r2.common.exceptions.PermissionDeniedException; 049 import org.kuali.student.r2.common.exceptions.ReadOnlyException; 050 import org.kuali.student.r2.common.exceptions.VersionMismatchException; 051 import org.kuali.student.r2.common.util.ContextUtils; 052 import org.kuali.student.r2.common.util.constants.CourseOfferingServiceConstants; 053 import org.kuali.student.r2.common.util.constants.LprServiceConstants; 054 import org.kuali.student.r2.common.util.constants.LuServiceConstants; 055 import org.kuali.student.r2.common.util.constants.LuiServiceConstants; 056 import org.kuali.student.r2.core.atp.service.AtpService; 057 import org.kuali.student.r2.core.class1.type.dto.TypeInfo; 058 import org.kuali.student.r2.core.constants.AtpServiceConstants; 059 import org.kuali.student.r2.lum.course.dto.CourseInfo; 060 import org.kuali.student.r2.lum.course.service.CourseService; 061 import org.springframework.test.context.ContextConfiguration; 062 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 063 064 import javax.annotation.Resource; 065 import java.util.ArrayList; 066 import java.util.Arrays; 067 import java.util.List; 068 069 import static org.junit.Assert.assertEquals; 070 import static org.junit.Assert.assertNotNull; 071 import static org.junit.Assert.assertNull; 072 import static org.junit.Assert.assertTrue; 073 import static org.junit.Assert.fail; 074 075 /** 076 * @author ocleirig 077 * <p/> 078 * This is a set of unit test cases that runs directly against a mock 079 * implementation of the class 2 course offering service. 080 */ 081 @RunWith(SpringJUnit4ClassRunner.class) 082 @ContextConfiguration(locations = {"classpath:co-test-with-class2-mock-context.xml"}) 083 public class TestCourseOfferingServiceImplWithClass2Mocks { 084 085 private static final Logger log = Logger 086 .getLogger(TestCourseOfferingServiceImplWithClass2Mocks.class); 087 088 @Resource 089 protected CourseOfferingService coService; 090 091 @Resource 092 protected AcademicCalendarService acalService; 093 094 @Resource 095 protected AtpService atpService; 096 097 @Resource 098 protected CourseService canonicalCourseService; 099 100 @Resource 101 protected CourseOfferingServiceTestDataLoader dataLoader; 102 103 private final boolean testAwareDataLoader; 104 105 /** 106 * 107 */ 108 public TestCourseOfferingServiceImplWithClass2Mocks() { 109 this(true); 110 } 111 112 113 protected TestCourseOfferingServiceImplWithClass2Mocks(boolean testAwareDataLoader) { 114 this.testAwareDataLoader = testAwareDataLoader; 115 116 } 117 118 119 public static String principalId = "123"; 120 public ContextInfo callContext = null; 121 122 @Before 123 public void setup() throws Exception { 124 125 callContext = new ContextInfo(); 126 callContext.setPrincipalId(principalId); 127 128 if (testAwareDataLoader || !dataLoader.isInitialized()) 129 dataLoader.beforeTest(); 130 131 } 132 133 134 @After 135 public void tearDown() { 136 if (testAwareDataLoader) 137 dataLoader.afterTest(); 138 } 139 140 @Test 141 public void testCreateAndGetRegistrationGroup() 142 throws AlreadyExistsException, DoesNotExistException, 143 DataValidationErrorException, InvalidParameterException, 144 MissingParameterException, OperationFailedException, 145 PermissionDeniedException { 146 List<String> activityOfferingIds = new ArrayList<String>(); 147 148 activityOfferingIds.add("CO-1:LEC-ONLY:LEC-A"); 149 150 String formatOfferingId = "CO-1:LEC-ONLY"; 151 152 String activityOfferingClusterId = "fake-aoc-id"; 153 154 RegistrationGroupInfo rgLecA = CourseOfferingServiceDataUtils 155 .createRegistrationGroup("CO-1", formatOfferingId, "2012FA", 156 activityOfferingClusterId, activityOfferingIds, "RG-1", "RG-1", true, true, 157 10, LuiServiceConstants.REGISTRATION_GROUP_OPEN_STATE_KEY); 158 159 try { 160 RegistrationGroupInfo created = coService.createRegistrationGroup( 161 formatOfferingId, activityOfferingClusterId, 162 LuiServiceConstants.REGISTRATION_GROUP_TYPE_KEY, rgLecA, 163 callContext); 164 assertNotNull(created); 165 166 RegistrationGroupInfo retrieved = coService.getRegistrationGroup( 167 created.getId(), callContext); 168 assertNotNull(retrieved); 169 170 assertEquals(rgLecA.getFormatOfferingId(), 171 retrieved.getFormatOfferingId()); 172 assertEquals(rgLecA.getActivityOfferingClusterId(), retrieved.getActivityOfferingClusterId()); 173 assertEquals(rgLecA.getName(), retrieved.getName()); 174 assertEquals(rgLecA.getStateKey(), retrieved.getStateKey()); 175 assertEquals(rgLecA.getTypeKey(), retrieved.getTypeKey()); 176 177 // test getRegistrationGroupsForCourseOffering 178 179 } catch (Exception ex) { 180 log.error("failed from service call:", ex); 181 182 fail("Exception from service call :" + ex.getMessage()); 183 } 184 } 185 186 187 @Test 188 public void testCreateActivityOfferintgCluster() throws DoesNotExistException, InvalidParameterException, MissingParameterException, OperationFailedException, PermissionDeniedException, DataValidationErrorException, ReadOnlyException { 189 190 // default cluster is 2x3 = 6 reg groups 191 192 // we want to constrain to not use lec-b 193 // 1x3 = 3 reg groups 194 195 ActivityOfferingInfo activities[] = new ActivityOfferingInfo[]{ 196 coService.getActivityOffering("CO-1:LEC-AND-LAB:LEC-A", 197 callContext), 198 coService.getActivityOffering("CO-1:LEC-AND-LAB:LAB-A", 199 callContext), 200 coService.getActivityOffering("CO-1:LEC-AND-LAB:LAB-B", 201 callContext), 202 coService.getActivityOffering("CO-1:LEC-AND-LAB:LAB-C", 203 callContext),}; 204 205 ActivityOfferingClusterInfo expected = CourseOfferingServiceDataUtils 206 .createActivityOfferingCluster("CO-1:LEC-AND-LAB", "Default Cluster", 207 Arrays.asList(activities)); 208 209 new AttributeTester().add2ForCreate(expected.getAttributes()); 210 211 ActivityOfferingClusterInfo actual = coService.createActivityOfferingCluster("CO-1:LEC-AND-LAB", CourseOfferingServiceConstants.AOC_ROOT_TYPE_KEY, expected, callContext); 212 213 assertNotNull(actual.getId()); 214 new AttributeTester().check(expected.getAttributes(), actual.getAttributes()); 215 new MetaTester().checkAfterCreate(actual.getMeta()); 216 217 // check that the union of activity id's matches what we declared 218 new ListOfStringTester().checkExistsAnyOrder(Arrays.asList(new String[]{"CO-1:LEC-AND-LAB:LEC-A", "CO-1:LEC-AND-LAB:LAB-A", "CO-1:LEC-AND-LAB:LAB-B", "CO-1:LEC-AND-LAB:LAB-C"}), extractActivityOfferingIds(actual.getActivityOfferingSets()), true); 219 220 221 List<RegistrationGroupInfo> rgList = coService.getRegistrationGroupsByActivityOfferingCluster(actual.getId(), callContext); 222 223 assertEquals(0, rgList.size()); 224 225 coService.generateRegistrationGroupsForCluster(actual.getId(), callContext); 226 227 rgList = coService.getRegistrationGroupsByActivityOfferingCluster(actual.getId(), callContext); 228 229 assertEquals(3, rgList.size()); 230 231 coService.generateRegistrationGroupsForCluster(actual.getId(), callContext); 232 233 // verify count stays the same even after calling the method again. 234 rgList = coService.getRegistrationGroupsByActivityOfferingCluster(actual.getId(), callContext); 235 236 assertEquals(3, rgList.size()); 237 } 238 239 private List<String> extractActivityOfferingIds(List<ActivityOfferingSetInfo> aoList) { 240 List<String> idList = new ArrayList<String>(); 241 242 for (ActivityOfferingSetInfo activityOfferingSetInfo : aoList) { 243 244 idList.addAll(activityOfferingSetInfo.getActivityOfferingIds()); 245 246 } 247 return idList; 248 } 249 250 @Test 251 public void testGenerateRegGroupsFromActivityOfferingCluster() throws DoesNotExistException, InvalidParameterException, MissingParameterException, OperationFailedException, PermissionDeniedException, DataValidationErrorException, ReadOnlyException { 252 253 ActivityOfferingInfo activities[] = new ActivityOfferingInfo[]{ 254 coService.getActivityOffering("CO-1:LEC-AND-LAB:LEC-A", 255 callContext), 256 coService.getActivityOffering("CO-1:LEC-AND-LAB:LAB-A", 257 callContext), 258 coService.getActivityOffering("CO-1:LEC-AND-LAB:LAB-B", 259 callContext), 260 coService.getActivityOffering("CO-1:LEC-AND-LAB:LAB-C", 261 callContext),}; 262 263 ActivityOfferingClusterInfo cluster = CourseOfferingServiceDataUtils 264 .createActivityOfferingCluster("CO-1:LEC-AND-LAB", "Default", 265 Arrays.asList(activities)); 266 267 ActivityOfferingClusterInfo created = coService.createActivityOfferingCluster("CO-1:LEC-AND-LAB", CourseOfferingServiceConstants.AOC_ROOT_TYPE_KEY, cluster, callContext); 268 269 270 } 271 272 273 private ActivityOfferingClusterInfo createDefaultActivityOfferingCluster(String formatOfferingId) throws DoesNotExistException, InvalidParameterException, MissingParameterException, OperationFailedException, PermissionDeniedException, DataValidationErrorException, ReadOnlyException { 274 275 List<ActivityOfferingInfo> activities = coService.getActivityOfferingsByFormatOffering(formatOfferingId, callContext); 276 277 ActivityOfferingClusterInfo defaultAoc = CourseOfferingServiceDataUtils.createActivityOfferingCluster(formatOfferingId, "Default Cluster", activities); 278 279 defaultAoc = coService.createActivityOfferingCluster(formatOfferingId, CourseOfferingServiceConstants.AOC_ROOT_TYPE_KEY, defaultAoc, callContext); 280 281 Assert.assertNotNull(defaultAoc.getId()); 282 283 return defaultAoc; 284 } 285 286 @Test 287 public void testGenerateRegistrationGroupsSimple() throws DoesNotExistException, 288 InvalidParameterException, MissingParameterException, 289 OperationFailedException, PermissionDeniedException, AlreadyExistsException, DataValidationErrorException, ReadOnlyException { 290 291 String formatOfferingId = "CO-1:LEC-AND-LAB"; 292 293 createDefaultActivityOfferingCluster(formatOfferingId); 294 295 StatusInfo status = coService 296 .generateRegistrationGroupsForFormatOffering( 297 formatOfferingId, callContext); 298 299 Assert.assertTrue(status.getIsSuccess()); 300 301 List<RegistrationGroupInfo> rgList = coService.getRegistrationGroupsByFormatOffering("CO-1:LEC-AND-LAB", callContext); 302 303 Assert.assertEquals(6, rgList.size()); 304 305 } 306 307 @Test 308 public void testGenerateAndDeleteRegistrationGroups() throws DoesNotExistException, InvalidParameterException, MissingParameterException, OperationFailedException, PermissionDeniedException, DataValidationErrorException, ReadOnlyException, DoesNotExistException, InvalidParameterException, MissingParameterException, OperationFailedException, PermissionDeniedException, VersionMismatchException, AlreadyExistsException, DependentObjectsExistException { 309 310 ActivityOfferingClusterInfo cluster = createDefaultActivityOfferingCluster("CO-1:LEC-AND-LAB"); 311 312 List<RegistrationGroupInfo> rgList = coService.getRegistrationGroupsForCourseOffering("CO-1", callContext); 313 314 assertEquals(0, rgList.size()); 315 316 StatusInfo status = coService 317 .generateRegistrationGroupsForFormatOffering( 318 "CO-1:LEC-AND-LAB", callContext); 319 320 321 Assert.assertTrue(status.getIsSuccess()); 322 323 rgList = coService.getRegistrationGroupsByFormatOffering("CO-1:LEC-AND-LAB", callContext); 324 325 Assert.assertEquals(6, rgList.size()); 326 327 // this is harder so for now just skip 328 329 // FormatOfferingInfo fo = coService.getFormatOffering("CO-1:LEC-AND-LAB", callContext); 330 // 331 // fo.getActivityOfferingTypeKeys().add(LuiServiceConstants.DISCUSSION_ACTIVITY_OFFERING_TYPE_KEY); 332 // 333 // coService.updateFormatOffering(fo.getId(), fo, callContext); 334 335 List<ActivityOfferingInfo> ao = coService.getActivityOfferingsByFormatOffering("CO-1:LEC-AND-LAB", callContext); 336 337 Assert.assertEquals(5, ao.size()); 338 339 dataLoader.createLabActivityOfferingForCHEM123("LAB-F", callContext); 340 341 ao = coService.getActivityOfferingsByFormatOffering("CO-1:LEC-AND-LAB", callContext); 342 343 Assert.assertEquals(6, ao.size()); 344 345 boolean exception = false; 346 347 try { 348 status = coService 349 .generateRegistrationGroupsForFormatOffering( 350 "CO-1:LEC-AND-LAB", callContext); 351 352 } catch (OperationFailedException e) { 353 exception = true; 354 } 355 356 Assert.assertTrue("Exception should have occured when generating on top of existing reg groups.", exception); 357 358 status = coService.deleteGeneratedRegistrationGroupsByFormatOffering("CO-1:LEC-AND-LAB", callContext); 359 360 assertTrue("Failed to delete existing generated registration groups", status.getIsSuccess()); 361 362 status = coService 363 .generateRegistrationGroupsForFormatOffering( 364 "CO-1:LEC-AND-LAB", callContext); 365 366 rgList = coService.getRegistrationGroupsByFormatOffering("CO-1:LEC-AND-LAB", callContext); 367 368 Assert.assertEquals(6, rgList.size()); 369 370 // in order to get 8 we need to assign the new AO into the default cluster 371 372 // or just delete the existing default cluster and recreate it. 373 374 coService.deleteRegistrationGroupsForCluster(cluster.getId(), callContext); 375 coService.deleteActivityOfferingCluster(cluster.getId(), callContext); 376 377 createDefaultActivityOfferingCluster("CO-1:LEC-AND-LAB"); 378 379 coService.generateRegistrationGroupsForFormatOffering("CO-1:LEC-AND-LAB", callContext); 380 381 rgList = coService.getRegistrationGroupsByFormatOffering("CO-1:LEC-AND-LAB", callContext); 382 383 Assert.assertEquals(8, rgList.size()); 384 385 386 } 387 388 @Test 389 public void testServiceSetup() { 390 assertNotNull(coService); 391 } 392 393 /** 394 * ********************************************************************** 395 * COURSE TESTS *********************************************************************** 396 */ 397 @Test 398 public void testGetCourseOffering() throws DoesNotExistException, 399 InvalidParameterException, MissingParameterException, 400 OperationFailedException, PermissionDeniedException { 401 try { 402 try { 403 coService.getCourseOffering("Lui-blah", callContext); 404 fail("Lui-blah should have thrown DoesNotExistException"); 405 } catch (DoesNotExistException enee) { 406 // expected 407 } 408 409 CourseOfferingInfo co = coService.getCourseOffering("CO-1", 410 callContext); 411 assertNotNull(co); 412 assertEquals(LuiServiceConstants.COURSE_OFFERING_PROCESS_STATE_KEYS[0], 413 co.getStateKey()); 414 assertEquals(LuiServiceConstants.COURSE_OFFERING_TYPE_KEY, 415 co.getTypeKey()); 416 } catch (Exception ex) { 417 fail(ex.getMessage()); 418 } 419 } 420 421 @Test 422 public void testGetCourseOfferingIdsByTerm() throws DoesNotExistException, 423 InvalidParameterException, MissingParameterException, 424 OperationFailedException, PermissionDeniedException { 425 List<String> offerings = coService.getCourseOfferingIdsByTerm( 426 "TermId-blah", true, callContext); 427 428 assertEquals(0, offerings.size()); 429 430 List<String> idList = coService.getCourseOfferingIdsByTerm("2012FA", 431 true, callContext); 432 assertTrue(idList.size() > 0); 433 } 434 435 @Test 436 public void testGetCourseOfferingsByIds() throws DoesNotExistException, 437 InvalidParameterException, MissingParameterException, 438 OperationFailedException, PermissionDeniedException { 439 List<String> idsList = new ArrayList<String>(); 440 idsList.add("test1"); 441 idsList.add("test2"); 442 idsList.add("test3"); 443 444 try { 445 try { 446 coService.getCourseOfferingsByIds(idsList, callContext); 447 fail("idsList should have thrown DoesNotExistException"); 448 } catch (DoesNotExistException enee) { 449 // expected 450 } 451 452 idsList.clear(); 453 454 idsList.add("CO-1"); 455 idsList.add("CO-2"); 456 457 List<CourseOfferingInfo> co = coService.getCourseOfferingsByIds( 458 idsList, callContext); 459 460 assertNotNull(co); 461 for (CourseOfferingInfo coItem : co) { 462 assertEquals(LuiServiceConstants.COURSE_OFFERING_PROCESS_STATE_KEYS[0], 463 coItem.getStateKey()); 464 assertEquals(LuiServiceConstants.COURSE_OFFERING_TYPE_KEY, 465 coItem.getTypeKey()); 466 } 467 } catch (Exception ex) { 468 fail(ex.getMessage()); 469 } 470 } 471 472 @Test 473 public void testGetCourseOfferingsByCourseAndTerm() 474 throws DoesNotExistException, InvalidParameterException, 475 MissingParameterException, OperationFailedException, 476 PermissionDeniedException { 477 try { 478 List<CourseOfferingInfo> offerings = coService 479 .getCourseOfferingsByCourseAndTerm("Lui-blah", 480 "TermId-blah", callContext); 481 482 assertEquals(0, offerings.size()); 483 484 List<CourseOfferingInfo> co = coService 485 .getCourseOfferingsByCourseAndTerm("CLU-1", "2012FA", 486 callContext); 487 assertTrue(co.size() > 0); 488 489 for (CourseOfferingInfo coItem : co) { 490 assertEquals(LuiServiceConstants.COURSE_OFFERING_PROCESS_STATE_KEYS[0], 491 coItem.getStateKey()); 492 assertEquals(LuiServiceConstants.COURSE_OFFERING_TYPE_KEY, 493 coItem.getTypeKey()); 494 } 495 } catch (Exception ex) { 496 fail(ex.getMessage()); 497 } 498 } 499 500 @Test 501 public void testCreateCourseOffering() throws AlreadyExistsException, 502 DoesNotExistException, DataValidationErrorException, 503 InvalidParameterException, MissingParameterException, 504 OperationFailedException, PermissionDeniedException, 505 ReadOnlyException, 506 DoesNotExistException, 507 InvalidParameterException, 508 MissingParameterException, 509 OperationFailedException, 510 PermissionDeniedException { 511 512 List<CourseOfferingInfo> offerings = coService 513 .getCourseOfferingsByCourse("CLU-1", callContext); 514 515 int expectedOfferings = offerings.size() + 1; 516 517 List<String> optionKeys = new ArrayList<String>(); 518 CourseInfo canonicalCourse = this.canonicalCourseService 519 .getCourse("CLU-1", ContextUtils.getContextInfo()); 520 CourseOfferingInfo coInfo = CourseOfferingServiceDataUtils 521 .createCourseOffering(canonicalCourse, "2012FA"); 522 523 // gets around the unique course code constraint 524 // this is ok for testing. 525 coInfo.setCourseCode(coInfo.getCourseOfferingCode() + "TESTING CREATE"); 526 527 CourseOfferingInfo created = coService.createCourseOffering("CLU-1", 528 "2012FA", LuiServiceConstants.COURSE_OFFERING_TYPE_KEY, coInfo, 529 optionKeys, callContext); 530 531 assertNotNull(created); 532 assertEquals("CLU-1", created.getCourseId()); 533 assertEquals("2012FA", created.getTermId()); 534 assertEquals(LuiServiceConstants.COURSE_OFFERING_PROCESS_STATE_KEYS[0], 535 created.getStateKey()); 536 assertEquals(LuiServiceConstants.COURSE_OFFERING_TYPE_KEY, 537 created.getTypeKey()); 538 assertEquals("CHEM123", created.getCourseOfferingCode()); 539 assertEquals("Chemistry 123", created.getCourseOfferingTitle()); 540 541 CourseOfferingInfo retrieved = coService.getCourseOffering( 542 created.getId(), callContext); 543 assertNotNull(retrieved); 544 assertEquals("CLU-1", retrieved.getCourseId()); 545 assertEquals("2012FA", retrieved.getTermId()); 546 assertEquals(LuiServiceConstants.COURSE_OFFERING_PROCESS_STATE_KEYS[0], 547 retrieved.getStateKey()); 548 assertEquals(LuiServiceConstants.COURSE_OFFERING_TYPE_KEY, 549 retrieved.getTypeKey()); 550 551 assertEquals("CHEM123", retrieved.getCourseOfferingCode()); 552 assertEquals("Chemistry 123", retrieved.getCourseOfferingTitle()); 553 554 offerings = coService.getCourseOfferingsByCourse("CLU-1", callContext); 555 556 // we and maybe another test have added one 557 assertEquals(expectedOfferings, offerings.size()); 558 } 559 560 @Test 561 public void testUpdateCourseOffering() throws DataValidationErrorException, 562 DoesNotExistException, InvalidParameterException, 563 MissingParameterException, OperationFailedException, 564 PermissionDeniedException, ReadOnlyException, 565 VersionMismatchException { 566 try { 567 CourseOfferingInfo coi = coService.getCourseOffering("CO-2", 568 callContext); 569 assertNotNull(coi); 570 571 coi.setTermId("testAtpId1"); 572 coi.setIsHonorsOffering(true); 573 coi.setMaximumEnrollment(40); 574 coi.setMinimumEnrollment(10); 575 List<OfferingInstructorInfo> instructors = new ArrayList<OfferingInstructorInfo>(); 576 OfferingInstructorInfo instructor = new OfferingInstructorInfo(); 577 instructor.setPersonId("Pers-1"); 578 instructor.setPercentageEffort(Float.valueOf("60")); 579 instructor.setTypeKey(LprServiceConstants.INSTRUCTOR_MAIN_TYPE_KEY); 580 instructor.setStateKey(LprServiceConstants.ASSIGNED_STATE_KEY); 581 instructors.add(instructor); 582 coi.setInstructors(instructors); 583 CourseOfferingInfo updated = coService.updateCourseOffering("CO-2", 584 coi, callContext); 585 assertNotNull(updated); 586 587 CourseOfferingInfo retrieved = coService.getCourseOffering("CO-2", 588 callContext); 589 assertNotNull(retrieved); 590 591 assertTrue(retrieved.getIsHonorsOffering()); 592 assertEquals(1, retrieved.getInstructors().size()); 593 assertEquals(coi.getMaximumEnrollment(), 594 retrieved.getMaximumEnrollment()); 595 assertEquals(coi.getMinimumEnrollment(), 596 retrieved.getMinimumEnrollment()); 597 598 retrieved.setIsHonorsOffering(false); 599 List<OfferingInstructorInfo> instructors1 = new ArrayList<OfferingInstructorInfo>(); 600 OfferingInstructorInfo instructor1 = new OfferingInstructorInfo(); 601 instructor1.setPersonId("Pers-2"); 602 instructor1.setPercentageEffort(Float.valueOf("60")); 603 instructor1 604 .setTypeKey(LprServiceConstants.INSTRUCTOR_MAIN_TYPE_KEY); 605 instructor1.setStateKey(LprServiceConstants.ASSIGNED_STATE_KEY); 606 instructors1.add(instructor1); 607 OfferingInstructorInfo instructor2 = new OfferingInstructorInfo(); 608 instructor2.setPersonId("Pers-1"); 609 instructor2.setPercentageEffort(Float.valueOf("30")); 610 instructor2 611 .setTypeKey(LprServiceConstants.INSTRUCTOR_MAIN_TYPE_KEY); 612 instructor2.setStateKey(LprServiceConstants.ASSIGNED_STATE_KEY); 613 instructors1.add(instructor2); 614 retrieved.setInstructors(instructors1); 615 CourseOfferingInfo updated1 = coService.updateCourseOffering( 616 "CO-2", retrieved, callContext); 617 assertNotNull(updated1); 618 619 CourseOfferingInfo retrieved1 = coService.getCourseOffering("CO-2", 620 callContext); 621 assertNotNull(retrieved1); 622 assertEquals(2, retrieved1.getInstructors().size()); 623 } catch (Exception ex) { 624 log.error("exception due to", ex); 625 fail("Exception from service call :" + ex.getMessage()); 626 } 627 } 628 629 @Test 630 public void testUpdateCourseOfferingWithDynAttrs() 631 throws DataValidationErrorException, DoesNotExistException, 632 InvalidParameterException, MissingParameterException, 633 OperationFailedException, PermissionDeniedException, 634 ReadOnlyException, VersionMismatchException { 635 try { 636 637 CourseOfferingInfo coi = coService.getCourseOffering("CO-2", 638 callContext); 639 assertNotNull(coi); 640 641 coi.setTermId("atpId1"); 642 643 // dynamic attributes 644 AttributeTester attributeTester = new AttributeTester(); 645 646 List<AttributeInfo> expectedList = new ArrayList<AttributeInfo>(); 647 648 attributeTester.add2ForCreate(expectedList); 649 650 coi.getAttributes().addAll(expectedList); 651 652 coi.setFundingSource("state"); 653 654 CourseOfferingInfo updated = coService.updateCourseOffering( 655 coi.getId(), coi, callContext); 656 assertNotNull(updated); 657 658 CourseOfferingInfo retrieved = coService.getCourseOffering( 659 coi.getId(), callContext); 660 assertNotNull(retrieved); 661 662 assertEquals("state", coi.getFundingSource()); 663 664 attributeTester.check(expectedList, coi.getAttributes()); 665 666 // TODO: fix once waitlists are implemented 667 // assertEquals("WaitlistLevelType1", 668 // coi.getWaitlistLevelTypeKey()); 669 } catch (Exception ex) { 670 log.error("exception due to ", ex); 671 fail("Exception from service call :" + ex.getMessage()); 672 } 673 } 674 675 @Test 676 @Ignore 677 // TODO fix KSENROLL-2671, add back validation decorator and this will work again 678 public void testDeleteFormatOffering() throws InvalidParameterException, MissingParameterException, OperationFailedException, PermissionDeniedException, DependentObjectsExistException, DoesNotExistException { 679 680 boolean exception = false; 681 682 try { 683 coService.deleteFormatOffering("DOES NOT EXIST", callContext); 684 } catch (DoesNotExistException e) { 685 exception = true; 686 } 687 688 assertTrue("Activity should not exist but seems to.", exception); 689 690 exception = false; 691 692 String formatOfferingId = "CO-1:LEC-ONLY"; 693 try { 694 coService.deleteFormatOffering(formatOfferingId, callContext); 695 } catch (DependentObjectsExistException e) { 696 exception = true; 697 } 698 699 assertTrue("Deleted a format that has activities", exception); 700 701 StatusInfo status = coService.deleteFormatOfferingCascaded(formatOfferingId, callContext); 702 703 assertTrue(status.getIsSuccess()); 704 705 // verify no activity offerings remain 706 List<ActivityOfferingInfo> aos = coService.getActivityOfferingsByFormatOffering(formatOfferingId, callContext); 707 708 assertEquals(0, aos.size()); 709 } 710 711 712 @Test 713 @Ignore 714 // TODO fix KSENROLL-2671, add back validation decorator and this will work again 715 public void testDeleteActivityOffering() throws DataValidationErrorException, InvalidParameterException, MissingParameterException, OperationFailedException, PermissionDeniedException, ReadOnlyException, AlreadyExistsException, DoesNotExistException { 716 717 SeatPoolDefinitionInfo seatPoolDefinitionInfo = CourseOfferingServiceDataUtils.createSeatPoolDefinition("POP1", "Test Seat Pool", "expiration milestone", false, 12, 5); 718 719 seatPoolDefinitionInfo = coService.createSeatPoolDefinition(seatPoolDefinitionInfo, callContext); 720 721 String activityOfferingId = "CO-1:LEC-ONLY:LEC-A"; 722 coService.addSeatPoolDefinitionToActivityOffering(seatPoolDefinitionInfo.getId(), activityOfferingId, callContext); 723 724 boolean exception = false; 725 try { 726 coService.deleteActivityOffering(activityOfferingId, callContext); 727 } catch (DependentObjectsExistException e) { 728 exception = true; 729 } 730 731 assertTrue("Failed to detect associated seat pool for activity offering and abort delete", exception); 732 733 // now cascade the delete 734 735 StatusInfo status = coService.deleteActivityOfferingCascaded(activityOfferingId, callContext); 736 737 assertTrue(status.getIsSuccess()); 738 739 // check that the activity offering and seat pool are gone. 740 741 exception = false; 742 743 try { 744 coService.getActivityOffering(activityOfferingId, callContext); 745 } catch (DoesNotExistException e) { 746 exception = true; 747 } 748 749 assertTrue("activity still exists after delete", exception); 750 751 exception = false; 752 try { 753 List<SeatPoolDefinitionInfo> spls = coService.getSeatPoolDefinitionsForActivityOffering(activityOfferingId, callContext); 754 } catch (DoesNotExistException e) { 755 exception = true; 756 } 757 758 assertTrue("activity still exists after delete", exception); 759 760 } 761 762 763 @Test 764 @Ignore 765 // TODO fix KSENROLL-2671, add back validation decorator and this will work again 766 public void testDeleteCourseOffering() throws AlreadyExistsException, 767 DoesNotExistException, DataValidationErrorException, 768 InvalidParameterException, MissingParameterException, 769 OperationFailedException, PermissionDeniedException, 770 ReadOnlyException, 771 DoesNotExistException, 772 InvalidParameterException, 773 MissingParameterException, 774 OperationFailedException, 775 PermissionDeniedException { 776 777 CourseInfo canonicalCourse = canonicalCourseService.getCourse("CLU-1", ContextUtils.getContextInfo()); 778 779 // Create a CO 780 CourseOfferingInfo coInfo = CourseOfferingServiceDataUtils 781 .createCourseOffering(canonicalCourse, "2012SP"); 782 List<String> optionKeys = new ArrayList<String>(); 783 CourseOfferingInfo created = coService.createCourseOffering("CLU-1", 784 "2012SP", LuiServiceConstants.COURSE_OFFERING_TYPE_KEY, coInfo, 785 optionKeys, callContext); 786 787 // Verify that the CO was created 788 assertNotNull(created); 789 assertEquals("CLU-1", created.getCourseId()); 790 assertEquals("2012SP", created.getTermId()); 791 assertEquals(LuiServiceConstants.COURSE_OFFERING_PROCESS_STATE_KEYS[0], 792 created.getStateKey()); 793 assertEquals(LuiServiceConstants.COURSE_OFFERING_TYPE_KEY, 794 created.getTypeKey()); 795 796 try { 797 // Delete the course offering and check that the status returned was 798 // a success 799 StatusInfo delResult = coService.deleteCourseOffering( 800 created.getId(), callContext); 801 assertTrue(delResult.getIsSuccess()); 802 } catch (Exception ex) { 803 log.error("exception due to ", ex); 804 fail("Exception from service call :" + ex.getMessage()); 805 } 806 807 boolean exception = false; 808 809 try { 810 coService.deleteCourseOffering("CO-1", callContext); 811 } catch (DependentObjectsExistException e) { 812 exception = true; 813 } 814 815 assertTrue("Failed to detect dependent objects", exception); 816 817 818 } 819 820 @Test 821 @Ignore // TODO: update cascade to deal with AOC's instead of Reg Groups. 822 public void testDeleteCourseOfferingCascaded() throws DoesNotExistException, InvalidParameterException, MissingParameterException, OperationFailedException, PermissionDeniedException, AlreadyExistsException, DataValidationErrorException { 823 824 boolean dependantObjects = false; 825 826 try { 827 coService.deleteCourseOffering("CO-2", callContext); 828 } catch (DependentObjectsExistException e) { 829 dependantObjects = true; 830 } 831 832 assertTrue("No dependent objects exist for CO-2", dependantObjects); 833 834 835 StatusInfo status = coService.generateRegistrationGroupsForFormatOffering("CO-2:LEC-ONLY", callContext); 836 837 List<RegistrationGroupInfo> rgs = coService.getRegistrationGroupsByFormatOffering("CO-2:LEC-ONLY", callContext); 838 839 assertTrue(rgs.size() > 0); 840 841 status = coService.deleteCourseOfferingCascaded("CO-2", callContext); 842 843 assertTrue(status.getIsSuccess()); 844 845 List<FormatOfferingInfo> formats = coService.getFormatOfferingsByCourseOffering("CO-2", callContext); 846 847 assertEquals(0, formats.size()); 848 849 rgs = coService.getRegistrationGroupsForCourseOffering("CO-2", callContext); 850 851 assertEquals(0, rgs.size()); 852 853 } 854 855 856 @Test 857 public void testCreateFormatOffering() throws DoesNotExistException, 858 InvalidParameterException, MissingParameterException, 859 OperationFailedException, PermissionDeniedException { 860 try { 861 862 List<CourseOfferingInfo> coList = coService 863 .getCourseOfferingsByCourse("CLU-1", callContext); 864 865 assertTrue(coList.size() > 0); 866 867 CourseOfferingInfo co = coList.get(0); 868 869 FormatOfferingInfo newFO = CourseOfferingServiceDataUtils 870 .createFormatOffering(co.getId(), "format1", 871 co.getTermId(), "TEST FORMAT OFFERING", 872 LuiServiceConstants.ALL_ACTIVITY_TYPES); 873 FormatOfferingInfo fo = coService.createFormatOffering(co.getId(), 874 "format1", LuiServiceConstants.FORMAT_OFFERING_TYPE_KEY, 875 newFO, callContext); 876 assertNotNull(fo); 877 assertEquals(LuiServiceConstants.LUI_FO_STATE_PLANNED_KEY, 878 fo.getStateKey()); 879 assertEquals(LuiServiceConstants.FORMAT_OFFERING_TYPE_KEY, 880 fo.getTypeKey()); 881 assertEquals("TEST FORMAT OFFERING", fo.getDescr().getPlain()); 882 } catch (Exception ex) { 883 log.error("exception due to ", ex); 884 fail(ex.getMessage()); 885 } 886 } 887 888 @Test 889 public void testGetFormatOffering() throws DoesNotExistException, 890 InvalidParameterException, MissingParameterException, 891 OperationFailedException, PermissionDeniedException { 892 try { 893 894 FormatOfferingInfo fo = coService.getFormatOffering( 895 "CO-2:LEC-ONLY", callContext); 896 assertNotNull(fo); 897 assertEquals(LuiServiceConstants.LUI_FO_STATE_PLANNED_KEY, 898 fo.getStateKey()); 899 assertEquals(LuiServiceConstants.FORMAT_OFFERING_TYPE_KEY, 900 fo.getTypeKey()); 901 assertEquals("Lecture", fo.getDescr().getPlain()); 902 } catch (Exception ex) { 903 log.error("exception due to ", ex); 904 fail(ex.getMessage()); 905 } 906 } 907 908 @Test 909 public void testCreateAndGetActivityOffering() 910 throws AlreadyExistsException, DataValidationErrorException, 911 InvalidParameterException, MissingParameterException, 912 OperationFailedException, PermissionDeniedException, DoesNotExistException { 913 914 CourseOfferingInfo courseOffering = coService.getCourseOffering("CO-1", callContext); 915 916 List<OfferingInstructorInfo> instructors = new ArrayList<OfferingInstructorInfo>(); 917 918 instructors.add(CourseOfferingServiceDataUtils.createInstructor( 919 "Pers-1", "Person One", 60.00F)); 920 921 String activityId = CourseOfferingServiceDataUtils 922 .createCanonicalActivityId("CO-1:LEC-ONLY", 923 LuServiceConstants.COURSE_ACTIVITY_LECTURE_TYPE_KEY); 924 925 ActivityOfferingInfo ao = CourseOfferingServiceDataUtils 926 .createActivityOffering("2012FA", courseOffering, "CO-1:LEC-ONLY", 927 "SCHED-ID", activityId, "Lecture", "A", 928 LuiServiceConstants.LECTURE_ACTIVITY_OFFERING_TYPE_KEY, 929 instructors); 930 931 try { 932 ActivityOfferingInfo created = coService.createActivityOffering( 933 "CO-1:LEC-ONLY", activityId, 934 LuiServiceConstants.LECTURE_ACTIVITY_OFFERING_TYPE_KEY, ao, 935 callContext); 936 assertNotNull(created); 937 938 ActivityOfferingInfo retrieved = coService.getActivityOffering( 939 created.getId(), callContext); 940 assertNotNull(retrieved); 941 942 assertEquals(created.getActivityId(), retrieved.getActivityId()); 943 assertEquals(created.getTermId(), retrieved.getTermId()); 944 assertEquals(LuiServiceConstants.LUI_AO_STATE_DRAFT_KEY, 945 retrieved.getStateKey()); 946 assertEquals( 947 LuiServiceConstants.LECTURE_ACTIVITY_OFFERING_TYPE_KEY, 948 retrieved.getTypeKey()); 949 assertEquals(1, retrieved.getInstructors().size()); 950 951 // test getActivityOfferingsByCourseOffering 952 List<ActivityOfferingInfo> activities = coService 953 .getActivityOfferingsByCourseOffering("CO-1", callContext); 954 assertNotNull(activities); 955 // 3 existing plus this new one 956 // this one should probably not have been added so this test case 957 // may need to be adapted 958 // in the future. 959 assertEquals(8, activities.size()); 960 961 boolean foundActivityId = false; 962 boolean foundId = false; 963 964 for (ActivityOfferingInfo activityOfferingInfo : activities) { 965 966 if (activityOfferingInfo.getActivityId().equals( 967 created.getActivityId())) { 968 foundActivityId = true; 969 } 970 971 if (activityOfferingInfo.getId().equals("CO-1:LEC-ONLY:LEC-B")) 972 foundId = true; 973 } 974 assertTrue(foundActivityId); 975 assertTrue(foundId); 976 977 assertEquals(1, activities.get(0).getInstructors().size()); 978 } catch (Exception ex) { 979 log.fatal("Exception from serviceCall", ex); 980 981 fail("Exception from service call :" + ex.getMessage()); 982 } 983 } 984 985 986 @Test 987 @Ignore 988 public void testUpdateRegistrationGroup() throws InvalidParameterException, 989 DataValidationErrorException, MissingParameterException, 990 DoesNotExistException, VersionMismatchException, 991 PermissionDeniedException, OperationFailedException, 992 ReadOnlyException { 993 994 List<RegistrationGroupInfo> rgList = coService.getRegistrationGroupsByFormatOffering("CO-2:LEC-ONLY", callContext); 995 996 assertEquals(2, rgList.size()); 997 998 for (RegistrationGroupInfo regGroup : rgList) { 999 1000 // TODO: find a way to reach in and check that the reg groups are generated properly. 1001 if (regGroup.getId().contains("LEC-A")) { 1002 assertEquals("CO-2", regGroup.getCourseOfferingId()); 1003 assertEquals(1, regGroup.getActivityOfferingIds().size()); 1004 assertEquals("CO-2:LEC-ONLY:LEC-A", regGroup.getActivityOfferingIds() 1005 .get(0)); 1006 } else if (regGroup.getId().contains("LEC-B")) { 1007 regGroup.getActivityOfferingIds().remove(0); 1008 regGroup.getActivityOfferingIds().add("CO-2:LEC-ONLY:LEC-B"); 1009 RegistrationGroupInfo updatedRegGroup = coService 1010 .updateRegistrationGroup(regGroup.getId(), regGroup, 1011 callContext); 1012 assertEquals("CO-2", regGroup.getCourseOfferingId()); 1013 assertEquals(1, updatedRegGroup.getActivityOfferingIds().size()); 1014 assertEquals("CO-2:LEC-ONLY:LEC-B", regGroup.getActivityOfferingIds() 1015 .get(0)); 1016 } else { 1017 Assert.fail("invalid reg group with id = " + regGroup.getId()); 1018 } 1019 } 1020 1021 1022 } 1023 1024 @Test 1025 public void testDeleteRegistrationGroup() throws InvalidParameterException, 1026 MissingParameterException, DoesNotExistException, 1027 PermissionDeniedException, OperationFailedException { 1028 1029 List<RegistrationGroupInfo> rgList = coService.getRegistrationGroupsByFormatOffering("CO-2:LEC-ONLY", callContext); 1030 1031 assertEquals(2, rgList.size()); 1032 1033 RegistrationGroupInfo rg = rgList.get(0); 1034 1035 StatusInfo statusInfo = coService.deleteRegistrationGroup( 1036 rg.getId(), callContext); 1037 assertTrue(statusInfo.getIsSuccess()); 1038 try { 1039 coService.getRegistrationGroup(rg.getId(), callContext); 1040 fail("Expected DoesNotExistException."); 1041 } catch (DoesNotExistException e) { 1042 // Expected. Do nothing. 1043 } 1044 } 1045 1046 @Test 1047 public void testGetActivityOfferingType() throws InvalidParameterException, 1048 MissingParameterException, DoesNotExistException, 1049 PermissionDeniedException, OperationFailedException { 1050 TypeInfo validType = coService.getActivityOfferingType( 1051 LuiServiceConstants.LECTURE_ACTIVITY_OFFERING_TYPE_KEY, 1052 callContext); 1053 assertNotNull(validType); 1054 assertEquals(LuiServiceConstants.LECTURE_ACTIVITY_OFFERING_TYPE_KEY, 1055 validType.getKey()); 1056 1057 TypeInfo shouldBeNull = null; 1058 try { 1059 shouldBeNull = coService.getActivityOfferingType( 1060 "madeUpINAVLIDAoType", callContext); 1061 fail("Expected DoesNotExistException"); 1062 } catch (DoesNotExistException e) { 1063 assertNull(shouldBeNull); 1064 } 1065 } 1066 1067 @Test 1068 public void testGetActivityOfferingTypes() 1069 throws InvalidParameterException, MissingParameterException, 1070 PermissionDeniedException, OperationFailedException { 1071 List<TypeInfo> validTypes = coService 1072 .getActivityOfferingTypes(callContext); 1073 1074 assertNotNull(validTypes); 1075 assertTrue("Expecting at least one activity offering type", 1076 !validTypes.isEmpty()); 1077 1078 boolean found = false; 1079 for (TypeInfo type : validTypes) { 1080 found = type.getKey().equals( 1081 LuiServiceConstants.LECTURE_ACTIVITY_OFFERING_TYPE_KEY); 1082 if (found) { 1083 break; 1084 } 1085 } 1086 1087 assertTrue("Expecting to find at least " 1088 + LuiServiceConstants.LECTURE_ACTIVITY_OFFERING_TYPE_KEY 1089 + " type.", found); 1090 } 1091 1092 1093 @Test 1094 public void testCreateSeatPoolDefinition() throws DataValidationErrorException, InvalidParameterException, MissingParameterException, OperationFailedException, PermissionDeniedException, ReadOnlyException { 1095 1096 SeatPoolDefinitionInfo mainPool = CourseOfferingServiceDataUtils.createSeatPoolDefinition("EVERYONE", "Lab 123", AtpServiceConstants.MILESTONE_COURSE_SELECTION_PERIOD_END_TYPE_KEY, true, 85, 1); 1097 1098 SeatPoolDefinitionInfo secondaryPool = CourseOfferingServiceDataUtils.createSeatPoolDefinition("EVERYONE", "Lab 123B", AtpServiceConstants.MILESTONE_COURSE_SELECTION_PERIOD_END_TYPE_KEY, true, 15, 2); 1099 1100 mainPool = coService.createSeatPoolDefinition(mainPool, callContext); 1101 1102 secondaryPool = coService.createSeatPoolDefinition(secondaryPool, callContext); 1103 1104 boolean exceptionEncountered = false; 1105 try { 1106 coService.addSeatPoolDefinitionToActivityOffering(mainPool.getId(), "CO-1:LEC-ONLY:LEC-A", callContext); 1107 coService.addSeatPoolDefinitionToActivityOffering(secondaryPool.getId(), "CO-1:LEC-ONLY:LEC-A", callContext); 1108 } catch (AlreadyExistsException e) { 1109 exceptionEncountered = true; 1110 } catch (DoesNotExistException e) { 1111 exceptionEncountered = true; 1112 } 1113 1114 Assert.assertFalse(exceptionEncountered); 1115 1116 try { 1117 List<SeatPoolDefinitionInfo> spds = coService.getSeatPoolDefinitionsForActivityOffering("CO-1:LEC-ONLY:LEC-A", callContext); 1118 1119 Assert.assertEquals(2, spds.size()); 1120 1121 } catch (DoesNotExistException e) { 1122 // should not happen 1123 Assert.assertFalse("Activity does not exist exception", true); 1124 } 1125 1126 exceptionEncountered = false; 1127 1128 try { 1129 coService.removeSeatPoolDefinitionFromActivityOffering(mainPool.getId(), "CO-1:LEC-ONLY:LEC-A", callContext); 1130 } catch (DoesNotExistException e) { 1131 1132 exceptionEncountered = true; 1133 } 1134 1135 Assert.assertFalse(exceptionEncountered); 1136 1137 try { 1138 List<SeatPoolDefinitionInfo> spds = coService.getSeatPoolDefinitionsForActivityOffering("CO-1:LEC-ONLY:LEC-A", callContext); 1139 1140 Assert.assertEquals(1, spds.size()); 1141 1142 } catch (DoesNotExistException e) { 1143 // should not happen 1144 Assert.assertFalse("Activity does not exist exception", true); 1145 } 1146 1147 } 1148 }