import { splitAndTrim, fixFieldType, prepareInputItem, constructFilter } from '../helpers/utils';

describe('Test TheHiveProject, splitAndTrim', () => {
	it('should split and trim string, removing empty entries', () => {
		const data = 'a, b,, c, d, e, f,,';

		const result = splitAndTrim(data);

		expect(result).toEqual(['a', 'b', 'c', 'd', 'e', 'f']);
	});

	it('should return unchanged array', () => {
		const data = ['a', 'b', 'c', 'd', 'e', 'f'];

		const result = splitAndTrim(data);

		expect(result).toEqual(data);
	});
});

describe('Test TheHiveProject, fixFieldType', () => {
	it('should split and trim tags', () => {
		const data = {
			tags: 'a, b,, c, d, e, f,,',
			addTags: 'a, b,, c, d, e, f,,',
			removeTags: 'a, b,, c, d, e, f,,',
			notChanged: 'a, b,, c, d, e, f,,',
		};

		const result = fixFieldType(data);

		expect(result).toEqual({
			tags: ['a', 'b', 'c', 'd', 'e', 'f'],
			addTags: ['a', 'b', 'c', 'd', 'e', 'f'],
			removeTags: ['a', 'b', 'c', 'd', 'e', 'f'],
			notChanged: 'a, b,, c, d, e, f,,',
		});
	});

	it('should convert date strings to milis', () => {
		const data = {
			date: '2020-01-01T00:00:00.000Z',
			lastSyncDate: '2020-01-01T00:00:00.000Z',
			startDate: '2020-01-01T00:00:00.000Z',
			endDate: '2020-01-01T00:00:00.000Z',
			dueDate: '2020-01-01T00:00:00.000Z',
			includeInTimeline: '2020-01-01T00:00:00.000Z',
			sightedAt: '2020-01-01T00:00:00.000Z',
			notChanged: '2020-01-01T00:00:00.000Z',
		};

		const result = fixFieldType(data);

		expect(result).toEqual({
			date: 1577836800000,
			lastSyncDate: 1577836800000,
			startDate: 1577836800000,
			endDate: 1577836800000,
			dueDate: 1577836800000,
			includeInTimeline: 1577836800000,
			sightedAt: 1577836800000,
			notChanged: '2020-01-01T00:00:00.000Z',
		});
	});
});

describe('Test TheHiveProject, prepareInputItem', () => {
	it('should return object with fields present in schema', () => {
		const data = {
			a: 1,
			b: 2,
			c: 3,
			d: 4,
			f: 5,
			g: 6,
		};

		const schema = [
			{
				id: 'a',
				required: true,
			},
			{
				id: 'b',
				required: true,
			},
			{
				id: 'c',
			},
			{
				id: 'd',
				required: true,
			},
			{
				id: 'e',
			},
		];

		const result = prepareInputItem(data, schema, 0);

		expect(result).toEqual({
			a: 1,
			b: 2,
			c: 3,
			d: 4,
		});
	});
});

describe('Test TheHiveProject, constructFilter', () => {
	it('should add default operator _eq', () => {
		const data = {
			field: 'myField',
			value: 'myValue',
		};

		const result = constructFilter(data);

		expect(result).toEqual({
			_eq: {
				_field: 'myField',
				_value: 'myValue',
			},
		});
	});

	it('should return filter _gte', () => {
		const data = {
			field: 'myField',
			value: 'myValue',
			operator: '_gte',
		};

		const result = constructFilter(data);

		expect(result).toEqual({
			_gte: {
				_field: 'myField',
				_value: 'myValue',
			},
		});
	});

	it('should return filter _in', () => {
		const data = {
			field: 'myField',
			values: 'a, b,, c, d',
			operator: '_in',
		};

		const result = constructFilter(data);

		expect(result).toEqual({
			_in: {
				_field: 'myField',
				_values: ['a', 'b', 'c', 'd'],
			},
		});
	});

	it('should return filter _between', () => {
		const data = {
			field: 'myField',
			from: 'a',
			to: 'b',
			operator: '_between',
		};

		const result = constructFilter(data);

		expect(result).toEqual({
			_between: {
				_field: 'myField',
				_from: 'a',
				_to: 'b',
			},
		});
	});
});