node-red/test/unit/@node-red/runtime/lib/storage/index_spec.js

272 lines
8.9 KiB
JavaScript

/**
* Copyright JS Foundation and other contributors, http://js.foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/
var should = require("should");
var paff = require('path');
var NR_TEST_UTILS = require("nr-test-utils");
var storage = NR_TEST_UTILS.require("@node-red/runtime/lib/storage/index");
describe("red/storage/index", function() {
it('rejects the promise when settings suggest loading a bad module', function(done) {
var wrongModule = {
settings:{
storageModule : "thisaintloading"
}
};
storage.init(wrongModule).then( function() {
var one = 1;
var zero = 0;
try {
zero.should.equal(one, "The initialization promise should never get resolved");
} catch(err) {
done(err);
}
}).catch(function(e) {
done(); //successfully rejected promise
});
});
it('non-string storage module', function(done) {
var initSetsMeToTrue = false;
var moduleWithBooleanSettingInit = {
init : function() {
initSetsMeToTrue = true;
}
};
var setsBooleanModule = {
settings: {
storageModule : moduleWithBooleanSettingInit
}
};
storage.init(setsBooleanModule);
initSetsMeToTrue.should.be.true();
done();
});
it('respects storage interface', function(done) {
var calledFlagGetFlows = false;
var calledFlagGetCredentials = false;
var calledFlagGetAllFlows = false;
var calledInit = false;
var calledFlagGetSettings = false;
var calledFlagGetSessions = false;
var interfaceCheckerModule = {
init : function (settings) {
settings.should.be.an.Object();
calledInit = true;
},
getFlows : function() {
calledFlagGetFlows = true;
return Promise.resolve([]);
},
saveFlows : function (flows) {
flows.should.be.an.Array();
flows.should.have.lengthOf(0);
return Promise.resolve("");
},
getCredentials : function() {
calledFlagGetCredentials = true;
return Promise.resolve({});
},
saveCredentials : function(credentials) {
credentials.should.be.true();
},
getSettings : function() {
calledFlagGetSettings = true;
},
saveSettings : function(settings) {
settings.should.be.true();
},
getSessions : function() {
calledFlagGetSessions = true;
},
saveSessions : function(sessions) {
sessions.should.be.true();
},
getAllFlows : function() {
calledFlagGetAllFlows = true;
},
getFlow : function(fn) {
fn.should.equal("name");
},
saveFlow : function(fn, data) {
fn.should.equal("name");
data.should.be.true();
},
getLibraryEntry : function(type, path) {
type.should.be.true();
path.should.equal("name");
},
saveLibraryEntry : function(type, path, meta, body) {
type.should.be.true();
path.should.equal("name");
meta.should.be.true();
body.should.be.true();
}
};
var moduleToLoad = {
settings: {
storageModule : interfaceCheckerModule
}
};
var promises = [];
storage.init(moduleToLoad);
promises.push(storage.getFlows());
promises.push(storage.saveFlows({flows:[],credentials:{}}));
storage.getSettings();
storage.saveSettings(true);
storage.getSessions();
storage.saveSessions(true);
storage.getAllFlows();
storage.getFlow("name");
storage.saveFlow("name", true);
storage.getLibraryEntry(true, "name");
storage.saveLibraryEntry(true, "name", true, true);
Promise.all(promises).then(function() {
try {
calledInit.should.be.true();
calledFlagGetFlows.should.be.true();
calledFlagGetCredentials.should.be.true();
calledFlagGetAllFlows.should.be.true();
done();
} catch(err) {
done(err);
}
});
});
describe('respects deprecated flow library functions', function() {
var savePath;
var saveContent;
var saveMeta;
var saveType;
var interfaceCheckerModule = {
init : function (settings) {
settings.should.be.an.Object();
},
getLibraryEntry : function(type, path) {
if (type === "flows") {
if (path === "/" || path === "\\") {
return Promise.resolve(["a",{fn:"test.json"}]);
} else if (path == "/a" || path == "\\a") {
return Promise.resolve([{fn:"test2.json"}]);
} else if (path == paff.join("","a","test2.json")) {
return Promise.resolve("test content");
}
}
},
saveLibraryEntry : function(type, path, meta, body) {
saveType = type;
savePath = path;
saveContent = body;
saveMeta = meta;
return Promise.resolve();
}
};
var moduleToLoad = {
settings: {
storageModule : interfaceCheckerModule
}
};
before(function() {
storage.init(moduleToLoad);
});
it('getAllFlows',function(done) {
storage.getAllFlows().then(function (res) {
try {
res.should.eql({ d: { a: { f: ['test2'] } }, f: [ 'test' ] });
done();
} catch(err) {
done(err);
}
});
});
it('getFlow',function(done) {
storage.getFlow(paff.join("a","test2.json")).then(function(res) {
try {
res.should.eql("test content");
done();
} catch(err) {
done(err);
}
});
});
it ('saveFlow', function (done) {
storage.saveFlow(paff.join("a","test2.json"),"new content").then(function(res) {
try {
savePath.should.eql(paff.join("a","test2.json"));
saveContent.should.eql("new content");
saveMeta.should.eql({});
saveType.should.eql("flows");
done();
} catch(err) {
done(err);
}
});
});
});
describe('handles missing settings/sessions interface', function() {
before(function() {
var interfaceCheckerModule = {
init : function () {}
};
storage.init({settings:{storageModule: interfaceCheckerModule}});
});
it('defaults missing getSettings',function(done) {
storage.getSettings().then(function(settings) {
should.not.exist(settings);
done();
});
});
it('defaults missing saveSettings',function(done) {
storage.saveSettings({}).then(function() {
done();
});
});
it('defaults missing getSessions',function(done) {
storage.getSessions().then(function(settings) {
should.not.exist(settings);
done();
});
});
it('defaults missing saveSessions',function(done) {
storage.saveSessions({}).then(function() {
done();
});
});
});
});