node-tests.js 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. "use strict";
  2. var Papa = require("../papaparse.js");
  3. var fs = require('fs');
  4. var assert = require('assert');
  5. var longSampleRawCsv = fs.readFileSync(__dirname + '/long-sample.csv', 'utf8');
  6. var utf8BomSampleRawCsv = fs.readFileSync(__dirname + '/utf-8-bom-sample.csv', 'utf8');
  7. function assertLongSampleParsedCorrectly(parsedCsv) {
  8. assert.equal(8, parsedCsv.data.length);
  9. assert.deepEqual(parsedCsv.data[0], [
  10. 'Grant',
  11. 'Dyer',
  12. 'Donec.elementum@orciluctuset.example',
  13. '2013-11-23T02:30:31-08:00',
  14. '2014-05-31T01:06:56-07:00',
  15. 'Magna Ut Associates',
  16. 'ljenkins'
  17. ]);
  18. assert.deepEqual(parsedCsv.data[7], [
  19. 'Talon',
  20. 'Salinas',
  21. 'posuere.vulputate.lacus@Donecsollicitudin.example',
  22. '2015-01-31T09:19:02-08:00',
  23. '2014-12-17T04:59:18-08:00',
  24. 'Aliquam Iaculis Incorporate',
  25. 'Phasellus@Quisquetincidunt.example'
  26. ]);
  27. assert.deepEqual(parsedCsv.meta, {
  28. "delimiter": ",",
  29. "linebreak": "\n",
  30. "aborted": false,
  31. "truncated": false,
  32. renamedHeaders: null,
  33. "cursor": 1209
  34. });
  35. assert.equal(parsedCsv.errors.length, 0);
  36. }
  37. describe('PapaParse', function() {
  38. it('synchronously parsed CSV should be correctly parsed', function() {
  39. assertLongSampleParsedCorrectly(Papa.parse(longSampleRawCsv));
  40. });
  41. it('Pause and resume works (Regression Test for Bug #636)', function(done) {
  42. this.timeout(30000);
  43. var mod200Rows = [
  44. ["Etiam a dolor vitae est vestibulum","84","DEF"],
  45. ["Etiam a dolor vitae est vestibulum","84","DEF"],
  46. ["Lorem ipsum dolor sit","42","ABC"],
  47. ["Etiam a dolor vitae est vestibulum","84","DEF"],
  48. ["Etiam a dolor vitae est vestibulum","84"],
  49. ["Lorem ipsum dolor sit","42","ABC"],
  50. ["Etiam a dolor vitae est vestibulum","84","DEF"],
  51. ["Etiam a dolor vitae est vestibulum","84","DEF"],
  52. ["Lorem ipsum dolor sit","42","ABC"],
  53. ["Lorem ipsum dolor sit","42"]
  54. ];
  55. var stepped = 0;
  56. var dataRows = [];
  57. Papa.parse(fs.createReadStream(__dirname + '/verylong-sample.csv'), {
  58. step: function(results, parser) {
  59. stepped++;
  60. if (results)
  61. {
  62. parser.pause();
  63. parser.resume();
  64. if (results.data && stepped % 200 === 0) {
  65. dataRows.push(results.data);
  66. }
  67. }
  68. },
  69. complete: function() {
  70. assert.strictEqual(2001, stepped);
  71. assert.deepEqual(mod200Rows, dataRows);
  72. done();
  73. }
  74. });
  75. });
  76. it('asynchronously parsed CSV should be correctly parsed', function(done) {
  77. Papa.parse(longSampleRawCsv, {
  78. complete: function(parsedCsv) {
  79. assertLongSampleParsedCorrectly(parsedCsv);
  80. done();
  81. },
  82. });
  83. });
  84. it('asynchronously parsed streaming CSV should be correctly parsed', function(done) {
  85. Papa.parse(fs.createReadStream(__dirname + '/long-sample.csv', 'utf8'), {
  86. complete: function(parsedCsv) {
  87. assertLongSampleParsedCorrectly(parsedCsv);
  88. done();
  89. },
  90. });
  91. });
  92. it('reports the correct row number on FieldMismatch errors', function(done) {
  93. Papa.parse(fs.createReadStream(__dirname + '/verylong-sample.csv'), {
  94. header: true,
  95. fastMode: true,
  96. complete: function(parsedCsv) {
  97. assert.deepEqual(parsedCsv.errors, [
  98. {
  99. "type": "FieldMismatch",
  100. "code": "TooFewFields",
  101. "message": "Too few fields: expected 3 fields but parsed 2",
  102. "row": 498
  103. },
  104. {
  105. "type": "FieldMismatch",
  106. "code": "TooFewFields",
  107. "message": "Too few fields: expected 3 fields but parsed 2",
  108. "row": 998
  109. },
  110. {
  111. "type": "FieldMismatch",
  112. "code": "TooFewFields",
  113. "message": "Too few fields: expected 3 fields but parsed 2",
  114. "row": 1498
  115. },
  116. {
  117. "type": "FieldMismatch",
  118. "code": "TooFewFields",
  119. "message": "Too few fields: expected 3 fields but parsed 2",
  120. "row": 1998
  121. }
  122. ]);
  123. assert.strictEqual(2000, parsedCsv.data.length);
  124. done();
  125. },
  126. });
  127. });
  128. it('piped streaming CSV should be correctly parsed', function(done) {
  129. var data = [];
  130. var readStream = fs.createReadStream(__dirname + '/long-sample.csv', 'utf8');
  131. var csvStream = readStream.pipe(Papa.parse(Papa.NODE_STREAM_INPUT));
  132. csvStream.on('data', function(item) {
  133. data.push(item);
  134. });
  135. csvStream.on('end', function() {
  136. assert.deepEqual(data[0], [
  137. 'Grant',
  138. 'Dyer',
  139. 'Donec.elementum@orciluctuset.example',
  140. '2013-11-23T02:30:31-08:00',
  141. '2014-05-31T01:06:56-07:00',
  142. 'Magna Ut Associates',
  143. 'ljenkins'
  144. ]);
  145. assert.deepEqual(data[7], [
  146. 'Talon',
  147. 'Salinas',
  148. 'posuere.vulputate.lacus@Donecsollicitudin.example',
  149. '2015-01-31T09:19:02-08:00',
  150. '2014-12-17T04:59:18-08:00',
  151. 'Aliquam Iaculis Incorporate',
  152. 'Phasellus@Quisquetincidunt.example'
  153. ]);
  154. done();
  155. });
  156. });
  157. it('piped streaming CSV should be correctly parsed when header is true', function(done) {
  158. var data = [];
  159. var readStream = fs.createReadStream(__dirname + '/sample-header.csv', 'utf8');
  160. var csvStream = readStream.pipe(Papa.parse(Papa.NODE_STREAM_INPUT, {header: true}));
  161. csvStream.on('data', function(item) {
  162. data.push(item);
  163. });
  164. csvStream.on('end', function() {
  165. assert.deepEqual(data[0], { title: 'test title 01', name: 'test name 01' });
  166. assert.deepEqual(data[1], { title: '', name: 'test name 02' });
  167. done();
  168. });
  169. });
  170. it('should support pausing and resuming on same tick when streaming', function(done) {
  171. var rows = [];
  172. Papa.parse(fs.createReadStream(__dirname + '/long-sample.csv', 'utf8'), {
  173. chunk: function(results, parser) {
  174. rows = rows.concat(results.data);
  175. parser.pause();
  176. parser.resume();
  177. },
  178. error: function(err) {
  179. done(new Error(err));
  180. },
  181. complete: function() {
  182. assert.deepEqual(rows[0], [
  183. 'Grant',
  184. 'Dyer',
  185. 'Donec.elementum@orciluctuset.example',
  186. '2013-11-23T02:30:31-08:00',
  187. '2014-05-31T01:06:56-07:00',
  188. 'Magna Ut Associates',
  189. 'ljenkins'
  190. ]);
  191. assert.deepEqual(rows[7], [
  192. 'Talon',
  193. 'Salinas',
  194. 'posuere.vulputate.lacus@Donecsollicitudin.example',
  195. '2015-01-31T09:19:02-08:00',
  196. '2014-12-17T04:59:18-08:00',
  197. 'Aliquam Iaculis Incorporate',
  198. 'Phasellus@Quisquetincidunt.example'
  199. ]);
  200. done();
  201. }
  202. });
  203. });
  204. it('should support pausing and resuming asynchronously when streaming', function(done) {
  205. var rows = [];
  206. Papa.parse(fs.createReadStream(__dirname + '/long-sample.csv', 'utf8'), {
  207. chunk: function(results, parser) {
  208. rows = rows.concat(results.data);
  209. parser.pause();
  210. setTimeout(function() {
  211. parser.resume();
  212. }, 200);
  213. },
  214. error: function(err) {
  215. done(new Error(err));
  216. },
  217. complete: function() {
  218. assert.deepEqual(rows[0], [
  219. 'Grant',
  220. 'Dyer',
  221. 'Donec.elementum@orciluctuset.example',
  222. '2013-11-23T02:30:31-08:00',
  223. '2014-05-31T01:06:56-07:00',
  224. 'Magna Ut Associates',
  225. 'ljenkins'
  226. ]);
  227. assert.deepEqual(rows[7], [
  228. 'Talon',
  229. 'Salinas',
  230. 'posuere.vulputate.lacus@Donecsollicitudin.example',
  231. '2015-01-31T09:19:02-08:00',
  232. '2014-12-17T04:59:18-08:00',
  233. 'Aliquam Iaculis Incorporate',
  234. 'Phasellus@Quisquetincidunt.example'
  235. ]);
  236. done();
  237. }
  238. });
  239. });
  240. it('handles errors in beforeFirstChunk', function(done) {
  241. var expectedError = new Error('test');
  242. Papa.parse(fs.createReadStream(__dirname + '/long-sample.csv', 'utf8'), {
  243. beforeFirstChunk: function() {
  244. throw expectedError;
  245. },
  246. error: function(err) {
  247. assert.deepEqual(err, expectedError);
  248. done();
  249. }
  250. });
  251. });
  252. it('handles errors in chunk', function(done) {
  253. var expectedError = new Error('test');
  254. Papa.parse(fs.createReadStream(__dirname + '/long-sample.csv', 'utf8'), {
  255. chunk: function() {
  256. throw expectedError;
  257. },
  258. error: function(err) {
  259. assert.deepEqual(err, expectedError);
  260. done();
  261. }
  262. });
  263. });
  264. it('handles errors in step', function(done) {
  265. var expectedError = new Error('test');
  266. Papa.parse(fs.createReadStream(__dirname + '/long-sample.csv', 'utf8'), {
  267. step: function() {
  268. throw expectedError;
  269. },
  270. error: function(err) {
  271. assert.deepEqual(err, expectedError);
  272. done();
  273. }
  274. });
  275. });
  276. it('handles utf-8 BOM encoded files', function(done) {
  277. Papa.parse(utf8BomSampleRawCsv, {
  278. header: true,
  279. complete: function(parsedCsv) {
  280. assert.deepEqual(parsedCsv.data[0], { A: 'X', B: 'Y', C: 'Z' });
  281. done();
  282. }
  283. });
  284. });
  285. });