Fix shell.cd and add tests
This commit is contained in:
parent
2d3b15d310
commit
d7cce709f9
29
src/shell.js
29
src/shell.js
|
@ -2,11 +2,12 @@
|
||||||
define(function(require) {
|
define(function(require) {
|
||||||
|
|
||||||
var Path = require('src/path');
|
var Path = require('src/path');
|
||||||
|
var Error = require('src/error');
|
||||||
|
|
||||||
function Shell(fs, options) {
|
function Shell(fs, options) {
|
||||||
options = options || {};
|
options = options || {};
|
||||||
|
|
||||||
var cwd = options.cwd || '/';
|
var cwd = '/';
|
||||||
|
|
||||||
Object.defineProperty(this, 'fs', {
|
Object.defineProperty(this, 'fs', {
|
||||||
get: function() { return fs; },
|
get: function() { return fs; },
|
||||||
|
@ -20,10 +21,22 @@ define(function(require) {
|
||||||
|
|
||||||
// We include `cd` on the this vs. proto so that
|
// We include `cd` on the this vs. proto so that
|
||||||
// we can access cwd without exposing it externally.
|
// we can access cwd without exposing it externally.
|
||||||
this.cd = function(path) {
|
this.cd = function(path, callback) {
|
||||||
this.cwd = Path.resolve(this.cwd, path);
|
path = Path.resolve(this.cwd, path);
|
||||||
|
// Make sure the path actually exists, and is a dir
|
||||||
|
fs.stat(path, function(err, stats) {
|
||||||
|
if(err) {
|
||||||
|
callback(new Error.ENotDirectory());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(stats.type === 'DIRECTORY') {
|
||||||
|
cwd = path;
|
||||||
|
callback();
|
||||||
|
} else {
|
||||||
|
callback(new Error.ENotDirectory());
|
||||||
|
}
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -83,9 +96,7 @@ define(function(require) {
|
||||||
path = Path.resolve(this.cwd, path);
|
path = Path.resolve(this.cwd, path);
|
||||||
|
|
||||||
function createFile(path) {
|
function createFile(path) {
|
||||||
fs.writeFile(path, '', function(error) {
|
fs.writeFile(path, '', callback);
|
||||||
callback(error);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateTimes(path) {
|
function updateTimes(path) {
|
||||||
|
@ -93,9 +104,7 @@ define(function(require) {
|
||||||
var atime = options.date || now;
|
var atime = options.date || now;
|
||||||
var mtime = options.date || now;
|
var mtime = options.date || now;
|
||||||
|
|
||||||
fs.utimes(path, atime, mtime, function(error) {
|
fs.utimes(path, atime, mtime, callback);
|
||||||
callback(error);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fs.stat(path, function(error, stats) {
|
fs.stat(path, function(error, stats) {
|
||||||
|
|
|
@ -0,0 +1,104 @@
|
||||||
|
define(["Filer", "util"], function(Filer, util) {
|
||||||
|
|
||||||
|
describe('FileSystemShell.cd', function() {
|
||||||
|
beforeEach(util.setup);
|
||||||
|
afterEach(util.cleanup);
|
||||||
|
|
||||||
|
it('should be a function', function() {
|
||||||
|
var shell = util.shell();
|
||||||
|
expect(shell.cd).to.be.a('function');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should default to a cwd of /', function() {
|
||||||
|
var shell = util.shell();
|
||||||
|
expect(shell.cwd).to.equal('/');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should allow changing the path to a valid dir', function(done) {
|
||||||
|
var fs = util.fs();
|
||||||
|
var shell = fs.Shell();
|
||||||
|
|
||||||
|
fs.mkdir('/dir', function(err) {
|
||||||
|
if(err) throw err;
|
||||||
|
|
||||||
|
expect(shell.cwd).to.equal('/');
|
||||||
|
shell.cd('/dir', function(err) {
|
||||||
|
expect(err).not.to.exist;
|
||||||
|
expect(shell.cwd).to.equal('/dir');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should fail when changing the path to an invalid dir', function(done) {
|
||||||
|
var fs = util.fs();
|
||||||
|
var shell = fs.Shell();
|
||||||
|
|
||||||
|
fs.mkdir('/dir', function(err) {
|
||||||
|
if(err) throw err;
|
||||||
|
|
||||||
|
expect(shell.cwd).to.equal('/');
|
||||||
|
shell.cd('/nodir', function(err) {
|
||||||
|
expect(err).to.exist;
|
||||||
|
expect(err.name).to.equal('ENotDirectory');
|
||||||
|
expect(shell.cwd).to.equal('/');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should fail when changing the path to a file', function(done) {
|
||||||
|
var fs = util.fs();
|
||||||
|
var shell = fs.Shell();
|
||||||
|
|
||||||
|
fs.writeFile('/file', 'file', function(err) {
|
||||||
|
if(err) throw err;
|
||||||
|
|
||||||
|
expect(shell.cwd).to.equal('/');
|
||||||
|
shell.cd('/file', function(err) {
|
||||||
|
expect(err).to.exist;
|
||||||
|
expect(err.name).to.equal('ENotDirectory');
|
||||||
|
expect(shell.cwd).to.equal('/');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should allow relative paths for a valid dir', function(done) {
|
||||||
|
var fs = util.fs();
|
||||||
|
var shell = fs.Shell();
|
||||||
|
|
||||||
|
fs.mkdir('/dir', function(err) {
|
||||||
|
if(err) throw err;
|
||||||
|
|
||||||
|
expect(shell.cwd).to.equal('/');
|
||||||
|
shell.cd('./dir', function(err) {
|
||||||
|
expect(err).not.to.exist;
|
||||||
|
expect(shell.cwd).to.equal('/dir');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should allow .. in paths for a valid dir', function(done) {
|
||||||
|
var fs = util.fs();
|
||||||
|
var shell = fs.Shell();
|
||||||
|
|
||||||
|
fs.mkdir('/dir', function(err) {
|
||||||
|
if(err) throw err;
|
||||||
|
|
||||||
|
expect(shell.cwd).to.equal('/');
|
||||||
|
shell.cd('./dir', function(err) {
|
||||||
|
expect(err).not.to.exist;
|
||||||
|
expect(shell.cwd).to.equal('/dir');
|
||||||
|
shell.cd('..', function(err) {
|
||||||
|
expect(err).not.to.exist;
|
||||||
|
expect(shell.cwd).to.equal('/');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
});
|
|
@ -43,6 +43,7 @@ define([
|
||||||
"spec/adapters/adapters.general.spec",
|
"spec/adapters/adapters.general.spec",
|
||||||
|
|
||||||
// Filer.FileSystemShell.*
|
// Filer.FileSystemShell.*
|
||||||
|
"spec/shell/cd.spec",
|
||||||
"spec/shell/touch.spec",
|
"spec/shell/touch.spec",
|
||||||
"spec/shell/exec.spec",
|
"spec/shell/exec.spec",
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue