@zenfs/core
Version:
A filesystem, anywhere
142 lines (111 loc) • 4.06 kB
text/typescript
// SPDX-License-Identifier: LGPL-3.0-or-later
import assert from 'node:assert/strict';
import { suite, test } from 'node:test';
import { fs } from '../common.js';
// Top-level initialization
const testFilePath = 'test-file.txt';
const testData = 'Hello, World!';
await fs.promises.writeFile(testFilePath, testData);
const testFilePathWrite = 'test-file-write.txt';
await fs.promises.writeFile(testFilePathWrite, ''); // Ensure the file exists
suite('Streams', () => {
test('ReadStream reads data correctly', (_, done) => {
const readStream = fs.createReadStream(testFilePath);
let data = '';
readStream.on('data', chunk => {
data += chunk;
});
readStream.on('end', () => {
assert.equal(data, testData);
done();
});
readStream.on('error', err => {
done(err);
});
});
test('ReadStream close method works', (_, done) => {
const readStream = fs.createReadStream(testFilePath);
let closed = false;
readStream.on('close', () => {
closed = true;
});
readStream.close(err => {
assert.ifError(err);
assert(closed);
done();
});
});
test('WriteStream writes data correctly', async () => {
const writeStream = fs.createWriteStream(testFilePathWrite);
const { promise, resolve, reject } = Promise.withResolvers();
writeStream.on('finish', resolve);
writeStream.on('error', reject);
writeStream.end(testData, 'utf8');
await promise;
assert.equal(fs.readFileSync(testFilePathWrite, 'utf8'), testData);
});
test('WriteStream close method works', (_, done) => {
const writeStream = fs.createWriteStream(testFilePathWrite);
let closed = false;
writeStream.on('close', () => {
closed = true;
});
writeStream.close(err => {
assert.ifError(err);
assert(closed);
done();
});
});
test('createReadStream with start', async () => {
await fs.promises.writeFile('hello.txt', 'Hello world');
const stream = fs.createReadStream('hello.txt', { start: 6, encoding: 'utf-8' });
const data = (await stream.toArray()).join('');
assert.equal(data, 'world');
});
test('createReadStream with end', async () => {
await fs.promises.writeFile('hello.txt', 'Hello world');
const stream = fs.createReadStream('hello.txt', { end: 5, encoding: 'utf-8' });
const data = (await stream.toArray()).join('');
assert.equal(data, 'Hello');
});
test('FileHandle.createReadStream reads data correctly', async () => {
const fileHandle = await fs.promises.open(testFilePath, 'r');
const readStream = fileHandle.createReadStream({ encoding: 'utf-8' });
const [data] = await readStream.toArray();
assert.equal(data, testData);
await fileHandle.close();
});
test('FileHandle.createWriteStream writes data correctly', async () => {
const fileHandle = await fs.promises.open(testFilePathWrite, 'w');
const writeStream = fileHandle.createWriteStream();
const { promise, resolve, reject } = Promise.withResolvers();
writeStream.on('finish', resolve);
writeStream.on('error', reject);
writeStream.end(testData, 'utf8');
await promise;
const data = await fs.promises.readFile(testFilePathWrite, 'utf8');
assert.equal(data, testData);
await fileHandle.close();
});
test('readable web stream', async () => {
const fileHandle = await fs.promises.open(testFilePath, 'r');
const webStream = fileHandle.readableWebStream();
let data = '';
const decoder = new TextDecoder();
for await (const chunk of webStream) {
data += decoder.decode(chunk);
}
assert.equal(data, testData);
await fileHandle.close();
});
test('FileHandle.createReadStream after close should give an error', async () => {
const fileHandle = await fs.promises.open(testFilePath, 'r');
await fileHandle.close();
assert.throws(() => fileHandle.createReadStream(), { code: 'EBADF' });
});
test('FileHandle.createWriteStream after close should give an error', async () => {
const fileHandle = await fs.promises.open(testFilePathWrite, 'w');
await fileHandle.close();
assert.throws(() => fileHandle.createWriteStream(), { code: 'EBADF' });
});
});