Commit f7c00a2b by Andy Armstrong Committed by cahrens

Jasmine tests for full staff grading.

parent f083c9fd
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
<div class="staff__grade__content ui-toggle-visibility__content"> <div class="staff__grade__content ui-toggle-visibility__content">
<div class="wrapper--input"> <div class="wrapper--input">
<div class="staff__grade__form--error"></div>
<div class="staff__grade__form"></div> <div class="staff__grade__form"></div>
</div> </div>
</div> </div>
......
...@@ -1031,5 +1031,117 @@ ...@@ -1031,5 +1031,117 @@
] ]
}, },
"output": "oa_turbo_mode.html" "output": "oa_turbo_mode.html"
},
{
"template": "openassessmentblock/staff_area/oa_staff_grade_learners_assessment.html",
"context": {
"rubric_criteria": [
{
"name": "vocabulary",
"prompt": "vocabulary",
"order_num": 0,
"feedback": "optional",
"options": [
{
"order_num": 0,
"points": 0,
"name": "Bad"
},
{
"order_num": 1,
"points": 1,
"name": "Good"
}
]
},
{
"name": "grammar",
"prompt": "grammar",
"order_num": 1,
"options": [
{
"order_num": 0,
"points": 0,
"name": "Bad"
},
{
"order_num": 1,
"points": 1,
"name": "Good"
}
]
},
{
"name": "feedback_only",
"prompt": "Feedback only, no options!",
"order_num": 2,
"feedback": "required",
"options": []
}
],
"submission": {
"answer": {
"text": "testing response text"
}
},
"student_username": "mock_user"
},
"output": "oa_staff_grade_learners_assessment.html"
},
{
"template": "openassessmentblock/staff_area/oa_staff_grade_learners_assessment.html",
"context": {
"rubric_criteria": [
{
"name": "vocabulary",
"prompt": "vocabulary",
"order_num": 0,
"feedback": "optional",
"options": [
{
"order_num": 0,
"points": 0,
"name": "Bad"
},
{
"order_num": 1,
"points": 1,
"name": "Good"
}
]
},
{
"name": "grammar",
"prompt": "grammar",
"order_num": 1,
"options": [
{
"order_num": 0,
"points": 0,
"name": "Bad"
},
{
"order_num": 1,
"points": 1,
"name": "Good"
}
]
},
{
"name": "feedback_only",
"prompt": "Feedback only, no options!",
"order_num": 2,
"feedback": "required",
"options": []
}
],
"submission": {
"answer": {
"text": "testing response text"
}
},
"student_username": "mock_user_2"
},
"output": "oa_staff_grade_learners_assessment_2.html"
} }
] ]
...@@ -20,26 +20,28 @@ describe('OpenAssessment.StaffAreaView', function() { ...@@ -20,26 +20,28 @@ describe('OpenAssessment.StaffAreaView', function() {
var StubServer = function() { var StubServer = function() {
this.studentTemplate = 'oa_student_info.html'; this.studentTemplate = 'oa_student_info.html';
this.staffAreaTemplate = 'oa_staff_area.html'; this.staffAreaTemplate = 'oa_staff_area.html';
this.staffGradeFormTemplate = 'oa_staff_grade_learners_assessment.html';
// Remember which fragments have been loaded // Remember which fragments have been loaded
this.fragmentsLoaded = []; this.fragmentsLoaded = [];
// Render the template for the staff info view this.mockLoadTemplate = function(template) {
this.render = function(component) {
var server = this; var server = this;
this.fragmentsLoaded.push(component);
return $.Deferred(function(defer) { return $.Deferred(function(defer) {
var fragment = readFixtures(server.staffAreaTemplate); var fragment = readFixtures(template);
defer.resolveWith(server, [fragment]); defer.resolveWith(server, [fragment]);
}); });
}; };
this.studentInfo = function() { // Render the template for the staff info view
this.render = function(component) {
var server = this; var server = this;
return $.Deferred(function(defer) { this.fragmentsLoaded.push(component);
var fragment = readFixtures(server.studentTemplate); return this.mockLoadTemplate(server.staffAreaTemplate);
defer.resolveWith(server, [fragment]); };
});
this.studentInfo = function() {
return this.mockLoadTemplate(server.studentTemplate);
}; };
this.scheduleTraining = function() { this.scheduleTraining = function() {
...@@ -64,8 +66,11 @@ describe('OpenAssessment.StaffAreaView', function() { ...@@ -64,8 +66,11 @@ describe('OpenAssessment.StaffAreaView', function() {
return successPromise; return successPromise;
}; };
this.data = {}; this.staffGradeForm = function() {
return this.mockLoadTemplate(server.staffGradeFormTemplate);
};
this.data = {};
}; };
// Stubs // Stubs
...@@ -74,6 +79,7 @@ describe('OpenAssessment.StaffAreaView', function() { ...@@ -74,6 +79,7 @@ describe('OpenAssessment.StaffAreaView', function() {
/** /**
* Create a staff area view. * Create a staff area view.
*
* @param {dict} serverResponse An optional fake response from the server. * @param {dict} serverResponse An optional fake response from the server.
* @param {string} staffAreaTemplate - An optional template to use. * @param {string} staffAreaTemplate - An optional template to use.
* @returns {OpenAssessment.StaffAreaView} The staff area view. * @returns {OpenAssessment.StaffAreaView} The staff area view.
...@@ -95,7 +101,8 @@ describe('OpenAssessment.StaffAreaView', function() { ...@@ -95,7 +101,8 @@ describe('OpenAssessment.StaffAreaView', function() {
/** /**
* Initialize the staff area view, then check whether it makes * Initialize the staff area view, then check whether it makes
* an AJAX call to populate itself. * an AJAX call to populate itself.
* @param shouldCall True if an AJAX call should be made. *
* @param {bool} shouldCall - True if an AJAX call should be made.
*/ */
var assertStaffAreaAjaxCall = function(shouldCall) { var assertStaffAreaAjaxCall = function(shouldCall) {
createStaffArea(); createStaffArea();
...@@ -247,7 +254,7 @@ describe('OpenAssessment.StaffAreaView', function() { ...@@ -247,7 +254,7 @@ describe('OpenAssessment.StaffAreaView', function() {
}); });
}); });
describe('Staff Tools', function() { describe('Manage Individual Learners', function() {
var chooseStudent = function(view, studentName) { var chooseStudent = function(view, studentName) {
var studentNameField = $('.openassessment__student_username', view.element), var studentNameField = $('.openassessment__student_username', view.element),
submitButton = $('.action--submit-username', view.element); submitButton = $('.action--submit-username', view.element);
...@@ -278,6 +285,15 @@ describe('OpenAssessment.StaffAreaView', function() { ...@@ -278,6 +285,15 @@ describe('OpenAssessment.StaffAreaView', function() {
.toBe('You must provide a learner name.'); .toBe('You must provide a learner name.');
}); });
it('shows an error message when failing to load the student info', function() {
var staffArea = createStaffArea();
server.studentInfo = failWith(server);
chooseStudent(staffArea, 'testStudent');
expect($('.openassessment_student_info_form .form--error', staffArea.element).first().text().trim()).toBe(
'Unexpected server error.'
);
});
describe('Submission Management', function() { describe('Submission Management', function() {
it('updates submission cancellation button when comments changes', function() { it('updates submission cancellation button when comments changes', function() {
// Prevent the server's response from resolving, // Prevent the server's response from resolving,
...@@ -400,7 +416,6 @@ describe('OpenAssessment.StaffAreaView', function() { ...@@ -400,7 +416,6 @@ describe('OpenAssessment.StaffAreaView', function() {
fillAssessment($assessment); fillAssessment($assessment);
// Submit the assessment but return a server error message // Submit the assessment but return a server error message
staffArea.comment('Cancellation reason.');
server.staffAssess = failWith(server, serverErrorMessage); server.staffAssess = failWith(server, serverErrorMessage);
submitAssessment(staffArea); submitAssessment(staffArea);
...@@ -410,7 +425,7 @@ describe('OpenAssessment.StaffAreaView', function() { ...@@ -410,7 +425,7 @@ describe('OpenAssessment.StaffAreaView', function() {
}); });
}); });
describe('Staff Info', function() { describe('View Assignment Statistics', function() {
beforeEach(function() { beforeEach(function() {
loadFixtures('oa_base_course_staff.html'); loadFixtures('oa_base_course_staff.html');
}); });
...@@ -427,4 +442,107 @@ describe('OpenAssessment.StaffAreaView', function() { ...@@ -427,4 +442,107 @@ describe('OpenAssessment.StaffAreaView', function() {
expect($staffInfoPanel).toHaveClass('is--hidden'); expect($staffInfoPanel).toHaveClass('is--hidden');
}); });
}); });
describe('Grade Available Responses', function() {
var showInstructorAssessmentForm = function(staffArea) {
$('.staff__grade__control', staffArea.element).click();
};
var fillAssessment = function($assessment) {
$('#staff__assessment__rubric__question--2__feedback', $assessment).val('Text response');
$('.question__answers', $assessment).each(function() {
$('input[type="radio"]', this).first().click();
});
};
var submitAssessment = function(staffArea) {
var $assessment = $('.wrapper--staff-assessment', staffArea.element),
$submitButton = $('.action--submit', $assessment);
$submitButton.click();
};
beforeEach(function() {
loadFixtures('oa_base_course_staff.html');
});
it('enables both submit buttons when all required fields are specified', function() {
var staffArea = createStaffArea({}, 'oa_staff_area_full_grading.html'),
$assessment, $submitButtons;
showInstructorAssessmentForm(staffArea);
$assessment = $('.wrapper--staff-assessment', staffArea.element);
$submitButtons = $('.action--submit', $assessment);
expect($submitButtons.length).toBe(2);
expect($submitButtons).toHaveClass('is--disabled');
fillAssessment($assessment);
expect($submitButtons).not.toHaveClass('is--disabled');
});
it('can submit a staff grade', function() {
var staffArea = createStaffArea({}, 'oa_staff_area_full_grading.html'),
$assessment, $gradeSection;
showInstructorAssessmentForm(staffArea);
$assessment = $('.wrapper--staff-assessment', staffArea.element);
// Verify that the submission is shown for the first user
expect($('.staff-assessment__display__title', $assessment).text().trim()).toBe(
'Response for: mock_user'
);
// Fill in and submit the assessment
fillAssessment($assessment);
server.staffGradeFormTemplate = 'oa_staff_grade_learners_assessment_2.html';
submitAssessment(staffArea);
// Verify that the assessment form has been removed
expect($('.staff__grade__form', staffArea.element).html().trim()).toBe('');
});
it('can submit a staff grade and receive another submission', function() {
var staffArea = createStaffArea({}, 'oa_staff_area_full_grading.html'),
$assessment;
showInstructorAssessmentForm(staffArea);
// Verify that the submission is shown for the first user
expect($('.staff-assessment__display__title', staffArea.element).text().trim()).toBe(
'Response for: mock_user'
);
// Fill in and click the button to submit and request another submission
$assessment = $('.wrapper--staff-assessment', staffArea.element);
fillAssessment($assessment);
server.staffGradeFormTemplate = 'oa_staff_grade_learners_assessment_2.html';
$('.continue_grading--action', $assessment).click();
// Verify that the submission is shown for the second learner
expect($('.staff-assessment__display__title', staffArea.element).text().trim()).toBe(
'Response for: mock_user_2'
);
});
it('shows an error message when failing to load the staff grade form', function() {
var staffArea = createStaffArea({}, 'oa_staff_area_full_grading.html'),
$assessment, $submitButtons;
server.staffGradeForm = failWith(server);
showInstructorAssessmentForm(staffArea);
expect($('.staff__grade__form--error', staffArea.element).first().text().trim()).toBe(
'Unexpected server error.'
);
});
it('shows an error message when a staff grade request fails', function() {
var staffArea = createStaffArea({}, 'oa_staff_area_full_grading.html'),
serverErrorMessage = 'Mock server error',
$assessment;
showInstructorAssessmentForm(staffArea);
$assessment = $('.wrapper--staff-assessment', staffArea.element);
fillAssessment($assessment);
// Submit the assessment but return a server error message
server.staffAssess = failWith(server, serverErrorMessage);
submitAssessment(staffArea);
// Verify that the error message is shown
expect($('.staff-grade-error', staffArea.element).first().text().trim()).toBe(serverErrorMessage);
});
});
}); });
...@@ -120,22 +120,23 @@ ...@@ -120,22 +120,23 @@
loadStaffGradeForm: function(eventObject) { loadStaffGradeForm: function(eventObject) {
var view = this; var view = this;
var staff_form_element = $(eventObject.currentTarget); var $staffForm = $(eventObject.currentTarget);
var isCollapsed = staff_form_element.hasClass("is--collapsed"); var isCollapsed = $staffForm.hasClass("is--collapsed");
var deferred = $.Deferred(); var deferred = $.Deferred();
var showFormError = function(errorMessage) {
$staffForm.find('.staff__grade__form--error').text(errorMessage);
};
if (isCollapsed && !this.staffGradeFormLoaded) { if (isCollapsed && !this.staffGradeFormLoaded) {
eventObject.preventDefault(); eventObject.preventDefault();
this.staffGradeFormLoaded = true; this.staffGradeFormLoaded = true;
this.server.staffGradeForm().done(function(html) { this.server.staffGradeForm().done(function(html) {
// TODO: need to create a div to show an error message if this server call fails. showFormError('');
//showFormError('');
// Load the HTML and install event handlers // Load the HTML and install event handlers
$('.staff__grade__form', view.element).replaceWith(html); $staffForm.find('.staff__grade__form').replaceWith(html);
// Initialize the rubric : TODO SHARE CODE! var $rubric = $staffForm.find('.staff-assessment__assessment');
var $rubric = $('.staff-assessment__assessment', view.element);
if ($rubric.size() > 0) { if ($rubric.size() > 0) {
var rubricElement = $rubric.get(0); var rubricElement = $rubric.get(0);
var rubric = new OpenAssessment.Rubric(rubricElement); var rubric = new OpenAssessment.Rubric(rubricElement);
...@@ -144,26 +145,23 @@ ...@@ -144,26 +145,23 @@
rubric.canSubmitCallback($.proxy(view.staffSubmitEnabled, view)); rubric.canSubmitCallback($.proxy(view.staffSubmitEnabled, view));
// Install a click handler for the submit buttons // Install a click handler for the submit buttons
$('.wrapper--staff-assessment .action--submit', view.element).click( $staffForm.find('.action--submit').click(
function(eventObject) { function(eventObject) {
var submissionID = staff_form_element.find('.staff__grade__form').data('submission-uuid'); // This was a change var submissionID = $staffForm.find('.staff__grade__form').data('submission-uuid');
eventObject.preventDefault(); eventObject.preventDefault();
view.submitStaffGradeForm(submissionID, rubric, view.submitStaffGradeForm(submissionID, rubric,
$(eventObject.currentTarget).hasClass('continue_grading--action') $(eventObject.currentTarget).hasClass('continue_grading--action')
); // This was a change );
} }
); );
} }
deferred.resolve(); deferred.resolve();
}).fail(function() { }).fail(function() {
// showFormError(gettext('Unexpected server error.')); showFormError(gettext('Unexpected server error.'));
this.staffGradeFormLoaded = false; view.staffGradeFormLoaded = false;
deferred.reject(); deferred.reject();
}); });
} }
}, },
/** /**
...@@ -357,7 +355,7 @@ ...@@ -357,7 +355,7 @@
}, },
/** /**
* Enable/disable the staff assessment submit button. * Enable/disable submit button(s) for staff grading or staff override.
* *
* @param {boolean} enabled If specified, sets the state of the button. * @param {boolean} enabled If specified, sets the state of the button.
* @returns {boolean} Whether the button is enabled * @returns {boolean} Whether the button is enabled
...@@ -409,7 +407,7 @@ ...@@ -409,7 +407,7 @@
rubric.optionsSelected(), rubric.criterionFeedback(), rubric.overallFeedback(), submissionID rubric.optionsSelected(), rubric.criterionFeedback(), rubric.overallFeedback(), submissionID
).done(function() { ).done(function() {
view.staffGradeFormLoaded = false; view.staffGradeFormLoaded = false;
var onSuccessCallback = function () { var onSuccessCallback = function() {
$('.button-staff-grading').click(); $('.button-staff-grading').click();
if (continueGrading) { if (continueGrading) {
$('.staff__grade__title').click(); $('.staff__grade__title').click();
......
...@@ -116,10 +116,8 @@ if (typeof OpenAssessment.Server === "undefined" || !OpenAssessment.Server) { ...@@ -116,10 +116,8 @@ if (typeof OpenAssessment.Server === "undefined" || !OpenAssessment.Server) {
}, },
/** /**
* Load the student information section inside the Staff Info section. TODO update * Renders the next submission for staff grading.
* *
* @param {string} studentUsername - The username for the student.
* @param {object} options - An optional set of configuration options.
* @returns {promise} A JQuery promise, which resolves with the HTML of the rendered section * @returns {promise} A JQuery promise, which resolves with the HTML of the rendered section
* fails with an error message. * fails with an error message.
*/ */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment