Commit 4e7c309d by Will Daly

Merge pull request #798 from edx/will/js-test-tool-squashed

Integrate js-test-tool into testing infrastructure
parents 4e7885a2 fe727309
"""
This configuration is used for running jasmine tests
"""
# We intentionally define lots of variables that aren't used, and
# want to import all variables from base settings files
# pylint: disable=W0401, W0614
from .test import *
from logsettings import get_logger_config
ENABLE_JASMINE = True
DEBUG = True
LOGGING = get_logger_config(TEST_ROOT / "log",
logging_env="dev",
tracking_filename="tracking.log",
dev_env=True,
debug=True,
local_loglevel='ERROR',
console_loglevel='ERROR')
PIPELINE_JS['js-test-source'] = {
'source_filenames': sum([
pipeline_group['source_filenames']
for group_name, pipeline_group
in sorted(PIPELINE_JS.items(), key=lambda item: item[1].get('test_order', 1e100))
if group_name != 'spec'
], []),
'output_filename': 'js/cms-test-source.js'
}
PIPELINE_JS['spec'] = {
'source_filenames': sorted(rooted_glob(PROJECT_ROOT / 'static/', 'coffee/spec/**/*.js')),
'output_filename': 'js/cms-spec.js'
}
JASMINE_TEST_DIRECTORY = PROJECT_ROOT + '/static/coffee'
JASMINE_REPORT_DIR = os.environ.get('JASMINE_REPORT_DIR', 'reports/cms/jasmine')
TEMPLATE_CONTEXT_PROCESSORS += ('settings_context_processor.context_processors.settings',)
TEMPLATE_VISIBLE_SETTINGS = ('JASMINE_REPORT_DIR', )
STATICFILES_DIRS.append(REPO_ROOT/'node_modules/phantom-jasmine/lib')
STATICFILES_DIRS.append(REPO_ROOT/'node_modules/jasmine-reporters/src')
# Remove the localization middleware class because it requires the test database
# to be sync'd and migrated in order to run the jasmine tests interactively
# with a browser
MIDDLEWARE_CLASSES = tuple(e for e in MIDDLEWARE_CLASSES \
if e != 'django.middleware.locale.LocaleMiddleware')
INSTALLED_APPS += ('django_jasmine', 'settings_context_processor')
{
"static_files": [
"../jsi18n/",
"js/vendor/RequireJS.js",
"js/vendor/jquery.min.js",
"js/vendor/jquery-ui.min.js",
"js/vendor/jquery.ui.draggable.js",
"js/vendor/jquery.cookie.js",
"js/vendor/json2.js",
"js/vendor/underscore-min.js",
"js/vendor/underscore.string.min.js",
"js/vendor/backbone-min.js",
"js/vendor/backbone-associations-min.js",
"js/vendor/jquery.leanModal.min.js",
"js/vendor/jquery.form.js",
"js/vendor/sinon-1.7.1.js",
"js/vendor/jasmine-stealth.js",
"js/test/i18n.js"
]
}
jasmine.getFixtures().fixturesPath = 'fixtures'
jasmine.getFixtures().fixturesPath += 'coffee/fixtures'
# Stub jQuery.cookie
@stubCookies =
......
---
# JavaScript test suite description
#
#
# To run all the tests and print results to the console:
#
# js-test-tool run TEST_SUITE --use-firefox
#
# where `TEST_SUITE` is this file.
#
#
# To run the tests in your default browser ("dev mode"):
#
# js-test-tool dev TEST_SUITE
#
test_suite_name: cms
test_runner: jasmine
# Path prepended to source files in the coverage report (optional)
# For example, if the source path
# is "src/source.js" (relative to this YAML file)
# and the prepend path is "base/dir"
# then the coverage report will show
# "base/dir/src/source.js"
prepend_path: cms/static
# Paths to library JavaScript files (optional)
lib_paths:
- xmodule_js/common_static/coffee/src/ajax_prefix.js
- xmodule_js/common_static/coffee/src/logger.js
- xmodule_js/common_static/js/vendor/RequireJS.js
- xmodule_js/common_static/js/vendor/json2.js
- xmodule_js/common_static/js/vendor/jquery.min.js
- xmodule_js/common_static/js/vendor/jquery-ui.min.js
- xmodule_js/common_static/js/vendor/jquery.cookie.js
- xmodule_js/common_static/js/vendor/jquery.qtip.min.js
- xmodule_js/common_static/js/vendor/swfobject/swfobject.js
- xmodule_js/common_static/js/vendor/jquery.ba-bbq.min.js
- xmodule_js/common_static/js/vendor/annotator.min.js
- xmodule_js/common_static/js/vendor/annotator.store.min.js
- xmodule_js/common_static/js/vendor/annotator.tags.min.js
- xmodule_js/common_static/js/vendor/underscore-min.js
- xmodule_js/common_static/js/vendor/underscore.string.min.js
- xmodule_js/common_static/js/vendor/backbone-min.js
- xmodule_js/common_static/js/vendor/backbone-associations-min.js
- xmodule_js/common_static/js/vendor/timepicker/jquery.timepicker.js
- xmodule_js/common_static/js/vendor/jquery.leanModal.min.js
- xmodule_js/common_static/js/vendor/jquery.form.js
- xmodule_js/common_static/js/vendor/sinon-1.7.1.js
- xmodule_js/common_static/js/vendor/jasmine-jquery.js
- xmodule_js/common_static/js/vendor/jasmine-stealth.js
- xmodule_js/src/xmodule.js
- xmodule_js/src
- xmodule_js/common_static/js/test/add_ajax_prefix.js
# Paths to source JavaScript files
src_paths:
- coffee/src
- js
# Paths to spec (test) JavaScript files
spec_paths:
- coffee/spec/helpers.js
- coffee/spec
# Paths to fixture files (optional)
# The fixture path will be set automatically when using jasmine-jquery.
# (https://github.com/velesin/jasmine-jquery)
#
# You can then access fixtures using paths relative to
# the test suite description:
#
# loadFixtures('path/to/fixture/fixture.html');
#
fixture_paths:
- coffee/fixtures
# Regular expressions used to exclude *.js files from
# appearing in the test runner page.
# Files are included by default, which means that they
# are loaded using a <script> tag in the test runner page.
# When loading many files, this can be slow, so
# exclude any files you don't need.
#exclude_from_page:
# - path/to/lib/exclude/*
# Regular expression used to guarantee that a *.js file
# is included in the test runner page.
# If a file name matches both `exclude_from_page` and
# `include_in_page`, the file WILL be included.
# You can use this to exclude all files in a directory,
# but make an exception for particular files.
#include_in_page:
# - path/to/lib/exclude/exception_*.js
../../common/lib/xmodule/xmodule/js/
\ No newline at end of file
......@@ -135,10 +135,6 @@ urlpatterns += (
url(r'^jsi18n/$', 'django.views.i18n.javascript_catalog', js_info_dict),
)
if settings.ENABLE_JASMINE:
urlpatterns += (url(r'^_jasmine/', include('django_jasmine.urls')),)
if settings.MITX_FEATURES.get('ENABLE_SERVICE_STATUS'):
urlpatterns += (
url(r'^status/', include('service_status.urls')),
......
../../../../static/
\ No newline at end of file
......@@ -9,9 +9,9 @@
data-end=""
data-caption-asset-path="/static/subs/"
data-sub="Z5KLxerq05Y"
data-mp4-source="test_files/test.mp4"
data-webm-source="test_files/test.webm"
data-ogg-source="test_files/test.ogv"
data-mp4-source="xmodule/include/fixtures/test.mp4"
data-webm-source="xmodule/include/fixtures/test.webm"
data-ogg-source="xmodule/include/fixtures/test.ogv"
data-autoplay="False"
>
<div class="tc-wrapper">
......@@ -55,4 +55,4 @@
</div>
</div>
</div>
</div>
\ No newline at end of file
</div>
......@@ -9,9 +9,9 @@
data-end=""
data-caption-asset-path="/static/subs/"
data-sub="Z5KLxerq05Y"
data-mp4-source="test_files/test.mp4"
data-webm-source="test_files/test.webm"
data-ogg-source="test_files/test.ogv"
data-mp4-source="xmodule/include/fixtures/test.mp4"
data-webm-source="xmodule/include/fixtures/test.webm"
data-ogg-source="xmodule/include/fixtures/test.ogv"
data-autoplay="False"
>
<div class="tc-wrapper">
......@@ -27,4 +27,4 @@
</div>
</div>
</div>
</div>
\ No newline at end of file
</div>
---
# JavaScript test suite description
#
#
# To run all the tests and print results to the console:
#
# js-test-tool run TEST_SUITE --use-firefox
#
# where `TEST_SUITE` is this file.
#
#
# To run the tests in your default browser ("dev mode"):
#
# js-test-tool dev TEST_SUITE
#
test_suite_name: xmodule
test_runner: jasmine
# Path prepended to source files in the coverage report (optional)
# For example, if the source path
# is "src/source.js" (relative to this YAML file)
# and the prepend path is "base/dir"
# then the coverage report will show
# "base/dir/src/source.js"
prepend_path: common/lib/xmodule/xmodule/js
# Paths to source JavaScript files
src_paths:
- src/xmodule.js
- src
# Paths to library JavaScript files (optional)
lib_paths:
- common_static/coffee/src/ajax_prefix.js
- common_static/coffee/src/logger.js
- common_static/js/vendor/jasmine-jquery.js
- common_static/js/vendor/RequireJS.js
- common_static/js/vendor/jquery.min.js
- common_static/js/vendor/jquery-ui.min.js
- common_static/js/vendor/jquery.ui.draggable.js
- common_static/js/vendor/jquery.cookie.js
- common_static/js/vendor/json2.js
- common_static/js/vendor/underscore-min.js
- common_static/js/vendor/backbone-min.js
- common_static/js/vendor/jquery.leanModal.min.js
- common_static/js/vendor/CodeMirror/codemirror.js
- common_static/js/vendor/tiny_mce/jquery.tinymce.js
- common_static/js/vendor/tiny_mce/tiny_mce.js
- common_static/js/vendor/mathjax-MathJax-c9db6ac/MathJax.js
- common_static/js/vendor/jquery.timeago.js
- common_static/js/vendor/sinon-1.7.1.js
- common_static/js/vendor/analytics.js
- common_static/js/test/add_ajax_prefix.js
# Paths to spec (test) JavaScript files
spec_paths:
- spec/helper.js
- spec
# Paths to fixture files (optional)
fixture_paths:
- fixtures
......@@ -6,4 +6,4 @@ describe 'Annotatable', ->
beforeEach ->
@annotatable = new Annotatable(el)
it 'works', ->
expect(1).toBe(1)
\ No newline at end of file
expect(1).toBe(1)
......@@ -14,7 +14,6 @@ describe 'Problem', ->
# this msg is coming from the stubRequests function else clause.
jasmine.stubRequests()
# note that the fixturesPath is set in spec/helper.coffee
loadFixtures 'problem.html'
spyOn Logger, 'log'
......
......@@ -60,7 +60,7 @@ window.jQuery.ajaxWithPrefix = (url, settings) ->
# Time waitsFor() should wait for before failing a test.
window.WAIT_TIMEOUT = 1000
jasmine.getFixtures().fixturesPath = 'xmodule/js/fixtures'
jasmine.getFixtures().fixturesPath += 'fixtures'
jasmine.stubbedMetadata =
'7tqY6eQzVhE':
......
......@@ -117,4 +117,4 @@ describe 'HTMLEditingDescriptor', ->
expect(@descriptor.showingVisualEditor).toEqual(true)
expect(visualEditorStub.isDirty()).toEqual(false)
expect(visualEditorStub.getContent()).toEqual('Advanced Editor Text with link /c4x/foo/bar/asset/dummy.jpg')
expect(visualEditorStub.startContent).toEqual('Advanced Editor Text with link /c4x/foo/bar/asset/dummy.jpg')
\ No newline at end of file
expect(visualEditorStub.startContent).toEqual('Advanced Editor Text with link /c4x/foo/bar/asset/dummy.jpg')
(function () {
xdescribe('Video', function () {
describe('Video', function () {
var oldOTBD;
beforeEach(function () {
......@@ -154,9 +154,9 @@
it('parse Html5 sources', function () {
var html5Sources = {
mp4: 'test_files/test.mp4',
webm: 'test_files/test.webm',
ogg: 'test_files/test.ogv'
mp4: 'xmodule/include/fixtures/test.mp4',
webm: 'xmodule/include/fixtures/test.webm',
ogg: 'xmodule/include/fixtures/test.ogv'
};
expect(state.html5Sources).toEqual(html5Sources);
......
(function () {
xdescribe('Video HTML5Video', function () {
describe('Video HTML5Video', function () {
var state, player, oldOTBD, playbackRates = [0.75, 1.0, 1.25, 1.5];
function initialize() {
......@@ -40,7 +40,10 @@
expect(player.video.play).toHaveBeenCalled();
});
it('player state was changed', function () {
// Temporarily disabled due to intermittent failures
// Fails with "timeout: timed out after 1000 msec waiting for Player state should be changed"
// on Firefox
xit('player state was changed', function () {
waitsFor(function () {
return player.getPlayerState() !== STATUS.PAUSED;
}, 'Player state should be changed', WAIT_TIMEOUT);
......
Jasmine JavaScript tests status
-------------------------------
As of 22.07.2013, all the tests in this directory pass. To enable a test file, change
the top level "xdescribe(" to "describe(".
PS: When you are running the tests in chrome locally, make sure that chrome is started
with the option "--allow-file-access-from-files".
(function() {
xdescribe('VideoCaption', function() {
describe('VideoCaption', function() {
var state, videoPlayer, videoCaption, videoSpeedControl, oldOTBD;
function initialize() {
......@@ -130,6 +130,7 @@
describe('mouse movement', function() {
beforeEach(function() {
window.setTimeout = jasmine.createSpy().andCallFake(function(callback, timeout) { return 5; })
window.setTimeout.andReturn(100);
spyOn(window, 'clearTimeout');
});
......@@ -349,7 +350,9 @@
});
describe('set the height of caption container', function(){
it('when CC button is enabled', function() {
// Temporarily disabled due to intermittent failures
// with error "Expected 745 to be close to 805, 2." in Firefox
xit('when CC button is enabled', function() {
var realHeight = parseInt($('.subtitles').css('maxHeight'), 10),
shouldBeHeight = $('.video-wrapper').height();
......@@ -442,7 +445,12 @@
$('.subtitles li[data-start="14910"]').trigger('click');
});
it('trigger seek event with the correct time', function() {
// Temporarily disabled due to intermittent failures
// Fails with error: "InvalidStateError: An attempt was made to
// use an object that is not, or is no longer, usable
// Expected 0 to equal 14.91."
// on Firefox
xit('trigger seek event with the correct time', function() {
expect(videoPlayer.currentTime).toEqual(14.91);
});
});
......
(function() {
xdescribe('VideoControl', function() {
describe('VideoControl', function() {
var state, videoControl, oldOTBD;
function initialize() {
......
(function() {
xdescribe('VideoPlayer', function() {
describe('VideoPlayer', function() {
var state, videoPlayer, player, videoControl, videoCaption, videoProgressSlider, videoSpeedControl, videoVolumeControl, oldOTBD;
function initialize(fixture) {
......
(function() {
xdescribe('VideoProgressSlider', function() {
describe('VideoProgressSlider', function() {
var state, videoPlayer, videoProgressSlider, oldOTBD;
function initialize() {
......
(function() {
xdescribe('VideoQualityControl', function() {
describe('VideoQualityControl', function() {
var state, videoControl, videoQualityControl, oldOTBD;
function initialize() {
......
(function() {
xdescribe('VideoSpeedControl', function() {
describe('VideoSpeedControl', function() {
var state, videoPlayer, videoControl, videoSpeedControl;
function initialize() {
......
(function() {
xdescribe('VideoVolumeControl', function() {
describe('VideoVolumeControl', function() {
var state, videoControl, videoVolumeControl, oldOTBD;
function initialize() {
......
// Tests require that addAjaxPrefix is called
// before the tests are run.
AjaxPrefix.addAjaxPrefix(jQuery, function() {
return "";
});
---
# JavaScript test suite description
#
#
# To run all the tests and print results to the console:
#
# js-test-tool run TEST_SUITE --use-firefox
#
# where `TEST_SUITE` is this file.
#
#
# To run the tests in your default browser ("dev mode"):
#
# js-test-tool dev TEST_SUITE
#
test_suite_name: common
test_runner: jasmine
# Path prepended to source files in the coverage report (optional)
# For example, if the source path
# is "src/source.js" (relative to this YAML file)
# and the prepend path is "base/dir"
# then the coverage report will show
# "base/dir/src/source.js"
prepend_path: common/static
# Paths to library JavaScript files (optional)
lib_paths:
- coffee/src/ajax_prefix.js
- coffee/src/logger.js
- js/vendor/jasmine-jquery.js
- js/vendor/RequireJS.js
- js/vendor/jquery.min.js
- js/vendor/jquery-ui.min.js
- js/vendor/jquery.ui.draggable.js
- js/vendor/jquery.cookie.js
- js/vendor/json2.js
- js/vendor/underscore-min.js
- js/vendor/backbone-min.js
- js/vendor/jquery.leanModal.min.js
- js/vendor/CodeMirror/codemirror.js
- js/vendor/tiny_mce/jquery.tinymce.js
- js/vendor/tiny_mce/tiny_mce.js
- js/vendor/mathjax-MathJax-c9db6ac/MathJax.js
- js/vendor/jquery.timeago.js
- js/vendor/sinon-1.7.1.js
- js/vendor/analytics.js
- js/test/add_ajax_prefix.js
# Paths to source JavaScript files
src_paths:
- coffee/src
# Paths to spec (test) JavaScript files
spec_paths:
- coffee/spec
# Regular expressions used to exclude *.js files from
# appearing in the test runner page.
# Files are included by default, which means that they
# are loaded using a <script> tag in the test runner page.
# When loading many files, this can be slow, so
# exclude any files you don't need.
#exclude_from_page:
# - path/to/lib/exclude/*
# Regular expression used to guarantee that a *.js file
# is included in the test runner page.
# If a file name matches both `exclude_from_page` and
# `include_in_page`, the file WILL be included.
# You can use this to exclude all files in a directory,
# but make an exception for particular files.
#include_in_page:
# - path/to/lib/exclude/exception_*.js
# Paths to fixture files (optional)
# You can access these within JavaScript code
# at the URL: document.location.href + "/include/"
# plus the path to the file (relative to this YAML file)
#fixture_paths:
# - path/to/fixture
......@@ -166,43 +166,29 @@ then browse reports/common/lib/xmodule/cover/index.html
Very handy: if you uncomment the `pdb=1` line in `setup.cfg`, it will drop you into pdb on error. This lets you go up and down the stack and see what the values of the variables are. Check out [the pdb documentation](http://docs.python.org/library/pdb.html)
### Running Javascript Unit Tests
To run all of the javascript unit tests, use
rake jasmine
If the `phantomjs` binary is on the path, or the `PHANTOMJS_PATH` environment variable is
set to point to it, then the tests will be run headless. Otherwise, they will be run in
your default browser
export PATH=/path/to/phantomjs:$PATH
rake jasmine # Runs headless
or
PHANTOMJS_PATH=/path/to/phantomjs rake jasmine # Runs headless
or
### Running Javascript Unit Tests
rake jasmine # Runs in browser
We use Jasmine to run JavaScript unit tests. To run all the JavaScript tests:
You can also force a run using phantomjs or the browser using the commands
rake test:js
rake jasmine:browser # Runs in browser
rake jasmine:phantomjs # Runs headless
To run a specific set of JavaScript tests and print the results to the console:
You can run tests for a specific subsystems as well
rake test:js:run[lms]
rake test:js:run[cms]
rake test:js:run[xmodule]
rake test:js:run[common]
rake jasmine:lms # Runs all lms javascript unit tests using the default method
rake jasmine:cms:browser # Runs all cms javascript unit tests in the browser
To run JavaScript tests in your default browser:
Use `rake -T` to get a list of all available subsystems
rake test:js:dev[lms]
rake test:js:dev[cms]
rake test:js:dev[xmodule]
rake test:js:dev[common]
**Troubleshooting**: If you get an error message while running the `rake` task,
try running `bundle install` to install the required ruby gems.
These rake commands call through to a custom test runner. For more info, see [js-test-tool](https://github.com/edx/js-test-tool).
Unit tests can be run in parallel to each other and while acceptance tests are running
### Running Acceptance Tests
......
......@@ -36,6 +36,13 @@ github_status state:pending "is running"
# Reset the submodule, in case it changed
git submodule foreach 'git reset --hard HEAD'
# Assumes that Xvfb has been started by upstart
# and is capturing display :1
# The command for this is:
# /usr/bin/Xvfb :1 -screen 0 1024x268x24
# This allows us to run Chrome or Firefox without a display
export DISPLAY=:1
# Set the IO encoding to UTF-8 so that askbot will start
export PYTHONIOENCODING=UTF-8
......
......@@ -28,7 +28,7 @@ TESTS_FAILED=0
# and is capturing display :1
# The command for this is:
# /usr/bin/Xvfb :1 -screen 0 1024x268x24
# This allows us to run Chrome without a display
# This allows us to run Chrome or Firefox without a display
export DISPLAY=:1
SKIP_TESTS=""
......
"""
This configuration is used for running jasmine tests
"""
# We intentionally define lots of variables that aren't used, and
# want to import all variables from base settings files
# pylint: disable=W0401, W0614
from .test import *
from logsettings import get_logger_config
ENABLE_JASMINE = True
DEBUG = True
LOGGING = get_logger_config(TEST_ROOT / "log",
logging_env="dev",
tracking_filename="tracking.log",
dev_env=True,
debug=True,
local_loglevel='ERROR',
console_loglevel='ERROR')
PIPELINE_JS['js-test-source'] = {
'source_filenames': sum([
pipeline_group['source_filenames']
for group_name, pipeline_group
in sorted(PIPELINE_JS.items(), key=lambda item: item[1].get('test_order', 1e100))
if group_name != 'spec'
], []),
'output_filename': 'js/lms-test-source.js'
}
PIPELINE_JS['spec'] = {
'source_filenames': sorted(rooted_glob(PROJECT_ROOT / 'static/', 'coffee/spec/**/*.js')),
'output_filename': 'js/lms-spec.js'
}
JASMINE_TEST_DIRECTORY = PROJECT_ROOT + '/static/coffee'
JASMINE_REPORT_DIR = os.environ.get('JASMINE_REPORT_DIR', 'reports/lms/jasmine')
TEMPLATE_CONTEXT_PROCESSORS += ('settings_context_processor.context_processors.settings',)
TEMPLATE_VISIBLE_SETTINGS = ('JASMINE_REPORT_DIR', )
STATICFILES_DIRS.append(REPO_ROOT/'node_modules/phantom-jasmine/lib')
STATICFILES_DIRS.append(REPO_ROOT/'node_modules/jasmine-reporters/src')
INSTALLED_APPS += ('django_jasmine', 'settings_context_processor')
......@@ -42,7 +42,4 @@ Simply start the server using:
Testing
-------
We're also using Jasmine to unit-testing the JavaScript files. All the specs are
written in CoffeeScript for the consistency. To access the test cases, start the
server in debug mode, navigate to http://127.0.0.1:8000/_jasmine to see the
test result.
We use Jasmine to unit-test the JavaScript files. See `docs/internal/testing.md` for details.
{
"js_files": [
"/static/js/vendor/jquery.leanModal.min.js",
"/static/js/vendor/flot/jquery.flot.js"
]
}
jasmine.getFixtures().fixturesPath = "/_jasmine/fixtures/"
jasmine.getFixtures().fixturesPath += "coffee/fixtures"
jasmine.stubbedMetadata =
slowerSpeedYoutubeId:
......
// needs Markdown.Converter.js at the moment
// needs Markdown.Converter.js at the moment
(function () {
......
---
# JavaScript test suite description
#
#
# To run all the tests and print results to the console:
#
# js-test-tool run TEST_SUITE --use-firefox
#
# where `TEST_SUITE` is this file.
#
#
# To run the tests in your default browser ("dev mode"):
#
# js-test-tool dev TEST_SUITE
#
test_suite_name: lms
test_runner: jasmine
# Path prepended to source files in the coverage report (optional)
# For example, if the source path
# is "src/source.js" (relative to this YAML file)
# and the prepend path is "base/dir"
# then the coverage report will show
# "base/dir/src/source.js"
prepend_path: lms/static
# Paths to library JavaScript files (optional)
lib_paths:
- xmodule_js/common_static/coffee/src/ajax_prefix.js
- xmodule_js/common_static/coffee/src/logger.js
- xmodule_js/common_static/js/vendor/RequireJS.js
- xmodule_js/common_static/js/vendor/json2.js
- xmodule_js/common_static/js/vendor/jquery.min.js
- xmodule_js/common_static/js/vendor/jquery-ui.min.js
- xmodule_js/common_static/js/vendor/jquery.cookie.js
- xmodule_js/common_static/js/vendor/jquery.qtip.min.js
- xmodule_js/common_static/js/vendor/swfobject/swfobject.js
- xmodule_js/common_static/js/vendor/jquery.ba-bbq.min.js
- xmodule_js/common_static/js/vendor/annotator.min.js
- xmodule_js/common_static/js/vendor/annotator.store.min.js
- xmodule_js/common_static/js/vendor/annotator.tags.min.js
- xmodule_js/common_static/js/vendor/jasmine-jquery.js
- xmodule_js/common_static/js/vendor/jquery.leanModal.min.js
- xmodule_js/common_static/js/vendor/flot/jquery.flot.js
- xmodule_js/src
- xmodule_js/common_static/js/test/add_ajax_prefix.js
# Paths to source JavaScript files
src_paths:
- coffee/src
- js
# Paths to spec (test) JavaScript files
spec_paths:
- coffee/spec/helper.js
- coffee/spec
# Paths to fixture files (optional)
# The fixture path will be set automatically when using jasmine-jquery.
# (https://github.com/velesin/jasmine-jquery)
#
# You can then access fixtures using paths relative to
# the test suite description:
#
# loadFixtures('path/to/fixture/fixture.html');
#
fixture_paths:
- coffee/fixtures
# Regular expressions used to exclude *.js files from
# appearing in the test runner page.
# Files are included by default, which means that they
# are loaded using a <script> tag in the test runner page.
# When loading many files, this can be slow, so
# exclude any files you don't need.
#exclude_from_page:
# - path/to/lib/exclude/*
# Regular expression used to guarantee that a *.js file
# is included in the test runner page.
# If a file name matches both `exclude_from_page` and
# `include_in_page`, the file WILL be included.
# You can use this to exclude all files in a directory,
# but make an exception for particular files.
#include_in_page:
# - path/to/lib/exclude/exception_*.js
../../common/lib/xmodule/xmodule/js/
\ No newline at end of file
......@@ -346,9 +346,6 @@ if settings.COURSEWARE_ENABLED and settings.MITX_FEATURES.get('ENABLE_INSTRUCTOR
include('instructor.views.api_urls'))
)
if settings.ENABLE_JASMINE:
urlpatterns += (url(r'^_jasmine/', include('django_jasmine.urls')),)
if settings.DEBUG or settings.MITX_FEATURES.get('ENABLE_DJANGO_ADMIN_SITE'):
## Jasmine and admin
urlpatterns += (url(r'^admin/', include(admin.site.urls)),)
......
......@@ -2,8 +2,6 @@
"name": "mitx",
"version": "0.1.0",
"dependencies": {
"coffee-script": "1.6.X",
"phantom-jasmine": "0.1.0",
"jasmine-reporters": "0.2.1"
"coffee-script": "1.6.X"
}
}
require 'colorize'
def deprecated(deprecated, deprecated_by)
def deprecated(deprecated, deprecated_by, *args)
task deprecated do
puts("Task #{deprecated} has been deprecated. Use #{deprecated_by} instead. Waiting 5 seconds...".red)
if args.length > 0 then
args_str = args.join(',')
new_cmd = "#{deprecated_by}[#{args_str}]"
else
new_cmd = deprecated_by
end
puts("Task #{deprecated} has been deprecated. Use #{new_cmd} instead. Waiting 5 seconds...".red)
sleep(5)
Rake::Task[deprecated_by].invoke
Rake::Task[deprecated_by].invoke(*args)
end
end
[:lms, :cms].each do |system|
deprecated("browse_jasmine_#{system}", "jasmine:#{system}:browser")
deprecated("phantomjs_jasmine_#{system}", "jasmine:#{system}:phantomjs")
deprecated("browse_jasmine_#{system}", "test:js:dev", system)
deprecated("phantomjs_jasmine_#{system}", "test:js:run", system)
deprecated("jasmine:#{system}", "test:js:run", system)
deprecated("jasmine:#{system}:browser", "test:js:dev", system)
deprecated("jasmine:#{system}:browser:watch", "test:js:dev", system)
deprecated("jasmine:#{system}:phantomjs", "test:js:run", system)
deprecated("#{system}:check_settings:jasmine", "")
deprecated("#{system}:gather_assets:jasmine", "")
end
Dir["common/lib/*"].select{|lib| File.directory?(lib)}.each do |lib|
deprecated("browse_jasmine_#{lib}", "jasmine:#{lib}:browser")
deprecated("phantomjs_jasmine_#{lib}", "jasmine:#{lib}:phantomjs")
if lib == 'common/lib/xmodule' then
deprecated("browse_jasmine_#{lib}", "test:js:dev", "xmodule")
deprecated("phantomjs_jasmine_#{lib}", "test:js:run", "xmodule")
else
deprecated("browse_jasmine_#{lib}", "test:js:dev")
deprecated("phantomjs_jasmine_#{lib}", "test:js:run")
end
end
deprecated("browse_jasmine_discussion", "jasmine:common/static/coffee:browser")
deprecated("phantomjs_jasmine_discussion", "jasmine:common/static/coffee:phantomjs")
\ No newline at end of file
deprecated("browse_jasmine_discussion", "test:js:dev", "common")
deprecated("phantomjs_jasmine_discussion", "test:js:run", "common")
deprecated("jasmine:common/lib/xmodule", "test:js:run", "xmodule")
deprecated("jasmine:common/lib/xmodule:browser", "test:js:dev", "xmodule")
deprecated("jasmine:common/lib/xmodule:phantomjs", "test:js:run", "xmodule")
deprecated("jasmine:common/static/coffee", "test:js:run", "common")
deprecated("jasmine:common/static/coffee:browser", "test:js:dev", "common")
deprecated("jasmine:common/static/coffee:phantomjs", "test:js:run", "common")
deprecated("jasmine", "test:js")
deprecated("jasmine:phantomjs", "test:js:run")
deprecated("jasmine:browser", "test:js:dev")
require 'colorize'
require 'erb'
require 'launchy'
require 'net/http'
PHANTOMJS_PATH = find_executable(ENV['PHANTOMJS_PATH'] || 'phantomjs')
PREFERRED_METHOD = PHANTOMJS_PATH.nil? ? 'browser' : 'phantomjs'
if PHANTOMJS_PATH.nil?
puts("phantomjs not found on path. Set $PHANTOMJS_PATH. Using browser for jasmine tests".blue)
end
LOGDIR = 'logs/jasmine'
CLOBBER.include(LOGDIR)
directory LOGDIR
def django_for_jasmine(system, django_reload)
if !django_reload
reload_arg = '--noreload'
end
port = 10000 + rand(40000)
jasmine_url = "http://localhost:#{port}/_jasmine/"
background_process(django_admin(system, 'jasmine', 'runserver', '-v', '0', port.to_s, reload_arg).split(' '), "#{LOGDIR}/django.log")
up = false
start_time = Time.now
until up do
if Time.now - start_time > 30
abort "Timed out waiting for server to start to run jasmine tests"
end
begin
response = Net::HTTP.get_response(URI(jasmine_url))
puts response.code
up = response.code == '200'
rescue => e
puts e.message
ensure
puts('Waiting server to start')
sleep(0.5)
end
end
yield jasmine_url
end
def template_jasmine_runner(lib)
phantom_jasmine_path = File.expand_path("node_modules/phantom-jasmine")
jasmine_reporters_path = File.expand_path("node_modules/jasmine-reporters")
common_js_root = File.expand_path("common/static/js")
common_coffee_root = File.expand_path("common/static/coffee/src")
# Get arrays of spec and source files, ordered by how deep they are nested below the library
# (and then alphabetically) and expanded from a relative to an absolute path
spec_glob = File.join(lib, "**", "spec", "**", "*.js")
src_glob = File.join(lib, "**", "src", "**", "*.js")
js_specs = Dir[spec_glob].sort_by {|p| [p.split('/').length, p]} .map {|f| File.expand_path(f)}
js_source = Dir[src_glob].sort_by {|p| [p.split('/').length, p]} .map {|f| File.expand_path(f)}
report_dir = report_dir_path("#{lib}/jasmine")
template = ERB.new(File.read("common/templates/jasmine/jasmine_test_runner.html.erb"))
template_output = "#{lib}/jasmine_test_runner.html"
File.open(template_output, 'w') do |f|
f.write(template.result(binding))
end
yield File.expand_path(template_output)
end
def jasmine_browser(url, jitter=3, wait=10)
# Jitter starting the browser so that the tests don't all try and
# start the browser simultaneously
sleep(rand(jitter))
sh("python -m webbrowser -t '#{url}'")
sleep(wait)
end
def jasmine_phantomjs(url)
fail("phantomjs not found. Add it to your path, or set $PHANTOMJS_PATH") if PHANTOMJS_PATH.nil?
test_sh("#{PHANTOMJS_PATH} node_modules/jasmine-reporters/test/phantomjs-testrunner.js #{url}")
end
# Wrapper tasks for the real browse_jasmine and phantomjs_jasmine
# tasks above. These have a nicer UI since there's no arg passing.
[:lms, :cms].each do |system|
namespace :jasmine do
namespace system do
desc "Open jasmine tests for #{system} in your default browser"
task :browser => [:clean_reports_dir, LOGDIR] do
Rake::Task[:assets].invoke(system, 'jasmine')
django_for_jasmine(system, true) do |jasmine_url|
jasmine_browser(jasmine_url)
end
end
desc "Open jasmine tests for #{system} in your default browser, and dynamically recompile coffeescript"
task :'browser:watch' => [:clean_reports_dir, :'assets:coffee:_watch', LOGDIR] do
django_for_jasmine(system, true) do |jasmine_url|
jasmine_browser(jasmine_url, jitter=0, wait=0)
end
puts "Press ENTER to terminate".red
$stdin.gets
end
desc "Use phantomjs to run jasmine tests for #{system} from the console"
task :phantomjs => [:clean_reports_dir, LOGDIR] do
Rake::Task[:assets].invoke(system, 'jasmine')
phantomjs = ENV['PHANTOMJS_PATH'] || 'phantomjs'
django_for_jasmine(system, false) do |jasmine_url|
jasmine_phantomjs(jasmine_url)
end
end
end
desc "Run jasmine tests for #{system} using #{PREFERRED_METHOD}"
task system => "jasmine:#{system}:#{PREFERRED_METHOD}"
task :phantomjs => "jasmine:#{system}:phantomjs"
multitask :browser => "jasmine:#{system}:browser"
end
end
static_js_dirs = Dir["common/lib/*"].select{|lib| File.directory?(lib)}
static_js_dirs << 'common/static/coffee'
static_js_dirs << 'common/static/js'
static_js_dirs.select!{|lib| !Dir["#{lib}/**/spec"].empty?}
static_js_dirs.each do |dir|
namespace :jasmine do
namespace dir do
desc "Open jasmine tests for #{dir} in your default browser"
task :browser => [:clean_reports_dir] do
# We need to use either CMS or LMS to preprocess files. Use LMS by default
Rake::Task['assets:coffee'].invoke('lms', 'jasmine')
template_jasmine_runner(dir) do |f|
jasmine_browser("file://#{f}")
end
end
desc "Use phantomjs to run jasmine tests for #{dir} from the console"
task :phantomjs => [:clean_reports_dir] do
# We need to use either CMS or LMS to preprocess files. Use LMS by default
Rake::Task[:assets].invoke('lms', 'jasmine')
template_jasmine_runner(dir) do |f|
jasmine_phantomjs(f)
end
end
end
desc "Run jasmine tests for #{dir} using #{PREFERRED_METHOD}"
task dir => "jasmine:#{dir}:#{PREFERRED_METHOD}"
task :phantomjs => "jasmine:#{dir}:phantomjs"
multitask :browser => "jasmine:#{dir}:browser"
end
end
desc "Run all jasmine tests using #{PREFERRED_METHOD}"
task :jasmine => "jasmine:#{PREFERRED_METHOD}"
['phantomjs', 'browser'].each do |method|
desc "Run all jasmine tests using #{method}"
task "jasmine:#{method}"
end
task :test => :jasmine
JS_TEST_SUITES = {
'lms' => 'lms/static/js_test.yml',
'cms' => 'cms/static/js_test.yml',
'xmodule' => 'common/lib/xmodule/xmodule/js/js_test.yml',
'common' => 'common/static/js_test.yml',
}
# Turn relative paths to absolute paths from the repo root.
JS_TEST_SUITES.each do |key, val|
JS_TEST_SUITES[key] = File.join(REPO_ROOT, val)
end
# Define the directory for coverage reports
JS_REPORT_DIR = report_dir_path('javascript')
directory JS_REPORT_DIR
# Given an environment (a key in `JS_TEST_SUITES`)
# return the path to the JavaScript test suite description
# If `env` is nil, return a string containing
# all available descriptions.
def suite_for_env(env)
if env.nil?
return JS_TEST_SUITES.map{|key, val| val}.join(' ')
else
return JS_TEST_SUITES[env]
end
end
# Run the tests using js-test-tool
# See js-test-tool docs for description of different
# command line arguments
def js_test_tool(env, command, do_coverage)
suite = suite_for_env(env)
cmd = "js-test-tool #{command} #{suite} --use-firefox --timeout-sec 600"
if do_coverage
report_dir = File.join(JS_REPORT_DIR, 'coverage.xml')
cmd += " --coverage-xml #{report_dir}"
end
sh(cmd)
end
# Print a list of js_test commands for
# all available environments
def print_js_test_cmds(mode)
JS_TEST_SUITES.each do |key, val|
puts " rake test:js:#{mode}[#{key}]"
end
end
namespace :'test:js' do
desc "Run the JavaScript tests and print results to the console"
task :run, [:env] => [:clean_test_files, :'assets:coffee'] do |t, args|
if args[:env].nil?
puts "Running all test suites. To run a specific test suite, try:"
print_js_test_cmds('run')
end
js_test_tool(args[:env], 'run', false)
end
desc "Run the JavaScript tests in your default browser"
task :dev, [:env] => [:clean_test_files, :'assets:coffee'] do |t, args|
if args[:env].nil?
puts "Error: No test suite specified. Try one of these instead:"
print_js_test_cmds('dev')
else
js_test_tool(args[:env], 'dev', false)
end
end
desc "Run all JavaScript tests and collect coverage information"
task :coverage => [:clean_reports_dir, :clean_test_files, :'assets:coffee', JS_REPORT_DIR] do
js_test_tool(nil, 'run', true)
end
end
# Default js_test is js_test:run
desc "Run all JavaScript tests and print results the the console"
task :'test:js' => :'test:js:run'
# Add the JS tests to the main test command
task :test => :'test:js:coverage'
......@@ -148,46 +148,33 @@ task :test, [:test_id] => :test_docs
desc "Build the html, xml, and diff coverage reports"
task :coverage => :report_dirs do
found_coverage_info = false
reports = []
# Generate coverage for Python sources
TEST_TASK_DIRS.each do |dir|
report_dir = report_dir_path(dir)
if !File.file?("#{report_dir}/.coverage")
next
else
found_coverage_info = true
end
puts "***************"
puts "Generating diff coverage report for: #{dir}"
puts "***************\n"
# Generate the coverage.py HTML report
sh("coverage html --rcfile=#{dir}/.coveragerc")
if File.file?("#{report_dir}/.coverage")
# Generate the coverage.py XML report
sh("coverage xml -o #{report_dir}/coverage.xml --rcfile=#{dir}/.coveragerc")
reports << "#{report_dir}/coverage.xml"
# Generate the coverage.py HTML report
sh("coverage html --rcfile=#{dir}/.coveragerc")
# Generate the diff coverage HTML report, based on the XML report
sh("diff-cover #{report_dir}/coverage.xml --html-report #{report_dir}/diff_cover.html")
# Generate the coverage.py XML report
sh("coverage xml -o #{report_dir}/coverage.xml --rcfile=#{dir}/.coveragerc")
# Print the diff coverage report to the console
sh("diff-cover #{report_dir}/coverage.xml")
puts "\n"
end
end
# Find all coverage XML files (both Python and JavaScript)
xml_reports = FileList[File.join(REPORT_DIR, '**/coverage.xml')]
if not found_coverage_info
if xml_reports.length < 1
puts "No coverage info found. Run `rake test` before running `rake coverage`."
else
puts "***************"
puts "Generating combined diff coverage report"
puts "Combined over: #{TEST_TASK_DIRS.join(', ')}"
puts "***************\n"
sh("diff-cover #{reports.join(' ')} --html-report #{REPORT_DIR}/diff_coverage_combined.html")
sh("diff-cover #{reports.join(' ')}")
xml_report_str = xml_reports.join(' ')
diff_html_path = report_dir_path('diff_coverage_combined.html')
# Generate the diff coverage reports (HTML and console)
sh("diff-cover #{xml_report_str} --html-report #{diff_html_path}")
sh("diff-cover #{xml_report_str}")
puts "\n"
end
end
......@@ -85,7 +85,6 @@ rednose==0.3
selenium==2.34.0
splinter==0.5.4
django_nose==1.1
django-jasmine==0.3.2
django_debug_toolbar
django-debug-toolbar-mongo
nose-ignore-docstring
......
......@@ -11,3 +11,4 @@
-e git+https://github.com/edx/XBlock.git@446668fddc75b78512eef4e9425cbc9a3327606f#egg=XBlock
-e git+https://github.com/edx/codejail.git@0a1b468#egg=codejail
-e git+https://github.com/edx/diff-cover.git@v0.2.1#egg=diff_cover
-e git+https://github.com/edx/js-test-tool.git@v0.0.7#egg=js_test_tool
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