Commit 841d1a03 by Muhammad Shoaib

added the following work

- Jasmine tests Setup
- proctored exam view jasmine tests
parent 6c6236b3
...@@ -53,3 +53,4 @@ coverage/ ...@@ -53,3 +53,4 @@ coverage/
htmlcov/ htmlcov/
acceptance_tests/*.png acceptance_tests/*.png
node_modules/
\ No newline at end of file
...@@ -12,12 +12,14 @@ before_install: ...@@ -12,12 +12,14 @@ before_install:
sudo: false sudo: false
install: install:
- npm install
- "pip install -r requirements.txt" - "pip install -r requirements.txt"
- "pip install -r test_requirements.txt" - "pip install -r test_requirements.txt"
- "pip install coveralls" - "pip install coveralls"
script: script:
- coverage run ./manage.py test edx_proctoring - coverage run ./manage.py test edx_proctoring
- gulp test
- coverage report -m - coverage report -m
- pep8 edx_proctoring - pep8 edx_proctoring
- pylint edx_proctoring --report=no - pylint edx_proctoring --report=no
......
window.gettext = function(s){return s;};
window.ngettext = function(singular, plural, num){ return num == 1 ? singular : plural }
function interpolate(fmt, obj, named) {
if (named) {
return fmt.replace(/%\(\w+\)s/g, function(match){return String(obj[match.slice(2,-2)])});
} else {
return fmt.replace(/%s/g, function(match){return String(obj.shift())});
}
}
...@@ -95,6 +95,9 @@ var edx = edx || {}; ...@@ -95,6 +95,9 @@ var edx = edx || {};
} }
return this; return this;
}, },
reloadPage: function () {
location.reload();
},
unloadMessage: function () { unloadMessage: function () {
return gettext("Are you sure you want to leave this page? \n" + return gettext("Are you sure you want to leave this page? \n" +
"To pass your proctored exam you must submit your \n" + "To pass your proctored exam you must submit your \n" +
...@@ -122,7 +125,7 @@ var edx = edx || {}; ...@@ -122,7 +125,7 @@ var edx = edx || {};
clearInterval(self.timerId); // stop the timer once the time finishes. clearInterval(self.timerId); // stop the timer once the time finishes.
$(window).unbind('beforeunload', this.unloadMessage); $(window).unbind('beforeunload', this.unloadMessage);
// refresh the page when the timer expired // refresh the page when the timer expired
location.reload(); this.reloadPage()
} }
} }
}); });
......
define(['jquery', 'backbone', 'common/js/spec_helpers/template_helpers', 'js/courseware/base/models/proctored_exam_model', 'js/courseware/base/views/proctored_exam_view' describe('ProctoredExamView', function () {
], function($, Backbone, TemplateHelpers, ProctoredExamModel, ProctoredExamView) { beforeEach(function () {
'use strict'; this.server = sinon.fakeServer.create();
jasmine.clock().install();
describe('Proctored Exam', function () { setFixtures(
'<div class="proctored_exam_status">' +
beforeEach(function () { '<script type="text/template" id="proctored-exam-status-tpl">' +
this.model = new ProctoredExamModel(); '<div class="exam-timer">' +
}); '<%- gettext("You are taking") %>' +
'<a href="<%= exam_url_path %>"> <%= exam_display_name %> </a>' +
it('model has properties', function () { '<%- gettext(" exam as a proctored exam. Good Luck!") %>' +
expect(this.model.get('in_timed_exam')).toBeDefined(); '<span id="time_remaining_id" class="pull-right"> <b> </b> </span> </div>' +
expect(this.model.get('is_proctored')).toBeDefined(); '</script>'+
expect(this.model.get('exam_display_name')).toBeDefined(); '</div>'
expect(this.model.get('exam_url_path')).toBeDefined(); );
expect(this.model.get('time_remaining_seconds')).toBeDefined(); this.model = new ProctoredExamModel({
expect(this.model.get('low_threshold')).toBeDefined(); in_timed_exam: true,
expect(this.model.get('critically_low_threshold')).toBeDefined(); is_proctored: true,
expect(this.model.get('lastFetched')).toBeDefined(); exam_display_name: 'Midterm',
taking_as_proctored: true,
exam_url_path: '/test_url',
time_remaining_seconds: 45, //2 * 60 + 15,
low_threshold_sec: 30,
attempt_id: 2,
critically_low_threshold_sec: 15,
lastFetched: new Date()
}); });
this.proctored_exam_view = new edx.coursware.proctored_exam.ProctoredExamView(
{
model: this.model,
el: $(".proctored_exam_status"),
proctored_template: '#proctored-exam-status-tpl'
}
);
this.proctored_exam_view.render();
}); });
describe('ProctoredExamView', function () { afterEach(function() {
beforeEach(function () { this.server.restore();
TemplateHelpers.installTemplate('templates/courseware/proctored-exam-status', true, 'proctored-exam-status-tpl'); jasmine.clock().uninstall();
appendSetFixtures('<div class="proctored_exam_status"></div>'); });
this.model = new ProctoredExamModel({
in_timed_exam: true,
is_proctored: true,
exam_display_name: 'Midterm',
exam_url_path: '/test_url',
time_remaining_seconds: 45, //2 * 60 + 15,
low_threshold: 30,
critically_low_threshold: 15,
lastFetched: new Date()
});
this.proctored_exam_view = new edx.coursware.proctored_exam.ProctoredExamView( it('renders items correctly', function () {
{ expect(this.proctored_exam_view.$el.find('a')).toHaveAttr('href', this.model.get("exam_url_path"));
model: this.model, expect(this.proctored_exam_view.$el.find('a')).toContainHtml(this.model.get('exam_display_name'));
el: $(".proctored_exam_status"), });
proctored_template: '#proctored-exam-status-tpl' it('changes behavior when clock time decreases low threshold', function () {
} spyOn(this.model, 'getRemainingSeconds').and.callFake(function() {
); return 25;
this.proctored_exam_view.render();
}); });
expect(this.model.getRemainingSeconds()).toEqual(25);
expect(this.proctored_exam_view.$el.find('div.exam-timer')).not.toHaveClass('low-time warning');
this.proctored_exam_view.render();
it('renders items correctly', function () { expect(this.proctored_exam_view.$el.find('div.exam-timer')).toHaveClass('low-time warning');
expect(this.proctored_exam_view.$el.find('a')).toHaveAttr('href', this.model.get("exam_url_path")); });
expect(this.proctored_exam_view.$el.find('a')).toContainHtml(this.model.get('exam_display_name')); it('changes behavior when clock time decreases critically low threshold', function () {
}); spyOn(this.model, 'getRemainingSeconds').and.callFake(function () {
it('changes behavior when clock time decreases low threshold', function () { return 5;
spyOn(this.model, 'getRemainingSeconds').andCallFake(function () {
return 25;
});
expect(this.model.getRemainingSeconds()).toEqual(25);
expect(this.proctored_exam_view.$el.find('div.exam-timer')).not.toHaveClass('low-time warning');
this.proctored_exam_view.render();
expect(this.proctored_exam_view.$el.find('div.exam-timer')).toHaveClass('low-time warning');
}); });
it('changes behavior when clock time decreases critically low threshold', function () { expect(this.model.getRemainingSeconds()).toEqual(5);
spyOn(this.model, 'getRemainingSeconds').andCallFake(function () { expect(this.proctored_exam_view.$el.find('div.exam-timer')).not.toHaveClass('low-time critical');
return 5; this.proctored_exam_view.render();
}); expect(this.proctored_exam_view.$el.find('div.exam-timer')).toHaveClass('low-time critical');
expect(this.model.getRemainingSeconds()).toEqual(5); });
expect(this.proctored_exam_view.$el.find('div.exam-timer')).not.toHaveClass('low-time critical'); it("reload the page when the exam time finishes", function(){
this.proctored_exam_view.render(); spyOn(this.model, 'getRemainingSeconds').and.callFake(function() {
expect(this.proctored_exam_view.$el.find('div.exam-timer')).toHaveClass('low-time critical'); return -10;
}); });
expect(this.model.getRemainingSeconds()).toEqual(-10);
var reloadPage = spyOn(this.proctored_exam_view, 'reloadPage');
this.proctored_exam_view.render();
expect(reloadPage).toHaveBeenCalled();
}); });
}); });
var gulp = require('gulp');
var karma = require('karma').server;
var coverageOnOff = 'coverage';
/**
* Run test once and exit
*/
gulp.task('test', function (done) {
karma.start({
configFile: __dirname + '/karma.conf.js',
singleRun: true
}, done);
});
/**
* Watch for file changes and re-run tests on each change
*/
gulp.task('tdd', function (done) {
karma.start({
configFile: __dirname + '/karma.conf.js'
}, done);
});
gulp.task('default', ['tdd']);
/**
* Run test in debug mode
*/
gulp.task('debug', function (done) {
karma.start({
configFile: __dirname + '/karma.conf.js',
singleRun: false
}, done);
});
\ No newline at end of file
//Add ability to turn coverage off when the tests are run in debug mode
var sourcePreprocessors = 'coverage';
function isDebug(argument) {
return argument === 'debug';
}
if (process.argv.some(isDebug)) {
sourcePreprocessors = [];
}
module.exports = function(config) {
config.set({
basePath: '',
//plugins required for running the karma tests
plugins:[
'karma-jasmine',
'karma-jasmine-jquery',
'karma-firefox-launcher',
'karma-phantomjs-launcher',
'karma-chrome-launcher',
'karma-coverage',
'karma-sinon'
],
// start the browser
browsers: ['Firefox'],
//frameworks to use
frameworks: ['jasmine-jquery', 'jasmine', 'sinon'],
//patterns to load all files in child folders
files: [
'edx_proctoring/static/proctoring/js/vendor/i18n.js',
'edx_proctoring/static/proctoring/js/vendor/jquery.js',
'edx_proctoring/static/proctoring/js/vendor/underscore.js',
'edx_proctoring/static/proctoring/js/vendor/backbone.js',
'edx_proctoring/static/proctoring/js/vendor/date.js',
'edx_proctoring/static/proctoring/js/models/*.js',
'edx_proctoring/static/proctoring/js/collections/*.js',
'edx_proctoring/static/proctoring/js/views/*.js',
'edx_proctoring/static/proctoring/spec/*.js'
],
// preprocess matching files before serving them to the browser
// available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
preprocessors: {
'edx_proctoring/static/proctoring/js/models/*.js': sourcePreprocessors,
'edx_proctoring/static/proctoring/js/collections/*.js': sourcePreprocessors,
'edx_proctoring/static/proctoring/js/views/*.js': sourcePreprocessors
},
// test results reporter to use
// possible values: 'dots', 'progress'
// available reporters: https://npmjs.org/browse/keyword/karma-reporter
reporters: ['progress', 'coverage'],
coverageReporter: {
dir:'build', subdir: 'coverage-js',
reporters:[
{type: 'html', subdir: 'coverage-js/html'},
{type: 'cobertura', file: 'coverage.xml'},
{type: 'text-summary'}
]
},
// enable / disable colors in the output (reporters and logs)
colors: true,
// level of logging
// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
logLevel: config.LOG_INFO,
// enable / disable watching file and executing tests whenever any file changes
autoWatch: true,
captureTimeout: 60000,
// Continuous Integration mode
// if true, Karma captures browsers, runs the tests and exits
singleRun: false
});
};
{
"name": "edx-proctoring",
"repository": {
"type": "git",
"url": "git://github.com/edx/edx-proctoring"
},
"devDependencies": {
"gulp": "latest",
"gulp-karma": "latest",
"karma": "latest",
"karma-chrome-launcher": "latest",
"karma-coverage": "latest",
"karma-firefox-launcher": "latest",
"karma-jasmine": "latest",
"karma-jasmine-jquery": "latest",
"karma-phantomjs-launcher": "latest",
"karma-sinon": "latest",
"karma-spec-reporter": "latest"
}
}
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