import { NodeTestHarness } from '@nodes-testing/node-test-harness';
import type fs from 'fs';
import fsPromises, { type FileHandle } from 'fs/promises';
import { Readable } from 'stream';

describe('Test Crypto Node', () => {
	jest.mock('fast-glob', () => async () => ['/test/binary.data']);
	jest.mock('fs/promises');
	fsPromises.access = async () => {};
	fsPromises.stat = jest.fn(async (path: fs.PathLike) => {
		if (path === '/test/binary.data') {
			return {
				isFile: () => true,
				dev: 123456,
				ino: 654321,
			} as fs.Stats;
		}
		throw Object.assign(new Error('File not found'), { code: 'ENOENT' });
	}) as unknown as typeof fsPromises.stat;
	fsPromises.open = jest.fn(async (path: fs.PathLike) => {
		if (path === '/test/binary.data') {
			return {
				close: async () => {},
				// eslint-disable-next-line @typescript-eslint/require-await
				stat: async () =>
					({
						isFile: () => true,
						dev: 123456,
						ino: 654321,
					}) as fs.Stats,
				createReadStream: () => {
					const stream = Readable.from(Buffer.from('test')) as fs.ReadStream;
					// Emit 'open' event asynchronously to match real fs.ReadStream behavior
					setImmediate(() => stream.emit('open'));
					return stream;
				},
			} as FileHandle;
		}
		throw Object.assign(new Error('File not found'), { code: 'ENOENT' });
	}) as unknown as typeof fsPromises.open;
	beforeEach(() => {
		jest.spyOn(fsPromises, 'realpath').mockImplementation(async (path) => path as string);
	});

	new NodeTestHarness().setupTests();
});
