dateValidator.spec.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  1. describe('dateValidator', () => {
  2. const 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. const arrayOfObjects = function() {
  13. return [
  14. { date: '01/01/2015', name: 'Ted', lastName: 'Right' },
  15. { date: '01/01/15', name: 'Frank', lastName: 'Honest' },
  16. { date: '41/01/2015', name: 'Joan', lastName: 'Well' },
  17. { date: '01/51/2015', name: 'Sid', lastName: 'Strong' }
  18. ];
  19. };
  20. it('should validate an empty string (default behavior)', (done) => {
  21. const onAfterValidate = jasmine.createSpy('onAfterValidate');
  22. handsontable({
  23. data: arrayOfObjects(),
  24. columns: [
  25. { data: 'date', type: 'date' },
  26. { data: 'name' },
  27. { data: 'lastName' }
  28. ],
  29. afterValidate: onAfterValidate
  30. });
  31. setDataAtCell(0, 0, '');
  32. setTimeout(() => {
  33. expect(onAfterValidate).toHaveBeenCalledWith(true, '', 0, 'date', undefined, undefined);
  34. done();
  35. }, 100);
  36. });
  37. it('should rewrite an ISO 8601 string to the correct format if a date-string in different format is provided', async() => {
  38. const onAfterValidate = jasmine.createSpy('onAfterValidate');
  39. handsontable({
  40. data: arrayOfObjects(),
  41. columns: [
  42. { data: 'date', type: 'date', dateFormat: 'MM/DD/YYYY', correctFormat: true },
  43. { data: 'lastName' }
  44. ],
  45. afterValidate: onAfterValidate
  46. });
  47. setDataAtCell(1, 0, '2016-03-18');
  48. await sleep(200);
  49. expect(onAfterValidate).toHaveBeenCalledWith(true, '2016-03-18', 1, 'date', undefined, undefined);
  50. expect(getDataAtCell(1, 0)).toEqual('03/18/2016');
  51. });
  52. it('should not positively validate a non-date string', (done) => {
  53. const onAfterValidate = jasmine.createSpy('onAfterValidate');
  54. handsontable({
  55. data: arrayOfObjects(),
  56. columns: [
  57. { data: 'date', type: 'date' },
  58. { data: 'name' },
  59. { data: 'lastName' }
  60. ],
  61. afterValidate: onAfterValidate
  62. });
  63. setDataAtCell(0, 0, 'wat');
  64. setTimeout(() => {
  65. expect(onAfterValidate).toHaveBeenCalledWith(false, 'wat', 0, 'date', undefined, undefined);
  66. done();
  67. }, 100);
  68. });
  69. it('should not positively validate a non-date string and rewrite to the correct format when `allowInvalid` is false', async() => {
  70. const onAfterValidate = jasmine.createSpy('onAfterValidate');
  71. handsontable({
  72. data: arrayOfObjects(),
  73. columns: [
  74. { data: 'date', type: 'date', dateFormat: 'MM/DD/YYYY', correctFormat: true, allowInvalid: false },
  75. { data: 'lastName' }
  76. ],
  77. afterValidate: onAfterValidate
  78. });
  79. setDataAtCell(0, 0, '01/01/2015 ops');
  80. await sleep(200);
  81. expect(onAfterValidate).toHaveBeenCalledWith(false, '01/01/2015 ops', 0, 'date', undefined, undefined);
  82. expect(getDataAtCell(0, 0)).toEqual('01/01/2015');
  83. });
  84. it('should not positively validate a incorrect date string', (done) => {
  85. const onAfterValidate = jasmine.createSpy('onAfterValidate');
  86. handsontable({
  87. data: arrayOfObjects(),
  88. columns: [
  89. { data: 'date', type: 'date' },
  90. { data: 'name' },
  91. { data: 'lastName' }
  92. ],
  93. afterValidate: onAfterValidate
  94. });
  95. setDataAtCell(0, 0, '33/01/2014');
  96. setTimeout(() => {
  97. expect(onAfterValidate).toHaveBeenCalledWith(false, '33/01/2014', 0, 'date', undefined, undefined);
  98. done();
  99. }, 100);
  100. });
  101. it('should not positively validate a date string in wrong format', (done) => {
  102. const onAfterValidate = jasmine.createSpy('onAfterValidate');
  103. handsontable({
  104. data: arrayOfObjects(),
  105. columns: [
  106. { data: 'date', type: 'date' },
  107. { data: 'name' },
  108. { data: 'lastName' }
  109. ],
  110. afterValidate: onAfterValidate
  111. });
  112. setDataAtCell(1, 0, '01/01/15');
  113. setTimeout(() => {
  114. expect(onAfterValidate).toHaveBeenCalledWith(false, '01/01/15', 1, 'date', undefined, undefined);
  115. done();
  116. }, 100);
  117. });
  118. it('should not positively validate a date string in wrong format (if custom format is provided)', (done) => {
  119. const onAfterValidate = jasmine.createSpy('onAfterValidate');
  120. handsontable({
  121. data: arrayOfObjects(),
  122. columns: [
  123. { data: 'date', type: 'date', dateFormat: 'DD/MM/YY' },
  124. { data: 'name' },
  125. { data: 'lastName' }
  126. ],
  127. afterValidate: onAfterValidate
  128. });
  129. setDataAtCell(1, 0, '01/01/2015');
  130. setTimeout(() => {
  131. expect(onAfterValidate).toHaveBeenCalledWith(false, '01/01/2015', 1, 'date', undefined, undefined);
  132. done();
  133. }, 100);
  134. });
  135. it('should positively validate a date string in correct format', (done) => {
  136. const onAfterValidate = jasmine.createSpy('onAfterValidate');
  137. handsontable({
  138. data: arrayOfObjects(),
  139. columns: [
  140. { data: 'date', type: 'date' },
  141. { data: 'name' },
  142. { data: 'lastName' }
  143. ],
  144. afterValidate: onAfterValidate
  145. });
  146. setDataAtCell(1, 0, '01/01/2015');
  147. setTimeout(() => {
  148. expect(onAfterValidate).toHaveBeenCalledWith(true, '01/01/2015', 1, 'date', undefined, undefined);
  149. done();
  150. }, 100);
  151. });
  152. it('should positively validate a date string in correct format (if custom format is provided)', (done) => {
  153. const onAfterValidate = jasmine.createSpy('onAfterValidate');
  154. handsontable({
  155. data: arrayOfObjects(),
  156. columns: [
  157. { data: 'date', type: 'date', dateFormat: 'DD/MM/YY' },
  158. { data: 'name' },
  159. { data: 'lastName' }
  160. ],
  161. afterValidate: onAfterValidate
  162. });
  163. setDataAtCell(1, 0, '23/03/15');
  164. setTimeout(() => {
  165. expect(onAfterValidate).toHaveBeenCalledWith(true, '23/03/15', 1, 'date', undefined, undefined);
  166. done();
  167. }, 100);
  168. });
  169. describe('allowEmpty', () => {
  170. it('should not validate an empty string when allowEmpty is set as `false`', (done) => {
  171. const onAfterValidate = jasmine.createSpy('onAfterValidate');
  172. handsontable({
  173. data: arrayOfObjects(),
  174. columns: [
  175. { data: 'date', type: 'date', dateFormat: 'DD/MM/YY', allowEmpty: false },
  176. { data: 'name' },
  177. { data: 'lastName' }
  178. ],
  179. afterValidate: onAfterValidate
  180. });
  181. setDataAtCell(1, 0, '');
  182. setTimeout(() => {
  183. expect(onAfterValidate).toHaveBeenCalledWith(false, '', 1, 'date', undefined, undefined);
  184. done();
  185. }, 100);
  186. });
  187. it('should not validate `null` when allowEmpty is set as `false`', (done) => {
  188. const onAfterValidate = jasmine.createSpy('onAfterValidate');
  189. handsontable({
  190. data: arrayOfObjects(),
  191. columns: [
  192. { data: 'date', type: 'date', dateFormat: 'DD/MM/YY', allowEmpty: false },
  193. { data: 'name' },
  194. { data: 'lastName' }
  195. ],
  196. afterValidate: onAfterValidate
  197. });
  198. setDataAtCell(1, 0, null);
  199. setTimeout(() => {
  200. expect(onAfterValidate).toHaveBeenCalledWith(false, null, 1, 'date', undefined, undefined);
  201. done();
  202. }, 100);
  203. });
  204. it('should not validate `undefined` when allowEmpty is set as `false`', (done) => {
  205. const onAfterValidate = jasmine.createSpy('onAfterValidate');
  206. handsontable({
  207. data: arrayOfObjects(),
  208. columns: [
  209. { data: 'date', type: 'date', dateFormat: 'DD/MM/YY', allowEmpty: false },
  210. { data: 'name' },
  211. { data: 'lastName' }
  212. ],
  213. afterValidate: onAfterValidate
  214. });
  215. setDataAtCell(1, 0, void 0);
  216. setTimeout(() => {
  217. expect(onAfterValidate).toHaveBeenCalledWith(false, void 0, 1, 'date', undefined, undefined);
  218. done();
  219. }, 100);
  220. });
  221. });
  222. describe('correctFormat', () => {
  223. it('should not make any changes to entered string if correctFormat is not set', (done) => {
  224. const onAfterValidate = jasmine.createSpy('onAfterValidate');
  225. handsontable({
  226. data: arrayOfObjects(),
  227. columns: [
  228. { data: 'date', type: 'date', dateFormat: 'MM/DD/YY' },
  229. { data: 'name' },
  230. { data: 'lastName' }
  231. ],
  232. afterValidate: onAfterValidate
  233. });
  234. setDataAtCell(1, 0, '11/23/2013');
  235. setTimeout(() => {
  236. expect(onAfterValidate).toHaveBeenCalledWith(false, '11/23/2013', 1, 'date', undefined, undefined);
  237. done();
  238. }, 100);
  239. });
  240. it('should not make any changes to entered string if correctFormat is set to false', (done) => {
  241. const onAfterValidate = jasmine.createSpy('onAfterValidate');
  242. handsontable({
  243. data: arrayOfObjects(),
  244. columns: [
  245. { data: 'date', type: 'date', dateFormat: 'MM/DD/YY', correctFormat: false },
  246. { data: 'name' },
  247. { data: 'lastName' }
  248. ],
  249. afterValidate: onAfterValidate
  250. });
  251. setDataAtCell(1, 0, '11/23/2013');
  252. setTimeout(() => {
  253. expect(onAfterValidate).toHaveBeenCalledWith(false, '11/23/2013', 1, 'date', undefined, undefined);
  254. done();
  255. }, 100);
  256. });
  257. it('should rewrite the string to the correct format if a date-string in different format is provided', (done) => {
  258. const onAfterValidate = jasmine.createSpy('onAfterValidate');
  259. handsontable({
  260. data: arrayOfObjects(),
  261. columns: [
  262. { data: 'date', type: 'date', dateFormat: 'MM/DD/YYYY', correctFormat: true },
  263. { data: 'lastName' }
  264. ],
  265. afterValidate: onAfterValidate
  266. });
  267. setDataAtCell(1, 0, '1/10/15');
  268. setTimeout(() => {
  269. expect(onAfterValidate).toHaveBeenCalledWith(true, '1/10/15', 1, 'date', undefined, undefined);
  270. }, 100);
  271. setTimeout(() => {
  272. expect(getDataAtCell(1, 0)).toEqual('01/10/2015');
  273. done();
  274. }, 130);
  275. });
  276. it('should rewrite the string to the correct format if a date-string in different format is provided (for non-default format)', (done) => {
  277. const onAfterValidate = jasmine.createSpy('onAfterValidate');
  278. handsontable({
  279. data: arrayOfObjects(),
  280. columns: [
  281. { data: 'date', type: 'date', dateFormat: 'DD.MM.YYYY', correctFormat: true },
  282. { data: 'lastName' }
  283. ],
  284. afterValidate: onAfterValidate
  285. });
  286. setDataAtCell(1, 0, '5.3.2016');
  287. setTimeout(() => {
  288. expect(onAfterValidate).toHaveBeenCalledWith(true, '5.3.2016', 1, 'date', undefined, undefined);
  289. }, 100);
  290. setTimeout(() => {
  291. expect(getDataAtCell(1, 0)).toEqual('05.03.2016');
  292. done();
  293. }, 130);
  294. });
  295. it('should not try to correct format of non-date strings', (done) => {
  296. const onAfterValidate = jasmine.createSpy('onAfterValidate');
  297. handsontable({
  298. data: arrayOfObjects(),
  299. columns: [
  300. { data: 'date', type: 'date', dateFormat: 'DD/MM/YY', correctFormat: true },
  301. { data: 'name' },
  302. { data: 'lastName' }
  303. ],
  304. afterValidate: onAfterValidate
  305. });
  306. setDataAtCell(1, 0, 'test non-date string');
  307. setTimeout(() => {
  308. expect(onAfterValidate).toHaveBeenCalledWith(false, 'test non-date string', 1, 'date', undefined, undefined);
  309. done();
  310. }, 100);
  311. });
  312. });
  313. });