phone.js 13 KB

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