Files
bun.sh/test/js/bun/shell/commands/rm.test.ts
Dylan Conway aad4d800ff add "configVersion" to bun.lock(b) (#24236)
### What does this PR do?

Adds `"configVersion"` to bun.lock(b). The version will be used to keep
default settings the same if they would be breaking across bun versions.

fixes ENG-21389
fixes ENG-21388
### How did you verify your code works?
TODO:
- [ ] new project
- [ ] existing project without configVersion
- [ ] existing project with configVersion
- [ ] same as above but with bun.lockb
- [ ] configVersion@0 defaults to hoisted linker
- [ ] new projects use isolated linker

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
2025-11-03 22:20:07 -08:00

174 lines
5.3 KiB
TypeScript

/**
* 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<boolean> =>
$`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"
}`;
}