deno/tests/unit/mkdir_test.ts
Matt Mastracci f5e46c9bf2
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.
2024-02-10 20:22:13 +00:00

236 lines
6.8 KiB
TypeScript

// 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");
},
);