UNPKG

papaparse

Version:

Fast and powerful CSV parser for the browser that supports web workers and streaming large files. Converts CSV to JSON and JSON to CSV.

303 lines (285 loc) 8.27 kB
"use strict"; var Papa = require("../papaparse.js"); var fs = require('fs'); var assert = require('assert'); var longSampleRawCsv = fs.readFileSync(__dirname + '/long-sample.csv', 'utf8'); var utf8BomSampleRawCsv = fs.readFileSync(__dirname + '/utf-8-bom-sample.csv', 'utf8'); function assertLongSampleParsedCorrectly(parsedCsv) { assert.equal(8, parsedCsv.data.length); assert.deepEqual(parsedCsv.data[0], [ 'Grant', 'Dyer', 'Donec.elementum@orciluctuset.example', '2013-11-23T02:30:31-08:00', '2014-05-31T01:06:56-07:00', 'Magna Ut Associates', 'ljenkins' ]); assert.deepEqual(parsedCsv.data[7], [ 'Talon', 'Salinas', 'posuere.vulputate.lacus@Donecsollicitudin.example', '2015-01-31T09:19:02-08:00', '2014-12-17T04:59:18-08:00', 'Aliquam Iaculis Incorporate', 'Phasellus@Quisquetincidunt.example' ]); assert.deepEqual(parsedCsv.meta, { "delimiter": ",", "linebreak": "\n", "aborted": false, "truncated": false, renamedHeaders: null, "cursor": 1209 }); assert.equal(parsedCsv.errors.length, 0); } describe('PapaParse', function() { it('synchronously parsed CSV should be correctly parsed', function() { assertLongSampleParsedCorrectly(Papa.parse(longSampleRawCsv)); }); it('Pause and resume works (Regression Test for Bug #636)', function(done) { this.timeout(30000); var mod200Rows = [ ["Etiam a dolor vitae est vestibulum","84","DEF"], ["Etiam a dolor vitae est vestibulum","84","DEF"], ["Lorem ipsum dolor sit","42","ABC"], ["Etiam a dolor vitae est vestibulum","84","DEF"], ["Etiam a dolor vitae est vestibulum","84"], ["Lorem ipsum dolor sit","42","ABC"], ["Etiam a dolor vitae est vestibulum","84","DEF"], ["Etiam a dolor vitae est vestibulum","84","DEF"], ["Lorem ipsum dolor sit","42","ABC"], ["Lorem ipsum dolor sit","42"] ]; var stepped = 0; var dataRows = []; Papa.parse(fs.createReadStream(__dirname + '/verylong-sample.csv'), { step: function(results, parser) { stepped++; if (results) { parser.pause(); parser.resume(); if (results.data && stepped % 200 === 0) { dataRows.push(results.data); } } }, complete: function() { assert.strictEqual(2001, stepped); assert.deepEqual(mod200Rows, dataRows); done(); } }); }); it('asynchronously parsed CSV should be correctly parsed', function(done) { Papa.parse(longSampleRawCsv, { complete: function(parsedCsv) { assertLongSampleParsedCorrectly(parsedCsv); done(); }, }); }); it('asynchronously parsed streaming CSV should be correctly parsed', function(done) { Papa.parse(fs.createReadStream(__dirname + '/long-sample.csv', 'utf8'), { complete: function(parsedCsv) { assertLongSampleParsedCorrectly(parsedCsv); done(); }, }); }); it('reports the correct row number on FieldMismatch errors', function(done) { Papa.parse(fs.createReadStream(__dirname + '/verylong-sample.csv'), { header: true, fastMode: true, complete: function(parsedCsv) { assert.deepEqual(parsedCsv.errors, [ { "type": "FieldMismatch", "code": "TooFewFields", "message": "Too few fields: expected 3 fields but parsed 2", "row": 498 }, { "type": "FieldMismatch", "code": "TooFewFields", "message": "Too few fields: expected 3 fields but parsed 2", "row": 998 }, { "type": "FieldMismatch", "code": "TooFewFields", "message": "Too few fields: expected 3 fields but parsed 2", "row": 1498 }, { "type": "FieldMismatch", "code": "TooFewFields", "message": "Too few fields: expected 3 fields but parsed 2", "row": 1998 } ]); assert.strictEqual(2000, parsedCsv.data.length); done(); }, }); }); it('piped streaming CSV should be correctly parsed', function(done) { var data = []; var readStream = fs.createReadStream(__dirname + '/long-sample.csv', 'utf8'); var csvStream = readStream.pipe(Papa.parse(Papa.NODE_STREAM_INPUT)); csvStream.on('data', function(item) { data.push(item); }); csvStream.on('end', function() { assert.deepEqual(data[0], [ 'Grant', 'Dyer', 'Donec.elementum@orciluctuset.example', '2013-11-23T02:30:31-08:00', '2014-05-31T01:06:56-07:00', 'Magna Ut Associates', 'ljenkins' ]); assert.deepEqual(data[7], [ 'Talon', 'Salinas', 'posuere.vulputate.lacus@Donecsollicitudin.example', '2015-01-31T09:19:02-08:00', '2014-12-17T04:59:18-08:00', 'Aliquam Iaculis Incorporate', 'Phasellus@Quisquetincidunt.example' ]); done(); }); }); it('piped streaming CSV should be correctly parsed when header is true', function(done) { var data = []; var readStream = fs.createReadStream(__dirname + '/sample-header.csv', 'utf8'); var csvStream = readStream.pipe(Papa.parse(Papa.NODE_STREAM_INPUT, {header: true})); csvStream.on('data', function(item) { data.push(item); }); csvStream.on('end', function() { assert.deepEqual(data[0], { title: 'test title 01', name: 'test name 01' }); assert.deepEqual(data[1], { title: '', name: 'test name 02' }); done(); }); }); it('should support pausing and resuming on same tick when streaming', function(done) { var rows = []; Papa.parse(fs.createReadStream(__dirname + '/long-sample.csv', 'utf8'), { chunk: function(results, parser) { rows = rows.concat(results.data); parser.pause(); parser.resume(); }, error: function(err) { done(new Error(err)); }, complete: function() { assert.deepEqual(rows[0], [ 'Grant', 'Dyer', 'Donec.elementum@orciluctuset.example', '2013-11-23T02:30:31-08:00', '2014-05-31T01:06:56-07:00', 'Magna Ut Associates', 'ljenkins' ]); assert.deepEqual(rows[7], [ 'Talon', 'Salinas', 'posuere.vulputate.lacus@Donecsollicitudin.example', '2015-01-31T09:19:02-08:00', '2014-12-17T04:59:18-08:00', 'Aliquam Iaculis Incorporate', 'Phasellus@Quisquetincidunt.example' ]); done(); } }); }); it('should support pausing and resuming asynchronously when streaming', function(done) { var rows = []; Papa.parse(fs.createReadStream(__dirname + '/long-sample.csv', 'utf8'), { chunk: function(results, parser) { rows = rows.concat(results.data); parser.pause(); setTimeout(function() { parser.resume(); }, 200); }, error: function(err) { done(new Error(err)); }, complete: function() { assert.deepEqual(rows[0], [ 'Grant', 'Dyer', 'Donec.elementum@orciluctuset.example', '2013-11-23T02:30:31-08:00', '2014-05-31T01:06:56-07:00', 'Magna Ut Associates', 'ljenkins' ]); assert.deepEqual(rows[7], [ 'Talon', 'Salinas', 'posuere.vulputate.lacus@Donecsollicitudin.example', '2015-01-31T09:19:02-08:00', '2014-12-17T04:59:18-08:00', 'Aliquam Iaculis Incorporate', 'Phasellus@Quisquetincidunt.example' ]); done(); } }); }); it('handles errors in beforeFirstChunk', function(done) { var expectedError = new Error('test'); Papa.parse(fs.createReadStream(__dirname + '/long-sample.csv', 'utf8'), { beforeFirstChunk: function() { throw expectedError; }, error: function(err) { assert.deepEqual(err, expectedError); done(); } }); }); it('handles errors in chunk', function(done) { var expectedError = new Error('test'); Papa.parse(fs.createReadStream(__dirname + '/long-sample.csv', 'utf8'), { chunk: function() { throw expectedError; }, error: function(err) { assert.deepEqual(err, expectedError); done(); } }); }); it('handles errors in step', function(done) { var expectedError = new Error('test'); Papa.parse(fs.createReadStream(__dirname + '/long-sample.csv', 'utf8'), { step: function() { throw expectedError; }, error: function(err) { assert.deepEqual(err, expectedError); done(); } }); }); it('handles utf-8 BOM encoded files', function(done) { Papa.parse(utf8BomSampleRawCsv, { header: true, complete: function(parsedCsv) { assert.deepEqual(parsedCsv.data[0], { A: 'X', B: 'Y', C: 'Z' }); done(); } }); }); });