diff --git a/common/static/common/js/spec/utils/edx.utils.validate_spec.js b/common/static/common/js/spec/utils/edx.utils.validate_spec.js new file mode 100644 index 0000000000..f50383ff58 --- /dev/null +++ b/common/static/common/js/spec/utils/edx.utils.validate_spec.js @@ -0,0 +1,197 @@ +;(function (define) { + 'use strict'; + define(['jquery', 'common/js/utils/edx.utils.validate'], + function($, EdxUtilsValidate) { + + describe("EdxUtilsValidate", function() { + var fixture = null, + field = null, + result = null, + MIN_LENGTH = 2, + MAX_LENGTH = 20, + VALID_STRING = 'xsy_is_awesome', + SHORT_STRING = 'x', + LONG_STRING = 'xsy_is_way_too_awesome', + EMAIL_ERROR_FRAGMENT = 'formatted', + MIN_ERROR_FRAGMENT = 'least', + MAX_ERROR_FRAGMENT = 'up to', + REQUIRED_ERROR_FRAGMENT = 'Please enter your', + CUSTOM_MESSAGE = 'custom message'; + + var createFixture = function( type, name, required, minlength, maxlength, value ) { + setFixtures(''); + + field = $('#field'); + field.prop('required', required); + field.attr({ + name: name, + minlength: minlength, + maxlength: maxlength, + value: value + }); + }; + + var expectValid = function() { + result = EdxUtilsValidate.validate(field); + expect(result.isValid).toBe(true); + }; + + var expectInvalid = function( errorFragment ) { + result = EdxUtilsValidate.validate(field); + expect(result.isValid).toBe(false); + expect(result.message).toMatch(errorFragment); + }; + + it('succeeds if an optional field is left blank', function () { + createFixture('text', 'username', false, MIN_LENGTH, MAX_LENGTH, ''); + expectValid(); + }); + + it('succeeds if a required field is provided a valid value', function () { + createFixture('text', 'username', true, MIN_LENGTH, MAX_LENGTH, VALID_STRING); + expectValid(); + }); + + it('fails if a required field is left blank', function () { + createFixture('text', 'username', true, MIN_LENGTH, MAX_LENGTH, ''); + expectInvalid(REQUIRED_ERROR_FRAGMENT); + }); + + it('fails if a field is provided a value below its minimum character limit', function () { + createFixture('text', 'username', false, MIN_LENGTH, MAX_LENGTH, SHORT_STRING); + + // Verify optional field behavior + expectInvalid(MIN_ERROR_FRAGMENT); + + // Verify required field behavior + field.prop('required', true); + expectInvalid(MIN_ERROR_FRAGMENT); + }); + + it('succeeds if a field with no minimum character limit is provided a value below its maximum character limit', function () { + createFixture('text', 'username', false, null, MAX_LENGTH, SHORT_STRING); + + // Verify optional field behavior + expectValid(); + + // Verify required field behavior + field.prop('required', true); + expectValid(); + }); + + it('fails if a required field with no minimum character limit is left blank', function () { + createFixture('text', 'username', true, null, MAX_LENGTH, ''); + expectInvalid(REQUIRED_ERROR_FRAGMENT); + }); + + it('fails if a field is provided a value above its maximum character limit', function () { + createFixture('text', 'username', false, MIN_LENGTH, MAX_LENGTH, LONG_STRING); + + // Verify optional field behavior + expectInvalid(MAX_ERROR_FRAGMENT); + + // Verify required field behavior + field.prop('required', true); + expectInvalid(MAX_ERROR_FRAGMENT); + }); + + it('succeeds if a field with no maximum character limit is provided a value above its minimum character limit', function () { + createFixture('text', 'username', false, MIN_LENGTH, null, LONG_STRING); + + // Verify optional field behavior + expectValid(); + + // Verify required field behavior + field.prop('required', true); + expectValid(); + }); + + it('succeeds if a field with no character limits is provided a value', function () { + createFixture('text', 'username', false, null, null, VALID_STRING); + + // Verify optional field behavior + expectValid(); + + // Verify required field behavior + field.prop('required', true); + expectValid(); + }); + + it('fails if an email field is provided an invalid address', function () { + createFixture('email', 'email', false, MIN_LENGTH, MAX_LENGTH, 'localpart'); + + // Verify optional field behavior + expectInvalid(EMAIL_ERROR_FRAGMENT); + + // Verify required field behavior + field.prop('required', false); + expectInvalid(EMAIL_ERROR_FRAGMENT); + }); + + it('succeeds if an email field is provided a valid address', function () { + createFixture('email', 'email', false, MIN_LENGTH, MAX_LENGTH, 'localpart@label.tld'); + + // Verify optional field behavior + expectValid(); + + // Verify required field behavior + field.prop('required', true); + expectValid(); + }); + + it('succeeds if a checkbox is optional, or required and checked, but fails if a required checkbox is unchecked', function () { + createFixture('checkbox', 'checkbox', false, null, null, 'value'); + + // Optional, unchecked + expectValid(); + + // Optional, checked + field.prop('checked', true); + expectValid(); + + // Required, checked + field.prop('required', true); + expectValid(); + + // Required, unchecked + field.prop('checked', false); + expectInvalid(REQUIRED_ERROR_FRAGMENT); + }); + + it('succeeds if a select is optional, or required and default is selected, but fails if a required select has the default option selected', function () { + var select = [ + '' + ].join(''); + + setFixtures(select); + + field = $('#dropdown'); + + // Optional + expectValid(); + + // Required, default text selected + field.attr('required', true); + expectInvalid(REQUIRED_ERROR_FRAGMENT); + + // Required, country selected + field.val('BE'); + expectValid(); + }); + + it('returns a custom error message if an invalid field has one attached', function () { + // Create a blank required field + createFixture('text', 'username', true, MIN_LENGTH, MAX_LENGTH, ''); + + // Attach a custom error message to the field + field.data('errormsg-required', CUSTOM_MESSAGE); + + expectInvalid(CUSTOM_MESSAGE); + }); + }); + }); +}).call(this, define || RequireJS.define); diff --git a/common/static/js/utils/edx.utils.validate.js b/common/static/common/js/utils/edx.utils.validate.js similarity index 100% rename from common/static/js/utils/edx.utils.validate.js rename to common/static/common/js/utils/edx.utils.validate.js diff --git a/common/static/js/spec/edx.utils.validate_spec.js b/common/static/js/spec/edx.utils.validate_spec.js deleted file mode 100644 index b85b99d733..0000000000 --- a/common/static/js/spec/edx.utils.validate_spec.js +++ /dev/null @@ -1,195 +0,0 @@ -;(function (define) { - 'use strict'; - define(['jquery', 'js/utils/edx.utils.validate'], - function($) { - - var fixture = null, - field = null, - result = null, - MIN_LENGTH = 2, - MAX_LENGTH = 20, - VALID_STRING = 'xsy_is_awesome', - SHORT_STRING = 'x', - LONG_STRING = 'xsy_is_way_too_awesome', - EMAIL_ERROR_FRAGMENT = 'formatted', - MIN_ERROR_FRAGMENT = 'least', - MAX_ERROR_FRAGMENT = 'up to', - REQUIRED_ERROR_FRAGMENT = 'Please enter your', - CUSTOM_MESSAGE = 'custom message'; - - var createFixture = function( type, name, required, minlength, maxlength, value ) { - setFixtures(''); - - field = $('#field'); - field.prop('required', required); - field.attr({ - name: name, - minlength: minlength, - maxlength: maxlength, - value: value - }); - }; - - var expectValid = function() { - result = edx.utils.validate(field); - expect(result.isValid).toBe(true); - }; - - var expectInvalid = function( errorFragment ) { - result = edx.utils.validate(field); - expect(result.isValid).toBe(false); - expect(result.message).toMatch(errorFragment); - }; - - it('succeeds if an optional field is left blank', function () { - createFixture('text', 'username', false, MIN_LENGTH, MAX_LENGTH, ''); - expectValid(); - }); - - it('succeeds if a required field is provided a valid value', function () { - createFixture('text', 'username', true, MIN_LENGTH, MAX_LENGTH, VALID_STRING); - expectValid(); - }); - - it('fails if a required field is left blank', function () { - createFixture('text', 'username', true, MIN_LENGTH, MAX_LENGTH, ''); - expectInvalid(REQUIRED_ERROR_FRAGMENT); - }); - - it('fails if a field is provided a value below its minimum character limit', function () { - createFixture('text', 'username', false, MIN_LENGTH, MAX_LENGTH, SHORT_STRING); - - // Verify optional field behavior - expectInvalid(MIN_ERROR_FRAGMENT); - - // Verify required field behavior - field.prop('required', true); - expectInvalid(MIN_ERROR_FRAGMENT); - }); - - it('succeeds if a field with no minimum character limit is provided a value below its maximum character limit', function () { - createFixture('text', 'username', false, null, MAX_LENGTH, SHORT_STRING); - - // Verify optional field behavior - expectValid(); - - // Verify required field behavior - field.prop('required', true); - expectValid(); - }); - - it('fails if a required field with no minimum character limit is left blank', function () { - createFixture('text', 'username', true, null, MAX_LENGTH, ''); - expectInvalid(REQUIRED_ERROR_FRAGMENT); - }); - - it('fails if a field is provided a value above its maximum character limit', function () { - createFixture('text', 'username', false, MIN_LENGTH, MAX_LENGTH, LONG_STRING); - - // Verify optional field behavior - expectInvalid(MAX_ERROR_FRAGMENT); - - // Verify required field behavior - field.prop('required', true); - expectInvalid(MAX_ERROR_FRAGMENT); - }); - - it('succeeds if a field with no maximum character limit is provided a value above its minimum character limit', function () { - createFixture('text', 'username', false, MIN_LENGTH, null, LONG_STRING); - - // Verify optional field behavior - expectValid(); - - // Verify required field behavior - field.prop('required', true); - expectValid(); - }); - - it('succeeds if a field with no character limits is provided a value', function () { - createFixture('text', 'username', false, null, null, VALID_STRING); - - // Verify optional field behavior - expectValid(); - - // Verify required field behavior - field.prop('required', true); - expectValid(); - }); - - it('fails if an email field is provided an invalid address', function () { - createFixture('email', 'email', false, MIN_LENGTH, MAX_LENGTH, 'localpart'); - - // Verify optional field behavior - expectInvalid(EMAIL_ERROR_FRAGMENT); - - // Verify required field behavior - field.prop('required', false); - expectInvalid(EMAIL_ERROR_FRAGMENT); - }); - - it('succeeds if an email field is provided a valid address', function () { - createFixture('email', 'email', false, MIN_LENGTH, MAX_LENGTH, 'localpart@label.tld'); - - // Verify optional field behavior - expectValid(); - - // Verify required field behavior - field.prop('required', true); - expectValid(); - }); - - it('succeeds if a checkbox is optional, or required and checked, but fails if a required checkbox is unchecked', function () { - createFixture('checkbox', 'checkbox', false, null, null, 'value'); - - // Optional, unchecked - expectValid(); - - // Optional, checked - field.prop('checked', true); - expectValid(); - - // Required, checked - field.prop('required', true); - expectValid(); - - // Required, unchecked - field.prop('checked', false); - expectInvalid(REQUIRED_ERROR_FRAGMENT); - }); - - it('succeeds if a select is optional, or required and default is selected, but fails if a required select has the default option selected', function () { - var select = [ - '' - ].join(''); - - setFixtures(select); - - field = $('#dropdown'); - - // Optional - expectValid(); - - // Required, default text selected - field.attr('required', true); - expectInvalid(REQUIRED_ERROR_FRAGMENT); - - // Required, country selected - field.val('BE'); - expectValid(); - }); - - it('returns a custom error message if an invalid field has one attached', function () { - // Create a blank required field - createFixture('text', 'username', true, MIN_LENGTH, MAX_LENGTH, ''); - - // Attach a custom error message to the field - field.data('errormsg-required', CUSTOM_MESSAGE); - - expectInvalid(CUSTOM_MESSAGE); - }); - }); -}).call(this, define || RequireJS.define); diff --git a/common/static/js/spec/main_requirejs.js b/common/static/js/spec/main_requirejs.js index 4e1a45b968..be43b6dc5c 100644 --- a/common/static/js/spec/main_requirejs.js +++ b/common/static/js/spec/main_requirejs.js @@ -162,7 +162,8 @@ 'common-requirejs/include/common/js/spec/components/paging_header_spec.js', 'common-requirejs/include/common/js/spec/components/paging_footer_spec.js', 'common-requirejs/include/common/js/spec/components/search_field_spec.js', - 'common-requirejs/include/common/js/spec/components/view_utils_spec.js' + 'common-requirejs/include/common/js/spec/components/view_utils_spec.js', + 'common-requirejs/include/common/js/spec/utils/edx.utils.validate_spec.js' ]); }).call(this, requirejs, define); diff --git a/common/static/js_test.yml b/common/static/js_test.yml index ec54090f88..91fab6e375 100644 --- a/common/static/js_test.yml +++ b/common/static/js_test.yml @@ -48,7 +48,6 @@ src_paths: - js/xblock - coffee/src - js/src - - js/utils - js/capa/src # Paths to spec (test) JavaScript files diff --git a/lms/static/js/spec/main.js b/lms/static/js/spec/main.js index 5fb49ab6c1..661eb576c7 100644 --- a/lms/static/js/spec/main.js +++ b/lms/static/js/spec/main.js @@ -89,7 +89,7 @@ 'annotator_1.2.9': 'xmodule_js/common_static/js/vendor/edxnotes/annotator-full.min', // Common edx utils - 'js/utils/edx.utils.validate': 'xmodule_js/common_static/js/utils/edx.utils.validate' + 'common/js/utils/edx.utils.validate': 'xmodule_js/common_static/common/js/utils/edx.utils.validate' }, shim: { 'gettext': { diff --git a/lms/static/js/student_account/views/FormView.js b/lms/static/js/student_account/views/FormView.js index 389950119d..75f7c56f1c 100644 --- a/lms/static/js/student_account/views/FormView.js +++ b/lms/static/js/student_account/views/FormView.js @@ -4,7 +4,7 @@ 'jquery', 'underscore', 'backbone', - 'js/utils/edx.utils.validate' + 'common/js/utils/edx.utils.validate' ], function($, _, Backbone, EdxUtilsValidate) { diff --git a/lms/static/js_test.yml b/lms/static/js_test.yml index b08cfa0dba..0605d739b7 100644 --- a/lms/static/js_test.yml +++ b/lms/static/js_test.yml @@ -64,7 +64,7 @@ lib_paths: - xmodule_js/common_static/js/vendor/date.js - xmodule_js/common_static/js/vendor/moment.min.js - xmodule_js/common_static/js/vendor/moment-with-locales.min.js - - xmodule_js/common_static/js/utils/edx.utils.validate.js + - xmodule_js/common_static/common/js/utils/edx.utils.validate.js # Paths to source JavaScript files src_paths: