// Copyright 2019 The Chromium Authors
// 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));
  });
});
