import type {
	IExecuteFunctions,
	IHookFunctions,
	ILoadOptionsFunctions,
	IHttpRequestMethods,
	INode,
} from 'n8n-workflow';
import nock from 'nock';

import { setup, equalityTest, workflowToTests, getWorkflowFilenames } from '@test/nodes/Helpers';

import { profileResponse } from './apiResponses';
import { ouraApiRequest } from '../GenericFunctions';

const node: INode = {
	id: '2cdb46cf-b561-4537-a982-b8d26dd7718b',
	name: 'Oura',
	type: 'n8n-nodes-base.oura',
	typeVersion: 1,
	position: [0, 0],
	parameters: {
		resource: 'profile',
		operation: 'get',
	},
};

const mockThis = {
	helpers: {
		httpRequestWithAuthentication: jest
			.fn()
			.mockResolvedValue({ statusCode: 200, data: profileResponse }),
	},
	getNode() {
		return node;
	},
	getNodeParameter: jest.fn(),
} as unknown as IHookFunctions | IExecuteFunctions | ILoadOptionsFunctions;

describe('Oura', () => {
	describe('ouraApiRequest', () => {
		it('should make an authenticated API request to Oura', async () => {
			const method: IHttpRequestMethods = 'GET';
			const resource = '/usercollection/personal_info';

			await ouraApiRequest.call(mockThis, method, resource);

			expect(mockThis.helpers.httpRequestWithAuthentication).toHaveBeenCalledWith('ouraApi', {
				method: 'GET',
				url: 'https://api.ouraring.com/v2/usercollection/personal_info',
				json: true,
			});
		});
	});
	describe('Run Oura workflow', () => {
		const workflows = getWorkflowFilenames(__dirname);
		const tests = workflowToTests(workflows);

		beforeAll(() => {
			nock.disableNetConnect();

			nock('https://api.ouraring.com/v2')
				.get('/usercollection/personal_info')
				.reply(200, profileResponse);
		});

		afterAll(() => {
			nock.restore();
		});

		const nodeTypes = setup(tests);

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