/** * These tests are derived from the [deno_task_shell](https://github.com/denoland/deno_task_shell/) rm tests, which are developed and maintained by the Deno authors. * Copyright 2018-2023 the Deno authors. * * This code is licensed under the MIT License: https://opensource.org/licenses/MIT */ import { $ } from "bun"; import { beforeAll, describe, expect, setDefaultTimeout, test } from "bun:test"; import { tempDirWithFiles } from "harness"; import { mkdirSync, writeFileSync } from "node:fs"; import path from "path"; import { createTestBuilder, sortedShellOutput } from "../util"; const TestBuilder = createTestBuilder(import.meta.path); const fileExists = async (path: string): Promise => $`ls -d ${path}`.then(o => o.stdout.toString() === `${path}\n`); $.nothrow(); beforeAll(() => { setDefaultTimeout(1000 * 60 * 5); }); const BUN = process.argv0; const DEV_NULL = process.platform === "win32" ? "NUL" : "/dev/null"; describe.concurrent("bunshell rm", () => { TestBuilder.command`echo ${packagejson()} > package.json; ${BUN} install --linker hoisted &> ${DEV_NULL}; rm -rf node_modules/` .ensureTempDir() .doesNotExist("node_modules") .runAsTest("node_modules"); test("force", async () => { const files = { "existent.txt": "", }; const tempdir = tempDirWithFiles("rmforce", files); expect(await $`rm -f ${tempdir}/non_existent.txt`.then(o => o.exitCode)).toBe(0); { const { stderr, exitCode } = await $`rm ${tempdir}/non_existent.txt`; expect(stderr.toString()).toEqual(`rm: ${tempdir}/non_existent.txt: No such file or directory\n`); expect(exitCode).toBe(1); } { expect(await fileExists(`${tempdir}/existent.txt`)).toBeTrue(); const { stdout, exitCode } = await $`rm -v ${tempdir}/existent.txt`; expect(stdout.toString()).toEqual(`${tempdir}/existent.txt\n`); expect(exitCode).toBe(0); expect(await fileExists(`${tempdir}/existent.txt`)).toBeFalse(); } }); test("recursive", async () => { const files = { "existent.txt": "", }; const tempdir = tempDirWithFiles("rmrecursive", files); // test on a file { expect(await fileExists(`${tempdir}/existent.txt`)).toBeTrue(); const { stdout, stderr, exitCode } = await $`rm -rv ${tempdir}/existent.txt`; expect(stderr.length).toBe(0); expect(stdout.toString()).toEqual(`${tempdir}/existent.txt\n`); expect(exitCode).toBe(0); expect(await fileExists(`${tempdir}/existent.txt`)).toBeFalse(); } // test on a directory { let subDir = path.join(tempdir, "folder", "sub"); mkdirSync(subDir, { recursive: true }); let subFile = path.join(subDir, "file.txt"); writeFileSync(subFile, "test"); const { stdout, exitCode } = await $`rm -rv ${path.join(tempdir, "folder")}`; expect(sortedShellOutput(stdout.toString())).toEqual( sortedShellOutput(`${subFile}\n${subDir}\n${path.join(tempdir, "folder")}\n`), ); expect(exitCode).toBe(0); expect(await fileExists(subDir)).toBeFalse(); expect(await fileExists(subFile)).toBeFalse(); { const { stdout, stderr, exitCode } = await $`ls ${tempdir}`; console.log("NICE", stdout.toString(), exitCode); console.log("NICE", stderr.toString()); } expect(await fileExists(tempdir)).toBeTrue(); } // test with cwd { const tmpdir = TestBuilder.tmpdir(); const { stdout, stderr } = await $`mkdir foo; touch ./foo/lol ./foo/nice ./foo/lmao; mkdir foo/bar; touch ./foo/bar/great; touch ./foo/bar/wow; rm -rfv foo/`.cwd( tmpdir, ); expect(sortedShellOutput(stdout.toString())).toEqual( sortedShellOutput( `foo/lol foo/nice foo/lmao foo/bar foo/bar/great foo/bar/wow foo/ `, ), ); } }); test("dir", async () => { const files = { "existent.txt": "", "sub_dir": {}, "sub_dir_files/file.txt": "", }; const tempdir = tempDirWithFiles("rmdir", files); { const { stdout, stderr, exitCode } = await $`rm -d ${tempdir}/existent.txt`; expect(exitCode).toBe(0); expect(await fileExists(`${tempdir}/existent.txt`)).toBeFalse(); } { const { stdout, stderr, exitCode } = await $`rm -d ${tempdir}/sub_dir`; console.log(stderr.toString()); expect(exitCode).toBe(0); expect(await fileExists(`${tempdir}/sub_dir`)).toBeFalse(); } { const { stdout, stderr, exitCode } = await $`rm -d ${tempdir}/sub_dir_files`; console.log(exitCode, "STDOUT", stdout.toString()); expect(stderr.toString()).toEqual(`rm: ${tempdir}/sub_dir_files: Directory not empty\n`); expect(exitCode).toBe(1); expect(await fileExists(`${tempdir}/sub_dir_files`)).toBeTrue(); } }); }); function packagejson() { return `{ "name": "dummy", "dependencies": { "@biomejs/biome": "^1.5.3", "@vscode/debugadapter": "^1.61.0", "esbuild": "^0.17.15", "eslint": "^8.20.0", "eslint-config-prettier": "^8.5.0", "mitata": "^0.1.3", "peechy": "0.4.34", "prettier": "3.2.2", "react": "next", "react-dom": "next", "source-map-js": "^1.0.2", "typescript": "^5.0.2" }, "devDependencies": { "@types/react": "^18.0.25", "@typescript-eslint/eslint-plugin": "^5.31.0", "@typescript-eslint/parser": "^5.31.0" }, "version": "0.0.0" }`; }