timeValidator.spec.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  1. describe('timeValidator', () => {
  2. var id = 'testContainer';
  3. beforeEach(function() {
  4. this.$container = $(`<div id="${id}"></div>`).appendTo('body');
  5. });
  6. afterEach(function() {
  7. if (this.$container) {
  8. destroy();
  9. this.$container.remove();
  10. }
  11. });
  12. var arrayOfObjects = function() {
  13. return [
  14. {time: '4:10:05 am', name: 'Ted', lastName: 'Right'},
  15. {time: '17:15:25', name: 'Frank', lastName: 'Honest'},
  16. {time: '14:65:45 am', name: 'Joan', lastName: 'Well'},
  17. {time: '33:25:05', name: 'Sid', lastName: 'Strong'}
  18. ];
  19. };
  20. it('should validate an empty string (default behavior)', (done) => {
  21. var onAfterValidate = jasmine.createSpy('onAfterValidate');
  22. handsontable({
  23. data: arrayOfObjects(),
  24. columns: [
  25. {data: 'time', type: 'time'},
  26. {data: 'name'},
  27. {data: 'lastName'}
  28. ],
  29. afterValidate: onAfterValidate
  30. });
  31. setDataAtCell(0, 0, '');
  32. setTimeout(() => {
  33. expect(onAfterValidate).toHaveBeenCalledWith(true, '', 0, 'time', undefined, undefined);
  34. done();
  35. }, 100);
  36. });
  37. it('should not positively validate a non-date format', (done) => {
  38. var onAfterValidate = jasmine.createSpy('onAfterValidate');
  39. handsontable({
  40. data: arrayOfObjects(),
  41. columns: [
  42. {data: 'time', type: 'time'},
  43. {data: 'name'},
  44. {data: 'lastName'}
  45. ],
  46. afterValidate: onAfterValidate
  47. });
  48. setDataAtCell(0, 0, 'nd');
  49. setTimeout(() => {
  50. expect(onAfterValidate).toHaveBeenCalledWith(false, 'nd', 0, 'time', undefined, undefined);
  51. done();
  52. }, 100);
  53. });
  54. it('should not positively validate a incorrect time string', (done) => {
  55. var onAfterValidate = jasmine.createSpy('onAfterValidate');
  56. handsontable({
  57. data: arrayOfObjects(),
  58. columns: [
  59. {data: 'time', type: 'time'},
  60. {data: 'name'},
  61. {data: 'lastName'}
  62. ],
  63. afterValidate: onAfterValidate
  64. });
  65. setDataAtCell(0, 0, '30:10:25');
  66. setTimeout(() => {
  67. expect(onAfterValidate).toHaveBeenCalledWith(false, '30:10:25', 0, 'time', undefined, undefined);
  68. done();
  69. }, 100);
  70. });
  71. it('should not positively validate a time string in not default format', (done) => {
  72. var onAfterValidate = jasmine.createSpy('onAfterValidate');
  73. handsontable({
  74. data: arrayOfObjects(),
  75. columns: [
  76. {data: 'time', type: 'time'},
  77. {data: 'name'},
  78. {data: 'lastName'}
  79. ],
  80. afterValidate: onAfterValidate
  81. });
  82. setDataAtCell(1, 0, '20:20:01');
  83. setTimeout(() => {
  84. expect(onAfterValidate).toHaveBeenCalledWith(false, '20:20:01', 1, 'time', undefined, undefined);
  85. done();
  86. }, 100);
  87. });
  88. it('should not positively validate a time string in wrong format (if custom format is provided)', (done) => {
  89. var onAfterValidate = jasmine.createSpy('onAfterValidate');
  90. handsontable({
  91. data: arrayOfObjects(),
  92. columns: [
  93. {data: 'time', type: 'time', timeFormat: 'HH:mm:ss'},
  94. {data: 'name'},
  95. {data: 'lastName'}
  96. ],
  97. afterValidate: onAfterValidate
  98. });
  99. setDataAtCell(1, 0, '5:10:15 am');
  100. setTimeout(() => {
  101. expect(onAfterValidate).toHaveBeenCalledWith(false, '5:10:15 am', 1, 'time', undefined, undefined);
  102. done();
  103. }, 100);
  104. });
  105. it('should positively validate a date string in correct format (if custom format is provided)', (done) => {
  106. var onAfterValidate = jasmine.createSpy('onAfterValidate');
  107. handsontable({
  108. data: arrayOfObjects(),
  109. columns: [
  110. {data: 'time', type: 'time', timeFormat: 'HH:mm:ss'},
  111. {data: 'name'},
  112. {data: 'lastName'}
  113. ],
  114. afterValidate: onAfterValidate
  115. });
  116. setDataAtCell(1, 0, '16:32:03');
  117. setTimeout(() => {
  118. expect(onAfterValidate).toHaveBeenCalledWith(true, '16:32:03', 1, 'time', undefined, undefined);
  119. done();
  120. }, 100);
  121. });
  122. describe('allowEmpty', () => {
  123. it('should not validate an empty string when allowEmpty is set as `false`', (done) => {
  124. var onAfterValidate = jasmine.createSpy('onAfterValidate');
  125. handsontable({
  126. data: arrayOfObjects(),
  127. columns: [
  128. {data: 'time', type: 'time', dateFormat: 'HH:mm', allowEmpty: false},
  129. {data: 'name'},
  130. {data: 'lastName'}
  131. ],
  132. afterValidate: onAfterValidate
  133. });
  134. setDataAtCell(1, 0, '');
  135. setTimeout(() => {
  136. expect(onAfterValidate).toHaveBeenCalledWith(false, '', 1, 'time', undefined, undefined);
  137. done();
  138. }, 100);
  139. });
  140. it('should not validate `null` when allowEmpty is set as `false`', (done) => {
  141. var onAfterValidate = jasmine.createSpy('onAfterValidate');
  142. handsontable({
  143. data: arrayOfObjects(),
  144. columns: [
  145. {data: 'time', type: 'time', dateFormat: 'HH:mm', allowEmpty: false},
  146. {data: 'name'},
  147. {data: 'lastName'}
  148. ],
  149. afterValidate: onAfterValidate
  150. });
  151. setDataAtCell(1, 0, null);
  152. setTimeout(() => {
  153. expect(onAfterValidate).toHaveBeenCalledWith(false, null, 1, 'time', undefined, undefined);
  154. done();
  155. }, 100);
  156. });
  157. it('should not validate `undefined` when allowEmpty is set as `false`', (done) => {
  158. var onAfterValidate = jasmine.createSpy('onAfterValidate');
  159. handsontable({
  160. data: arrayOfObjects(),
  161. columns: [
  162. {data: 'time', type: 'time', dateFormat: 'HH:mm', allowEmpty: false},
  163. {data: 'name'},
  164. {data: 'lastName'}
  165. ],
  166. afterValidate: onAfterValidate
  167. });
  168. setDataAtCell(1, 0, void 0);
  169. setTimeout(() => {
  170. expect(onAfterValidate).toHaveBeenCalledWith(false, void 0, 1, 'time', undefined, undefined);
  171. done();
  172. }, 100);
  173. });
  174. });
  175. describe('correctFormat', () => {
  176. it('should not make any changes to entered string if correctFormat is not set', (done) => {
  177. var onAfterValidate = jasmine.createSpy('onAfterValidate');
  178. handsontable({
  179. data: arrayOfObjects(),
  180. columns: [
  181. {data: 'time', type: 'time', timeFormat: 'h:mm:ss a'},
  182. {data: 'name'},
  183. {data: 'lastName'}
  184. ],
  185. afterValidate: onAfterValidate
  186. });
  187. setDataAtCell(1, 0, '13:00:00');
  188. setTimeout(() => {
  189. expect(onAfterValidate).toHaveBeenCalledWith(false, '13:00:00', 1, 'time', undefined, undefined);
  190. done();
  191. }, 100);
  192. });
  193. it('should not make any changes to entered string if correctFormat is set to false', (done) => {
  194. var onAfterValidate = jasmine.createSpy('onAfterValidate');
  195. handsontable({
  196. data: arrayOfObjects(),
  197. columns: [
  198. {data: 'time', type: 'time', timeFormat: 'h:mm:ss a', correctFormat: false},
  199. {data: 'name'},
  200. {data: 'lastName'}
  201. ],
  202. afterValidate: onAfterValidate
  203. });
  204. setDataAtCell(1, 0, '13:00:00');
  205. setTimeout(() => {
  206. expect(onAfterValidate).toHaveBeenCalledWith(false, '13:00:00', 1, 'time', undefined, undefined);
  207. done();
  208. }, 100);
  209. });
  210. it('should rewrite the string to the correct format if a time-string in different format is provided', (done) => {
  211. var onAfterValidate = jasmine.createSpy('onAfterValidate');
  212. handsontable({
  213. data: arrayOfObjects(),
  214. columns: [
  215. {data: 'time', type: 'time', timeFormat: 'h:mm:ss a', correctFormat: true},
  216. {data: 'lastName'}
  217. ],
  218. afterValidate: onAfterValidate
  219. });
  220. setDataAtCell(1, 0, '16:35:01');
  221. setTimeout(() => {
  222. expect(onAfterValidate).toHaveBeenCalledWith(true, '16:35:01', 1, 'time', undefined, undefined);
  223. }, 100);
  224. setTimeout(() => {
  225. expect(getDataAtCell(1, 0)).toEqual('4:35:01 pm');
  226. done();
  227. }, 130);
  228. });
  229. it('should rewrite the string to the correct format if a time in micro-timestamp format is provided', (done) => {
  230. var onAfterValidate = jasmine.createSpy('onAfterValidate');
  231. handsontable({
  232. data: arrayOfObjects(),
  233. columns: [
  234. {data: 'time', type: 'time', timeFormat: 'HH:mm:ss', correctFormat: true},
  235. {data: 'lastName'}
  236. ],
  237. afterValidate: onAfterValidate
  238. });
  239. var currentDateTime = new Date();
  240. setDataAtCell(1, 0, currentDateTime.getTime()); // timestamp in milliseconds
  241. setTimeout(() => {
  242. expect(onAfterValidate).toHaveBeenCalledWith(true, currentDateTime.getTime(), 1, 'time', undefined, undefined);
  243. }, 100);
  244. setTimeout(() => {
  245. var addLeadingZero = function(number) {
  246. return number < 10 ? `0${number}` : number;
  247. };
  248. expect(getDataAtCell(1, 0)).toEqual(`${addLeadingZero(currentDateTime.getHours())}:${addLeadingZero(currentDateTime.getMinutes())}:${
  249. addLeadingZero(currentDateTime.getSeconds())}`);
  250. done();
  251. }, 130);
  252. });
  253. it('should rewrite the string to the correct format if a time in ISO8601 format is provided', (done) => {
  254. var onAfterValidate = jasmine.createSpy('onAfterValidate');
  255. handsontable({
  256. data: arrayOfObjects(),
  257. columns: [
  258. {data: 'time', type: 'time', timeFormat: 'HH:mm:ss', correctFormat: true},
  259. {data: 'lastName'}
  260. ],
  261. afterValidate: onAfterValidate
  262. });
  263. var currentDateTime = new Date();
  264. setDataAtCell(1, 0, currentDateTime.toISOString()); // ISO-formatted datetime, sth like '2016-02-19T12:40:04.983Z'
  265. setTimeout(() => {
  266. expect(onAfterValidate).toHaveBeenCalledWith(true, currentDateTime.toISOString(), 1, 'time', undefined, undefined);
  267. }, 100);
  268. setTimeout(() => {
  269. var addLeadingZero = function(number) {
  270. return number < 10 ? `0${number}` : number;
  271. };
  272. expect(getDataAtCell(1, 0)).toEqual(`${addLeadingZero(currentDateTime.getHours())}:${addLeadingZero(currentDateTime.getMinutes())}:${
  273. addLeadingZero(currentDateTime.getSeconds())}`);
  274. done();
  275. }, 130);
  276. });
  277. it('should rewrite one and two-digit number to the correct format at hours', (done) => {
  278. var onAfterValidate = jasmine.createSpy('onAfterValidate');
  279. handsontable({
  280. data: arrayOfObjects(),
  281. columns: [
  282. {data: 'time', type: 'time', timeFormat: 'hh:mm:ss a', correctFormat: true},
  283. {data: 'lastName'}
  284. ],
  285. afterValidate: onAfterValidate
  286. });
  287. setDataAtCell(1, 0, '19');
  288. setTimeout(() => {
  289. expect(onAfterValidate).toHaveBeenCalledWith(true, '19', 1, 'time', undefined, undefined);
  290. }, 100);
  291. setTimeout(() => {
  292. expect(getDataAtCell(1, 0)).toEqual('07:00:00 pm');
  293. done();
  294. }, 130);
  295. });
  296. it('should rewrite one and two-digit number to the correct format at minutes', (done) => {
  297. var onAfterValidate = jasmine.createSpy('onAfterValidate');
  298. handsontable({
  299. data: arrayOfObjects(),
  300. columns: [
  301. {data: 'time', type: 'time', timeFormat: 'mm:ss', correctFormat: true},
  302. {data: 'lastName'}
  303. ],
  304. afterValidate: onAfterValidate
  305. });
  306. setDataAtCell(1, 0, '57');
  307. setTimeout(() => {
  308. expect(onAfterValidate).toHaveBeenCalledWith(true, '57', 1, 'time', undefined, undefined);
  309. }, 100);
  310. setTimeout(() => {
  311. expect(getDataAtCell(1, 0)).toEqual('57:00');
  312. done();
  313. }, 130);
  314. });
  315. it('should not try to correct format of non-date strings', (done) => {
  316. var onAfterValidate = jasmine.createSpy('onAfterValidate');
  317. handsontable({
  318. data: arrayOfObjects(),
  319. columns: [
  320. {data: 'time', type: 'time', timeFormat: 'HH:mm:ss', correctFormat: true},
  321. {data: 'name'},
  322. {data: 'lastName'}
  323. ],
  324. afterValidate: onAfterValidate
  325. });
  326. setDataAtCell(1, 0, 'test non-time string');
  327. setTimeout(() => {
  328. expect(onAfterValidate).toHaveBeenCalledWith(false, 'test non-time string', 1, 'time', undefined, undefined);
  329. done();
  330. }, 100);
  331. });
  332. });
  333. });