浏览代码

#465: Refactoring iban validator

phuoc 11 年之前
父节点
当前提交
43dc4ce8b8
共有 6 个文件被更改,包括 282 次插入76 次删除
  1. 1 1
      dist/css/bootstrapValidator.min.css
  2. 29 23
      dist/js/bootstrapValidator.js
  3. 3 3
      dist/js/bootstrapValidator.min.js
  4. 28 22
      src/js/validator/iban.js
  5. 110 13
      test/spec.js
  6. 111 14
      test/spec/validator/iban.js

+ 1 - 1
dist/css/bootstrapValidator.min.css

@@ -2,7 +2,7 @@
  * BootstrapValidator (http://bootstrapvalidator.com)
  * The best jQuery plugin to validate form fields. Designed to use with Bootstrap 3
  *
- * @version     v0.5.0-dev, built on 2014-07-06 8:06:34 AM
+ * @version     v0.5.0-dev, built on 2014-07-06 8:37:51 AM
  * @author      https://twitter.com/nghuuphuoc
  * @copyright   (c) 2013 - 2014 Nguyen Huu Phuoc
  * @license     MIT

+ 29 - 23
dist/js/bootstrapValidator.js

@@ -2,7 +2,7 @@
  * BootstrapValidator (http://bootstrapvalidator.com)
  * The best jQuery plugin to validate form fields. Designed to use with Bootstrap 3
  *
- * @version     v0.5.0-dev, built on 2014-07-06 8:06:34 AM
+ * @version     v0.5.0-dev, built on 2014-07-06 8:37:51 AM
  * @author      https://twitter.com/nghuuphuoc
  * @copyright   (c) 2013 - 2014 Nguyen Huu Phuoc
  * @license     MIT
@@ -2763,21 +2763,6 @@
             TN: 'Tunisia',
             TR: 'Turkey',
             VG: 'Virgin Islands, British'
-        },
-
-        getMessage: function(options) {
-            if (options.country) {
-                var country = options.country.toUpperCase();
-                if (!$.fn.bootstrapValidator.validators.iban.REGEX[country]) {
-                    return $.fn.bootstrapValidator.helpers.format(this.countryNotSupported, options.country);
-                }
-
-                if (this.countries[country]) {
-                    return $.fn.bootstrapValidator.helpers.format(this.country, this.countries[country]);
-                }
-            }
-
-            return this['default'];
         }
     });
 
@@ -2823,7 +2808,7 @@
             'GB': 'GB[0-9]{2}[A-Z]{4}[0-9]{6}[0-9]{8}',                         // United Kingdom
             'GE': 'GE[0-9]{2}[A-Z]{2}[0-9]{16}',                                // Georgia
             'GI': 'GI[0-9]{2}[A-Z]{4}[A-Z0-9]{15}',                             // Gibraltar
-            'GL': 'GL[0-9]{2}[0-9]{4}[0-9]{9}[0-9]{1}',                         // Greenland[
+            'GL': 'GL[0-9]{2}[0-9]{4}[0-9]{9}[0-9]{1}',                         // Greenland
             'GR': 'GR[0-9]{2}[0-9]{3}[0-9]{4}[A-Z0-9]{16}',                     // Greece
             'GT': 'GT[0-9]{2}[A-Z0-9]{4}[A-Z0-9]{20}',                          // Guatemala
             'HR': 'HR[0-9]{2}[0-9]{7}[0-9]{10}',                                // Croatia
@@ -2880,8 +2865,12 @@
          * @param {jQuery} $field Field element
          * @param {Object} options Can consist of the following keys:
          * - message: The invalid message
-         * - country: The ISO 3166-1 country code
-         * @returns {Boolean}
+         * - country: The ISO 3166-1 country code. It can be
+         *      - A country code
+         *      - Name of field which its value defines the country code
+         *      - Name of callback function that returns the country code
+         *      - A callback function that returns the country code
+         * @returns {Boolean|Object}
          */
         validate: function(validator, $field, options) {
             var value = $field.val();
@@ -2890,12 +2879,26 @@
             }
 
             value = value.replace(/[^a-zA-Z0-9]/g, '').toUpperCase();
-            var country = options.country || value.substr(0, 2);
+            var country = options.country;
+            if (!country) {
+                country = value.substr(0, 2);
+            } else if (typeof country !== 'string' || !this.REGEX[country]) {
+                // Determine the country code
+                country = validator.getDynamicOption(country, $field);
+            }
+
             if (!this.REGEX[country]) {
-                return false;
+                return {
+                    valid: false,
+                    message: $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.iban.countryNotSupported, country)
+                };
             }
+
             if (!(new RegExp('^' + this.REGEX[country] + '$')).test(value)) {
-                return false;
+                return {
+                    valid: false,
+                    message: $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.iban.country, $.fn.bootstrapValidator.i18n.iban.countries[country])
+                };
             }
 
             value = value.substr(4) + value.substr(0, 4);
@@ -2913,7 +2916,10 @@
             for (var i = 1; i < length; ++i) {
                 temp = (temp * 10 + parseInt(value.substr(i, 1), 10)) % 97;
             }
-            return (temp === 1);
+            return {
+                valid: (temp === 1),
+                message: $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.iban.country, $.fn.bootstrapValidator.i18n.iban.countries[country])
+            };
         }
     };
 }(window.jQuery));

文件差异内容过多而无法显示
+ 3 - 3
dist/js/bootstrapValidator.min.js


+ 28 - 22
src/js/validator/iban.js

@@ -83,21 +83,6 @@
             TN: 'Tunisia',
             TR: 'Turkey',
             VG: 'Virgin Islands, British'
-        },
-
-        getMessage: function(options) {
-            if (options.country) {
-                var country = options.country.toUpperCase();
-                if (!$.fn.bootstrapValidator.validators.iban.REGEX[country]) {
-                    return $.fn.bootstrapValidator.helpers.format(this.countryNotSupported, options.country);
-                }
-
-                if (this.countries[country]) {
-                    return $.fn.bootstrapValidator.helpers.format(this.country, this.countries[country]);
-                }
-            }
-
-            return this['default'];
         }
     });
 
@@ -143,7 +128,7 @@
             'GB': 'GB[0-9]{2}[A-Z]{4}[0-9]{6}[0-9]{8}',                         // United Kingdom
             'GE': 'GE[0-9]{2}[A-Z]{2}[0-9]{16}',                                // Georgia
             'GI': 'GI[0-9]{2}[A-Z]{4}[A-Z0-9]{15}',                             // Gibraltar
-            'GL': 'GL[0-9]{2}[0-9]{4}[0-9]{9}[0-9]{1}',                         // Greenland[
+            'GL': 'GL[0-9]{2}[0-9]{4}[0-9]{9}[0-9]{1}',                         // Greenland
             'GR': 'GR[0-9]{2}[0-9]{3}[0-9]{4}[A-Z0-9]{16}',                     // Greece
             'GT': 'GT[0-9]{2}[A-Z0-9]{4}[A-Z0-9]{20}',                          // Guatemala
             'HR': 'HR[0-9]{2}[0-9]{7}[0-9]{10}',                                // Croatia
@@ -200,8 +185,12 @@
          * @param {jQuery} $field Field element
          * @param {Object} options Can consist of the following keys:
          * - message: The invalid message
-         * - country: The ISO 3166-1 country code
-         * @returns {Boolean}
+         * - country: The ISO 3166-1 country code. It can be
+         *      - A country code
+         *      - Name of field which its value defines the country code
+         *      - Name of callback function that returns the country code
+         *      - A callback function that returns the country code
+         * @returns {Boolean|Object}
          */
         validate: function(validator, $field, options) {
             var value = $field.val();
@@ -210,12 +199,26 @@
             }
 
             value = value.replace(/[^a-zA-Z0-9]/g, '').toUpperCase();
-            var country = options.country || value.substr(0, 2);
+            var country = options.country;
+            if (!country) {
+                country = value.substr(0, 2);
+            } else if (typeof country !== 'string' || !this.REGEX[country]) {
+                // Determine the country code
+                country = validator.getDynamicOption(country, $field);
+            }
+
             if (!this.REGEX[country]) {
-                return false;
+                return {
+                    valid: false,
+                    message: $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.iban.countryNotSupported, country)
+                };
             }
+
             if (!(new RegExp('^' + this.REGEX[country] + '$')).test(value)) {
-                return false;
+                return {
+                    valid: false,
+                    message: $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.iban.country, $.fn.bootstrapValidator.i18n.iban.countries[country])
+                };
             }
 
             value = value.substr(4) + value.substr(0, 4);
@@ -233,7 +236,10 @@
             for (var i = 1; i < length; ++i) {
                 temp = (temp * 10 + parseInt(value.substr(i, 1), 10)) % 97;
             }
-            return (temp === 1);
+            return {
+                valid: (temp === 1),
+                message: $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.iban.country, $.fn.bootstrapValidator.i18n.iban.countries[country])
+            };
         }
     };
 }(window.jQuery));

+ 110 - 13
test/spec.js

@@ -1901,25 +1901,105 @@ describe('greaterThan', function() {
 
 describe('iban', function() {
     beforeEach(function() {
-        var html = [
-            '<div class="container">',
-                '<form class="form-horizontal" id="ibanForm">',
-                    '<div class="form-group">',
-                        '<input type="text" name="iban" data-bv-iban />',
-                    '</div>',
-                '</form>',
-            '</div>'
-        ].join('\n');
+        $([
+            '<form class="form-horizontal" id="ibanForm">',
+                '<div class="form-group">',
+                    '<select class="form-control" name="country">',
+                        '<option value="AD">Andorra</option>',
+                        '<option value="AE">United Arab Emirates</option>',
+                        '<option value="AL">Albania</option>',
+                        '<option value="AO">Angola</option>',
+                        '<option value="AT">Austria</option>',
+                        '<option value="AZ">Azerbaijan</option>',
+                        '<option value="BA">Bosnia and Herzegovina</option>',
+                        '<option value="BE">Belgium</option>',
+                        '<option value="BF">Burkina Faso</option>',
+                        '<option value="BG">Bulgaria</option>',
+                        '<option value="BH">Bahrain</option>',
+                        '<option value="BI">Burundi</option>',
+                        '<option value="BJ">Benin</option>',
+                        '<option value="BR">Brazil</option>',
+                        '<option value="CH">Switzerland</option>',
+                        '<option value="CM">Cameroon</option>',
+                        '<option value="CR">Costa Rica</option>',
+                        '<option value="CV">Cape Verde</option>',
+                        '<option value="CY">Cyprus</option>',
+                        '<option value="CZ">Czech Republic</option>',
+                        '<option value="DE">Germany</option>',
+                        '<option value="DK">Denmark</option>',
+                        '<option value="DO">Dominican Republic</option>',
+                        '<option value="DZ">Algeria</option>',
+                        '<option value="EE">Estonia</option>',
+                        '<option value="ES">Spain</option>',
+                        '<option value="FI">Finland</option>',
+                        '<option value="FO">Faroe Islands</option>',
+                        '<option value="FR">France</option>',
+                        '<option value="GB">United Kingdom</option>',
+                        '<option value="GE">Georgia</option>',
+                        '<option value="GI">Gibraltar</option>',
+                        '<option value="GL">Greenland</option>',
+                        '<option value="GR">Greece</option>',
+                        '<option value="GT">Guatemala</option>',
+                        '<option value="HR">Croatia</option>',
+                        '<option value="HU">Hungary</option>',
+                        '<option value="IE">Ireland</option>',
+                        '<option value="IL">Israel</option>',
+                        '<option value="IR">Iran</option>',
+                        '<option value="IS">Iceland</option>',
+                        '<option value="IT">Italy</option>',
+                        '<option value="JO">Jordan</option>',
+                        '<option value="KW">Kuwait</option>',
+                        '<option value="KZ">Kazakhstan</option>',
+                        '<option value="LB">Lebanon</option>',
+                        '<option value="LI">Liechtenstein</option>',
+                        '<option value="LT">Lithuania</option>',
+                        '<option value="LU">Luxembourg</option>',
+                        '<option value="LV">Latvia</option>',
+                        '<option value="MC">Monaco</option>',
+                        '<option value="MD">Moldova</option>',
+                        '<option value="ME">Montenegro</option>',
+                        '<option value="MG">Madagascar</option>',
+                        '<option value="MK">Macedonia</option>',
+                        '<option value="ML">Mali</option>',
+                        '<option value="MR">Mauritania</option>',
+                        '<option value="MT">Malta</option>',
+                        '<option value="MU">Mauritius</option>',
+                        '<option value="MZ">Mozambique</option>',
+                        '<option value="NL">Netherlands</option>',
+                        '<option value="NO">Norway</option>',
+                        '<option value="PK">Pakistan</option>',
+                        '<option value="PL">Poland</option>',
+                        '<option value="PS">Palestinian</option>',
+                        '<option value="PT">Portugal</option>',
+                        '<option value="QA">Qatar</option>',
+                        '<option value="RO">Romania</option>',
+                        '<option value="RS">Serbia</option>',
+                        '<option value="SA">Saudi Arabia</option>',
+                        '<option value="SE">Sweden</option>',
+                        '<option value="SE">Slovenia</option>',
+                        '<option value="SK">Slovakia</option>',
+                        '<option value="SM">San Marino</option>',
+                        '<option value="SN">Senegal</option>',
+                        '<option value="TN">Tunisia</option>',
+                        '<option value="TR">Turkey</option>',
+                        '<option value="VG">Virgin Islands, British</option>',
+                    '</select>',
+                '</div>',
+                '<div class="form-group">',
+                    '<input type="text" name="iban" data-bv-iban />',
+                '</div>',
+            '</form>'
+        ].join('\n')).appendTo('body');
 
-        $(html).appendTo('body');
         $('#ibanForm').bootstrapValidator();
 
-        this.bv    = $('#ibanForm').data('bootstrapValidator');
-        this.$iban = this.bv.getFieldElements('iban');
+        this.bv       = $('#ibanForm').data('bootstrapValidator');
+        this.$country = this.bv.getFieldElements('country');
+        this.$iban    = this.bv.getFieldElements('iban');
     });
 
     afterEach(function() {
-        $('#ibanForm').bootstrapValidator('destroy').parent().remove();
+        $('#ibanForm').bootstrapValidator('destroy').remove();
     });
 
     it('not supported country', function() {
@@ -1928,6 +2008,23 @@ describe('iban', function() {
         expect(this.bv.isValidField('iban')).toEqual(false);
     });
 
+    it('dynamic country', function() {
+        this.$iban.attr('data-bv-iban-country', 'country');
+        this.bv.destroy();
+        this.bv = $('#ibanForm').bootstrapValidator().data('bootstrapValidator');
+
+        this.$country.val('AT');
+        this.$iban.val('AT611904300234573201');
+        this.bv.validate();
+        expect(this.bv.isValid()).toBeTruthy();
+
+        this.bv.resetForm();
+        this.$country.val('BG');
+        this.$iban.val('HR1210010051863000160');
+        this.bv.validate();
+        expect(this.bv.isValid()).toEqual(false);
+    });
+
     it('Albania', function() {
         this.$iban.val('AL47212110090000000235698741');
         this.bv.validate();

+ 111 - 14
test/spec/validator/iban.js

@@ -1,24 +1,104 @@
 describe('iban', function() {
     beforeEach(function() {
-        var html = [
-            '<div class="container">',
-                '<form class="form-horizontal" id="ibanForm">',
-                    '<div class="form-group">',
-                        '<input type="text" name="iban" data-bv-iban />',
-                    '</div>',
-                '</form>',
-            '</div>'
-        ].join('\n');
-
-        $(html).appendTo('body');
+        $([
+            '<form class="form-horizontal" id="ibanForm">',
+                '<div class="form-group">',
+                    '<select class="form-control" name="country">',
+                        '<option value="AD">Andorra</option>',
+                        '<option value="AE">United Arab Emirates</option>',
+                        '<option value="AL">Albania</option>',
+                        '<option value="AO">Angola</option>',
+                        '<option value="AT">Austria</option>',
+                        '<option value="AZ">Azerbaijan</option>',
+                        '<option value="BA">Bosnia and Herzegovina</option>',
+                        '<option value="BE">Belgium</option>',
+                        '<option value="BF">Burkina Faso</option>',
+                        '<option value="BG">Bulgaria</option>',
+                        '<option value="BH">Bahrain</option>',
+                        '<option value="BI">Burundi</option>',
+                        '<option value="BJ">Benin</option>',
+                        '<option value="BR">Brazil</option>',
+                        '<option value="CH">Switzerland</option>',
+                        '<option value="CM">Cameroon</option>',
+                        '<option value="CR">Costa Rica</option>',
+                        '<option value="CV">Cape Verde</option>',
+                        '<option value="CY">Cyprus</option>',
+                        '<option value="CZ">Czech Republic</option>',
+                        '<option value="DE">Germany</option>',
+                        '<option value="DK">Denmark</option>',
+                        '<option value="DO">Dominican Republic</option>',
+                        '<option value="DZ">Algeria</option>',
+                        '<option value="EE">Estonia</option>',
+                        '<option value="ES">Spain</option>',
+                        '<option value="FI">Finland</option>',
+                        '<option value="FO">Faroe Islands</option>',
+                        '<option value="FR">France</option>',
+                        '<option value="GB">United Kingdom</option>',
+                        '<option value="GE">Georgia</option>',
+                        '<option value="GI">Gibraltar</option>',
+                        '<option value="GL">Greenland</option>',
+                        '<option value="GR">Greece</option>',
+                        '<option value="GT">Guatemala</option>',
+                        '<option value="HR">Croatia</option>',
+                        '<option value="HU">Hungary</option>',
+                        '<option value="IE">Ireland</option>',
+                        '<option value="IL">Israel</option>',
+                        '<option value="IR">Iran</option>',
+                        '<option value="IS">Iceland</option>',
+                        '<option value="IT">Italy</option>',
+                        '<option value="JO">Jordan</option>',
+                        '<option value="KW">Kuwait</option>',
+                        '<option value="KZ">Kazakhstan</option>',
+                        '<option value="LB">Lebanon</option>',
+                        '<option value="LI">Liechtenstein</option>',
+                        '<option value="LT">Lithuania</option>',
+                        '<option value="LU">Luxembourg</option>',
+                        '<option value="LV">Latvia</option>',
+                        '<option value="MC">Monaco</option>',
+                        '<option value="MD">Moldova</option>',
+                        '<option value="ME">Montenegro</option>',
+                        '<option value="MG">Madagascar</option>',
+                        '<option value="MK">Macedonia</option>',
+                        '<option value="ML">Mali</option>',
+                        '<option value="MR">Mauritania</option>',
+                        '<option value="MT">Malta</option>',
+                        '<option value="MU">Mauritius</option>',
+                        '<option value="MZ">Mozambique</option>',
+                        '<option value="NL">Netherlands</option>',
+                        '<option value="NO">Norway</option>',
+                        '<option value="PK">Pakistan</option>',
+                        '<option value="PL">Poland</option>',
+                        '<option value="PS">Palestinian</option>',
+                        '<option value="PT">Portugal</option>',
+                        '<option value="QA">Qatar</option>',
+                        '<option value="RO">Romania</option>',
+                        '<option value="RS">Serbia</option>',
+                        '<option value="SA">Saudi Arabia</option>',
+                        '<option value="SE">Sweden</option>',
+                        '<option value="SE">Slovenia</option>',
+                        '<option value="SK">Slovakia</option>',
+                        '<option value="SM">San Marino</option>',
+                        '<option value="SN">Senegal</option>',
+                        '<option value="TN">Tunisia</option>',
+                        '<option value="TR">Turkey</option>',
+                        '<option value="VG">Virgin Islands, British</option>',
+                    '</select>',
+                '</div>',
+                '<div class="form-group">',
+                    '<input type="text" name="iban" data-bv-iban />',
+                '</div>',
+            '</form>'
+        ].join('\n')).appendTo('body');
+
         $('#ibanForm').bootstrapValidator();
 
-        this.bv    = $('#ibanForm').data('bootstrapValidator');
-        this.$iban = this.bv.getFieldElements('iban');
+        this.bv       = $('#ibanForm').data('bootstrapValidator');
+        this.$country = this.bv.getFieldElements('country');
+        this.$iban    = this.bv.getFieldElements('iban');
     });
 
     afterEach(function() {
-        $('#ibanForm').bootstrapValidator('destroy').parent().remove();
+        $('#ibanForm').bootstrapValidator('destroy').remove();
     });
 
     it('not supported country', function() {
@@ -27,6 +107,23 @@ describe('iban', function() {
         expect(this.bv.isValidField('iban')).toEqual(false);
     });
 
+    it('dynamic country', function() {
+        this.$iban.attr('data-bv-iban-country', 'country');
+        this.bv.destroy();
+        this.bv = $('#ibanForm').bootstrapValidator().data('bootstrapValidator');
+
+        this.$country.val('AT');
+        this.$iban.val('AT611904300234573201');
+        this.bv.validate();
+        expect(this.bv.isValid()).toBeTruthy();
+
+        this.bv.resetForm();
+        this.$country.val('BG');
+        this.$iban.val('HR1210010051863000160');
+        this.bv.validate();
+        expect(this.bv.isValid()).toEqual(false);
+    });
+
     it('Albania', function() {
         this.$iban.val('AL47212110090000000235698741');
         this.bv.validate();