/*-
 * ============LICENSE_START=======================================================
 * ONAP CLAMP
 * ================================================================================
 * Copyright (C) 2019 AT&T Intellectual Property. All rights
 *                             reserved.
 * ================================================================================
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ============LICENSE_END============================================
 * ===================================================================
 *
 */

import CsvToJson from './CsvToJson'

describe('Verify CsvToJson', () => {

	const hdrNames= [ 
		"Element Short Name",
		"Element Name",
		"Element Description",
		"Element Type",
		"Sub-Dictionary"
	];

	const jsonKeyNames = [
		"shortName",
		"name",
		"description",
		"type",
		"subDictionary"
	];

	const mandatory = [ true, true, true, true, false ];

	it('Test CsvToJson No Error Case, Quoted Columns', () => {

		let rawCsv = '"Element Short Name","Element Name","Element Description","Element Type","Sub-Dictionary"\n';
		rawCsv += '"alertType","Alert Type","Type of Alert","string","","admin","2020-06-11T13:56:14.927437Z"';
				
		let expectedResult = {
			 errorMessages: '',
			 jsonObjArray: [
				{
					description: "Type of Alert",
					name: "Alert Type",
					shortName: "alertType",
					subDictionary: "",
					type: "string"
				}
			]
		};

		expect(CsvToJson(rawCsv, ',', '|', hdrNames, jsonKeyNames, mandatory)).toEqual(expectedResult);
	});

	it('Test CsvToJson No Error Case, Unquoted Columns', () => {

		let rawCsv = 'Element Short Name,Element Name,Element Description,Element Type,Sub-Dictionary\n';
		rawCsv += 'alertType,Alert Type,Type of Alert,string,,admin,2020-06-11T13:56:14.927437Z';
				
		let expectedResult = {
			 errorMessages: '',
			 jsonObjArray: [
				{
					description: "Type of Alert",
					name: "Alert Type",
					shortName: "alertType",
					subDictionary: "",
					type: "string"
				}
			]
		};

		expect(CsvToJson(rawCsv, ',', '|', hdrNames, jsonKeyNames, mandatory)).toEqual(expectedResult);
	});

	it('Test CsvToJson Properly Escaped Double Quote and Delimiter', () => {

		let rawCsv = '"Element Short Name","Element Name","Element Description","Element Type","Sub-Dictionary"\n';
		rawCsv += '"alertType","Alert ""Type""","Type of Alert, Varies","string","","admin","2020-06-11T13:56:14.927437Z"';
		
		let errorMessage = '';
				
		let expectedResult = {
			errorMessages: errorMessage,
			jsonObjArray: [
				{
					description: "Type of Alert, Varies",
					name: 'Alert "Type"',
					shortName: 'alertType',
					subDictionary: "",
					type: "string",
				}

			]
		};

		expect(CsvToJson(rawCsv, ',', '|', hdrNames, jsonKeyNames, mandatory)).toEqual(expectedResult);
	});


	it('Test CsvToJson Error Header Mismatch Error Case', () => {

		let rawCsv = '"Element Short Names","Element Name","Element Description","Element Type","Sub-Dictionary"\n';
		rawCsv += '"alertType","Alert Type","Type of Alert","string","","admin","2020-06-11T13:56:14.927437Z"';
		
		let errorMessage = 'Row 1 header key at column #1 is a mismatch. Expected row header must contain at least:\n';
		errorMessage += 'Element Short Name,Element Name,Element Description,Element Type,Sub-Dictionary';
				
		let expectedResult = {
			 errorMessages: errorMessage,
			 jsonObjArray: []
		};

		expect(CsvToJson(rawCsv, ',', '|', hdrNames, jsonKeyNames, mandatory)).toEqual(expectedResult);
	});

	it('Test CsvToJson Error Mismatched Double Quotes in Column', () => {

		let rawCsv = '"Element Short Name","Element Name","Element Description","Element Type","Sub-Dictionary"\n';
		rawCsv += '"alert"Type","Alert Type","Type of Alert","string","","admin","2020-06-11T13:56:14.927437Z"';
		
		let errorMessage = '\nRow #2 is badly formatted at column #1. Perhaps an unescaped double quote.'
				
		let expectedResult = {
			 errorMessages: errorMessage,
			 jsonObjArray: []
		};

		expect(CsvToJson(rawCsv, ',', '|', hdrNames, jsonKeyNames, mandatory)).toEqual(expectedResult);
	});

	it('Test CsvToJson Error Illegal Whitespace', () => {

		let rawCsv = '"Element Short Name","Element Name","Element Description","Element Type","Sub-Dictionary"\n';
		rawCsv += 'alertType ,  "Alert Type","Type of Alert","string","","admin","2020-06-11T13:56:14.927437Z"';
		
		let errorMessage = '\nMismatched double quotes or illegal whitespace around delimiter at row #2 near column #2';
				
		let expectedResult = {
			 errorMessages: errorMessage,
			 jsonObjArray: []
		};

		expect(CsvToJson(rawCsv, ',', '|', hdrNames, jsonKeyNames, mandatory)).toEqual(expectedResult);
	});

	it('Test CsvToJson Error Too Few Data Columns', () => {

		let rawCsv = '"Element Short Name","Element Name","Element Description","Element Type","Sub-Dictionary"\n';
		rawCsv += '"alertType","Alert Type","Type of Alert"';
		
		let errorMessage = '\nNot enough columns (5) at row #2';
				
		let expectedResult = {
			errorMessages: errorMessage,
			jsonObjArray: []
		};

		expect(CsvToJson(rawCsv, ',', '|', hdrNames, jsonKeyNames, mandatory)).toEqual(expectedResult);
	});

	it('Test CsvToJson Error Wrong Header Column Order', () => {

		let rawCsv = '"Element Name","Element Short Name","Element Description","Element Type","Sub-Dictionary"\n';
		rawCsv += '"alertType","Alert Type","Type of Alert","string","","admin","2020-06-11T13:56:14.927437Z"';
		
		let errorMessage = 'Row 1 header key at column #1 is a mismatch. Expected row header must contain at least:\n';
		errorMessage += 'Element Short Name,Element Name,Element Description,Element Type,Sub-Dictionary';
				
		let expectedResult = {
			errorMessages: errorMessage,
			jsonObjArray: []
		};

		expect(CsvToJson(rawCsv, ',', '|', hdrNames, jsonKeyNames, mandatory)).toEqual(expectedResult);
	});

	it('Test CsvToJson Error Not Enough Rows', () => {

		let rawCsv = '"Element Short Name","Element Name","Element Description","Element Type","Sub-Dictionary"\n';
		
		let errorMessage = '\nNot enough row data found in import file. Need at least a header row and one row of data';
				
		let expectedResult = {
			errorMessages: errorMessage,
			jsonObjArray: []
		};

		expect(CsvToJson(rawCsv, ',', '|', hdrNames, jsonKeyNames, mandatory)).toEqual(expectedResult);
	});

	it('Test CsvToJson Error Mandatory Field Is Empty', () => {

		let rawCsv = '"Element Short Name","Element Name","Element Description","Element Type","Sub-Dictionary"\n';
		rawCsv += '"","Alert Type","Type of Alert","string","","admin","2020-06-11T13:56:14.927437Z"';
				
		let expectedResult = {
			 errorMessages: '\nElement Short Name at row #2 is empty but requires a value.',
			 jsonObjArray: []
		};

		expect(CsvToJson(rawCsv, ',', '|', hdrNames, jsonKeyNames, mandatory)).toEqual(expectedResult);
	});

	it('Test CsvToJson Error Mismatched Double Quotes At End', () => {

		let rawCsv = '"Element Short Name","Element Name","Element Description","Element Type","Sub-Dictionary"\n';
		rawCsv += '"alertType","Alert Type","Alert Type Description","string","admin","2020-06-11T13:56:14.927437Z';
				
		let expectedResult = {
			 errorMessages: '\nMismatched double quotes at row #2',
			 jsonObjArray: []
		};

		expect(CsvToJson(rawCsv, ',', '||', hdrNames, jsonKeyNames, mandatory)).toEqual(expectedResult);
	});

	it('Test CsvToJson Error Mismatched Mandatory Array Parameters', () => {

		let rawCsv = '"Element Short Name","Element Name","Element Description","Element Type","Sub-Dictionary"\n';
		rawCsv += '"alertType","Alert Type","Alert Type Description","string","admin","2020-06-11T13:56:14.927437Z';
				
		let expectedResult = {
			 errorMessages: 'interanl error: csvHeaderNames, jsonKeyNames, and mandatory arrays parameters are not the same length',
			 jsonObjArray: []
		};

		expect(CsvToJson(rawCsv, ',', '||', hdrNames, jsonKeyNames, [ true ])).toEqual(expectedResult);
	});

	it('Test CsvToJson Error Empty Mandatory Array Parameters', () => {

		let rawCsv = '"Element Short Name","Element Name","Element Description","Element Type","Sub-Dictionary"\n';
		rawCsv += '"alertType","Alert Type","Alert Type Description","string","admin","2020-06-11T13:56:14.927437Z';
				
		let expectedResult = {
			 errorMessages: 'interanl error: csvHeaderNames, jsonKeyNames, and mandatory arrays have no entries',
			 jsonObjArray: []
		};

		expect(CsvToJson(rawCsv, ',', '||', [], [], [])).toEqual(expectedResult);
	});

	it('Test CsvToJson Error Illegal Data Contains Internal Delimiter', () => {

		let rawCsv = '"Element Short Name","Element Name","Element Description","Element Type","Sub-Dictionary"\n';
		rawCsv += '"alertType","Alert Type","Alert Type||Description","string","admin","2020-06-11T13:56:14.927437Z';

		let expectedResult = {
			 errorMessages: '\nRow #1 contains illegal sequence of characters (||)',
			 jsonObjArray: []
		};

		expect(CsvToJson(rawCsv, ',', '||', hdrNames, jsonKeyNames, mandatory)).toEqual(expectedResult);
	});
})