/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/gradebook/trunk/app/standalone-app/src/test/org/sakaiproject/tool/gradebook/test/FinalizeGradebookTest.java $ * $Id: FinalizeGradebookTest.java 105079 2012-02-24 23:08:11Z ottenhoff@longsight.com $ *********************************************************************************** * * Copyright (c) 2008 The Sakai Foundation * * Licensed under the Educational Community License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.opensource.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **********************************************************************************/ package org.sakaiproject.tool.gradebook.test; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.sakaiproject.section.api.coursemanagement.Course; import org.sakaiproject.section.api.coursemanagement.CourseSection; import org.sakaiproject.section.api.facade.Role; import org.sakaiproject.tool.gradebook.CourseGradeRecord; import org.sakaiproject.tool.gradebook.GradeMapping; import org.sakaiproject.tool.gradebook.Gradebook; /** * */ public class FinalizeGradebookTest extends GradebookTestBase { private static final Log log = LogFactory.getLog(FinalizeGradebookTest.class); private static final String GRADEBOOK_UID = "gradebookFinalize"; private static final String INSTRUCTOR_UID = "Inst-1"; private static final String TA_UID = "TA-1"; private static final String SECTION_NAME = "Lab 01"; private static final String STUDENT_ON_TIME = "StudentOnTime"; private static final String STUDENT_TARDY = "StudentTardy"; private static final String STUDENT_VERY_TARDY = "StudentVeryTardy"; private static final String ASN_TITLE1 = "Assignment #1"; private static final String ASN_TITLE2 = "Assignment #2"; private static final String ASN_NOT_COUNTED = "Survey"; private static final Double ASN_POINTS1 = new Double(40.0); private static final Double ASN_POINTS2 = new Double(60.0); private static final Double ASN_POINTS_NOT_COUNTED = new Double(300.0); private static final List<String> STUDENT_UIDS = Arrays.asList(new String[] {STUDENT_ON_TIME, STUDENT_TARDY, STUDENT_VERY_TARDY}); private static Long gradebookId; private static Long asnId1 ; private static Long asnId2; private static Long asnIdNotCounted; protected void onSetUpInTransaction() throws Exception { super.onSetUpInTransaction(); userManager.createUser(INSTRUCTOR_UID, null, null, null); userManager.createUser(TA_UID, null, null, null); gradebookFrameworkService.addGradebook(GRADEBOOK_UID, GRADEBOOK_UID); Gradebook gradebook = gradebookManager.getGradebook(GRADEBOOK_UID); gradebookId = gradebook.getId(); Course courseSite1 = integrationSupport.createCourse(GRADEBOOK_UID, GRADEBOOK_UID, false, false, false); addUsersEnrollments(gradebook, STUDENT_UIDS); integrationSupport.addSiteMembership(INSTRUCTOR_UID, GRADEBOOK_UID, Role.INSTRUCTOR); integrationSupport.addSiteMembership(TA_UID, GRADEBOOK_UID, Role.TA); List<String> sectionCategories1 = sectionAwareness.getSectionCategories(GRADEBOOK_UID); CourseSection section1 = integrationSupport.createSection(courseSite1.getUuid(), SECTION_NAME, (String)sectionCategories1.get(0), new Integer(40), null, null, null, true, false, true, false, false, false, false); integrationSupport.addSectionMembership(STUDENT_ON_TIME, section1.getUuid(), Role.STUDENT); integrationSupport.addSectionMembership(TA_UID, section1.getUuid(), Role.TA); // Add internal assignments asnId1 = gradebookManager.createAssignment(gradebook.getId(), ASN_TITLE1, ASN_POINTS1, new Date(), Boolean.FALSE, Boolean.FALSE, Boolean.FALSE); asnId2 = gradebookManager.createAssignment(gradebook.getId(), ASN_TITLE2, ASN_POINTS2, new Date(), Boolean.FALSE, Boolean.TRUE, Boolean.FALSE); asnIdNotCounted = gradebookManager.createAssignment(gradebook.getId(), ASN_NOT_COUNTED, ASN_POINTS_NOT_COUNTED, new Date(), Boolean.TRUE, Boolean.TRUE, Boolean.FALSE); } public void testFinalizeGradebook() throws Exception { setAuthnId(INSTRUCTOR_UID); // One student gets scores of 0, 60, and 300, resulting in a D+. gradebookService.saveGradeAndCommentForStudent(GRADEBOOK_UID, asnId1, STUDENT_ON_TIME, "0", ""); gradebookService.saveGradeAndCommentForStudent(GRADEBOOK_UID, asnId2, STUDENT_ON_TIME, "60", ""); gradebookService.saveGradeAndCommentForStudent(GRADEBOOK_UID, asnIdNotCounted, STUDENT_ON_TIME, "300", ""); // Another gets no score on the 40-point assignment, and 60 and 300 on the other two, resulting in an A+. gradebookService.saveGradeAndCommentForStudent(GRADEBOOK_UID, asnId2, STUDENT_TARDY, "60", ""); gradebookService.saveGradeAndCommentForStudent(GRADEBOOK_UID, asnIdNotCounted, STUDENT_TARDY, "300", ""); // A third gets explicit null scores (as they'd have if an erroneous score was reverted). gradebookService.saveGradeAndCommentForStudent(GRADEBOOK_UID, asnId1, STUDENT_VERY_TARDY, "40", ""); gradebookService.saveGradeAndCommentForStudent(GRADEBOOK_UID, asnId2, STUDENT_VERY_TARDY, "60", ""); gradebookService.saveGradeAndCommentForStudent(GRADEBOOK_UID, asnIdNotCounted, STUDENT_VERY_TARDY, "300", ""); gradebookService.saveGradeAndCommentForStudent(GRADEBOOK_UID, asnId1, STUDENT_VERY_TARDY, null, ""); gradebookService.saveGradeAndCommentForStudent(GRADEBOOK_UID, asnId2, STUDENT_VERY_TARDY, null, ""); gradebookService.saveGradeAndCommentForStudent(GRADEBOOK_UID, asnIdNotCounted, STUDENT_VERY_TARDY, null, ""); Map<String, String> courseGradeMap = getCourseGradeMap(gradebookId, STUDENT_UIDS); assertEquals("D-", courseGradeMap.get(STUDENT_ON_TIME)); assertEquals("A+", courseGradeMap.get(STUDENT_TARDY)); assertNull(courseGradeMap.get(STUDENT_VERY_TARDY)); // Make sure TAs can't finalize grades. setAuthnId(TA_UID); try { if (log.isInfoEnabled()) log.info("Ignore the upcoming authorization error..."); gradebookService.finalizeGrades(GRADEBOOK_UID); fail(); } catch (SecurityException e) { } // Finalize grades and make sure the tardy students have paid for their sins. setAuthnId(INSTRUCTOR_UID); gradebookService.finalizeGrades(GRADEBOOK_UID); courseGradeMap = getCourseGradeMap(gradebookId, STUDENT_UIDS); assertEquals("D-", courseGradeMap.get(STUDENT_ON_TIME)); assertEquals("D-", courseGradeMap.get(STUDENT_TARDY)); assertEquals("F", courseGradeMap.get(STUDENT_VERY_TARDY)); } /** * The GradebookService "getCalculatedCourseGrade" currently does not show the same letter grades as * the application's Course Grade page. For now, we need to mimic the latter's logic. * @param gradebookUid * @return map from student UID to letter grade (or null) */ private Map<String, String> getCourseGradeMap(Long gradebookId, List<String> studentUids) { Map<String, String> courseGradeMap = new HashMap<String, String>(); List<CourseGradeRecord> courseGradeRecords = gradebookManager.getPointsEarnedCourseGradeRecords(gradebookManager.getCourseGrade(gradebookId), studentUids); Gradebook gradebook = gradebookManager.getGradebookWithGradeMappings(gradebookId); GradeMapping gradeMapping = gradebook.getSelectedGradeMapping(); for (CourseGradeRecord courseGradeRecord : courseGradeRecords) { courseGradeMap.put(courseGradeRecord.getStudentId(), gradeMapping.getGrade(courseGradeRecord.getAutoCalculatedGrade())); } return courseGradeMap; } }