phone.js 13 KB

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