phone.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. describe('phone', function() {
  2. beforeEach(function() {
  3. $([
  4. '<form class="form-horizontal" id="phoneForm">',
  5. '<div class="form-group">',
  6. '<select class="form-control" name="country">',
  7. '<option value="BR">Brazil</option>',
  8. '<option value="CN">China</option>',
  9. '<option value="DK">Denmark</option>',
  10. '<option value="ES">Spain</option>',
  11. '<option value="FR">France</option>',
  12. '<option value="GB">United Kingdom</option>',
  13. '<option value="MA">Morocco</option>',
  14. '<option value="PK">Pakistan</option>',
  15. '<option value="RO">Romania</option>',
  16. '<option value="RU">Russia</option>',
  17. '<option value="TH">Thailand</option>',
  18. '<option value="US">USA</option>',
  19. '<option value="VE">Venezuela</option>',
  20. '</select>',
  21. '</div>',
  22. '<div class="form-group">',
  23. '<input type="text" name="phone" data-bv-phone />',
  24. '</div>',
  25. '</form>',
  26. ].join('\n')).appendTo('body');
  27. $('#phoneForm').bootstrapValidator();
  28. /**
  29. * @type {BootstrapValidator}
  30. */
  31. this.bv = $('#phoneForm').data('bootstrapValidator');
  32. this.$country = this.bv.getFieldElements('country');
  33. this.$phone = this.bv.getFieldElements('phone');
  34. });
  35. afterEach(function() {
  36. $('#phoneForm').bootstrapValidator('destroy').remove();
  37. });
  38. it('dynamic country', function() {
  39. this.$phone.attr('data-bv-phone-country', 'country');
  40. this.bv.destroy();
  41. this.bv = $('#phoneForm').bootstrapValidator().data('bootstrapValidator');
  42. this.$country.val('BR');
  43. this.$phone.val('16920894635');
  44. this.bv.validate();
  45. expect(this.bv.isValid()).toBeTruthy();
  46. this.bv.resetForm();
  47. this.$country.val('FR');
  48. this.$phone.val('0644444444');
  49. this.bv.validate();
  50. expect(this.bv.isValid()).toBeTruthy();
  51. this.bv.resetForm();
  52. this.$country.val('GB');
  53. this.$phone.val('012345678900');
  54. this.bv.validate();
  55. expect(this.bv.isValid()).toBeFalsy();
  56. });
  57. it('Brazil phone number', function() {
  58. this.bv.updateOption('phone', 'phone', 'country', 'BR');
  59. // Valid samples
  60. var validSamples = [
  61. '0800.000.00.00', '0800-000-00-00', '0800 000 00 00', '0800-00-00-00', '0800.00.00.00', '0800 00 00 00',
  62. '0800-000-0000', '0800 000 0000', '0800.000.0000', '08000000000',
  63. '1692089-4635', '16920894635', '16992089-4635', '16 99202-4635', '(16)99202-4635', '(16)92089-4635',
  64. '(16) 92089-4635', '(15) 4343-4343', '+55 15 3702-7523', '(+55) 15 3702-7523', '(+55)1537027523',
  65. '(+55)(15)3702-7523', '(+55) 15 3702-7523', '(+55) 15 99202-7523', '99202-4635', '(16) 9208-4635'
  66. ];
  67. for (var i in validSamples) {
  68. this.bv.resetForm();
  69. this.$phone.val(validSamples[i]);
  70. this.bv.validate();
  71. expect(this.bv.isValid()).toBeTruthy();
  72. }
  73. });
  74. it('China phone number', function() {
  75. this.bv.updateOption('phone', 'phone', 'country', 'CN');
  76. // Valid samples
  77. var validSamples = [
  78. '18911111111', '189 1111 1111', '189-1111-1111', '0086-18911111111', '+86-18911111111',
  79. '86-18911111111', '0086 18911111111', '+86 18911111111', '86 18911111111', '0086 189-1111-1111',
  80. '+86 189-1111-1111', '86 189-1111-1111', '02011111111', '020-11111111', '020 11111111',
  81. '020 1111 1111', '020-1111-1111', '0086 020 82803159', '0086-020-82803159', '0086-020-82803159',
  82. '+86 20 61302222-8866', '+86 20 6130-2222-8866', '+86 10 59081185'
  83. ];
  84. for (var i in validSamples) {
  85. this.bv.resetForm();
  86. this.$phone.val(validSamples[i]);
  87. this.bv.validate();
  88. expect(this.bv.isValid()).toBeTruthy();
  89. }
  90. });
  91. it('France phone number', function() {
  92. this.bv.updateOption('phone', 'phone', 'country', 'FR');
  93. // Valid samples
  94. var validSamples = [
  95. // National formats
  96. '0644444444', '06 44 44 44 44', '06-44-44-44-44', '06.44.44.44.44',
  97. // International formats
  98. '+33644444444', '+336.44.44.44.44', '+33 6.44.44.44.44', '0033644444444', '00336.44.44.44.44',
  99. '0033 6.44.44.44.44',
  100. // Some times
  101. '+33(0)644444444', '+33 (0) 644444444'
  102. ];
  103. for (var i in validSamples) {
  104. this.bv.resetForm();
  105. this.$phone.val(validSamples[i]);
  106. this.bv.validate();
  107. expect(this.bv.isValid()).toBeTruthy();
  108. }
  109. // Invalid samples
  110. var invalidSamples = [
  111. // The separator between pairs of digits is not the same
  112. '06 44.44-44.44', '06 44 44-44.44', '06 44 44-4444', '06 44 44-4444',
  113. // Too many digits
  114. '06444444444444',
  115. // Missing leading 0
  116. '6644444444',
  117. // Too much non-numeric characters
  118. '06 44.44-44.44', '+33 (0) 644444444',
  119. // Bad parenthesis
  120. '(0)644444444',
  121. // Bad separator after the international prefix
  122. '+33-(0)-644444444', '+33 (0)-644444444', '+33-(0) 644444444',
  123. // Trailing separator
  124. '06.44.44.44.44.'
  125. ];
  126. for (i in invalidSamples) {
  127. this.bv.resetForm();
  128. this.$phone.val(invalidSamples[i]);
  129. this.bv.validate();
  130. expect(this.bv.isValid()).toEqual(false);
  131. }
  132. });
  133. it('United Kingdom phone number', function() {
  134. this.bv.updateOption('phone', 'phone', 'country', 'GB');
  135. // Valid samples
  136. var validSamples = [
  137. // National formats
  138. '01611234567', '0161 123 4567', '(0161) 123 4567', '0161-123-4567',
  139. // International formats
  140. '+44 161 123 4567', '+441611234567', '+44(0)161234567', '00 44 161 1234567', '(011) 44 161 234567', '0161-158-5587',
  141. // Extensions
  142. '0161 123 4567 ext. 123', '01611234567x123', '+44161234567x123', '+44 (0) 161 1234567 ext 123'
  143. ];
  144. for (var i in validSamples) {
  145. this.bv.resetForm();
  146. this.$phone.val(validSamples[i]);
  147. this.bv.validate();
  148. expect(this.bv.isValid()).toBeTruthy();
  149. }
  150. // Invalid samples
  151. var invalidSamples = [
  152. '012345678900', // Too many digits
  153. '1611234567', // Missing trunk
  154. '012345678', // Not enough digits
  155. '123 4567', // Missing area code
  156. '061 123 4567' // Invalid area code
  157. ];
  158. for (i in invalidSamples) {
  159. this.bv.resetForm();
  160. this.$phone.val(invalidSamples[i]);
  161. this.bv.validate();
  162. expect(this.bv.isValid()).toEqual(false);
  163. }
  164. });
  165. it('Morocco phone number', function() {
  166. this.bv.updateOption('phone', 'phone', 'country', 'MA');
  167. // Valid samples
  168. var validSamples = [
  169. // National formats
  170. '0644444444', '0610245896', '0630548564', '06 44 44 44 44', '06-44-44-44-44', '06.44.44.44.44', '06 44.44-44.44',
  171. '0528254856', '0535484541', '05 28 44 44 44', '05-28-44.44.44', '05.28.44.44.44', '05 28.44-44.44',
  172. // International formats
  173. '+212644444444', '+2126.44.44.44.44', '+212 6.44.44.44.44', '00212644444444', '002126.44.44.44.44', '00212 6.44.44.44.44',
  174. // Some times
  175. '+212(0)644444444', '+212 (0) 644444444'
  176. ];
  177. for (var i in validSamples) {
  178. this.bv.resetForm();
  179. this.$phone.val(validSamples[i]);
  180. this.bv.validate();
  181. expect(this.bv.isValid()).toBeTruthy();
  182. }
  183. // Invalid samples
  184. var invalidSamples = [
  185. '0625468961', '0512548632', '0542564896', // Not a valid phone numbers
  186. '06444444444444', // Too many digits
  187. '6644444444', // Missing leading 0
  188. '06 44.44-44.44', '+212 (0) 644444444', // Too much non-numeric characters
  189. '(0)644444444' // Bad parenthesis
  190. ];
  191. for (i in invalidSamples) {
  192. this.bv.resetForm();
  193. this.$phone.val(invalidSamples[i]);
  194. this.bv.validate();
  195. expect(this.bv.isValid()).toEqual(false);
  196. }
  197. });
  198. it('Pakistan phone number', function() {
  199. this.bv.updateOption('phone', 'phone', 'country', 'PK');
  200. // Valid samples
  201. var validSamples = ['03336527366'];
  202. for (var i in validSamples) {
  203. this.bv.resetForm();
  204. this.$phone.val(validSamples[i]);
  205. this.bv.validate();
  206. expect(this.bv.isValid()).toBeTruthy();
  207. }
  208. });
  209. it('Romania phone number', function() {
  210. this.bv.updateOption('phone', 'phone', 'country', 'RO');
  211. // Valid samples
  212. var validSamples = [
  213. '+40213-564-864', '+40213.564.864', '+40213 564 864', '0213-564-864',
  214. '0213564864', '0313564864',
  215. '0720512346', '0730512346', '0740512346', '0750512346', '+40750512346', '+40750.512.346',
  216. '0760512346', '0770512346', '0780512346'
  217. ];
  218. for (var i in validSamples) {
  219. this.bv.resetForm();
  220. this.$phone.val(validSamples[i]);
  221. this.bv.validate();
  222. expect(this.bv.isValid()).toBeTruthy();
  223. }
  224. // Invalid samples
  225. var invalidSamples = [
  226. '0213/564/864', // Invalid separator
  227. '0413564864', // Invalid land line number (The valid one should be +402, +403 or inside country 02 - 03)
  228. '0790512346' // Invalid mobile phone number (The valid one is 072xxxxxxx - 078xxxxxxx)
  229. ];
  230. for (i in invalidSamples) {
  231. this.bv.resetForm();
  232. this.$phone.val(invalidSamples[i]);
  233. this.bv.validate();
  234. expect(this.bv.isValid()).toEqual(false);
  235. }
  236. });
  237. it('Russia phone number', function() {
  238. this.bv.updateOption('phone', 'phone', 'country', 'RU');
  239. // Valid samples
  240. var validSamples = ['+7(911)976-91-04'];
  241. for (var i in validSamples) {
  242. this.bv.resetForm();
  243. this.$phone.val(validSamples[i]);
  244. this.bv.validate();
  245. expect(this.bv.isValid()).toBeTruthy();
  246. }
  247. });
  248. });