HEX
Server: Apache
System: Linux pdx1-shared-a1-38 6.6.104-grsec-jammy+ #3 SMP Tue Sep 16 00:28:11 UTC 2025 x86_64
User: mmickelson (3396398)
PHP: 8.1.31
Disabled: NONE
Upload Files
File: //usr/share/nodejs/@nodelib/fs.walk/src/providers/stream.spec.ts
import * as assert from 'assert';
import { Readable } from 'stream';

import * as sinon from 'sinon';

import AsyncReader from '../readers/async';
import Settings from '../settings';
import * as tests from '../tests';
import StreamProvider from './stream';

class TestProvider extends StreamProvider {
	protected readonly _reader: AsyncReader = new tests.TestAsyncReader() as unknown as AsyncReader;

	constructor(_root: string, _settings: Settings = new Settings()) {
		super(_root, _settings);

		this._stream.emit = sinon.stub();
		this._stream.push = sinon.stub();
	}

	public get reader(): tests.TestAsyncReader {
		return this._reader as unknown as tests.TestAsyncReader;
	}

	public get stream(): sinon.SinonStubbedInstance<Readable> {
		return this._stream as unknown as sinon.SinonStubbedInstance<Readable>;
	}
}

describe('Providers → Stream', () => {
	describe('.read', () => {
		it('should return stream', () => {
			const provider = new TestProvider('directory');

			const stream = provider.read();

			assert.ok(stream instanceof Readable);
		});

		it('should call reader function with correct set of arguments', () => {
			const provider = new TestProvider('directory');

			provider.read();

			assert.ok(provider.reader.read.called);
		});

		it('should re-emit the "error" event from reader', () => {
			const provider = new TestProvider('directory');

			provider.reader.onError.yields(tests.EPERM_ERRNO);

			provider.read();

			assert.deepStrictEqual(provider.stream.emit.args, [['error', tests.EPERM_ERRNO]]);
		});

		it('should call the "push" method with entry value for the "entry" event from reader', () => {
			const provider = new TestProvider('directory');
			const fakeEntry = tests.buildFakeFileEntry();

			provider.reader.onEntry.yields(fakeEntry);

			provider.read();

			assert.deepStrictEqual(provider.stream.push.args, [[fakeEntry]]);
		});

		it('should call the "push" method with "null" value for the "end" event from reader', () => {
			const provider = new TestProvider('directory');

			provider.reader.onEnd.yields();

			provider.read();

			assert.deepStrictEqual(provider.stream.push.args, [[null]]);
		});

		it('should do not destroy reader when it is already destroyed', () => {
			const provider = new TestProvider('directory');

			const stream = provider.read();

			stream.destroy();

			assert.ok(stream.destroyed);
			assert.doesNotThrow(() => stream.destroy());
		});
	});
});