Fix syntax error in selectors .attr() now returns a string (though it can still be passed an integer) Fixes checkbox test failures Remove remaining references to jquery.min (in wrong folder) $.ajax now returns 422 if type is json and body is not JSON, e.g. '' Substitute prop for attr Remove references to jquery.min, add jquery.migrate (again) "Fix" jquery karma config This wasn't suppoed to survive the merge This throws an error when called with an 'undefined' error Fix Karma warning about [re|un]loading the window Fix path for jquery in cms-squire tests Move jasmine.clock.uninstall() to afterEach so it runs even on failure Fix test failing due to timezone issues Do the timeout before the window scrolling (so handler will not be _.throttled) Fix an alert() triggered by window.onBeforeUnload while testing in Chrome
358 lines
15 KiB
JavaScript
358 lines
15 KiB
JavaScript
define([
|
|
'jquery', 'js/models/settings/course_details', 'js/views/settings/main',
|
|
'common/js/spec_helpers/ajax_helpers', 'common/js/spec_helpers/template_helpers',
|
|
], function($, CourseDetailsModel, MainView, AjaxHelpers, TemplateHelpers) {
|
|
'use strict';
|
|
|
|
var SELECTORS = {
|
|
entrance_exam_min_score: '#entrance-exam-minimum-score-pct',
|
|
entrance_exam_enabled_field: '#entrance-exam-enabled',
|
|
grade_requirement_div: '.div-grade-requirements div',
|
|
add_course_learning_info: '.add-course-learning-info',
|
|
delete_course_learning_info: '.delete-course-learning-info',
|
|
add_course_instructor_info: '.add-course-instructor-info',
|
|
remove_instructor_data: '.remove-instructor-data'
|
|
};
|
|
|
|
describe('Settings/Main', function () {
|
|
var urlRoot = '/course/settings/org/DemoX/Demo_Course',
|
|
modelData = {
|
|
start_date: "2014-10-05T00:00:00Z",
|
|
end_date: "2014-11-05T20:00:00Z",
|
|
enrollment_start: "2014-10-00T00:00:00Z",
|
|
enrollment_end: "2014-11-05T00:00:00Z",
|
|
org : '',
|
|
course_id : '',
|
|
run : '',
|
|
syllabus : null,
|
|
title: '',
|
|
subtitle: '',
|
|
duration: '',
|
|
description: '',
|
|
short_description : '',
|
|
overview : '',
|
|
intro_video : null,
|
|
effort : null,
|
|
course_image_name : '',
|
|
course_image_asset_path : '',
|
|
banner_image_name : '',
|
|
banner_image_asset_path : '',
|
|
video_thumbnail_image_name : '',
|
|
video_thumbnail_image_asset_path : '',
|
|
pre_requisite_courses : [],
|
|
entrance_exam_enabled : '',
|
|
entrance_exam_minimum_score_pct: '50',
|
|
license: null,
|
|
language: '',
|
|
learning_info: [''],
|
|
instructor_info: {
|
|
'instructors': [{"name": "","title": "","organization": "","image": "","bio": ""}]
|
|
}
|
|
},
|
|
|
|
mockSettingsPage = readFixtures('mock/mock-settings-page.underscore'),
|
|
learningInfoTpl = readFixtures('course-settings-learning-fields.underscore'),
|
|
instructorInfoTpl = readFixtures('course-instructor-details.underscore');
|
|
|
|
beforeEach(function () {
|
|
TemplateHelpers.installTemplates(['course-settings-learning-fields', 'course-instructor-details'], true);
|
|
appendSetFixtures(mockSettingsPage);
|
|
appendSetFixtures(
|
|
$("<script>", { id: "basic-learning-info-tpl", type: "text/template" }).text(learningInfoTpl)
|
|
);
|
|
appendSetFixtures(
|
|
$("<script>", { id: "basic-instructor-info-tpl", type: "text/template" }).text(instructorInfoTpl)
|
|
);
|
|
|
|
|
|
this.model = new CourseDetailsModel($.extend(true, {}, modelData, {
|
|
instructor_info: {
|
|
'instructors': [{"name": "","title": "","organization": "","image": "","bio": ""}]
|
|
}}), {parse: true});
|
|
this.model.urlRoot = urlRoot;
|
|
this.view = new MainView({
|
|
el: $('.settings-details'),
|
|
model: this.model
|
|
}).render();
|
|
});
|
|
|
|
afterEach(function () {
|
|
// Clean up after the $.datepicker
|
|
$("#start_date").datepicker("destroy");
|
|
$("#due_date").datepicker("destroy");
|
|
$('.ui-datepicker').remove();
|
|
});
|
|
|
|
it('Changing the time field do not affect other time fields', function () {
|
|
var requests = AjaxHelpers.requests(this),
|
|
expectedJson = $.extend(true, {}, modelData, {
|
|
// Expect to see changes just in `start_date` field.
|
|
start_date: "2014-10-05T22:00:00.000Z"
|
|
});
|
|
this.view.$el.find('#course-start-time')
|
|
.val('22:00')
|
|
.trigger('input');
|
|
|
|
this.view.saveView();
|
|
// It sends `POST` request, because the model doesn't have `id`. In
|
|
// this case, it is considered to be new according to Backbone documentation.
|
|
AjaxHelpers.expectJsonRequest(
|
|
requests, 'POST', urlRoot, expectedJson
|
|
);
|
|
});
|
|
|
|
it('Selecting a course in pre-requisite drop down should save it as part of course details', function () {
|
|
var pre_requisite_courses = ['test/CSS101/2012_T1'];
|
|
var requests = AjaxHelpers.requests(this),
|
|
expectedJson = $.extend(true, {}, modelData, {
|
|
pre_requisite_courses: pre_requisite_courses
|
|
});
|
|
this.view.$el.find('#pre-requisite-course')
|
|
.val(pre_requisite_courses[0])
|
|
.trigger('change');
|
|
|
|
this.view.saveView();
|
|
AjaxHelpers.expectJsonRequest(
|
|
requests, 'POST', urlRoot, expectedJson
|
|
);
|
|
AjaxHelpers.respondWithJson(requests, expectedJson);
|
|
});
|
|
|
|
it('should disallow save with an invalid minimum score percentage', function(){
|
|
var entrance_exam_enabled_field = this.view.$(SELECTORS.entrance_exam_enabled_field),
|
|
entrance_exam_min_score = this.view.$(SELECTORS.entrance_exam_min_score);
|
|
|
|
//input some invalid values.
|
|
expect(entrance_exam_min_score.val('101').trigger('input')).toHaveClass("error");
|
|
expect(entrance_exam_min_score.val('invalidVal').trigger('input')).toHaveClass("error");
|
|
|
|
});
|
|
|
|
it('should provide a default value for the minimum score percentage', function(){
|
|
|
|
var entrance_exam_min_score = this.view.$(SELECTORS.entrance_exam_min_score);
|
|
|
|
//if input an empty value, model should be populated with the default value.
|
|
entrance_exam_min_score.val('').trigger('input');
|
|
expect(this.model.get('entrance_exam_minimum_score_pct'))
|
|
.toEqual(this.model.defaults.entrance_exam_minimum_score_pct);
|
|
});
|
|
|
|
it('show and hide the grade requirement section when the check box is selected and deselected respectively', function(){
|
|
|
|
var entrance_exam_enabled_field = this.view.$(SELECTORS.entrance_exam_enabled_field);
|
|
|
|
// select the entrance-exam-enabled checkbox. grade requirement section should be visible.
|
|
entrance_exam_enabled_field
|
|
.prop('checked', true)
|
|
.trigger('change');
|
|
|
|
this.view.render();
|
|
expect(this.view.$(SELECTORS.grade_requirement_div)).toBeVisible();
|
|
|
|
// deselect the entrance-exam-enabled checkbox. grade requirement section should be hidden.
|
|
entrance_exam_enabled_field
|
|
.prop('checked', false)
|
|
.trigger('change');
|
|
|
|
expect(this.view.$(SELECTORS.grade_requirement_div)).toBeHidden();
|
|
|
|
});
|
|
|
|
it('should save entrance exam course details information correctly', function () {
|
|
var entrance_exam_minimum_score_pct = '60',
|
|
entrance_exam_enabled = 'true',
|
|
entrance_exam_min_score = this.view.$(SELECTORS.entrance_exam_min_score),
|
|
entrance_exam_enabled_field = this.view.$(SELECTORS.entrance_exam_enabled_field);
|
|
|
|
var requests = AjaxHelpers.requests(this),
|
|
expectedJson = $.extend(true, {}, modelData, {
|
|
entrance_exam_enabled: entrance_exam_enabled,
|
|
entrance_exam_minimum_score_pct: entrance_exam_minimum_score_pct
|
|
});
|
|
|
|
// select the entrance-exam-enabled checkbox.
|
|
entrance_exam_enabled_field
|
|
.prop('checked', true)
|
|
.trigger('change');
|
|
|
|
// input a valid value for entrance exam minimum score.
|
|
entrance_exam_min_score.val(entrance_exam_minimum_score_pct).trigger('input');
|
|
|
|
this.view.saveView();
|
|
AjaxHelpers.expectJsonRequest(
|
|
requests, 'POST', urlRoot, expectedJson
|
|
);
|
|
AjaxHelpers.respondWithJson(requests, expectedJson);
|
|
});
|
|
|
|
it('should save language as part of course details', function(){
|
|
var requests = AjaxHelpers.requests(this);
|
|
var expectedJson = $.extend(true, {}, modelData, {
|
|
language: 'en',
|
|
});
|
|
$('#course-language').val('en').trigger('change');
|
|
expect(this.model.get('language')).toEqual('en');
|
|
this.view.saveView();
|
|
AjaxHelpers.expectJsonRequest(
|
|
requests, 'POST', urlRoot, expectedJson
|
|
);
|
|
});
|
|
|
|
it('should not error if about_page_editable is False', function(){
|
|
var requests = AjaxHelpers.requests(this);
|
|
// if about_page_editable is false, there is no section.course_details
|
|
$('.course_details').remove();
|
|
expect(this.model.get('language')).toEqual('');
|
|
this.view.saveView();
|
|
AjaxHelpers.expectJsonRequest(requests, 'POST', urlRoot, modelData);
|
|
});
|
|
|
|
it('should save title', function(){
|
|
var requests = AjaxHelpers.requests(this),
|
|
expectedJson = $.extend(true, {}, modelData, {
|
|
title: 'course title'
|
|
});
|
|
|
|
// Input some value.
|
|
this.view.$("#course-title").val('course title');
|
|
this.view.$("#course-title").trigger('change');
|
|
this.view.saveView();
|
|
AjaxHelpers.expectJsonRequest(
|
|
requests, 'POST', urlRoot, expectedJson
|
|
);
|
|
AjaxHelpers.respondWithJson(requests, expectedJson);
|
|
});
|
|
|
|
it('should save subtitle', function(){
|
|
var requests = AjaxHelpers.requests(this),
|
|
expectedJson = $.extend(true, {}, modelData, {
|
|
subtitle: 'course subtitle'
|
|
});
|
|
|
|
// Input some value.
|
|
this.view.$("#course-subtitle").val('course subtitle');
|
|
this.view.$("#course-subtitle").trigger('change');
|
|
this.view.saveView();
|
|
AjaxHelpers.expectJsonRequest(
|
|
requests, 'POST', urlRoot, expectedJson
|
|
);
|
|
AjaxHelpers.respondWithJson(requests, expectedJson);
|
|
});
|
|
|
|
it('should save duration', function(){
|
|
var requests = AjaxHelpers.requests(this),
|
|
expectedJson = $.extend(true, {}, modelData, {
|
|
duration: '8 weeks'
|
|
});
|
|
|
|
// Input some value.
|
|
this.view.$("#course-duration").val('8 weeks');
|
|
this.view.$("#course-duration").trigger('change');
|
|
this.view.saveView();
|
|
AjaxHelpers.expectJsonRequest(
|
|
requests, 'POST', urlRoot, expectedJson
|
|
);
|
|
AjaxHelpers.respondWithJson(requests, expectedJson);
|
|
});
|
|
|
|
it('should save description', function(){
|
|
var requests = AjaxHelpers.requests(this),
|
|
expectedJson = $.extend(true, {}, modelData, {
|
|
description: 'course description'
|
|
});
|
|
|
|
// Input some value.
|
|
this.view.$("#course-description").val('course description');
|
|
this.view.$("#course-description").trigger('change');
|
|
this.view.saveView();
|
|
AjaxHelpers.expectJsonRequest(
|
|
requests, 'POST', urlRoot, expectedJson
|
|
);
|
|
AjaxHelpers.respondWithJson(requests, expectedJson);
|
|
});
|
|
|
|
it('can add learning information', function () {
|
|
this.view.$(SELECTORS.add_course_learning_info).click();
|
|
expect('click').not.toHaveBeenPreventedOn(SELECTORS.add_course_learning_info);
|
|
expect(this.model.get('learning_info').length).toEqual(2);
|
|
this.view.$(SELECTORS.add_course_learning_info).click();
|
|
expect(this.model.get('learning_info').length).toEqual(3);
|
|
});
|
|
|
|
it('can delete learning information', function () {
|
|
for (var i = 0 ; i < 2; i++) {
|
|
this.view.$(SELECTORS.add_course_learning_info).click();
|
|
}
|
|
expect(this.model.get('learning_info').length).toEqual(3);
|
|
expect(this.view.$(SELECTORS.delete_course_learning_info)).toExist();
|
|
this.view.$(SELECTORS.delete_course_learning_info).click();
|
|
expect(this.model.get('learning_info').length).toEqual(2);
|
|
});
|
|
|
|
it('can save learning information', function () {
|
|
expect(this.model.get('learning_info').length).toEqual(1);
|
|
var requests = AjaxHelpers.requests(this),
|
|
expectedJson = $.extend(true, {}, modelData, {
|
|
learning_info: ['testing info']
|
|
});
|
|
|
|
// Input some value.
|
|
this.view.$("#course-learning-info-0").val('testing info');
|
|
this.view.$("#course-learning-info-0").trigger('change');
|
|
|
|
this.view.saveView();
|
|
AjaxHelpers.expectJsonRequest(
|
|
requests, 'POST', urlRoot, expectedJson
|
|
);
|
|
AjaxHelpers.respondWithJson(requests, expectedJson);
|
|
});
|
|
|
|
it('can add instructor information', function () {
|
|
this.view.$(SELECTORS.add_course_instructor_info).click();
|
|
expect(this.model.get('instructor_info').instructors.length).toEqual(2);
|
|
this.view.$(SELECTORS.add_course_instructor_info).click();
|
|
expect(this.model.get('instructor_info').instructors.length).toEqual(3);
|
|
|
|
});
|
|
|
|
it('can delete instructor information', function () {
|
|
this.view.$(SELECTORS.add_course_instructor_info).click();
|
|
expect(this.model.get('instructor_info').instructors.length).toEqual(2);
|
|
expect(this.view.$(SELECTORS.remove_instructor_data)).toExist();
|
|
this.view.$(SELECTORS.remove_instructor_data).click();
|
|
expect(this.model.get('instructor_info').instructors.length).toEqual(1);
|
|
});
|
|
|
|
it('can save instructor information', function () {
|
|
var requests = AjaxHelpers.requests(this),
|
|
expectedJson = $.extend(true, {}, modelData, {
|
|
instructor_info: {
|
|
instructors:
|
|
[{
|
|
"name": "test_name",
|
|
"title": "test_title",
|
|
"organization": "test_org",
|
|
"image": "test_image",
|
|
"bio": "test_bio"
|
|
}]
|
|
}
|
|
});
|
|
|
|
// Input some value.
|
|
this.view.$("#course-instructor-name-0").val('test_name').trigger('change');
|
|
this.view.$("#course-instructor-title-0").val('test_title').trigger('change');
|
|
this.view.$("#course-instructor-organization-0").val('test_org').trigger('change');
|
|
this.view.$("#course-instructor-bio-0").val('test_bio').trigger('change');
|
|
this.view.$("#course-instructor-image-0").val('test_image').trigger('change');
|
|
|
|
this.view.saveView();
|
|
AjaxHelpers.expectJsonRequest(
|
|
requests, 'POST', urlRoot, expectedJson
|
|
);
|
|
AjaxHelpers.respondWithJson(requests, expectedJson);
|
|
|
|
});
|
|
});
|
|
});
|