From f5e46c9bf2f50d66a953fa133161fc829cecff06 Mon Sep 17 00:00:00 2001 From: Matt Mastracci Date: Sat, 10 Feb 2024 13:22:13 -0700 Subject: 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. --- tests/unit/mkdir_test.ts | 235 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 235 insertions(+) create mode 100644 tests/unit/mkdir_test.ts (limited to 'tests/unit/mkdir_test.ts') 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"); + }, +); -- cgit v1.2.3