/**********************************************************************************
*
* $Id: GradebookServiceNewTest.java 105079 2012-02-24 23:08:11Z ottenhoff@longsight.com $
*
***********************************************************************************
*
* Copyright (c) 2005, 2006, 2008, 2009 The Sakai Foundation, The MIT Corporation
*
* 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.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import junit.framework.Assert;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.component.gradebook.GradebookDefinition;
import org.sakaiproject.component.gradebook.VersionedExternalizable;
import org.sakaiproject.section.api.coursemanagement.Course;
import org.sakaiproject.section.api.coursemanagement.CourseSection;
import org.sakaiproject.section.api.facade.Role;
import org.sakaiproject.service.gradebook.shared.AssessmentNotFoundException;
import org.sakaiproject.service.gradebook.shared.Assignment;
import org.sakaiproject.service.gradebook.shared.AssignmentHasIllegalPointsException;
import org.sakaiproject.service.gradebook.shared.CategoryDefinition;
import org.sakaiproject.service.gradebook.shared.CommentDefinition;
import org.sakaiproject.service.gradebook.shared.ConflictingAssignmentNameException;
import org.sakaiproject.service.gradebook.shared.GradeDefinition;
import org.sakaiproject.service.gradebook.shared.GradebookNotFoundException;
import org.sakaiproject.service.gradebook.shared.GradingScaleDefinition;
import org.sakaiproject.service.gradebook.shared.GradebookService;
import org.sakaiproject.service.gradebook.shared.InvalidGradeException;
import org.sakaiproject.tool.gradebook.AssignmentGradeRecord;
import org.sakaiproject.tool.gradebook.Category;
import org.sakaiproject.tool.gradebook.Comment;
import org.sakaiproject.tool.gradebook.GradeMapping;
import org.sakaiproject.tool.gradebook.Gradebook;
import org.sakaiproject.tool.gradebook.GradingEvents;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.InputSource;
import com.thoughtworks.xstream.converters.ConversionException;
/**
* Test the service methods which interact with internally maintained data.
* These methods have more complex authorization requirements.
*/
public class GradebookServiceNewTest extends GradebookTestBase {
private static final Log log = LogFactory.getLog(GradebookServiceNewTest.class);
private static final String GRADEBOOK_UID_NO_CAT = "gradebookNoCategories";
private static final String ASN_TITLE1 = "Assignment #1";
private static final String ASN_TITLE2 = "Assignment #2";
private static final String INSTRUCTOR_UID = "Inst-1";
private static final String TA_UID = "TA-1";
private static final String TA_NO_SECT_UID = "TA-2";
private static final String SECTION_NAME = "Lab 01";
private static final String STUDENT_IN_SECTION_UID1 = "StudentInLab1";
private static final String STUDENT_NOT_IN_SECTION_UID1 = "StudentNotInLab1";
private static final Double ASN_POINTS1 = new Double(40.0);
private static final Double ASN_POINTS2 = new Double(60.0);
private Long asn1IdNoCat;
private Long asn2IdNoCat;
private static final String GRADEBOOK_UID_WITH_CAT = "gradebookWithCategories";
private static final String STUDENT_IN_SECTION_UID2 = "StudentInLab2";
private static final String STUDENT_NOT_IN_SECTION_UID2 = "StudentNotInLab2";
private Long asn1IdWithCat;
private Long asn2IdWithCat;
private String section2Uid;
private Long cat1Id;
private Long cat2Id;
private static final String CAT1_NAME = "Category 1";
private static final String CAT2_NAME = "Category 2";
/**
* @see org.springframework.test.AbstractTransactionalSpringContextTests#onSetUpInTransaction()
*/
protected void onSetUpInTransaction() throws Exception {
super.onSetUpInTransaction();
userManager.createUser(INSTRUCTOR_UID, null, null, null);
userManager.createUser(TA_UID, null, null, null);
userManager.createUser(TA_NO_SECT_UID, null, null, null);
// set up gb with no categories /////////////////////
gradebookFrameworkService.addGradebook(GRADEBOOK_UID_NO_CAT, GRADEBOOK_UID_NO_CAT);
Gradebook gradebookNoCat = gradebookManager.getGradebook(GRADEBOOK_UID_NO_CAT);
// Set up users, enrollments, teaching assignments, and sections.
Course courseSite1 = integrationSupport.createCourse(GRADEBOOK_UID_NO_CAT, GRADEBOOK_UID_NO_CAT, false, false, false);
addUsersEnrollments(gradebookNoCat, Arrays.asList(new String[] {STUDENT_IN_SECTION_UID1, STUDENT_NOT_IN_SECTION_UID1}));
integrationSupport.addSiteMembership(INSTRUCTOR_UID, GRADEBOOK_UID_NO_CAT, Role.INSTRUCTOR);
integrationSupport.addSiteMembership(TA_UID, GRADEBOOK_UID_NO_CAT, Role.TA);
integrationSupport.addSiteMembership(TA_NO_SECT_UID, GRADEBOOK_UID_NO_CAT, Role.TA);
List sectionCategories1 = sectionAwareness.getSectionCategories(GRADEBOOK_UID_NO_CAT);
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_IN_SECTION_UID1, section1.getUuid(), Role.STUDENT);
integrationSupport.addSectionMembership(TA_UID, section1.getUuid(), Role.TA);
// Add internal assignments
asn1IdNoCat = gradebookManager.createAssignment(gradebookNoCat.getId(), ASN_TITLE1, ASN_POINTS1, new Date(), Boolean.FALSE,Boolean.FALSE,Boolean.FALSE);
asn2IdNoCat = gradebookManager.createAssignment(gradebookNoCat.getId(), ASN_TITLE2, ASN_POINTS2, new Date(), Boolean.FALSE,Boolean.FALSE,Boolean.FALSE);
// set up gb with categories ///////////////////
gradebookFrameworkService.addGradebook(GRADEBOOK_UID_WITH_CAT, GRADEBOOK_UID_WITH_CAT);
Gradebook gradebookWithCat = gradebookManager.getGradebook(GRADEBOOK_UID_WITH_CAT);
gradebookWithCat.setCategory_type(GradebookService.CATEGORY_TYPE_ONLY_CATEGORY);
gradebookManager.updateGradebook(gradebookWithCat);
// Set up users, enrollments, teaching assignments, and sections.
Course courseSite2 = integrationSupport.createCourse(GRADEBOOK_UID_WITH_CAT, GRADEBOOK_UID_WITH_CAT, false, false, false);
addUsersEnrollments(gradebookWithCat, Arrays.asList(new String[] {STUDENT_IN_SECTION_UID2, STUDENT_NOT_IN_SECTION_UID2}));
integrationSupport.addSiteMembership(INSTRUCTOR_UID, GRADEBOOK_UID_WITH_CAT, Role.INSTRUCTOR);
integrationSupport.addSiteMembership(TA_UID, GRADEBOOK_UID_WITH_CAT, Role.TA);
integrationSupport.addSiteMembership(TA_NO_SECT_UID, GRADEBOOK_UID_WITH_CAT, Role.TA);
List sectionCategories2 = sectionAwareness.getSectionCategories(GRADEBOOK_UID_WITH_CAT);
CourseSection section2 = integrationSupport.createSection(courseSite2.getUuid(), SECTION_NAME,
(String)sectionCategories2.get(0),
new Integer(40), null, null, null, true, false, true, false, false, false, false);
section2Uid = section2.getUuid();
integrationSupport.addSectionMembership(STUDENT_IN_SECTION_UID2, section2.getUuid(), Role.STUDENT);
integrationSupport.addSectionMembership(TA_UID, section2.getUuid(), Role.TA);
// Add an internal assignment.
cat1Id = gradebookManager.createCategory(gradebookWithCat.getId(), CAT1_NAME, new Double(0), 0, 0, 0, false);
asn1IdWithCat = gradebookManager.createAssignmentForCategory(gradebookWithCat.getId(), cat1Id, ASN_TITLE1, ASN_POINTS1, new Date(), Boolean.FALSE,Boolean.FALSE,Boolean.FALSE);
cat2Id = gradebookManager.createCategory(gradebookWithCat.getId(), CAT2_NAME, new Double(0), 0, 0, 0, false);
asn2IdWithCat = gradebookManager.createAssignmentForCategory(gradebookWithCat.getId(), cat2Id, ASN_TITLE2, ASN_POINTS2, new Date(), Boolean.FALSE,Boolean.FALSE,Boolean.FALSE);
}
public void testGetCategory() throws Exception{
String className = this.getClass().getName();
gradebookFrameworkService.addGradebook(className, className);
Gradebook persistentGradebook = gradebookManager.getGradebook(this.getClass().getName());
Long cate1Long = gradebookManager.createCategory(persistentGradebook.getId(), "cate 1", new Double(0.40), 0, 0, 0, false);
Long cate2Long = gradebookManager.createCategory(persistentGradebook.getId(), "cate 2", new Double(0.60), 0, 0, 0, false);
List list = (List) gradebookManager.getCategories(persistentGradebook.getId());
for(int i=0; i<list.size(); i++)
{
Category cat = (Category) list.get(i);
if(i == 0)
{
Long assgn1Long = gradebookManager.createAssignmentForCategory(persistentGradebook.getId(), cat.getId(),
cat.getName() + "_assignment_1", new Double(10.0), new Date(), new Boolean(false), new Boolean(true), new Boolean(false));
}
if(i == 1)
{
Long assgn3Long = gradebookManager.createAssignmentForCategory(persistentGradebook.getId(), cat.getId(),
cat.getName() + "_assignment_1", new Double(10.0), new Date(), new Boolean(false), new Boolean(true), new Boolean(false));
}
Long assign2 = gradebookManager.createAssignmentForCategory(persistentGradebook.getId(), cat.getId(),
cat.getName() + "_assignment_2", new Double(10.0), new Date(), new Boolean(false), new Boolean(true), new Boolean(false));
}
Category cat1 = gradebookManager.getCategory(cate1Long);
Category cat2 = gradebookManager.getCategory(cate2Long);
// System.out.println(cat1 + "---" + cat1.getName());
// System.out.println(cat2 + "---" + cat2.getName());
}
public void testStudentRebuff() throws Exception {
setAuthnId(INSTRUCTOR_UID);
// Score the unreleased assignment.
gradebookService.setAssignmentScoreString(GRADEBOOK_UID_NO_CAT, ASN_TITLE1, STUDENT_IN_SECTION_UID1, new String("39"), "Service Test");
// Try to get a list of assignments as the student.
setAuthnId(STUDENT_IN_SECTION_UID1);
try {
if (log.isInfoEnabled()) log.info("Ignore the upcoming authorization errors...");
gradebookService.getAssignments(GRADEBOOK_UID_NO_CAT);
fail();
} catch (SecurityException e) {
}
// And then try to get the score.
Double score;
try {
score = new Double(gradebookService.getAssignmentScoreString(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_IN_SECTION_UID1));
fail();
} catch (SecurityException e) {
}
// try to get grades for students for item
List grades;
try {
List studentIds = new ArrayList();
studentIds.add(STUDENT_IN_SECTION_UID1);
studentIds.add(STUDENT_NOT_IN_SECTION_UID1);
grades = gradebookService.getGradesForStudentsForItem(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, studentIds);
} catch (SecurityException e) {
}
// try to get gradeDef for student for item - should return null if not released
GradeDefinition gradeDef;
gradeDef = gradebookService.getGradeDefinitionForStudentForItem(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_IN_SECTION_UID1);
Assert.assertTrue(gradeDef.getGrade() == null);
// Now release the assignment.
setAuthnId(INSTRUCTOR_UID);
org.sakaiproject.tool.gradebook.Assignment assignment = gradebookManager.getAssignment(asn1IdNoCat);
assignment.setReleased(true);
gradebookManager.updateAssignment(assignment);
gradeDef = gradebookService.getGradeDefinitionForStudentForItem(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_IN_SECTION_UID1);
// Now see if the student gets lucky.
setAuthnId(STUDENT_IN_SECTION_UID1);
score = new Double(gradebookService.getAssignmentScoreString(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_IN_SECTION_UID1));
Assert.assertTrue(score.doubleValue() == 39.0);
gradeDef = gradebookService.getGradeDefinitionForStudentForItem(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_IN_SECTION_UID1);
Assert.assertTrue(gradeDef.getGrade().equals((new Double(39).toString())));
setAuthnId(STUDENT_IN_SECTION_UID1);
Map viewableStudents = gradebookService.getViewableStudentsForItemForCurrentUser(GRADEBOOK_UID_NO_CAT, asn1IdNoCat);
assertEquals(0, viewableStudents.size());
}
public void testGetGradeDefinitionForStudentForItem() throws Exception {
setAuthnId(INSTRUCTOR_UID);
// start with a points-based gb
GradeDefinition gradeDef =
gradebookService.getGradeDefinitionForStudentForItem(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_IN_SECTION_UID1);
Assert.assertTrue(gradeDef != null);
Assert.assertEquals(GradebookService.GRADE_TYPE_POINTS, gradeDef.getGradeEntryType());
Assert.assertEquals(STUDENT_IN_SECTION_UID1, gradeDef.getStudentUid());
Assert.assertTrue(gradeDef.isGradeReleased() == false);
Assert.assertNull(gradeDef.getGrade());
Assert.assertNull(gradeDef.getGraderUid());
Assert.assertNull(gradeDef.getDateRecorded());
String graderComment = "grader comment";
gradebookService.setAssignmentScoreString(GRADEBOOK_UID_NO_CAT, ASN_TITLE1, STUDENT_IN_SECTION_UID1, new String("35"), "Service Test");
gradebookService.setAssignmentScoreComment(GRADEBOOK_UID_NO_CAT, ASN_TITLE1, STUDENT_IN_SECTION_UID1, graderComment);
gradeDef = gradebookService.getGradeDefinitionForStudentForItem(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_IN_SECTION_UID1);
Assert.assertTrue(gradeDef != null);
Assert.assertEquals(GradebookService.GRADE_TYPE_POINTS, gradeDef.getGradeEntryType());
Assert.assertEquals(STUDENT_IN_SECTION_UID1, gradeDef.getStudentUid());
Assert.assertTrue(gradeDef.isGradeReleased() == false);
Assert.assertEquals("35.0", gradeDef.getGrade());
Assert.assertEquals(INSTRUCTOR_UID, gradeDef.getGraderUid());
Assert.assertEquals(graderComment, gradeDef.getGradeComment());
Assert.assertNotNull(gradeDef.getDateRecorded());
setAuthnId(STUDENT_IN_SECTION_UID1);
gradeDef = gradebookService.getGradeDefinitionForStudentForItem(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_IN_SECTION_UID1);
// the grade is not released, so grade info should be null
Assert.assertEquals(GradebookService.GRADE_TYPE_POINTS, gradeDef.getGradeEntryType());
Assert.assertEquals(STUDENT_IN_SECTION_UID1, gradeDef.getStudentUid());
Assert.assertTrue(gradeDef.isGradeReleased() == false);
Assert.assertNull(gradeDef.getGrade()); // should be null if grade not released
Assert.assertNull(gradeDef.getGradeComment()); // should be null if grade not released
Assert.assertNull(gradeDef.getGraderUid()); // should be null if grade not released
Assert.assertNull(gradeDef.getDateRecorded()); // should be null if grade not released
// switch back to instructor and double check other grade entry types
setAuthnId(INSTRUCTOR_UID);
// %-based gradebook
Gradebook gradebookNoCat = gradebookManager.getGradebook(GRADEBOOK_UID_NO_CAT);
gradebookNoCat.setGrade_type(GradebookService.GRADE_TYPE_PERCENTAGE);
gradebookManager.updateGradebook(gradebookNoCat);
gradeDef = gradebookService.getGradeDefinitionForStudentForItem(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_IN_SECTION_UID1);
Assert.assertEquals("87.5", gradeDef.getGrade());
Assert.assertEquals(graderComment, gradeDef.getGradeComment());
Assert.assertEquals(GradebookService.GRADE_TYPE_PERCENTAGE, gradeDef.getGradeEntryType());
// letter-based gradebook
gradebookNoCat.setGrade_type(GradebookService.GRADE_TYPE_LETTER);
gradebookManager.updateGradebook(gradebookNoCat);
gradeDef = gradebookService.getGradeDefinitionForStudentForItem(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_IN_SECTION_UID1);
Assert.assertEquals("B+", gradeDef.getGrade());
Assert.assertEquals(graderComment, gradeDef.getGradeComment());
Assert.assertEquals(GradebookService.GRADE_TYPE_LETTER, gradeDef.getGradeEntryType());
// the TA with standard grader perms should trigger exception for student
// not in section
setAuthnId(TA_UID);
try {
gradeDef = gradebookService.getGradeDefinitionForStudentForItem(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_NOT_IN_SECTION_UID1);
Assert.fail();
} catch (SecurityException se) {
}
// let's release the grade and make sure the student can access it
setAuthnId(INSTRUCTOR_UID);
org.sakaiproject.tool.gradebook.Assignment assignment = gradebookManager.getAssignment(asn1IdNoCat);
assignment.setReleased(true);
gradebookManager.updateAssignment(assignment);
setAuthnId(STUDENT_IN_SECTION_UID1);
gradeDef = gradebookService.getGradeDefinitionForStudentForItem(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_IN_SECTION_UID1);
Assert.assertEquals(GradebookService.GRADE_TYPE_LETTER, gradeDef.getGradeEntryType());
Assert.assertEquals(STUDENT_IN_SECTION_UID1, gradeDef.getStudentUid());
Assert.assertTrue(gradeDef.isGradeReleased());
Assert.assertEquals("B+", gradeDef.getGrade());
Assert.assertEquals(graderComment, gradeDef.getGradeComment());
Assert.assertEquals(INSTRUCTOR_UID, gradeDef.getGraderUid());
Assert.assertNotNull(gradeDef.getDateRecorded());
// try to retrieve another student's score
try {
gradeDef = gradebookService.getGradeDefinitionForStudentForItem(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_IN_SECTION_UID2);
fail("Did not catch a student trying to retrieve another student's grade info!");
} catch (SecurityException se) {}
}
public void testAssignmentScoreComment() throws Exception {
setAuthnId(INSTRUCTOR_UID);
// Comment on a student score as if the Gradebook application was doing it.
org.sakaiproject.tool.gradebook.Assignment assignment = gradebookManager.getAssignment(asn1IdNoCat);
List<AssignmentGradeRecord> gradeRecords = new ArrayList<AssignmentGradeRecord>();
List<Comment> comments = Arrays.asList(new Comment[] {new Comment(STUDENT_IN_SECTION_UID1, "First comment", assignment)});
gradebookManager.updateAssignmentGradesAndComments(assignment, gradeRecords, comments);
// Make sure we don't get a comment for the student who doesn't have one.
CommentDefinition commentDefinition = gradebookService.getAssignmentScoreComment(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_NOT_IN_SECTION_UID1);
Assert.assertTrue(commentDefinition == null);
CommentDefinition commentDefById = gradebookService.getAssignmentScoreComment(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_NOT_IN_SECTION_UID1);
Assert.assertTrue(commentDefById == null);
// Make sure we can retrieve the comment.
commentDefinition = gradebookService.getAssignmentScoreComment(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_IN_SECTION_UID1);
Assert.assertTrue(commentDefinition.getAssignmentName().equals(ASN_TITLE1));
Assert.assertTrue(commentDefinition.getCommentText().equals("First comment"));
Assert.assertTrue(commentDefinition.getGraderUid().equals(INSTRUCTOR_UID));
Assert.assertTrue(commentDefinition.getStudentUid().equals(STUDENT_IN_SECTION_UID1));
// Now change the comment.
setAuthnId(TA_UID);
gradebookService.setAssignmentScoreComment(GRADEBOOK_UID_NO_CAT, ASN_TITLE1, STUDENT_IN_SECTION_UID1, "Second comment");
commentDefinition = gradebookService.getAssignmentScoreComment(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_IN_SECTION_UID1);
Assert.assertTrue(commentDefinition.getCommentText().equals("Second comment"));
Assert.assertTrue(commentDefinition.getGraderUid().equals(TA_UID));
}
public void testPermissionChecks() throws Exception {
// test the instructor
setAuthnId(INSTRUCTOR_UID);
Assert.assertTrue(gradebookService.currentUserHasGradeAllPerm(GRADEBOOK_UID_NO_CAT));
Assert.assertTrue(gradebookService.currentUserHasEditPerm(GRADEBOOK_UID_NO_CAT));
Assert.assertTrue(gradebookService.currentUserHasGradingPerm(GRADEBOOK_UID_NO_CAT));
// test the TA
setAuthnId(TA_UID);
Assert.assertTrue(gradebookService.currentUserHasGradingPerm(GRADEBOOK_UID_NO_CAT));
Assert.assertFalse(gradebookService.currentUserHasGradeAllPerm(GRADEBOOK_UID_NO_CAT));
Assert.assertFalse(gradebookService.currentUserHasEditPerm(GRADEBOOK_UID_NO_CAT));
// test the student
setAuthnId(STUDENT_IN_SECTION_UID1);
Assert.assertTrue(gradebookService.currentUserHasViewOwnGradesPerm(GRADEBOOK_UID_NO_CAT));
Assert.assertFalse(gradebookService.currentUserHasEditPerm(GRADEBOOK_UID_NO_CAT));
Assert.assertFalse(gradebookService.currentUserHasGradingPerm(GRADEBOOK_UID_NO_CAT));
Assert.assertFalse(gradebookService.currentUserHasGradeAllPerm(GRADEBOOK_UID_NO_CAT));
}
public void testGradableObjectDefined() throws Exception {
Assert.assertFalse(gradebookService.isGradableObjectDefined(new Long(15)));
Assert.assertTrue(gradebookService.isGradableObjectDefined(asn1IdNoCat));
try {
gradebookService.isGradableObjectDefined(null);
log.error("isGradableObjectDefined did not catch null gbObjectId");
Assert.fail();
} catch (IllegalArgumentException e) {
}
}
public void testGetViewableAssignmentsForCurrentUser() throws Exception {
// first test gb without grader permissions
// test instructor
setAuthnId(INSTRUCTOR_UID);
List viewableAssignments = gradebookService.getViewableAssignmentsForCurrentUser(GRADEBOOK_UID_NO_CAT);
Assert.assertTrue(viewableAssignments.size() == 2);
// ta
setAuthnId(TA_UID);
log.info("1-----------");
viewableAssignments = gradebookService.getViewableAssignmentsForCurrentUser(GRADEBOOK_UID_NO_CAT);
log.info("2----------: " + viewableAssignments.size());
Assert.assertTrue(viewableAssignments.size() == 2);
// student
setAuthnId(STUDENT_IN_SECTION_UID1);
// only returns released items
viewableAssignments = gradebookService.getViewableAssignmentsForCurrentUser(GRADEBOOK_UID_NO_CAT);
Assert.assertTrue(viewableAssignments.size() == 0);
// now test gb with categories and grader permissions
Gradebook gb = gradebookManager.getGradebook(GRADEBOOK_UID_WITH_CAT);
// ta may only grade one category, so only 1 assignment
gradebookManager.addPermission(gb.getId(), TA_UID, GradebookService.gradePermission, cat1Id, section2Uid);
setAuthnId(INSTRUCTOR_UID);
viewableAssignments = gradebookService.getViewableAssignmentsForCurrentUser(GRADEBOOK_UID_WITH_CAT);
Assert.assertTrue(viewableAssignments.size() == 2);
setAuthnId(TA_UID);
viewableAssignments = gradebookService.getViewableAssignmentsForCurrentUser(GRADEBOOK_UID_WITH_CAT);
Assert.assertTrue(viewableAssignments.size() == 1);
setAuthnId(STUDENT_IN_SECTION_UID2);
// only returns released assign
viewableAssignments = gradebookService.getViewableAssignmentsForCurrentUser(GRADEBOOK_UID_WITH_CAT);
Assert.assertTrue(viewableAssignments.size() == 0);
}
public void testGetViewableSectionUuidToNameMap() throws Exception {
setAuthnId(INSTRUCTOR_UID);
Map sectionUuidNameMap = gradebookService.getViewableSectionUuidToNameMap(GRADEBOOK_UID_NO_CAT);
Assert.assertTrue(sectionUuidNameMap.size() == 1);
setAuthnId(TA_UID);
sectionUuidNameMap = gradebookService.getViewableSectionUuidToNameMap(GRADEBOOK_UID_NO_CAT);
Assert.assertTrue(sectionUuidNameMap.size() == 1);
setAuthnId(TA_NO_SECT_UID);
sectionUuidNameMap = gradebookService.getViewableSectionUuidToNameMap(GRADEBOOK_UID_NO_CAT);
Assert.assertTrue(sectionUuidNameMap.size() == 0);
setAuthnId(STUDENT_IN_SECTION_UID1);
sectionUuidNameMap = gradebookService.getViewableSectionUuidToNameMap(GRADEBOOK_UID_NO_CAT);
Assert.assertTrue(sectionUuidNameMap.size() == 0);
// now double check with grader permissions
// now test gb with categories and grader permissions
Gradebook gb = gradebookManager.getGradebook(GRADEBOOK_UID_WITH_CAT);
// this ta is not a member of a section, but grader perms will allow viewing section
gradebookManager.addPermission(gb.getId(), TA_NO_SECT_UID, GradebookService.gradePermission, null, section2Uid);
setAuthnId(TA_NO_SECT_UID);
sectionUuidNameMap = gradebookService.getViewableSectionUuidToNameMap(GRADEBOOK_UID_WITH_CAT);
Assert.assertTrue(sectionUuidNameMap.size() == 1);
}
public void testGetViewableStudentsForItemForCurrentUser() throws Exception {
// testing w/o grader permissions
setAuthnId(INSTRUCTOR_UID);
Map viewableStudentsMap = gradebookService.getViewableStudentsForItemForCurrentUser(GRADEBOOK_UID_NO_CAT, asn1IdNoCat);
Assert.assertEquals(2, viewableStudentsMap.size());
for (Iterator stIter = viewableStudentsMap.keySet().iterator(); stIter.hasNext();) {
String studentId = (String) stIter.next();
Assert.assertEquals(GradebookService.gradePermission, (String)viewableStudentsMap.get(studentId));
}
setAuthnId(TA_NO_SECT_UID);
viewableStudentsMap = gradebookService.getViewableStudentsForItemForCurrentUser(GRADEBOOK_UID_NO_CAT, asn1IdNoCat);
Assert.assertTrue(viewableStudentsMap.size() == 0);
setAuthnId(TA_UID);
viewableStudentsMap = gradebookService.getViewableStudentsForItemForCurrentUser(GRADEBOOK_UID_NO_CAT, asn1IdNoCat);
Assert.assertTrue(viewableStudentsMap.size() == 1);
Assert.assertEquals(GradebookService.gradePermission, (String)viewableStudentsMap.get(STUDENT_IN_SECTION_UID1));
// now test w/ grader perms
Gradebook gb = gradebookManager.getGradebook(GRADEBOOK_UID_WITH_CAT);
// this ta is not a member of a section, but grader perms will allow viewing section
gradebookManager.addPermission(gb.getId(), TA_NO_SECT_UID, GradebookService.viewPermission, null, section2Uid);
setAuthnId(TA_NO_SECT_UID);
viewableStudentsMap = gradebookService.getViewableStudentsForItemForCurrentUser(GRADEBOOK_UID_WITH_CAT, asn1IdWithCat);
Assert.assertTrue(viewableStudentsMap.size() == 1);
Assert.assertEquals(GradebookService.viewPermission, (String)viewableStudentsMap.get(STUDENT_IN_SECTION_UID2));
// make sure the student gets no students
setAuthnId(STUDENT_IN_SECTION_UID1);
viewableStudentsMap = gradebookService.getViewableStudentsForItemForCurrentUser(GRADEBOOK_UID_WITH_CAT, asn1IdWithCat);
Assert.assertEquals(0, viewableStudentsMap.size());
}
public void testGetViewableStudentsForItemForUser() throws Exception {
// testing w/o grader permissions
Map viewableStudentsMap = gradebookService.getViewableStudentsForItemForUser(INSTRUCTOR_UID, GRADEBOOK_UID_NO_CAT, asn1IdNoCat);
Assert.assertEquals(2, viewableStudentsMap.size());
for (Iterator stIter = viewableStudentsMap.keySet().iterator(); stIter.hasNext();) {
String studentId = (String) stIter.next();
Assert.assertEquals(GradebookService.gradePermission, (String)viewableStudentsMap.get(studentId));
}
viewableStudentsMap = gradebookService.getViewableStudentsForItemForUser(TA_NO_SECT_UID, GRADEBOOK_UID_NO_CAT, asn1IdNoCat);
Assert.assertEquals(0, viewableStudentsMap.size());
viewableStudentsMap = gradebookService.getViewableStudentsForItemForUser(TA_UID, GRADEBOOK_UID_NO_CAT, asn1IdNoCat);
Assert.assertEquals(1, viewableStudentsMap.size());
Assert.assertEquals(GradebookService.gradePermission, (String)viewableStudentsMap.get(STUDENT_IN_SECTION_UID1));
// now test w/ grader perms
Gradebook gb = gradebookManager.getGradebook(GRADEBOOK_UID_WITH_CAT);
// this ta is not a member of a section, but grader perms will allow viewing section
gradebookManager.addPermission(gb.getId(), TA_NO_SECT_UID, GradebookService.viewPermission, null, section2Uid);
viewableStudentsMap = gradebookService.getViewableStudentsForItemForUser(TA_NO_SECT_UID, GRADEBOOK_UID_WITH_CAT, asn1IdWithCat);
Assert.assertEquals(1, viewableStudentsMap.size());
Assert.assertEquals(GradebookService.viewPermission, (String)viewableStudentsMap.get(STUDENT_IN_SECTION_UID2));
// make sure student has no students returned
viewableStudentsMap = gradebookService.getViewableStudentsForItemForUser(STUDENT_IN_SECTION_UID1, GRADEBOOK_UID_WITH_CAT, asn1IdWithCat);
Assert.assertEquals(0, viewableStudentsMap.size());
}
public void testGetGradesForStudentsForItem() throws Exception {
setAuthnId(INSTRUCTOR_UID);
Map studentIdFunctionMap =
gradebookService.getViewableStudentsForItemForCurrentUser(GRADEBOOK_UID_NO_CAT, asn1IdNoCat);
List studentIds = new ArrayList(studentIdFunctionMap.keySet());
List gradeDefs = gradebookService.getGradesForStudentsForItem(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, studentIds);
Assert.assertNotNull(gradeDefs);
Assert.assertTrue(gradeDefs.size() == 0);
// add a score to the gb
gradebookService.setAssignmentScoreString(GRADEBOOK_UID_NO_CAT, ASN_TITLE1, STUDENT_IN_SECTION_UID1, new String("35"), "Service Test");
gradeDefs = gradebookService.getGradesForStudentsForItem(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, studentIds);
Assert.assertEquals(1, gradeDefs.size());
GradeDefinition gradeForS1 = (GradeDefinition)gradeDefs.get(0);
Assert.assertTrue(gradeForS1 != null);
Assert.assertEquals(GradebookService.GRADE_TYPE_POINTS, gradeForS1.getGradeEntryType());
Assert.assertEquals(STUDENT_IN_SECTION_UID1, gradeForS1.getStudentUid());
Assert.assertTrue(gradeForS1.isGradeReleased() == false);
Assert.assertEquals("35.0", gradeForS1.getGrade());
Assert.assertEquals(INSTRUCTOR_UID, gradeForS1.getGraderUid());
Assert.assertNotNull(gradeForS1.getDateRecorded());
// add another score to gb
gradebookService.setAssignmentScoreString(GRADEBOOK_UID_NO_CAT, ASN_TITLE1, STUDENT_NOT_IN_SECTION_UID1, new String("40"), "Service Test");
gradeDefs = gradebookService.getGradesForStudentsForItem(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, studentIds);
Assert.assertTrue(gradeDefs.size() == 2);
setAuthnId(TA_UID);
//should throw SecurityException b/c trying to get one student that user
// is not authorized to view
try {
gradeDefs = gradebookService.getGradesForStudentsForItem(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, studentIds);
Assert.fail();
} catch (SecurityException e) {
}
Gradebook gradebookNoCat = gradebookManager.getGradebook(GRADEBOOK_UID_NO_CAT);
gradebookNoCat.setGrade_type(GradebookService.GRADE_TYPE_PERCENTAGE);
// try with the auth students
List studentInSection = new ArrayList();
studentInSection.add(STUDENT_IN_SECTION_UID1);
gradeDefs = gradebookService.getGradesForStudentsForItem(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, studentInSection);
Assert.assertTrue(gradeDefs.size() == 1);
gradeForS1 = (GradeDefinition)gradeDefs.get(0);
Assert.assertTrue(gradeForS1 != null);
Assert.assertEquals(GradebookService.GRADE_TYPE_PERCENTAGE, gradeForS1.getGradeEntryType());
Assert.assertEquals(STUDENT_IN_SECTION_UID1, gradeForS1.getStudentUid());
Assert.assertTrue(gradeForS1.isGradeReleased() == false);
Assert.assertEquals("87.5", gradeForS1.getGrade());
Assert.assertEquals(INSTRUCTOR_UID, gradeForS1.getGraderUid());
Assert.assertNotNull(gradeForS1.getDateRecorded());
gradebookNoCat = gradebookManager.getGradebook(GRADEBOOK_UID_NO_CAT);
gradebookNoCat.setGrade_type(GradebookService.GRADE_TYPE_LETTER);
gradeDefs = gradebookService.getGradesForStudentsForItem(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, studentInSection);
Assert.assertTrue(gradeDefs.size() == 1);
gradeForS1 = (GradeDefinition)gradeDefs.get(0);
Assert.assertEquals(GradebookService.GRADE_TYPE_LETTER, gradeForS1.getGradeEntryType());
Assert.assertEquals("B+", gradeForS1.getGrade());
}
public void testGetAssignment() throws Exception {
setAuthnId(INSTRUCTOR_UID);
Assignment assnDef = gradebookService.getAssignment(GRADEBOOK_UID_NO_CAT, asn1IdNoCat);
Assert.assertNotNull(assnDef);
Assert.assertEquals(ASN_TITLE1, assnDef.getName());
Assert.assertEquals(new Double(40), assnDef.getPoints());
try {
assnDef = gradebookService.getAssignment(GRADEBOOK_UID_NO_CAT, new Long(-1));
Assert.fail();
} catch (AssessmentNotFoundException anfe) {
}
}
public void testIsGradeValid() throws Exception {
// try a null gradebookUuid
try {
gradebookService.isGradeValid(null, null);
fail("did not catch null gradebookUuid passed to isGradeValid");
} catch (IllegalArgumentException iae) {}
// let's start with a points-based gradebook
Gradebook gradebookNoCat = gradebookManager.getGradebook(GRADEBOOK_UID_NO_CAT);
gradebookNoCat.setGrade_type(GradebookService.GRADE_TYPE_POINTS);
gradebookManager.updateGradebook(gradebookNoCat);
// null grades are valid
assertTrue(gradebookService.isGradeValid(GRADEBOOK_UID_NO_CAT, null));
// try some positive point values
assertTrue(gradebookService.isGradeValid(GRADEBOOK_UID_NO_CAT, "25.34"));
assertTrue(gradebookService.isGradeValid(GRADEBOOK_UID_NO_CAT, "0"));
// negative should fail
assertFalse(gradebookService.isGradeValid(GRADEBOOK_UID_NO_CAT, "-1"));
// more than 2 decimal places should fail
assertFalse(gradebookService.isGradeValid(GRADEBOOK_UID_NO_CAT, "10.125"));
// try non-numeric
assertFalse(gradebookService.isGradeValid(GRADEBOOK_UID_NO_CAT, "A"));
// switch to %-based gradebook
gradebookNoCat.setGrade_type(GradebookService.GRADE_TYPE_PERCENTAGE);
gradebookManager.updateGradebook(gradebookNoCat);
// null grades are valid
assertTrue(gradebookService.isGradeValid(GRADEBOOK_UID_NO_CAT, null));
// try some positive point values
assertTrue(gradebookService.isGradeValid(GRADEBOOK_UID_NO_CAT, "25.34"));
assertTrue(gradebookService.isGradeValid(GRADEBOOK_UID_NO_CAT, "0"));
// negative should fail
assertFalse(gradebookService.isGradeValid(GRADEBOOK_UID_NO_CAT, "-1"));
// more than 2 decimal places should fail
assertFalse(gradebookService.isGradeValid(GRADEBOOK_UID_NO_CAT, "10.125"));
// try non-numeric
assertFalse(gradebookService.isGradeValid(GRADEBOOK_UID_NO_CAT, "A"));
// switch to letter-based gradebook
gradebookNoCat.setGrade_type(GradebookService.GRADE_TYPE_LETTER);
gradebookManager.updateGradebook(gradebookNoCat);
// null grades are valid
assertTrue(gradebookService.isGradeValid(GRADEBOOK_UID_NO_CAT, null));
// try some point values
assertFalse(gradebookService.isGradeValid(GRADEBOOK_UID_NO_CAT, "25.34"));
assertFalse(gradebookService.isGradeValid(GRADEBOOK_UID_NO_CAT, "0"));
// negative should fail
assertFalse(gradebookService.isGradeValid(GRADEBOOK_UID_NO_CAT, "-1"));
// try some valid ones
assertTrue(gradebookService.isGradeValid(GRADEBOOK_UID_NO_CAT, "A"));
assertTrue(gradebookService.isGradeValid(GRADEBOOK_UID_NO_CAT, "c-"));
}
public void testIdentifyStudentsWithInvalidGrades() throws Exception {
// try some null parameters
try {
gradebookService.identifyStudentsWithInvalidGrades(null, new HashMap<String, String>());
fail("did not catch null gradebookUid passed to identifyStudentsWithInvalidGrades");
} catch (IllegalArgumentException iae) {}
// try a null map
List<String> invalidStudentIds = gradebookService.identifyStudentsWithInvalidGrades(GRADEBOOK_UID_NO_CAT, null);
assertTrue(invalidStudentIds.isEmpty());
//add some students and grades for a points-based gb
Gradebook gradebookNoCat = gradebookManager.getGradebook(GRADEBOOK_UID_NO_CAT);
gradebookNoCat.setGrade_type(GradebookService.GRADE_TYPE_POINTS);
gradebookManager.updateGradebook(gradebookNoCat);
Map<String, String> studentIdGradeMap = new HashMap<String, String>();
studentIdGradeMap.put(STUDENT_IN_SECTION_UID1, "15");
studentIdGradeMap.put(STUDENT_IN_SECTION_UID2, "-1"); // invalid
studentIdGradeMap.put(STUDENT_NOT_IN_SECTION_UID1, "A"); //invalid
studentIdGradeMap.put(STUDENT_NOT_IN_SECTION_UID2, "25.67"); //valid//
invalidStudentIds = gradebookService.identifyStudentsWithInvalidGrades(GRADEBOOK_UID_NO_CAT, studentIdGradeMap);
assertEquals(2, invalidStudentIds.size());
assertTrue(invalidStudentIds.contains(STUDENT_IN_SECTION_UID2));
assertTrue(invalidStudentIds.contains(STUDENT_NOT_IN_SECTION_UID1));
//use a %-based gradebook
gradebookNoCat.setGrade_type(GradebookService.GRADE_TYPE_PERCENTAGE);
gradebookManager.updateGradebook(gradebookNoCat);
invalidStudentIds = gradebookService.identifyStudentsWithInvalidGrades(GRADEBOOK_UID_NO_CAT, studentIdGradeMap);
assertEquals(2, invalidStudentIds.size());
assertTrue(invalidStudentIds.contains(STUDENT_IN_SECTION_UID2));
assertTrue(invalidStudentIds.contains(STUDENT_NOT_IN_SECTION_UID1));
// use a letter-based gb
gradebookNoCat.setGrade_type(GradebookService.GRADE_TYPE_LETTER);
gradebookManager.updateGradebook(gradebookNoCat);
invalidStudentIds = gradebookService.identifyStudentsWithInvalidGrades(GRADEBOOK_UID_NO_CAT, studentIdGradeMap);
assertEquals(3, invalidStudentIds.size());
assertTrue(invalidStudentIds.contains(STUDENT_IN_SECTION_UID1));
assertTrue(invalidStudentIds.contains(STUDENT_IN_SECTION_UID2));
assertTrue(invalidStudentIds.contains(STUDENT_NOT_IN_SECTION_UID2));
}
public void testSaveGradeAndCommentForStudent() throws Exception {
// try some null params
try {
gradebookService.saveGradeAndCommentForStudent(null, new Long(1), STUDENT_IN_SECTION_UID1, "A", "Good work");
fail("Did not catch null gradebookUuid passed to saveGradeAndCommentForStudent");
} catch (IllegalArgumentException iae) {}
try {
gradebookService.saveGradeAndCommentForStudent(GRADEBOOK_UID_NO_CAT, null, STUDENT_IN_SECTION_UID1, "A", "Good work");
fail("Did not catch null gradableObjectId passed to saveGradeAndCommentForStudent");
} catch (IllegalArgumentException iae) {}
try {
gradebookService.saveGradeAndCommentForStudent(GRADEBOOK_UID_NO_CAT, new Long(1), null, "A", "Good work");
fail("Did not catch null gradableObjectId passed to saveGradeAndCommentForStudent");
} catch (IllegalArgumentException iae) {}
// try invalid gradebookUuid
try {
gradebookService.saveGradeAndCommentForStudent("bogus!", asn1IdNoCat, STUDENT_IN_SECTION_UID1, null, null);
fail("did not catch bogus gradebookUuid passed to saveGradeAndCommentForStudent");
} catch (GradebookNotFoundException gnfe) {}
// try invalid gradableObjectId
try {
gradebookService.saveGradeAndCommentForStudent(GRADEBOOK_UID_NO_CAT, new Long(12345), STUDENT_IN_SECTION_UID1, null, null);
fail("did not catch bogus gradableObjectId passed to saveGradeAndCommentForStudent");
} catch (AssessmentNotFoundException anfe) {}
// use point-based gb
Gradebook gradebookNoCat = gradebookManager.getGradebook(GRADEBOOK_UID_NO_CAT);
gradebookNoCat.setGrade_type(GradebookService.GRADE_TYPE_POINTS);
gradebookManager.updateGradebook(gradebookNoCat);
// add a grade and comment for student
String score = "15.0";
String comment = "Good work";
gradebookService.saveGradeAndCommentForStudent(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_IN_SECTION_UID1, score, comment);
// try to retrieve it again
GradeDefinition gradeDef = gradebookService.getGradeDefinitionForStudentForItem(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_IN_SECTION_UID1);
assertEquals(score, gradeDef.getGrade());
assertEquals(comment, gradeDef.getGradeComment());
// try an invalid grade
try {
gradebookService.saveGradeAndCommentForStudent(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_IN_SECTION_UID1, "A", comment);
fail("did not catch invalid grade passed to saveGradeAndCommentForStudent");
} catch (InvalidGradeException ige) {}
// try setting the score and comment to null
score = null;
comment = null;
gradebookService.saveGradeAndCommentForStudent(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_IN_SECTION_UID1, score, comment);
// try to retrieve it again
gradeDef = gradebookService.getGradeDefinitionForStudentForItem(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_IN_SECTION_UID1);
assertNull(gradeDef.getGrade());
assertNull(gradeDef.getGradeComment());
// set just a comment
comment = "Try again!";
gradebookService.saveGradeAndCommentForStudent(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_IN_SECTION_UID1, score, comment);
gradeDef = gradebookService.getGradeDefinitionForStudentForItem(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_IN_SECTION_UID1);
assertNull(gradeDef.getGrade());
assertEquals(comment, gradeDef.getGradeComment());
// try to update a student as a TA
authn.setAuthnContext(TA_UID);
// should only have auth to update student in her section
score = "25.78";
comment = "Jolly good show";
gradebookService.saveGradeAndCommentForStudent(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_IN_SECTION_UID1, score, comment);
// try to retrieve it again
gradeDef = gradebookService.getGradeDefinitionForStudentForItem(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_IN_SECTION_UID1);
assertEquals(score, gradeDef.getGrade());
assertEquals(comment, gradeDef.getGradeComment());
// now try to update a student not in the section
try {
gradebookService.saveGradeAndCommentForStudent(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_NOT_IN_SECTION_UID1, score, comment);
fail("did not catch ta trying to update score and comment w/o authorization!");
} catch (SecurityException se) {}
// make sure students don't have authorization
authn.setAuthnContext(STUDENT_IN_SECTION_UID1);
try {
gradebookService.saveGradeAndCommentForStudent(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_NOT_IN_SECTION_UID1, score, comment);
fail("did not catch student trying to update score and comment w/o authorization!");
} catch (SecurityException se) {}
}
public void testSaveGradesAndComments() throws Exception {
// try nulls
try {
gradebookService.saveGradesAndComments(null, asn1IdNoCat, new ArrayList<GradeDefinition>());
fail("did not catch null gradebookUuid passed to saveGradesAndComments");
} catch (IllegalArgumentException iae) {}
try {
gradebookService.saveGradesAndComments(GRADEBOOK_UID_NO_CAT, null, new ArrayList<GradeDefinition>());
fail("did not catch null gradableObjectId passed to saveGradesAndComments");
} catch (IllegalArgumentException iae) {}
// try invalid gradebookUuid
try {
gradebookService.saveGradesAndComments("bogus!", asn1IdNoCat, new ArrayList<GradeDefinition>());
fail("did not catch bogus gradebookUuid passed to saveGradesAndComments");
} catch (GradebookNotFoundException gnfe) {}
// try invalid gradableObjectId
try {
gradebookService.saveGradesAndComments(GRADEBOOK_UID_NO_CAT, new Long(12345), new ArrayList<GradeDefinition>());
fail("did not catch bogus gradableObjectId passed to saveGradesAndComments");
} catch (AssessmentNotFoundException anfe) {}
authn.setAuthnContext(INSTRUCTOR_UID);
// null gradeDef list shouldn't do anything
gradebookService.saveGradesAndComments(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, null);
// Add some grade defs
String def1Grade = "10.5";
String def1Comment = "Good work";
String def2Grade = "";
String def2Comment = "Turn this in";
GradeDefinition def1 = new GradeDefinition();
def1.setStudentUid(STUDENT_IN_SECTION_UID1);
def1.setGrade(def1Grade);
def1.setGradeComment(def1Comment);
GradeDefinition def2 = new GradeDefinition();
def2.setStudentUid(STUDENT_NOT_IN_SECTION_UID1);
def2.setGrade(def2Grade);
def2.setGradeComment(def2Comment);
List<GradeDefinition> gradeDefList = new ArrayList<GradeDefinition>();
gradeDefList.add(def1);
gradeDefList.add(def2);
// use point-based gb
Gradebook gradebookNoCat = gradebookManager.getGradebook(GRADEBOOK_UID_NO_CAT);
gradebookNoCat.setGrade_type(GradebookService.GRADE_TYPE_POINTS);
gradebookManager.updateGradebook(gradebookNoCat);
gradebookService.saveGradesAndComments(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, gradeDefList);
// now let's see if the change was successful
// try to retrieve it again
GradeDefinition gradeDef = gradebookService.getGradeDefinitionForStudentForItem(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_IN_SECTION_UID1);
assertEquals(def1Grade, gradeDef.getGrade());
assertEquals(def1Comment, gradeDef.getGradeComment());
gradeDef = gradebookService.getGradeDefinitionForStudentForItem(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_NOT_IN_SECTION_UID1);
assertNull(gradeDef.getGrade());
assertEquals(def2Comment, gradeDef.getGradeComment());
// let's try this as a TA - should throw SecurityException b/c not auth for STUDENT_NOT_IN_SECTION_UID1
authn.setAuthnContext(TA_UID);
try {
gradebookService.saveGradesAndComments(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, gradeDefList);
fail("did not catch TA trying to save grades for students w/o auth");
} catch (SecurityException se) {}
// if we remove def2, TA should be able to update
gradeDefList = new ArrayList<GradeDefinition>();
def1Grade = "37.0";
def1Comment = "";
def1.setGrade(def1Grade);
def1.setGradeComment(def1Comment);
gradeDefList.add(def1);
gradebookService.saveGradesAndComments(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, gradeDefList);
gradeDef = gradebookService.getGradeDefinitionForStudentForItem(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_IN_SECTION_UID1);
assertEquals(def1Grade, gradeDef.getGrade());
assertEquals(def1Comment, gradeDef.getGradeComment());
// let's try an invalid grade
gradeDefList = new ArrayList<GradeDefinition>();
def1.setGrade("A");
def1.setGradeComment("I like letters");
gradeDefList.add(def1);
try {
gradebookService.saveGradesAndComments(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, gradeDefList);
fail("Did not catch invalid grade passed to saveGradesAndComments");
} catch (InvalidGradeException ige) {}
// double check grade wasn't updated
gradeDef = gradebookService.getGradeDefinitionForStudentForItem(GRADEBOOK_UID_NO_CAT, asn1IdNoCat, STUDENT_IN_SECTION_UID1);
assertEquals(def1Grade, gradeDef.getGrade());
assertEquals(def1Comment, gradeDef.getGradeComment());
}
public void testGetGradeEntryType() throws Exception {
// try passing a null gradebookUid
try {
gradebookService.getGradeEntryType(null);
fail("did not catch null gradebookUid passed to getGradeEntryType");
} catch (IllegalArgumentException iae) {}
// try a bogus gradebookUid
try {
gradebookService.getGradeEntryType("bogus");
fail("did not catch gradebook that didn't exist");
} catch (GradebookNotFoundException gnfe) {}
// let's start with a point gb
Gradebook gradebookNoCat = gradebookManager.getGradebook(GRADEBOOK_UID_NO_CAT);
gradebookNoCat.setGrade_type(GradebookService.GRADE_TYPE_POINTS);
gradebookManager.updateGradebook(gradebookNoCat);
assertEquals(GradebookService.GRADE_TYPE_POINTS, gradebookService.getGradeEntryType(GRADEBOOK_UID_NO_CAT));
// change it to %
gradebookNoCat.setGrade_type(GradebookService.GRADE_TYPE_PERCENTAGE);
gradebookManager.updateGradebook(gradebookNoCat);
assertEquals(GradebookService.GRADE_TYPE_PERCENTAGE, gradebookService.getGradeEntryType(GRADEBOOK_UID_NO_CAT));
// change it to letter
gradebookNoCat.setGrade_type(GradebookService.GRADE_TYPE_LETTER);
gradebookManager.updateGradebook(gradebookNoCat);
assertEquals(GradebookService.GRADE_TYPE_LETTER, gradebookService.getGradeEntryType(GRADEBOOK_UID_NO_CAT));
}
public void testGetLowestPossibleGradeForGbItem() throws Exception {
// try passing some nulls
try {
gradebookService.getLowestPossibleGradeForGbItem(null, asn1IdNoCat);
fail("did not catch null gradebookUid passed to getLowestPossibleGradeForGbItem");
} catch (IllegalArgumentException iae) {}
try {
gradebookService.getLowestPossibleGradeForGbItem(GRADEBOOK_UID_NO_CAT, null);
fail("did not catch null gradebookItemId passed to getLowestPossibleGradeForGbItem");
} catch (IllegalArgumentException iae) {}
// let's start with a point gb
Gradebook gradebookNoCat = gradebookManager.getGradebook(GRADEBOOK_UID_NO_CAT);
gradebookNoCat.setGrade_type(GradebookService.GRADE_TYPE_POINTS);
gradebookManager.updateGradebook(gradebookNoCat);
String lowestPointsPossible = gradebookService.getLowestPossibleGradeForGbItem(GRADEBOOK_UID_NO_CAT, asn1IdNoCat);
assertEquals("0", lowestPointsPossible);
// change it to %
gradebookNoCat.setGrade_type(GradebookService.GRADE_TYPE_PERCENTAGE);
gradebookManager.updateGradebook(gradebookNoCat);
lowestPointsPossible = gradebookService.getLowestPossibleGradeForGbItem(GRADEBOOK_UID_NO_CAT, asn1IdNoCat);
assertEquals("0", lowestPointsPossible);
// change it to letter
gradebookNoCat.setGrade_type(GradebookService.GRADE_TYPE_LETTER);
gradebookManager.updateGradebook(gradebookNoCat);
lowestPointsPossible = gradebookService.getLowestPossibleGradeForGbItem(GRADEBOOK_UID_NO_CAT, asn1IdNoCat);
assertEquals("F", lowestPointsPossible);
// now let's change the gb item to ungraded
org.sakaiproject.tool.gradebook.Assignment assignment = gradebookManager.getAssignment(asn1IdNoCat);
assignment.setUngraded(true);
gradebookManager.updateAssignment(assignment);
lowestPointsPossible = gradebookService.getLowestPossibleGradeForGbItem(GRADEBOOK_UID_NO_CAT, asn1IdNoCat);
assertNull(lowestPointsPossible);
}
public void testGetCategoryDefinitions() throws Exception {
try {
gradebookService.getCategoryDefinitions(null);
fail("Did not catch null gradebookUid passed to getCategoryDefinitions");
} catch (IllegalArgumentException iae) {}
authn.setAuthnContext(STUDENT_IN_SECTION_UID1);
try {
gradebookService.getCategoryDefinitions(GRADEBOOK_UID_WITH_CAT);
fail("Did not catch student accessing category information");
} catch (SecurityException se) {}
authn.setAuthnContext(INSTRUCTOR_UID);
List<CategoryDefinition> catDefs = gradebookService.getCategoryDefinitions(GRADEBOOK_UID_WITH_CAT);
assertEquals(2, catDefs.size());
for (CategoryDefinition def : catDefs) {
if (def.getId().equals(cat1Id)) {
assertEquals(CAT1_NAME, def.getName());
assertEquals(0D, def.getWeight());
} else if (def.getId().equals(cat2Id)) {
assertEquals(CAT2_NAME, def.getName());
assertEquals(0D, def.getWeight());
} else {
fail("Unknown category returned by getCategoryDefs");
}
}
// now try a gradebook w/o categories
catDefs = gradebookService.getCategoryDefinitions(GRADEBOOK_UID_NO_CAT);
assertEquals(0, catDefs.size());
}
public void testIsPointsPossibleValid() throws Exception {
// try some null values
try {
gradebookService.isPointsPossibleValid(null, new Assignment(), 5D);
fail("Did not catch null gradebookUid passed to isPointsPossibleValid");
} catch (IllegalArgumentException iae) {}
try {
gradebookService.isPointsPossibleValid(GRADEBOOK_UID_NO_CAT, null, 5D);
fail("Did not catch null gradebookItem passed to isPointsPossibleValid");
} catch (IllegalArgumentException iae) {}
// try passing a null points possible
assertEquals(GradebookService.PointsPossibleValidation.INVALID_NULL_VALUE, gradebookService.isPointsPossibleValid(GRADEBOOK_UID_NO_CAT, new Assignment(), null));
// try a negative
assertEquals(GradebookService.PointsPossibleValidation.INVALID_NUMERIC_VALUE, gradebookService.isPointsPossibleValid(GRADEBOOK_UID_NO_CAT, new Assignment(), -5D));
// try 0
assertEquals(GradebookService.PointsPossibleValidation.INVALID_NUMERIC_VALUE, gradebookService.isPointsPossibleValid(GRADEBOOK_UID_NO_CAT, new Assignment(), 0D));
// try more than 2 decimal places
assertEquals(GradebookService.PointsPossibleValidation.INVALID_DECIMAL, gradebookService.isPointsPossibleValid(GRADEBOOK_UID_NO_CAT, new Assignment(), 5.123D));
// try some valid points possible
assertEquals(GradebookService.PointsPossibleValidation.VALID, gradebookService.isPointsPossibleValid(GRADEBOOK_UID_NO_CAT, new Assignment(), 0.01D));
assertEquals(GradebookService.PointsPossibleValidation.VALID,gradebookService.isPointsPossibleValid(GRADEBOOK_UID_NO_CAT, new Assignment(), 100D));
}
}