You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							324 lines
						
					
					
						
							8.3 KiB
						
					
					
				
			
		
		
	
	
							324 lines
						
					
					
						
							8.3 KiB
						
					
					
				import csv from "../src";
 | 
						|
import assert from "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");
 | 
						|
      })
 | 
						|
 | 
						|
  });
 | 
						|
  it ("should stream json string correctly",function(done){
 | 
						|
    const data=`a,b,c
 | 
						|
1,2,3
 | 
						|
4,5,6`
 | 
						|
    let hasLeftBracket=false;
 | 
						|
    let hasRightBracket=false;
 | 
						|
    csv({
 | 
						|
      downstreamFormat:"array"
 | 
						|
    })
 | 
						|
    .fromString(data)
 | 
						|
    .on("data",(d)=>{
 | 
						|
      const str=d.toString();
 | 
						|
      if (str[0]==="[" && str.length ===2){
 | 
						|
        hasLeftBracket=true;
 | 
						|
      }else if (str[0]==="]" && str.length===2){
 | 
						|
        hasRightBracket=true;
 | 
						|
      }else{
 | 
						|
        assert.equal(str[str.length-2],",");
 | 
						|
      }
 | 
						|
      
 | 
						|
    })
 | 
						|
    .on("end",()=>{
 | 
						|
      assert.equal(hasLeftBracket,true);
 | 
						|
      assert.equal(hasRightBracket,true);
 | 
						|
      done();
 | 
						|
    })
 | 
						|
  })
 | 
						|
  it ("should stream json line correctly",function(done){
 | 
						|
    const data=`a,b,c
 | 
						|
1,2,3
 | 
						|
4,5,6`
 | 
						|
    csv({
 | 
						|
      downstreamFormat:"line"
 | 
						|
    })
 | 
						|
    .fromString(data)
 | 
						|
    .on("data",(d)=>{
 | 
						|
      const str=d.toString();
 | 
						|
      
 | 
						|
      assert.notEqual(str[str.length-2],",");
 | 
						|
    })
 | 
						|
    .on("end",()=>{
 | 
						|
      done();
 | 
						|
    })
 | 
						|
  })
 | 
						|
  it ("should not send json if needEmitAll is false",async function(){
 | 
						|
    const data=`a,b,c
 | 
						|
1,2,3
 | 
						|
4,5,6`
 | 
						|
    return csv({
 | 
						|
      needEmitAll:false
 | 
						|
    })
 | 
						|
    .fromString(data)
 | 
						|
    .then((d)=>{
 | 
						|
      assert(d.length===0);
 | 
						|
    })
 | 
						|
  })
 | 
						|
  it ("should convert null to null object",async function(){
 | 
						|
    const data=`a,b,c
 | 
						|
null,2,3
 | 
						|
4,5,6`
 | 
						|
    return csv({
 | 
						|
      nullObject:true
 | 
						|
    })
 | 
						|
    .fromString(data)
 | 
						|
    .then((d)=>{
 | 
						|
      assert.equal(d[0].a,null)
 | 
						|
    })
 | 
						|
  })
 | 
						|
  it ("should process period properly",async function(){
 | 
						|
    const data=`a..,b,c
 | 
						|
1,2,3
 | 
						|
4,5,6`
 | 
						|
    return csv({
 | 
						|
    })
 | 
						|
    .fromString(data)
 | 
						|
    .then((d)=>{
 | 
						|
      assert.equal(d[0]["a.."],1);
 | 
						|
      assert.equal(d[1]["a.."],4);
 | 
						|
    })
 | 
						|
  })
 | 
						|
});
 |