mirror of
https://github.com/shelljs/shelljs.git
synced 2025-12-08 20:35:51 +00:00
No change to logic. This swaps over tests to use require() since everything is currently designed for the commonjs module system.
204 lines
6.8 KiB
JavaScript
204 lines
6.8 KiB
JavaScript
const fs = require('fs');
|
|
|
|
const test = require('ava');
|
|
|
|
const shell = require('..');
|
|
const common = require('../src/common');
|
|
const utils = require('./utils/utils');
|
|
|
|
test.beforeEach(t => {
|
|
t.context.tmp = utils.getTempDir();
|
|
shell.config.resetForTesting();
|
|
shell.mkdir(t.context.tmp);
|
|
});
|
|
|
|
test.afterEach.always(t => {
|
|
shell.rm('-rf', t.context.tmp);
|
|
});
|
|
|
|
|
|
//
|
|
// Invalids
|
|
//
|
|
|
|
test('no args', t => {
|
|
const result = shell.mkdir();
|
|
t.truthy(shell.error());
|
|
t.is(result.code, 1);
|
|
t.is(result.stderr, 'mkdir: no paths given');
|
|
});
|
|
|
|
test('dir already exists', t => {
|
|
const mtime = common.statFollowLinks(t.context.tmp).mtime.toString();
|
|
const result = shell.mkdir(t.context.tmp); // dir already exists
|
|
t.truthy(shell.error());
|
|
t.is(result.code, 1);
|
|
t.is(result.stderr, `mkdir: path already exists: ${t.context.tmp}`);
|
|
t.is(common.statFollowLinks(t.context.tmp).mtime.toString(), mtime); // didn't mess with dir
|
|
});
|
|
|
|
test("Can't overwrite a broken link", t => {
|
|
const mtime = common.statNoFollowLinks('test/resources/badlink').mtime.toString();
|
|
const result = shell.mkdir('test/resources/badlink');
|
|
t.truthy(shell.error());
|
|
t.is(result.code, 1);
|
|
t.is(result.stderr, 'mkdir: path already exists: test/resources/badlink');
|
|
t.is(common.statNoFollowLinks('test/resources/badlink').mtime.toString(), mtime); // didn't mess with file
|
|
});
|
|
|
|
test('root path does not exist', t => {
|
|
t.falsy(fs.existsSync('/asdfasdf')); // sanity check
|
|
const result = shell.mkdir('/asdfasdf/foobar'); // root path does not exist
|
|
t.truthy(shell.error());
|
|
t.is(result.code, 1);
|
|
t.is(result.stderr, 'mkdir: no such file or directory: /asdfasdf');
|
|
t.falsy(fs.existsSync('/asdfasdf'));
|
|
t.falsy(fs.existsSync('/asdfasdf/foobar'));
|
|
});
|
|
|
|
test('try to overwrite file', t => {
|
|
t.truthy(common.statFollowLinks('test/resources/file1').isFile());
|
|
const result = shell.mkdir('test/resources/file1');
|
|
t.truthy(shell.error());
|
|
t.is(result.code, 1);
|
|
t.is(result.stderr, 'mkdir: path already exists: test/resources/file1');
|
|
t.truthy(common.statFollowLinks('test/resources/file1').isFile());
|
|
});
|
|
|
|
test('try to overwrite file, with -p', t => {
|
|
t.truthy(common.statFollowLinks('test/resources/file1').isFile());
|
|
const result = shell.mkdir('-p', 'test/resources/file1');
|
|
t.truthy(shell.error());
|
|
t.is(result.code, 1);
|
|
t.is(result.stderr, 'mkdir: cannot create directory test/resources/file1: File exists');
|
|
t.truthy(common.statFollowLinks('test/resources/file1').isFile());
|
|
});
|
|
|
|
test('try to make a subdirectory of a file', t => {
|
|
t.truthy(common.statFollowLinks('test/resources/file1').isFile());
|
|
const result = shell.mkdir('test/resources/file1/subdir');
|
|
t.truthy(shell.error());
|
|
t.is(result.code, 1);
|
|
t.is(result.stderr, 'mkdir: cannot create directory test/resources/file1/subdir: Not a directory');
|
|
t.truthy(common.statFollowLinks('test/resources/file1').isFile());
|
|
t.falsy(fs.existsSync('test/resources/file1/subdir'));
|
|
});
|
|
|
|
test('Check for invalid permissions', t => {
|
|
utils.skipOnWin(t, () => {
|
|
// This test case only works on unix, but should work on Windows as well
|
|
const dirName = `${t.context.tmp}/nowritedir`;
|
|
shell.mkdir(dirName);
|
|
t.falsy(shell.error());
|
|
shell.chmod('-w', dirName);
|
|
const result = shell.mkdir(dirName + '/foo');
|
|
t.is(result.code, 1);
|
|
t.is(
|
|
result.stderr,
|
|
`mkdir: cannot create directory ${t.context.tmp}/nowritedir/foo: Permission denied`
|
|
);
|
|
t.truthy(shell.error());
|
|
t.falsy(fs.existsSync(dirName + '/foo'));
|
|
});
|
|
});
|
|
|
|
//
|
|
// Valids
|
|
//
|
|
|
|
test('basic usage', t => {
|
|
t.falsy(fs.existsSync(`${t.context.tmp}/t1`));
|
|
const result = shell.mkdir(`${t.context.tmp}/t1`);
|
|
t.falsy(shell.error());
|
|
t.is(result.code, 0);
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/t1`));
|
|
});
|
|
|
|
test('multiple dirs', t => {
|
|
t.falsy(fs.existsSync(`${t.context.tmp}/t2`));
|
|
t.falsy(fs.existsSync(`${t.context.tmp}/t3`));
|
|
const result = shell.mkdir(`${t.context.tmp}/t2`, `${t.context.tmp}/t3`);
|
|
t.falsy(shell.error());
|
|
t.is(result.code, 0);
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/t2`));
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/t3`));
|
|
});
|
|
|
|
test('one dir exists, the other does not', t => {
|
|
shell.mkdir(`${t.context.tmp}/t1`);
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/t1`));
|
|
t.falsy(fs.existsSync(`${t.context.tmp}/t4`));
|
|
const result = shell.mkdir(`${t.context.tmp}/t1`, `${t.context.tmp}/t4`);
|
|
t.is(result.code, 1);
|
|
t.is(utils.numLines(shell.error()), 1);
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/t1`));
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/t4`));
|
|
});
|
|
|
|
test('-p flag', t => {
|
|
t.falsy(fs.existsSync(`${t.context.tmp}/a`));
|
|
const result = shell.mkdir('-p', `${t.context.tmp}/a/b/c`);
|
|
t.falsy(shell.error());
|
|
t.is(result.code, 0);
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/a/b/c`));
|
|
});
|
|
|
|
test('-p flag: multiple dirs', t => {
|
|
const result = shell.mkdir('-p', `${t.context.tmp}/zzza`,
|
|
`${t.context.tmp}/zzzb`, `${t.context.tmp}/zzzc`);
|
|
t.falsy(shell.error());
|
|
t.is(result.code, 0);
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/zzza`));
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/zzzb`));
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/zzzc`));
|
|
});
|
|
|
|
test('-p flag: multiple dirs, array syntax', t => {
|
|
const result = shell.mkdir('-p', [`${t.context.tmp}/yyya`,
|
|
`${t.context.tmp}/yyyb`, `${t.context.tmp}/yyyc`]);
|
|
t.falsy(shell.error());
|
|
t.is(result.code, 0);
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/yyya`));
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/yyyb`));
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/yyyc`));
|
|
});
|
|
|
|
test('-p flag: subdirectory already exists', t => {
|
|
t.falsy(fs.existsSync(`${t.context.tmp}/d1`));
|
|
shell.mkdir('-p', `${t.context.tmp}/d1/d2/d3`);
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/d1/d2/d3`));
|
|
const result = shell.mkdir('-p', `${t.context.tmp}/d1/d2`);
|
|
t.falsy(shell.error());
|
|
t.is(result.code, 0);
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/d1/d2/d3`));
|
|
});
|
|
|
|
test('-p flag: create directory in subdirectory', t => {
|
|
t.falsy(fs.existsSync(`${t.context.tmp}/d1`));
|
|
shell.mkdir('-p', `${t.context.tmp}/d1/d2`);
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/d1/d2`));
|
|
const result = shell.mkdir('-p', `${t.context.tmp}/d1/d2/d3`);
|
|
t.falsy(shell.error());
|
|
t.is(result.code, 0);
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/d1/d2/d3`));
|
|
});
|
|
|
|
test('globbed dir', t => {
|
|
let result = shell.mkdir('-p', `${t.context.tmp}/mydir`);
|
|
t.falsy(shell.error());
|
|
t.is(result.code, 0);
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/mydir`));
|
|
result = shell.mkdir('-p', `${t.context.tmp}/m*ir`);
|
|
t.falsy(shell.error());
|
|
t.is(result.code, 0);
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/mydir`));
|
|
t.falsy(fs.existsSync(`${t.context.tmp}/m*ir`)); // doesn't create literal name
|
|
});
|
|
|
|
test('non-normalized paths are still ok with -p', t => {
|
|
const result = shell.mkdir('-p', `${t.context.tmp}/asdf/../asdf/./`);
|
|
t.falsy(shell.error());
|
|
t.is(result.code, 0);
|
|
t.truthy(fs.existsSync(`${t.context.tmp}/asdf`));
|
|
});
|