From f77fa8b3261512243eac76365e1886ba80fda776 Mon Sep 17 00:00:00 2001 From: streamich Date: Sat, 9 Feb 2019 20:59:18 +0100 Subject: [PATCH] =?UTF-8?q?fix:=20=F0=9F=90=9B=20throw=20when=20creating?= =?UTF-8?q?=20root=20directory?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit closes #325 --- .../__snapshots__/mkdirSync.test.ts.snap | 5 ++ src/__tests__/volume/mkdirSync.test.ts | 53 +++++++++++++++++++ src/volume.ts | 6 +++ 3 files changed, 64 insertions(+) create mode 100644 src/__tests__/volume/__snapshots__/mkdirSync.test.ts.snap create mode 100644 src/__tests__/volume/mkdirSync.test.ts diff --git a/src/__tests__/volume/__snapshots__/mkdirSync.test.ts.snap b/src/__tests__/volume/__snapshots__/mkdirSync.test.ts.snap new file mode 100644 index 00000000..86500631 --- /dev/null +++ b/src/__tests__/volume/__snapshots__/mkdirSync.test.ts.snap @@ -0,0 +1,5 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`mkdirSync throws when creating root directory 1`] = `"EISDIR: illegal operation on a directory, mkdir"`; + +exports[`mkdirSync throws when re-creating existing directory 1`] = `"EEXIST: file already exists, mkdir '/new-dir'"`; diff --git a/src/__tests__/volume/mkdirSync.test.ts b/src/__tests__/volume/mkdirSync.test.ts new file mode 100644 index 00000000..53992a19 --- /dev/null +++ b/src/__tests__/volume/mkdirSync.test.ts @@ -0,0 +1,53 @@ +import { create } from '../util'; + +describe('mkdirSync', () => { + it('can create a directory', () => { + const vol = create(); + + vol.mkdirSync('/new-dir'); + const stat = vol.statSync('/new-dir'); + + expect(stat.isDirectory()).toBe(true); + }); + + it('root directory is directory', () => { + const vol = create(); + const stat = vol.statSync('/'); + + expect(stat.isDirectory()).toBe(true); + }); + + it('throws when re-creating existing directory', () => { + const vol = create(); + + vol.mkdirSync('/new-dir'); + + let error; + try { + vol.mkdirSync('/new-dir'); + } catch (err) { + error = err; + } + + expect(error).toBeInstanceOf(Error); + expect(error.message).toMatchSnapshot(); + }); + + /** + * See issue #325 + * https://github.com/streamich/memfs/issues/325 + */ + it('throws when creating root directory', () => { + const vol = create(); + + let error; + try { + vol.mkdirSync('/'); + } catch (err) { + error = err; + } + + expect(error).toBeInstanceOf(Error); + expect(error.message).toMatchSnapshot(); + }); +}); diff --git a/src/volume.ts b/src/volume.ts index edbf3572..8574cf81 100644 --- a/src/volume.ts +++ b/src/volume.ts @@ -1768,6 +1768,12 @@ export class Volume { private mkdirBase(filename: string, modeNum: number) { const steps = filenameToSteps(filename); + + // This will throw if user tries to create root dir `fs.mkdirSync('/')`. + if (!steps.length) { + throwError(EISDIR, 'mkdir'); + } + const dir = this.getLinkParentAsDirOrThrow(filename, 'mkdir'); // Check path already exists.