summaryrefslogtreecommitdiff
path: root/cli/tests/unit_node/_fs/_fs_readdir_test.ts
diff options
context:
space:
mode:
Diffstat (limited to 'cli/tests/unit_node/_fs/_fs_readdir_test.ts')
-rw-r--r--cli/tests/unit_node/_fs/_fs_readdir_test.ts96
1 files changed, 96 insertions, 0 deletions
diff --git a/cli/tests/unit_node/_fs/_fs_readdir_test.ts b/cli/tests/unit_node/_fs/_fs_readdir_test.ts
new file mode 100644
index 000000000..bb1df079f
--- /dev/null
+++ b/cli/tests/unit_node/_fs/_fs_readdir_test.ts
@@ -0,0 +1,96 @@
+// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license.
+import {
+ assertEquals,
+ assertNotEquals,
+ fail,
+} from "../../../../test_util/std/testing/asserts.ts";
+import { assertCallbackErrorUncaught } from "../_test_utils.ts";
+import { readdir, readdirSync } from "node:fs";
+import { join } from "../../../../test_util/std/path/mod.ts";
+
+Deno.test({
+ name: "ASYNC: reading empty directory",
+ async fn() {
+ const dir = Deno.makeTempDirSync();
+ await new Promise<string[]>((resolve, reject) => {
+ readdir(dir, (err, files) => {
+ if (err) reject(err);
+ resolve(files);
+ });
+ })
+ .then((files) => assertEquals(files, []), () => fail())
+ .finally(() => Deno.removeSync(dir));
+ },
+});
+
+function assertEqualsArrayAnyOrder<T>(actual: T[], expected: T[]) {
+ assertEquals(actual.length, expected.length);
+ for (const item of expected) {
+ const index = actual.indexOf(item);
+ assertNotEquals(index, -1);
+ expected = expected.splice(index, 1);
+ }
+}
+
+Deno.test({
+ name: "ASYNC: reading non-empty directory",
+ async fn() {
+ const dir = Deno.makeTempDirSync();
+ Deno.writeTextFileSync(join(dir, "file1.txt"), "hi");
+ Deno.writeTextFileSync(join(dir, "file2.txt"), "hi");
+ Deno.mkdirSync(join(dir, "some_dir"));
+ await new Promise<string[]>((resolve, reject) => {
+ readdir(dir, (err, files) => {
+ if (err) reject(err);
+ resolve(files);
+ });
+ })
+ .then(
+ (files) =>
+ assertEqualsArrayAnyOrder(
+ files,
+ ["file1.txt", "some_dir", "file2.txt"],
+ ),
+ () => fail(),
+ )
+ .finally(() => Deno.removeSync(dir, { recursive: true }));
+ },
+});
+
+Deno.test({
+ name: "SYNC: reading empty the directory",
+ fn() {
+ const dir = Deno.makeTempDirSync();
+ assertEquals(readdirSync(dir), []);
+ },
+});
+
+Deno.test({
+ name: "SYNC: reading non-empty directory",
+ fn() {
+ const dir = Deno.makeTempDirSync();
+ Deno.writeTextFileSync(join(dir, "file1.txt"), "hi");
+ Deno.writeTextFileSync(join(dir, "file2.txt"), "hi");
+ Deno.mkdirSync(join(dir, "some_dir"));
+ assertEqualsArrayAnyOrder(
+ readdirSync(dir),
+ ["file1.txt", "some_dir", "file2.txt"],
+ );
+ },
+});
+
+Deno.test("[std/node/fs] readdir callback isn't called twice if error is thrown", async () => {
+ // The correct behaviour is not to catch any errors thrown,
+ // but that means there'll be an uncaught error and the test will fail.
+ // So the only way to test this is to spawn a subprocess, and succeed if it has a non-zero exit code.
+ // (assertRejects won't work because there's no way to catch the error.)
+ const tempDir = await Deno.makeTempDir();
+ const importUrl = new URL("node:fs", import.meta.url);
+ await assertCallbackErrorUncaught({
+ prelude: `import { readdir } from ${JSON.stringify(importUrl)}`,
+ invocation: `readdir(${JSON.stringify(tempDir)}, `,
+ async cleanup() {
+ await Deno.remove(tempDir);
+ },
+ });
+});