]> git.ardis.lu - csvio/commitdiff
Add tests for createFileStream
authorArdis Lu <ardisglu@gmail.com>
Mon, 28 Apr 2025 06:14:04 +0000 (23:14 -0700)
committerArdis Lu <ardisglu@gmail.com>
Mon, 28 Apr 2025 06:14:04 +0000 (23:14 -0700)
test/core.test.js

index 23eea4f08730dab64064a3fa25a7ff18aee1d8b4..02e92259a7e82b0e3771a6eec1313fed53356f6c 100644 (file)
@@ -6,7 +6,7 @@ import { setTimeout } from 'node:timers/promises';
 import { pathToFileURL } from 'node:url';
 
 import { csvStreamEqualWritable, csvStreamNotEqualWritable, createCSVMockStream, createTempFile } from './utils.js';
-import { parsePathLike, CSVReader, CSVTransformer, CSVWriter } from '../src/core.js';
+import { parsePathLike, createFileStream, CSVReader, CSVTransformer, CSVWriter } from '../src/core.js';
 
 suite('CSVWriter.arrayToCSVString', { concurrency: true }, () => {
   const vectors = [
@@ -53,6 +53,63 @@ suite('parsePathLike', { concurrency: true }, () => {
   }
 });
 
+suite('createFileStream', { concurrency: true }, () => {
+  test('can cancel stream before reading', { concurrency: true }, async () => {
+    const path = new URL('./data/simple.csv', import.meta.url);
+    const s = createFileStream(path);
+    await s.cancel();
+    const c = await s.getReader({ mode: 'byob' }).read(new Uint8Array(1)).then(({ value }) => value);
+    deepStrictEqual(c?.[0], undefined); // Should be empty array because the stream was canceled
+  });
+  test('can cancel on reader before reading', { concurrency: true }, async () => {
+    const path = new URL('./data/simple.csv', import.meta.url);
+    const s = createFileStream(path);
+    const r = s.getReader({ mode: 'byob' });
+    await r.cancel();
+    r.releaseLock();
+    rejects(r.read(new Uint8Array(1)));
+  });
+  test('can read then cancel on stream', { concurrency: true }, async () => {
+    const path = new URL('./data/simple.csv', import.meta.url);
+    const s = createFileStream(path);
+    const r = s.getReader({ mode: 'byob' });
+    const c = await r.read(new Uint8Array(1)).then(({ value }) => value);
+    r.releaseLock();
+    await s.cancel();
+    rejects(r.read(new Uint8Array(1)));
+    deepStrictEqual(c?.[0], 99);
+  });
+  test('can read then cancel on reader', { concurrency: true }, async () => {
+    const path = new URL('./data/simple.csv', import.meta.url);
+    const s = createFileStream(path);
+    const r = s.getReader({ mode: 'byob' });
+    const c = await r.read(new Uint8Array(1)).then(({ value }) => value);
+    await r.cancel();
+    r.releaseLock();
+    rejects(r.read(new Uint8Array(1)));
+    deepStrictEqual(c?.[0], 99);
+  });
+  test('can re-acquire lock', { concurrency: true }, async () => {
+    const path = new URL('./data/simple.csv', import.meta.url);
+    const s = createFileStream(path);
+
+    const r = s.getReader({ mode: 'byob' });
+    const c = await r.read(new Uint8Array(1)).then(({ value }) => value);
+    r.releaseLock();
+
+    const r2 = s.getReader({ mode: 'byob' });
+    const c2 = await r2.read(new Uint8Array(1)).then(({ value }) => value);
+    r2.releaseLock();
+
+    await s.cancel();
+
+    rejects(r.read(new Uint8Array(1)));
+    rejects(r2.read(new Uint8Array(1)));
+    deepStrictEqual(c?.[0], 99);
+    deepStrictEqual(c2?.[0], 111);
+  });
+});
+
 suite('CSVReader', { concurrency: true }, () => {
   const vectors = [
     {
This page took 0.040256 seconds and 4 git commands to generate.