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: