summaryrefslogtreecommitdiff
path: root/tests/unit/mkdir_test.ts
diff options
context:
space:
mode:
authorMatt Mastracci <matthew@mastracci.com>2024-02-10 13:22:13 -0700
committerGitHub <noreply@github.com>2024-02-10 20:22:13 +0000
commitf5e46c9bf2f50d66a953fa133161fc829cecff06 (patch)
tree8faf2f5831c1c7b11d842cd9908d141082c869a5 /tests/unit/mkdir_test.ts
parentd2477f780630a812bfd65e3987b70c0d309385bb (diff)
chore: move cli/tests/ -> tests/ (#22369)
This looks like a massive PR, but it's only a move from cli/tests -> tests, and updates of relative paths for files. This is the first step towards aggregate all of the integration test files under tests/, which will lead to a set of integration tests that can run without the CLI binary being built. While we could leave these tests under `cli`, it would require us to keep a more complex directory structure for the various test runners. In addition, we have a lot of complexity to ignore various test files in the `cli` project itself (cargo publish exclusion rules, autotests = false, etc). And finally, the `tests/` folder will eventually house the `test_ffi`, `test_napi` and other testing code, reducing the size of the root repo directory. For easier review, the extremely large and noisy "move" is in the first commit (with no changes -- just a move), while the remainder of the changes to actual files is in the second commit.
Diffstat (limited to 'tests/unit/mkdir_test.ts')
-rw-r--r--tests/unit/mkdir_test.ts235
1 files changed, 235 insertions, 0 deletions
diff --git a/tests/unit/mkdir_test.ts b/tests/unit/mkdir_test.ts
new file mode 100644
index 000000000..0948a1a84
--- /dev/null
+++ b/tests/unit/mkdir_test.ts
@@ -0,0 +1,235 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+import {
+ assert,
+ assertEquals,
+ assertRejects,
+ assertThrows,
+ pathToAbsoluteFileUrl,
+} from "./test_util.ts";
+
+function assertDirectory(path: string, mode?: number) {
+ const info = Deno.lstatSync(path);
+ assert(info.isDirectory);
+ if (Deno.build.os !== "windows" && mode !== undefined) {
+ assertEquals(info.mode! & 0o777, mode & ~Deno.umask());
+ }
+}
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ function mkdirSyncSuccess() {
+ const path = Deno.makeTempDirSync() + "/dir";
+ Deno.mkdirSync(path);
+ assertDirectory(path);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ function mkdirSyncMode() {
+ const path = Deno.makeTempDirSync() + "/dir";
+ Deno.mkdirSync(path, { mode: 0o737 });
+ assertDirectory(path, 0o737);
+ },
+);
+
+Deno.test({ permissions: { write: false } }, function mkdirSyncPerm() {
+ assertThrows(() => {
+ Deno.mkdirSync("/baddir");
+ }, Deno.errors.PermissionDenied);
+});
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ async function mkdirSuccess() {
+ const path = Deno.makeTempDirSync() + "/dir";
+ await Deno.mkdir(path);
+ assertDirectory(path);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ async function mkdirMode() {
+ const path = Deno.makeTempDirSync() + "/dir";
+ await Deno.mkdir(path, { mode: 0o737 });
+ assertDirectory(path, 0o737);
+ },
+);
+
+Deno.test({ permissions: { write: true } }, function mkdirErrSyncIfExists() {
+ assertThrows(
+ () => {
+ Deno.mkdirSync(".");
+ },
+ Deno.errors.AlreadyExists,
+ `mkdir '.'`,
+ );
+});
+
+Deno.test({ permissions: { write: true } }, async function mkdirErrIfExists() {
+ await assertRejects(
+ async () => {
+ await Deno.mkdir(".");
+ },
+ Deno.errors.AlreadyExists,
+ `mkdir '.'`,
+ );
+});
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ function mkdirSyncRecursive() {
+ const path = Deno.makeTempDirSync() + "/nested/directory";
+ Deno.mkdirSync(path, { recursive: true });
+ assertDirectory(path);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ async function mkdirRecursive() {
+ const path = Deno.makeTempDirSync() + "/nested/directory";
+ await Deno.mkdir(path, { recursive: true });
+ assertDirectory(path);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ function mkdirSyncRecursiveMode() {
+ const nested = Deno.makeTempDirSync() + "/nested";
+ const path = nested + "/dir";
+ Deno.mkdirSync(path, { mode: 0o737, recursive: true });
+ assertDirectory(path, 0o737);
+ assertDirectory(nested, 0o737);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ async function mkdirRecursiveMode() {
+ const nested = Deno.makeTempDirSync() + "/nested";
+ const path = nested + "/dir";
+ await Deno.mkdir(path, { mode: 0o737, recursive: true });
+ assertDirectory(path, 0o737);
+ assertDirectory(nested, 0o737);
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ function mkdirSyncRecursiveIfExists() {
+ const path = Deno.makeTempDirSync() + "/dir";
+ Deno.mkdirSync(path, { mode: 0o737 });
+ Deno.mkdirSync(path, { recursive: true });
+ Deno.mkdirSync(path, { recursive: true, mode: 0o731 });
+ assertDirectory(path, 0o737);
+ if (Deno.build.os !== "windows") {
+ const pathLink = path + "Link";
+ Deno.symlinkSync(path, pathLink);
+ Deno.mkdirSync(pathLink, { recursive: true });
+ Deno.mkdirSync(pathLink, { recursive: true, mode: 0o731 });
+ assertDirectory(path, 0o737);
+ }
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ async function mkdirRecursiveIfExists() {
+ const path = Deno.makeTempDirSync() + "/dir";
+ await Deno.mkdir(path, { mode: 0o737 });
+ await Deno.mkdir(path, { recursive: true });
+ await Deno.mkdir(path, { recursive: true, mode: 0o731 });
+ assertDirectory(path, 0o737);
+ if (Deno.build.os !== "windows") {
+ const pathLink = path + "Link";
+ Deno.symlinkSync(path, pathLink);
+ await Deno.mkdir(pathLink, { recursive: true });
+ await Deno.mkdir(pathLink, { recursive: true, mode: 0o731 });
+ assertDirectory(path, 0o737);
+ }
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ function mkdirSyncErrors() {
+ const testDir = Deno.makeTempDirSync();
+ const emptydir = testDir + "/empty";
+ const fulldir = testDir + "/dir";
+ const file = fulldir + "/file";
+ Deno.mkdirSync(emptydir);
+ Deno.mkdirSync(fulldir);
+ Deno.createSync(file).close();
+
+ assertThrows(() => {
+ Deno.mkdirSync(emptydir, { recursive: false });
+ }, Deno.errors.AlreadyExists);
+ assertThrows(() => {
+ Deno.mkdirSync(fulldir, { recursive: false });
+ }, Deno.errors.AlreadyExists);
+ assertThrows(() => {
+ Deno.mkdirSync(file, { recursive: false });
+ }, Deno.errors.AlreadyExists);
+ assertThrows(() => {
+ Deno.mkdirSync(file, { recursive: true });
+ }, Deno.errors.AlreadyExists);
+
+ if (Deno.build.os !== "windows") {
+ const fileLink = testDir + "/fileLink";
+ const dirLink = testDir + "/dirLink";
+ const danglingLink = testDir + "/danglingLink";
+ Deno.symlinkSync(file, fileLink);
+ Deno.symlinkSync(emptydir, dirLink);
+ Deno.symlinkSync(testDir + "/nonexistent", danglingLink);
+
+ assertThrows(() => {
+ Deno.mkdirSync(dirLink, { recursive: false });
+ }, Deno.errors.AlreadyExists);
+ assertThrows(() => {
+ Deno.mkdirSync(fileLink, { recursive: false });
+ }, Deno.errors.AlreadyExists);
+ assertThrows(() => {
+ Deno.mkdirSync(fileLink, { recursive: true });
+ }, Deno.errors.AlreadyExists);
+ assertThrows(() => {
+ Deno.mkdirSync(danglingLink, { recursive: false });
+ }, Deno.errors.AlreadyExists);
+ assertThrows(() => {
+ Deno.mkdirSync(danglingLink, { recursive: true });
+ }, Deno.errors.AlreadyExists);
+ }
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ function mkdirSyncRelativeUrlPath() {
+ const testDir = Deno.makeTempDirSync();
+ const nestedDir = testDir + "/nested";
+ // Add trailing slash so base path is treated as a directory. pathToAbsoluteFileUrl removes trailing slashes.
+ const path = new URL("../dir", pathToAbsoluteFileUrl(nestedDir) + "/");
+
+ Deno.mkdirSync(nestedDir);
+ Deno.mkdirSync(path);
+
+ assertDirectory(testDir + "/dir");
+ },
+);
+
+Deno.test(
+ { permissions: { read: true, write: true } },
+ async function mkdirRelativeUrlPath() {
+ const testDir = Deno.makeTempDirSync();
+ const nestedDir = testDir + "/nested";
+ // Add trailing slash so base path is treated as a directory. pathToAbsoluteFileUrl removes trailing slashes.
+ const path = new URL("../dir", pathToAbsoluteFileUrl(nestedDir) + "/");
+
+ await Deno.mkdir(nestedDir);
+ await Deno.mkdir(path);
+
+ assertDirectory(testDir + "/dir");
+ },
+);