/* eslint-disable @typescript-eslint/no-loop-func */
import path from 'path';
import * as Helpers from '@test/nodes/Helpers';
import type { WorkflowTestData } from '@test/nodes/types';
import { executeWorkflow } from '@test/nodes/ExecuteWorkflow';

describe('Test Move Binary Data Node', () => {
	beforeEach(async () => {
		await Helpers.initBinaryDataService();
	});

	const workflow = Helpers.readJsonFileSync(
		'nodes/MoveBinaryData/test/MoveBinaryData.workflow.json',
	);
	const node = workflow.nodes.find((n: any) => n.name === 'Read Binary File');
	node.parameters.filePath = path.join(__dirname, 'data', 'sample.json');

	const tests: WorkflowTestData[] = [
		{
			description: 'nodes/MoveBinaryData/test/MoveBinaryData.workflow.json',
			input: {
				workflowData: workflow,
			},
			output: {
				nodeData: {
					'Binary to JSON': [
						[
							{
								json: {
									id: 1,
									title: 'My Title',
									description: 'Lorem Ipsum ...',
								},
							},
						],
					],
					'Binary to JSON - No Set All Data': [
						[
							{
								json: {
									data: '{\n\t"id": 1,\n\t"title": "My Title",\n\t"description": "Lorem Ipsum ..."\n}',
								},
							},
						],
					],
					'Binary to JSON - No Set All Data + Json Parse': [
						[
							{
								json: {
									data: {
										id: 1,
										title: 'My Title',
										description: 'Lorem Ipsum ...',
									},
								},
							},
						],
					],
					'Binary to JSON - No Set All Data + Encoding base64': [
						[
							{
								json: {
									data: 'ewoJImlkIjogMSwKCSJ0aXRsZSI6ICJNeSBUaXRsZSIsCgkiZGVzY3JpcHRpb24iOiAiTG9yZW0gSXBzdW0gLi4uIgp9',
								},
							},
						],
					],
					'Binary to JSON - Keep as Base64': [
						[
							{
								json: {
									data: 'ewoJImlkIjogMSwKCSJ0aXRsZSI6ICJNeSBUaXRsZSIsCgkiZGVzY3JpcHRpb24iOiAiTG9yZW0gSXBzdW0gLi4uIgp9',
								},
							},
						],
					],
					'JSON to Binary': [
						[
							{
								json: {},
								binary: {
									data: {
										data: 'eyJpZCI6MSwidGl0bGUiOiJNeSBUaXRsZSIsImRlc2NyaXB0aW9uIjoiTG9yZW0gSXBzdW0gLi4uIn0=',
										mimeType: 'application/json',
										fileType: 'json',
										fileSize: '59 B',
										fileExtension: 'json',
									},
								},
							},
						],
					],
					'JSON to Binary - No Convert All Data': [
						[
							{
								json: {
									id: 1,
									description: 'Lorem Ipsum ...',
								},
								binary: {
									data: {
										data: 'Ik15IFRpdGxlIg==',
										mimeType: 'application/json',
										fileType: 'json',
										fileSize: '10 B',
										fileName: 'example.json',
										fileExtension: 'json',
									},
								},
							},
						],
					],
				},
			},
		},
	];

	const nodeTypes = Helpers.setup(tests);

	for (const testData of tests) {
		test(testData.description, async () => {
			const { result } = await executeWorkflow(testData, nodeTypes);

			const resultNodeData = Helpers.getResultNodeData(result, testData);
			resultNodeData.forEach(({ nodeName, resultData }) =>
				expect(resultData).toEqual(testData.output.nodeData[nodeName]),
			);

			expect(result.finished).toEqual(true);
		});
	}
});