diff --git a/red/runtime/nodes/context/localfilesystem.js b/red/runtime/nodes/context/localfilesystem.js index 551289a95..74e1f30c0 100644 --- a/red/runtime/nodes/context/localfilesystem.js +++ b/red/runtime/nodes/context/localfilesystem.js @@ -203,6 +203,8 @@ LocalFileSystem.prototype.set = function(scope, key, value, callback) { var storagePath = getStoragePath(this.storageBaseDir ,scope); fs.outputFile(storagePath + ".json", JSON.stringify(newContext, undefined, 4), "utf8").catch(function(err) { }); + } else if (callback && typeof callback !== 'function') { + throw new Error("Callback must be a function"); } else { this._set(scope,key,value,callback); } diff --git a/test/red/runtime/nodes/context/localfilesystem_spec.js b/test/red/runtime/nodes/context/localfilesystem_spec.js index c462c389f..267ef3dd9 100644 --- a/test/red/runtime/nodes/context/localfilesystem_spec.js +++ b/test/red/runtime/nodes/context/localfilesystem_spec.js @@ -63,6 +63,15 @@ describe('localfilesystem',function() { }); }); + it('should store local scope property', function (done) { + context.set("abc:def", "foo.bar", "test", function (err) { + context.get("abc:def", "foo", function (err, value) { + value.should.be.eql({ bar: "test" }); + done(); + }); + }); + }); + it('should delete property',function(done) { context.set("nodeX","foo.abc.bar1","test1",function(err){ context.set("nodeX","foo.abc.bar2","test2",function(err){ @@ -240,6 +249,81 @@ describe('localfilesystem',function() { }); }); }); + + it('should throw an error when getting a value with invalid key', function (done) { + context.set("nodeX","foo","bar",function(err) { + context.get("nodeX"," ",function(err,value) { + should.exist(err); + done(); + }); + }); + }); + + it('should throw an error when setting a value with invalid key',function (done) { + context.set("nodeX"," ","bar",function (err) { + should.exist(err); + done(); + }); + }); + + it('should throw an error when callback of get() is not a function',function (done) { + try { + context.get("nodeX","foo","callback"); + done("should throw an error."); + } catch (err) { + done(); + }; + }); + + it('should throw an error when callback of get() is not specified',function (done) { + try { + context.get("nodeX","foo"); + done("should throw an error."); + } catch (err) { + done(); + }; + }); + + it('should throw an error when callback of set() is not a function',function (done) { + try { + context.set("nodeX","foo","bar","callback"); + done("should throw an error."); + } catch (err) { + done(); + }; + }); + + it('should not throw an error when callback of set() is not specified', function (done) { + try { + context.set("nodeX"," ","bar"); + done(); + } catch (err) { + done("should not throw an error."); + }; + }); + + it('should handle empty context file', function (done) { + fs.outputFile(path.join(resourcesDir,"contexts","nodeX","flow.json"),"",function(){ + context.get("nodeX", "foo", function (err, value) { + should.not.exist(value); + context.set("nodeX", "foo", "test", function (err) { + context.get("nodeX", "foo", function (err, value) { + value.should.be.equal("test"); + done(); + }); + }); + }); + }); + }); + + it('should throw an error when reading corrupt context file', function (done) { + fs.outputFile(path.join(resourcesDir, "contexts", "nodeX", "flow.json"),"{abc",function(){ + context.get("nodeX", "foo", function (err, value) { + should.exist(err); + done(); + }); + }); + }); }); describe('#keys',function() { @@ -286,6 +370,24 @@ describe('localfilesystem',function() { }); }); }); + + it('should throw an error when callback of keys() is not a function', function (done) { + try { + context.keys("nodeX", "callback"); + done("should throw an error."); + } catch (err) { + done(); + }; + }); + + it('should throw an error when callback of keys() is not specified', function (done) { + try { + context.keys("nodeX"); + done("should throw an error."); + } catch (err) { + done(); + }; + }); }); describe('#delete',function() { @@ -496,4 +598,132 @@ describe('localfilesystem',function() { }); }); }); + + describe('Configuration', function () { + it('should change a base directory', function (done) { + var differentBaseContext = LocalFileSystem({ + base: "contexts2", + dir: resourcesDir, + cache: false + }); + differentBaseContext.open().then(function () { + differentBaseContext.set("node2", "foo2", "bar2", function (err) { + differentBaseContext.get("node2", "foo2", function (err, value) { + value.should.be.equal("bar2"); + context.get("node2", "foo2", function(err, value) { + should.not.exist(value); + done(); + }); + }); + }); + }); + }); + + it('should use userDir', function (done) { + var userDirContext = LocalFileSystem({ + base: "contexts2", + cache: false, + settings: { + userDir: resourcesDir + } + }); + userDirContext.open().then(function () { + userDirContext.set("node2", "foo2", "bar2", function (err) { + userDirContext.get("node2", "foo2", function (err, value) { + value.should.be.equal("bar2"); + context.get("node2", "foo2", function (err, value) { + should.not.exist(value); + done(); + }); + }); + }); + }); + }); + + it('should use NODE_RED_HOME', function (done) { + var oldNRH = process.env.NODE_RED_HOME; + process.env.NODE_RED_HOME = resourcesDir; + fs.mkdirSync(resourcesDir); + fs.writeFileSync(path.join(resourcesDir,".config.json"),""); + var nrHomeContext = LocalFileSystem({ + base: "contexts2", + cache: false + }); + try { + nrHomeContext.open().then(function () { + nrHomeContext.set("node2", "foo2", "bar2", function (err) { + nrHomeContext.get("node2", "foo2", function (err, value) { + value.should.be.equal("bar2"); + context.get("node2", "foo2", function (err, value) { + should.not.exist(value); + done(); + }); + }); + }); + }); + } finally { + process.env.NODE_RED_HOME = oldNRH; + } + }); + + it('should use HOME_PATH', function (done) { + var oldNRH = process.env.NODE_RED_HOME; + var oldHOMEPATH = process.env.HOMEPATH; + process.env.NODE_RED_HOME = resourcesDir; + process.env.HOMEPATH = resourcesDir; + var homePath = path.join(resourcesDir, ".node-red"); + fs.outputFile(path.join(homePath, ".config.json"),"",function(){ + var homeContext = LocalFileSystem({ + base: "contexts2", + cache: false + }); + try { + homeContext.open().then(function () { + homeContext.set("node2", "foo2", "bar2", function (err) { + homeContext.get("node2", "foo2", function (err, value) { + value.should.be.equal("bar2"); + context.get("node2", "foo2", function (err, value) { + should.not.exist(value); + done(); + }); + }); + }); + }); + } finally { + process.env.NODE_RED_HOME = oldNRH; + process.env.HOMEPATH = oldHOMEPATH; + } + }); + }); + + it('should use HOME_PATH', function (done) { + var oldNRH = process.env.NODE_RED_HOME; + var oldHOMEPATH = process.env.HOMEPATH; + var oldHOME = process.env.HOME; + process.env.NODE_RED_HOME = resourcesDir; + process.env.HOMEPATH = resourcesDir; + process.env.HOME = resourcesDir; + var homeContext = LocalFileSystem({ + base: "contexts2", + cache: false + }); + try { + homeContext.open().then(function () { + homeContext.set("node2", "foo2", "bar2", function (err) { + homeContext.get("node2", "foo2", function (err, value) { + value.should.be.equal("bar2"); + context.get("node2", "foo2", function (err, value) { + should.not.exist(value); + done(); + }); + }); + }); + }); + } finally { + process.env.NODE_RED_HOME = oldNRH; + process.env.HOMEPATH = oldHOMEPATH; + process.env.HOME = oldHOME; + } + }); + }); });