@zenfs/core
Version:
A filesystem, anywhere
178 lines (159 loc) • 4.88 kB
text/typescript
import assert from 'node:assert';
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('ReadStream', () => {
test('ReadStream reads data correctly', (_, done) => {
const readStream = fs.createReadStream(testFilePath);
let data = '';
readStream.on('data', chunk => {
data += chunk;
});
readStream.on('end', () => {
assert(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(err === undefined);
assert(closed);
done();
});
});
test('ReadStream declared properties', () => {
const readStream = new fs.ReadStream();
assert(readStream.bytesRead === undefined);
assert(readStream.path === undefined);
assert(readStream.pending === undefined);
// Assign values
readStream.bytesRead = 10;
readStream.path = testFilePath;
readStream.pending = false;
assert(readStream.bytesRead === 10);
assert(readStream.path === testFilePath);
assert(!readStream.pending);
});
test('ReadStream close method can be called multiple times', (_, done) => {
const readStream = new fs.ReadStream();
readStream.close(err => {
assert(err === undefined);
// Call close again
readStream.close(err2 => {
assert(err2 === undefined);
done();
});
});
});
});
suite('WriteStream', () => {
test.skip('WriteStream writes data correctly', (_, done) => {
const writeStream = fs.createWriteStream(testFilePathWrite);
writeStream.write(testData, 'utf8', err => {
if (err) {
done(err);
return;
}
writeStream.end();
});
writeStream.on('finish', () => {
assert(fs.readFileSync(testFilePathWrite, 'utf8') == testData);
done();
});
writeStream.on('error', err => {
done(err);
});
});
test('WriteStream close method works', (_, done) => {
const writeStream = fs.createWriteStream(testFilePathWrite);
let closed = false;
writeStream.on('close', () => {
closed = true;
});
writeStream.close(err => {
assert(err === undefined);
assert(closed);
done();
});
});
test('WriteStream declared properties', () => {
const writeStream = new fs.WriteStream();
assert(writeStream.bytesWritten === undefined);
assert(writeStream.path === undefined);
assert(writeStream.pending === undefined);
// Assign values
writeStream.bytesWritten = 20;
writeStream.path = testFilePathWrite;
writeStream.pending = true;
assert(writeStream.bytesWritten === 20);
assert(writeStream.path === testFilePathWrite);
assert(writeStream.pending);
});
test('WriteStream close method can be called multiple times', (_, done) => {
const writeStream = new fs.WriteStream();
writeStream.close(err => {
assert(err === undefined);
// Call close again
writeStream.close(err2 => {
assert(err2 === undefined);
done();
});
});
});
});
suite('FileHandle', () => {
test.skip('FileHandle.createReadStream reads data correctly', async () => {
const fileHandle = await fs.promises.open(testFilePath, 'r');
const readStream = fileHandle.createReadStream();
let data = '';
await new Promise<void>((resolve, reject) => {
readStream.on('data', chunk => {
data += chunk;
});
readStream.on('end', () => {
assert(data == testData);
resolve();
});
readStream.on('error', reject);
});
await fileHandle.close();
});
test.skip('FileHandle.createWriteStream writes data correctly', async () => {
const fileHandle = await fs.promises.open(testFilePathWrite, 'w');
const writeStream = fileHandle.createWriteStream();
await new Promise<void>((resolve, reject) => {
writeStream.write(testData, 'utf8', err => {
if (err) return reject(err);
writeStream.end();
});
writeStream.on('finish', resolve);
writeStream.on('error', reject);
});
const data = await fs.promises.readFile(testFilePathWrite, 'utf8');
assert(data == testData);
await fileHandle.close();
});
test('FileHandle.createReadStream after close should throw', async () => {
const fileHandle = await fs.promises.open(testFilePath, 'r');
await fileHandle.close();
assert.throws(() => fileHandle.createReadStream());
});
test.skip('FileHandle.createWriteStream after close should throw', async () => {
const fileHandle = await fs.promises.open(testFilePathWrite, 'w');
await fileHandle.close();
assert.throws(() => fileHandle.createWriteStream());
});
});