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`)); });