244 lines
6.6 KiB
TypeScript
244 lines
6.6 KiB
TypeScript
|
import csv from "../src";
|
||
|
var assert = require("assert");
|
||
|
var fs = require("fs");
|
||
|
import { sandbox } from "sinon";
|
||
|
import CSVError from "../src/CSVError";
|
||
|
const sb = sandbox.create();
|
||
|
describe("testCSVConverter3", function () {
|
||
|
afterEach(function () {
|
||
|
sb.restore();
|
||
|
});
|
||
|
it("should parse large csv file with UTF-8 without spliting characters", function (done) {
|
||
|
var testData = __dirname + "/data/large-utf8.csv";
|
||
|
var rs = fs.createReadStream(testData);
|
||
|
var csvConverter = csv({
|
||
|
});
|
||
|
var count = 0;
|
||
|
csvConverter.preRawData(function (csvRawData) {
|
||
|
assert(csvRawData.charCodeAt(0) < 2000);
|
||
|
return csvRawData;
|
||
|
})
|
||
|
csvConverter.on("data", function () {
|
||
|
count++;
|
||
|
});
|
||
|
csvConverter.then(function () {
|
||
|
assert(count === 5290);
|
||
|
done();
|
||
|
});
|
||
|
rs.pipe(csvConverter);
|
||
|
});
|
||
|
it("should setup customise type convert function", function (done) {
|
||
|
csv({
|
||
|
checkType: true,
|
||
|
colParser: {
|
||
|
"column1": "string",
|
||
|
"column5": function (item, head, resultRow, row, i) {
|
||
|
assert.equal(item, '{"hello":"world"}');
|
||
|
assert.equal(head, "column5"),
|
||
|
assert(resultRow);
|
||
|
assert(row);
|
||
|
assert.equal(i, 5);
|
||
|
return "hello world";
|
||
|
}
|
||
|
}
|
||
|
})
|
||
|
.fromFile(__dirname + "/data/dataWithType")
|
||
|
.subscribe(function (json) {
|
||
|
assert.equal(typeof json.column1, "string");
|
||
|
assert.equal(json.column5, "hello world");
|
||
|
assert.strictEqual(json["name#!"], false);
|
||
|
assert.strictEqual(json["column9"], true);
|
||
|
})
|
||
|
.on('done', function () {
|
||
|
done()
|
||
|
});
|
||
|
})
|
||
|
it("should accept pipe as quote", function (done) {
|
||
|
csv({
|
||
|
quote: "|",
|
||
|
output: "csv"
|
||
|
})
|
||
|
.fromFile(__dirname + "/data/pipeAsQuote")
|
||
|
.subscribe(function (csv) {
|
||
|
assert.equal(csv[2], "blahhh, blah");
|
||
|
})
|
||
|
.on('done', function () {
|
||
|
done()
|
||
|
});
|
||
|
})
|
||
|
it("emit file not exists error when try to open a non-exists file", function () {
|
||
|
let called = false;
|
||
|
const cb = sb.spy((err) => {
|
||
|
assert(err.toString().indexOf("File does not exist") > -1);
|
||
|
});
|
||
|
return csv()
|
||
|
.fromFile("somefile")
|
||
|
.subscribe(function (csv) {
|
||
|
|
||
|
})
|
||
|
.on("error", cb)
|
||
|
.then(() => {
|
||
|
assert(false);
|
||
|
}, (err) => {
|
||
|
assert.equal(cb.callCount, 1);
|
||
|
})
|
||
|
|
||
|
})
|
||
|
it("should include column that is both included and excluded", () => {
|
||
|
return csv({
|
||
|
includeColumns: /b/,
|
||
|
ignoreColumns: /a|b/
|
||
|
})
|
||
|
.fromString(`a,b,c
|
||
|
1,2,3
|
||
|
4,5,6`)
|
||
|
.subscribe((d) => {
|
||
|
assert(d.b);
|
||
|
assert(!d.a);
|
||
|
})
|
||
|
})
|
||
|
it("should allow async preLine hook", () => {
|
||
|
return csv()
|
||
|
.preFileLine((line) => {
|
||
|
return new Promise((resolve, reject) => {
|
||
|
setTimeout(() => {
|
||
|
resolve(line + "changed")
|
||
|
}, 20);
|
||
|
|
||
|
})
|
||
|
})
|
||
|
.fromString(`a,b
|
||
|
1,2`)
|
||
|
.subscribe((d) => {
|
||
|
assert(d.bchanged);
|
||
|
assert.equal(d.bchanged, "2changed");
|
||
|
})
|
||
|
|
||
|
})
|
||
|
|
||
|
it("should allow async subscribe function", () => {
|
||
|
return csv({ trim: true })
|
||
|
.fromString(`a,b,c
|
||
|
1,2,3
|
||
|
4,5,6`)
|
||
|
.subscribe((d) => {
|
||
|
return new Promise((resolve, reject) => {
|
||
|
setTimeout(() => {
|
||
|
d.a = 10;
|
||
|
resolve();
|
||
|
}, 20);
|
||
|
})
|
||
|
})
|
||
|
.then((d) => {
|
||
|
assert.equal(d[0].a, 10);
|
||
|
assert.equal(d[1].a, 10);
|
||
|
})
|
||
|
})
|
||
|
it("should propagate value to next then", () => {
|
||
|
return csv({ trim: true })
|
||
|
.fromString(`a,b,c
|
||
|
1,2,3
|
||
|
4,5,6`)
|
||
|
.then(undefined, undefined)
|
||
|
.then((d) => {
|
||
|
assert.equal(d.length, 2);
|
||
|
assert.equal(d[0].a, "1");
|
||
|
})
|
||
|
|
||
|
})
|
||
|
it("should propagate error to next then", () => {
|
||
|
return csv({ trim: true })
|
||
|
.fromFile(__dirname + "/data/dataWithUnclosedQuotes")
|
||
|
.then(undefined, undefined)
|
||
|
.then(() => {
|
||
|
assert(false)
|
||
|
}, (err: CSVError) => {
|
||
|
assert(err);
|
||
|
assert.equal(err.err, "unclosed_quote");
|
||
|
})
|
||
|
})
|
||
|
it("should fallback to text is number can not be parsed", () => {
|
||
|
return csv({
|
||
|
colParser: {
|
||
|
"a": "number"
|
||
|
}
|
||
|
})
|
||
|
.fromString(`a,b,c
|
||
|
1,2,3
|
||
|
fefe,5,6`)
|
||
|
.then((d) => {
|
||
|
assert.strictEqual(d[0].a, 1);
|
||
|
assert.equal(d[1].a, "fefe");
|
||
|
})
|
||
|
})
|
||
|
it("should omit a column", () => {
|
||
|
return csv({
|
||
|
colParser: {
|
||
|
"a": "omit"
|
||
|
}
|
||
|
})
|
||
|
.fromString(`a,b,c
|
||
|
1,2,3
|
||
|
fefe,5,6`)
|
||
|
.then((d) => {
|
||
|
assert.strictEqual(d[0].a, undefined);
|
||
|
assert.equal(d[1].a, undefined);
|
||
|
})
|
||
|
})
|
||
|
it("could turn off quote and should trim even quote is turned off", () => {
|
||
|
return csv({
|
||
|
quote: "off",
|
||
|
trim: true
|
||
|
})
|
||
|
.fromString(`a,b,c
|
||
|
"1","2","3"
|
||
|
"fefe,5",6`)
|
||
|
.then((d) => {
|
||
|
assert.equal(d[0].a, '"1"');
|
||
|
assert.equal(d[0].b, '"2"');
|
||
|
assert.equal(d[1].a, '"fefe');
|
||
|
assert.equal(d[1].b, '5"');
|
||
|
})
|
||
|
})
|
||
|
it("should allow ignoreEmpty with checkColumn", () => {
|
||
|
return csv({
|
||
|
checkColumn: true,
|
||
|
ignoreEmpty: true
|
||
|
})
|
||
|
.fromString(`date,altitude,airtime
|
||
|
2016-07-08,2000,23
|
||
|
|
||
|
2016-07-09,3000,43`)
|
||
|
.then((data) => {
|
||
|
|
||
|
}, (err) => {
|
||
|
console.log(err);
|
||
|
assert(!err);
|
||
|
})
|
||
|
});
|
||
|
it("should allow quotes without content", () => {
|
||
|
const data = "a|^^|^b^";
|
||
|
return csv({
|
||
|
delimiter: '|',
|
||
|
quote: '^',
|
||
|
noheader: true,
|
||
|
})
|
||
|
.fromString(data)
|
||
|
.then((jsonObj) => {
|
||
|
assert.equal(jsonObj[0].field2, "");
|
||
|
});
|
||
|
})
|
||
|
it("should parse header with quotes correctly", function () {
|
||
|
var testData = __dirname + "/data/csvWithUnclosedHeader";
|
||
|
return csv({
|
||
|
headers:["exam_date","sample_no","status","sample_type","patient_id","last_name","first_name","gender_of_patient","patient_birth_date","patient_note","patient_department","accession_number","sample_site","physician","operator","department","note","test_order_code","draw_time","approval_status","approval_time","report_layout","patient_account_number","none_1","errors_detected_during_measurement","age","error_code_01","weight","error_code_02","height","error_code_03","hcg_beta_p","error_code_04","troponin_i_p","error_code_05","ck_mb_p","error_code_06","d_dimer_p","error_code_07","hscrp_p","error_code_08","myoglobin_p","error_code_09","nt_probnp","error_code_10","crp","error_code_11","bnp","error_code_12","tnt","error_code_13","demo_p","error_code_14","pct","error_code_15"]
|
||
|
})
|
||
|
.fromFile(testData)
|
||
|
.then((d)=>{
|
||
|
assert.equal(d.length,2);
|
||
|
assert.equal(d[0].sample_no,"12669");
|
||
|
})
|
||
|
|
||
|
});
|
||
|
});
|