blob: cd124a537d12615bb887d269b2d387d9bf15981d [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import {assert} from 'chai';
import sinon from 'sinon';
import {
constructHref,
convertListContentToCsv,
prepareDataForDownload,
preventCSVInjectionAndStringify,
} from './list-to-csv-helpers.js';
describe('constructHref', () => {
it('has default of empty string', () => {
const result = constructHref();
assert.equal(result, 'data:text/csv;charset=utf-8,');
});
it('starts with data:', () => {
const result = constructHref('');
assert.isTrue(result.startsWith('data:'));
});
it('uses charset=utf-8', () => {
const result = constructHref('');
assert.isTrue(result.search('charset=utf-8') > -1);
});
it('encodes URI component', () => {
const encodeFuncStub = sinon.stub(window, 'encodeURIComponent');
constructHref('');
sinon.assert.calledOnce(encodeFuncStub);
window.encodeURIComponent.restore();
});
it('encodes URI component', () => {
const input = 'foo, bar fizz=buzz';
const expected = 'foo%2C%20bar%20fizz%3Dbuzz';
const output = constructHref(input);
assert.equal(expected, output.split(',')[1]);
});
});
describe('convertListContentToCsv', () => {
it('joins rows with carriage return and line feed, CRLF', () => {
const input = [['foobar'], ['fizzbuzz']];
const expected = '"foobar"\r\n"fizzbuzz"';
assert.equal(expected, convertListContentToCsv(input));
});
it('joins columns with commas', () => {
const input = [['foo', 'bar', 'fizz', 'buzz']];
const expected = '"foo","bar","fizz","buzz"';
assert.equal(expected, convertListContentToCsv(input));
});
it('starts with non-empty row', () => {
const input = [['foobar']];
const expected = '"foobar"';
const result = convertListContentToCsv(input);
assert.equal(expected, result);
assert.isFalse(result.startsWith('\r\n'));
});
});
describe('prepareDataForDownload', () => {
it('prepends header row', () => {
const headers = ['column1', 'column2'];
const result = prepareDataForDownload([['a', 'b']], headers);
const expected = `"column1","column2"`;
assert.equal(expected, result.split('\r\n')[0]);
assert.isTrue(result.startsWith(expected));
});
});
describe('preventCSVInjectionAndStringify', () => {
it('prepends all double quotes with another double quote', () => {
let input = '"hello world"';
let expect = '""hello world""';
assert.equal(expect, preventCSVInjectionAndStringify(input).slice(1, -1));
input = 'Just a double quote: " ';
expect = 'Just a double quote: "" ';
assert.equal(expect, preventCSVInjectionAndStringify(input).slice(1, -1));
input = 'Multiple"double"quotes"""';
expect = 'Multiple""double""quotes""""""';
assert.equal(expect, preventCSVInjectionAndStringify(input).slice(1, -1));
});
it('wraps string with double quotes', () => {
let input = '"hello world"';
let expected = preventCSVInjectionAndStringify(input);
assert.equal('"', expected[0]);
assert.equal('"', expected[expected.length-1]);
input = 'For unevent quotes too: " ';
expected = '"For unevent quotes too: "" "';
assert.equal(expected, preventCSVInjectionAndStringify(input));
input = 'And for ending quotes"""';
expected = '"And for ending quotes"""""""';
assert.equal(expected, preventCSVInjectionAndStringify(input));
});
it('wraps strings containing commas with double quotes', () => {
const input = 'Let\'s, add, a bunch, of, commas,';
const expected = '"Let\'s, add, a bunch, of, commas,"';
assert.equal(expected, preventCSVInjectionAndStringify(input));
});
it('can handle strings containing commas and new line chars', () => {
const input = `""new"",\r\nline "" "",\r\nand 'end', and end`;
const expected = `"""""new"""",\r\nline """" """",\r\nand 'end', and end"`;
assert.equal(expected, preventCSVInjectionAndStringify(input));
});
it('preserves single quotes', () => {
let input = `all the 'single' quotes`;
let expected = `"all the 'single' quotes"`;
assert.equal(expected, preventCSVInjectionAndStringify(input));
input = `''''' fives single quotes before and after '''''`;
expected = `"''''' fives single quotes before and after '''''"`;
assert.equal(expected, preventCSVInjectionAndStringify(input));
});
it('prevents csv injection', () => {
let input = `@@Should prepend with single quote`;
let expected = `"'@@Should prepend with single quote"`;
assert.equal(expected, preventCSVInjectionAndStringify(input));
input = `at symbol @ later on, do not expect ' at start`;
expected = `"at symbol @ later on, do not expect ' at start"`;
assert.equal(expected, preventCSVInjectionAndStringify(input));
input = `==@+=--@Should prepend with single quote`;
expected = `"'==@+=--@Should prepend with single quote"`;
assert.equal(expected, preventCSVInjectionAndStringify(input));
});
});