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

272 lines
8.9 KiB
JavaScript
Raw Normal View History

/**
* 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");
2017-03-06 16:28:23 +01:00
var paff = require('path');
2018-08-20 17:17:24 +02:00
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() {
2014-07-23 16:15:20 +02:00
it('rejects the promise when settings suggest loading a bad module', function(done) {
2014-07-23 16:15:20 +02:00
var wrongModule = {
settings:{
2014-07-23 16:15:20 +02:00
storageModule : "thisaintloading"
}
2014-07-23 16:15:20 +02:00
};
2017-03-06 16:28:23 +01:00
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
});
2014-07-23 16:15:20 +02:00
});
2014-07-23 16:15:20 +02:00
it('non-string storage module', function(done) {
var initSetsMeToTrue = false;
2014-07-23 16:15:20 +02:00
var moduleWithBooleanSettingInit = {
init : function() {
initSetsMeToTrue = true;
}
2014-07-23 16:15:20 +02:00
};
2014-07-23 16:15:20 +02:00
var setsBooleanModule = {
settings: {
2014-07-23 16:15:20 +02:00
storageModule : moduleWithBooleanSettingInit
}
2014-07-23 16:15:20 +02:00
};
2014-07-23 16:15:20 +02:00
storage.init(setsBooleanModule);
2016-10-10 14:27:43 +02:00
initSetsMeToTrue.should.be.true();
2014-07-23 16:15:20 +02:00
done();
});
2016-10-10 14:27:43 +02:00
it('respects storage interface', function(done) {
2014-07-23 16:15:20 +02:00
var calledFlagGetFlows = false;
var calledFlagGetCredentials = false;
var calledFlagGetAllFlows = false;
var calledInit = false;
var calledFlagGetSettings = false;
var calledFlagGetSessions = false;
2014-07-23 16:15:20 +02:00
var interfaceCheckerModule = {
init : function (settings) {
2016-10-10 14:27:43 +02:00
settings.should.be.an.Object();
2014-07-23 16:15:20 +02:00
calledInit = true;
},
getFlows : function() {
calledFlagGetFlows = true;
2020-11-30 15:38:48 +01:00
return Promise.resolve([]);
2014-07-23 16:15:20 +02:00
},
saveFlows : function (flows) {
2016-10-10 14:27:43 +02:00
flows.should.be.an.Array();
flows.should.have.lengthOf(0);
2020-11-30 15:38:48 +01:00
return Promise.resolve("");
2014-07-23 16:15:20 +02:00
},
getCredentials : function() {
calledFlagGetCredentials = true;
2020-11-30 15:38:48 +01:00
return Promise.resolve({});
2014-07-23 16:15:20 +02:00
},
saveCredentials : function(credentials) {
2016-10-10 14:27:43 +02:00
credentials.should.be.true();
2014-07-23 16:15:20 +02:00
},
getSettings : function() {
calledFlagGetSettings = true;
},
saveSettings : function(settings) {
2016-10-10 14:27:43 +02:00
settings.should.be.true();
},
getSessions : function() {
calledFlagGetSessions = true;
},
saveSessions : function(sessions) {
2016-10-10 14:27:43 +02:00
sessions.should.be.true();
},
2014-07-23 16:15:20 +02:00
getAllFlows : function() {
calledFlagGetAllFlows = true;
},
getFlow : function(fn) {
fn.should.equal("name");
2014-07-23 16:15:20 +02:00
},
saveFlow : function(fn, data) {
fn.should.equal("name");
2016-10-10 14:27:43 +02:00
data.should.be.true();
2014-07-23 16:15:20 +02:00
},
getLibraryEntry : function(type, path) {
2016-10-10 14:27:43 +02:00
type.should.be.true();
path.should.equal("name");
2014-07-23 16:15:20 +02:00
},
saveLibraryEntry : function(type, path, meta, body) {
2016-10-10 14:27:43 +02:00
type.should.be.true();
path.should.equal("name");
2016-10-10 14:27:43 +02:00
meta.should.be.true();
body.should.be.true();
2014-07-23 16:15:20 +02:00
}
};
2014-07-23 16:15:20 +02:00
var moduleToLoad = {
settings: {
storageModule : interfaceCheckerModule
}
2014-07-23 16:15:20 +02:00
};
2016-10-10 14:27:43 +02:00
var promises = [];
2014-07-23 16:15:20 +02:00
storage.init(moduleToLoad);
2016-10-10 14:27:43 +02:00
promises.push(storage.getFlows());
promises.push(storage.saveFlows({flows:[],credentials:{}}));
storage.getSettings();
storage.saveSettings(true);
storage.getSessions();
storage.saveSessions(true);
2014-07-23 16:15:20 +02:00
storage.getAllFlows();
storage.getFlow("name");
storage.saveFlow("name", true);
storage.getLibraryEntry(true, "name");
storage.saveLibraryEntry(true, "name", true, true);
2020-11-30 15:38:48 +01:00
Promise.all(promises).then(function() {
2016-10-10 14:27:43 +02:00
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) {
2016-10-10 14:27:43 +02:00
settings.should.be.an.Object();
},
getLibraryEntry : function(type, path) {
if (type === "flows") {
2017-03-06 16:28:23 +01:00
if (path === "/" || path === "\\") {
2020-11-30 15:38:48 +01:00
return Promise.resolve(["a",{fn:"test.json"}]);
2017-03-06 16:28:23 +01:00
} else if (path == "/a" || path == "\\a") {
2020-11-30 15:38:48 +01:00
return Promise.resolve([{fn:"test2.json"}]);
2017-03-06 16:28:23 +01:00
} else if (path == paff.join("","a","test2.json")) {
2020-11-30 15:38:48 +01:00
return Promise.resolve("test content");
}
}
},
saveLibraryEntry : function(type, path, meta, body) {
saveType = type;
savePath = path;
saveContent = body;
saveMeta = meta;
2020-11-30 15:38:48 +01:00
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) {
2017-03-06 16:28:23 +01:00
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) {
2017-03-06 16:28:23 +01:00
storage.saveFlow(paff.join("a","test2.json"),"new content").then(function(res) {
try {
2017-03-06 16:28:23 +01:00
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();
});
});
2014-07-23 16:15:20 +02:00
});
});