mirror of
https://github.com/node-red/node-red.git
synced 2023-10-10 13:36:53 +02:00
Add tests for pluggable library
This commit is contained in:
parent
6f9e06e78d
commit
b41c7962c2
@ -28,43 +28,15 @@ let runtimeLibraries = [];
|
|||||||
// Libraries defined by the user in the editor.
|
// Libraries defined by the user in the editor.
|
||||||
let userLibraries = [];
|
let userLibraries = [];
|
||||||
|
|
||||||
function init(runtime) {
|
let runtime;
|
||||||
|
|
||||||
events.on("registry:plugin-added", function(id) {
|
function init(_runtime) {
|
||||||
const plugin = runtime.plugins.getPlugin(id);
|
runtime = _runtime;
|
||||||
if (plugin.type === "node-red-library-source") {
|
events.removeListener("registry:plugin-added",onPluginAdded);
|
||||||
libraryPlugins[plugin.id] = plugin;
|
events.on("registry:plugin-added",onPluginAdded);
|
||||||
|
|
||||||
runtimeLibraries.forEach(library => {
|
|
||||||
if (library.type === id) {
|
|
||||||
library.local = false;
|
|
||||||
|
|
||||||
if (!/^[a-z0-9-_]+$/.test(library.id)) {
|
|
||||||
log.warn(log._("library.failedToInit",{error:log._("library.invalidProperty",{prop:"id",value:library.id})}));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
libraries[library.id] = new plugin.class(library)
|
|
||||||
libraryConfigs[library.id] = library;
|
|
||||||
libraryConfigs[library.id].type = id;
|
|
||||||
if (libraries[library.id].init) {
|
|
||||||
libraries[library.id].init().catch(err => {
|
|
||||||
delete libraries[library.id];
|
|
||||||
delete libraryConfigs[library.id];
|
|
||||||
log.warn(log._("library.failedToInit",{library:library.id, error:err.toString()}));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} catch(err) {
|
|
||||||
log.warn(log._("library.failedToInit",{library:library.id, error:err.toString()}));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
knownTypes.flows = 'node-red';
|
knownTypes.flows = 'node-red';
|
||||||
|
|
||||||
libraries["local"] = require("./local");
|
libraries["local"] = require("./local");
|
||||||
libraries["local"].init(runtime);
|
libraries["local"].init(runtime);
|
||||||
libraryConfigs["local"] = libraries["local"]
|
libraryConfigs["local"] = libraries["local"]
|
||||||
@ -83,6 +55,41 @@ function init(runtime) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function onPluginAdded(id) {
|
||||||
|
const plugin = runtime.plugins.getPlugin(id);
|
||||||
|
if (plugin.type === "node-red-library-source") {
|
||||||
|
libraryPlugins[plugin.id] = plugin;
|
||||||
|
|
||||||
|
runtimeLibraries.forEach(library => {
|
||||||
|
if (library.type === id) {
|
||||||
|
library.local = false;
|
||||||
|
|
||||||
|
if (!/^[a-z0-9-_]+$/.test(library.id)) {
|
||||||
|
log.warn(log._("library.failedToInit",{error:log._("library.invalidProperty",{prop:"id",value:library.id})}));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
libraries[library.id] = new plugin.class(library)
|
||||||
|
libraryConfigs[library.id] = library;
|
||||||
|
libraryConfigs[library.id].type = id;
|
||||||
|
if (libraries[library.id].init) {
|
||||||
|
libraries[library.id].init().catch(err => {
|
||||||
|
delete libraries[library.id];
|
||||||
|
delete libraryConfigs[library.id];
|
||||||
|
log.warn(log._("library.failedToInit",{library:library.id, error:err.toString()}));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} catch(err) {
|
||||||
|
log.warn(log._("library.failedToInit",{library:library.id, error:err.toString()}));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
function registerType(id,type) {
|
function registerType(id,type) {
|
||||||
// TODO: would like to enforce this, but currently the tests register the same type multiple
|
// TODO: would like to enforce this, but currently the tests register the same type multiple
|
||||||
// times and have no way to remove themselves.
|
// times and have no way to remove themselves.
|
||||||
|
@ -44,6 +44,11 @@ describe("runtime-api/settings", function() {
|
|||||||
paletteCategories :["red","blue","green"],
|
paletteCategories :["red","blue","green"],
|
||||||
exportNodeSettings: (obj) => {
|
exportNodeSettings: (obj) => {
|
||||||
obj.testNodeSetting = "helloWorld";
|
obj.testNodeSetting = "helloWorld";
|
||||||
|
},
|
||||||
|
},
|
||||||
|
plugins: {
|
||||||
|
exportPluginSettings: (obj) => {
|
||||||
|
obj.testPluginSettings = "helloPluginWorld";
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
nodes: {
|
nodes: {
|
||||||
@ -51,13 +56,16 @@ describe("runtime-api/settings", function() {
|
|||||||
installerEnabled: () => false,
|
installerEnabled: () => false,
|
||||||
getCredentialKeyType: () => "test-key-type"
|
getCredentialKeyType: () => "test-key-type"
|
||||||
},
|
},
|
||||||
|
library: {getLibraries: () => ["lib1"] },
|
||||||
storage: {}
|
storage: {}
|
||||||
})
|
})
|
||||||
return settings.getRuntimeSettings({}).then(result => {
|
return settings.getRuntimeSettings({}).then(result => {
|
||||||
result.should.have.property("httpNodeRoot","testHttpNodeRoot");
|
result.should.have.property("httpNodeRoot","testHttpNodeRoot");
|
||||||
result.should.have.property("version","testVersion");
|
result.should.have.property("version","testVersion");
|
||||||
result.should.have.property("paletteCategories",["red","blue","green"]);
|
result.should.have.property("paletteCategories",["red","blue","green"]);
|
||||||
|
result.should.have.property("libraries",["lib1"]);
|
||||||
result.should.have.property("testNodeSetting","helloWorld");
|
result.should.have.property("testNodeSetting","helloWorld");
|
||||||
|
result.should.have.property("testPluginSettings","helloPluginWorld");
|
||||||
result.should.not.have.property("foo",123);
|
result.should.not.have.property("foo",123);
|
||||||
result.should.have.property("flowEncryptionType","test-key-type");
|
result.should.have.property("flowEncryptionType","test-key-type");
|
||||||
result.should.not.have.property("user");
|
result.should.not.have.property("user");
|
||||||
@ -75,6 +83,11 @@ describe("runtime-api/settings", function() {
|
|||||||
paletteCategories :["red","blue","green"],
|
paletteCategories :["red","blue","green"],
|
||||||
exportNodeSettings: (obj) => {
|
exportNodeSettings: (obj) => {
|
||||||
obj.testNodeSetting = "helloWorld";
|
obj.testNodeSetting = "helloWorld";
|
||||||
|
},
|
||||||
|
},
|
||||||
|
plugins: {
|
||||||
|
exportPluginSettings: (obj) => {
|
||||||
|
obj.testPluginSettings = "helloPluginWorld";
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
nodes: {
|
nodes: {
|
||||||
@ -82,6 +95,7 @@ describe("runtime-api/settings", function() {
|
|||||||
installerEnabled: () => false,
|
installerEnabled: () => false,
|
||||||
getCredentialKeyType: () => "test-key-type"
|
getCredentialKeyType: () => "test-key-type"
|
||||||
},
|
},
|
||||||
|
library: {getLibraries: () => { ["lib1"]} },
|
||||||
storage: {}
|
storage: {}
|
||||||
})
|
})
|
||||||
return settings.getRuntimeSettings({
|
return settings.getRuntimeSettings({
|
||||||
@ -111,6 +125,11 @@ describe("runtime-api/settings", function() {
|
|||||||
paletteCategories :["red","blue","green"],
|
paletteCategories :["red","blue","green"],
|
||||||
exportNodeSettings: (obj) => {
|
exportNodeSettings: (obj) => {
|
||||||
obj.testNodeSetting = "helloWorld";
|
obj.testNodeSetting = "helloWorld";
|
||||||
|
},
|
||||||
|
},
|
||||||
|
plugins: {
|
||||||
|
exportPluginSettings: (obj) => {
|
||||||
|
obj.testPluginSettings = "helloPluginWorld";
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
nodes: {
|
nodes: {
|
||||||
@ -118,6 +137,7 @@ describe("runtime-api/settings", function() {
|
|||||||
installerEnabled: () => false,
|
installerEnabled: () => false,
|
||||||
getCredentialKeyType: () => "test-key-type"
|
getCredentialKeyType: () => "test-key-type"
|
||||||
},
|
},
|
||||||
|
library: {getLibraries: () => { ["lib1"]} },
|
||||||
storage: {
|
storage: {
|
||||||
projects: {
|
projects: {
|
||||||
getActiveProject: () => 'test-active-project',
|
getActiveProject: () => 'test-active-project',
|
||||||
@ -162,6 +182,11 @@ describe("runtime-api/settings", function() {
|
|||||||
paletteCategories :["red","blue","green"],
|
paletteCategories :["red","blue","green"],
|
||||||
exportNodeSettings: (obj) => {
|
exportNodeSettings: (obj) => {
|
||||||
obj.testNodeSetting = "helloWorld";
|
obj.testNodeSetting = "helloWorld";
|
||||||
|
},
|
||||||
|
},
|
||||||
|
plugins: {
|
||||||
|
exportPluginSettings: (obj) => {
|
||||||
|
obj.testPluginSettings = "helloPluginWorld";
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
nodes: {
|
nodes: {
|
||||||
@ -169,6 +194,7 @@ describe("runtime-api/settings", function() {
|
|||||||
installerEnabled: () => false,
|
installerEnabled: () => false,
|
||||||
getCredentialKeyType: () => "test-key-type"
|
getCredentialKeyType: () => "test-key-type"
|
||||||
},
|
},
|
||||||
|
library: {getLibraries: () => { ["lib1"]} },
|
||||||
storage: {
|
storage: {
|
||||||
projects: {
|
projects: {
|
||||||
getActiveProject: () => 'test-active-project',
|
getActiveProject: () => 'test-active-project',
|
||||||
@ -203,6 +229,11 @@ describe("runtime-api/settings", function() {
|
|||||||
paletteCategories :["red","blue","green"],
|
paletteCategories :["red","blue","green"],
|
||||||
exportNodeSettings: (obj) => {
|
exportNodeSettings: (obj) => {
|
||||||
obj.testNodeSetting = "helloWorld";
|
obj.testNodeSetting = "helloWorld";
|
||||||
|
},
|
||||||
|
},
|
||||||
|
plugins: {
|
||||||
|
exportPluginSettings: (obj) => {
|
||||||
|
obj.testPluginSettings = "helloPluginWorld";
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
nodes: {
|
nodes: {
|
||||||
@ -210,6 +241,7 @@ describe("runtime-api/settings", function() {
|
|||||||
installerEnabled: () => false,
|
installerEnabled: () => false,
|
||||||
getCredentialKeyType: () => "test-key-type"
|
getCredentialKeyType: () => "test-key-type"
|
||||||
},
|
},
|
||||||
|
library: {getLibraries: () => { ["lib1"]} },
|
||||||
storage: {
|
storage: {
|
||||||
projects: {
|
projects: {
|
||||||
flowFileExists: () => true,
|
flowFileExists: () => true,
|
||||||
@ -248,6 +280,11 @@ describe("runtime-api/settings", function() {
|
|||||||
paletteCategories :["red","blue","green"],
|
paletteCategories :["red","blue","green"],
|
||||||
exportNodeSettings: (obj) => {
|
exportNodeSettings: (obj) => {
|
||||||
obj.testNodeSetting = "helloWorld";
|
obj.testNodeSetting = "helloWorld";
|
||||||
|
},
|
||||||
|
},
|
||||||
|
plugins: {
|
||||||
|
exportPluginSettings: (obj) => {
|
||||||
|
obj.testPluginSettings = "helloPluginWorld";
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
nodes: {
|
nodes: {
|
||||||
@ -255,6 +292,7 @@ describe("runtime-api/settings", function() {
|
|||||||
installerEnabled: () => false,
|
installerEnabled: () => false,
|
||||||
getCredentialKeyType: () => "test-key-type"
|
getCredentialKeyType: () => "test-key-type"
|
||||||
},
|
},
|
||||||
|
library: {getLibraries: () => { ["lib1"]} },
|
||||||
storage: {
|
storage: {
|
||||||
projects: {
|
projects: {
|
||||||
flowFileExists: () => false,
|
flowFileExists: () => false,
|
||||||
|
@ -14,13 +14,14 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
**/
|
**/
|
||||||
|
|
||||||
var should = require("should");
|
const should = require("should");
|
||||||
var sinon = require("sinon");
|
const sinon = require("sinon");
|
||||||
|
|
||||||
var NR_TEST_UTILS = require("nr-test-utils");
|
const NR_TEST_UTILS = require("nr-test-utils");
|
||||||
var library = NR_TEST_UTILS.require("@node-red/runtime/lib/library/index")
|
const library = NR_TEST_UTILS.require("@node-red/runtime/lib/library/index")
|
||||||
var localLibrary = NR_TEST_UTILS.require("@node-red/runtime/lib/library/local")
|
const localLibrary = NR_TEST_UTILS.require("@node-red/runtime/lib/library/local")
|
||||||
var examplesLibrary = NR_TEST_UTILS.require("@node-red/runtime/lib/library/examples")
|
const examplesLibrary = NR_TEST_UTILS.require("@node-red/runtime/lib/library/examples")
|
||||||
|
const events = NR_TEST_UTILS.require("@node-red/util/lib/events")
|
||||||
|
|
||||||
var mockLog = {
|
var mockLog = {
|
||||||
log: sinon.stub(),
|
log: sinon.stub(),
|
||||||
@ -72,6 +73,59 @@ describe("runtime/library", function() {
|
|||||||
// should(()=>{library.register("unknown","/abc")} ).throw();
|
// should(()=>{library.register("unknown","/abc")} ).throw();
|
||||||
// })
|
// })
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe("getLibraries", function() {
|
||||||
|
before(function() {
|
||||||
|
library.init({});
|
||||||
|
});
|
||||||
|
it('returns the default and examples libraries', function() {
|
||||||
|
const libs = library.getLibraries();
|
||||||
|
libs.should.have.length(2);
|
||||||
|
libs[0].should.have.property('id', 'local');
|
||||||
|
libs[0].should.have.property('label','editor:library.types.local');
|
||||||
|
libs[0].should.have.property("user", false);
|
||||||
|
libs[0].should.have.property('icon', 'font-awesome/fa-hdd-o');
|
||||||
|
|
||||||
|
libs[1].should.have.property('id', 'examples');
|
||||||
|
libs[1].should.have.property('label','editor:library.types.examples');
|
||||||
|
libs[1].should.have.property("user", false);
|
||||||
|
libs[1].should.have.property('icon', 'font-awesome/fa-life-ring');
|
||||||
|
libs[1].should.have.property('readOnly', true);
|
||||||
|
libs[1].should.have.property('types', ['flows']);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns the libraries from settings', function() {
|
||||||
|
library.init({
|
||||||
|
plugins: {
|
||||||
|
getPlugin: id => { return {
|
||||||
|
id: "test-library-plugin",
|
||||||
|
type: "node-red-library-source",
|
||||||
|
class: function() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
settings: {
|
||||||
|
editorTheme: {
|
||||||
|
library: {
|
||||||
|
sources: [
|
||||||
|
{id: "test-plugin-id", type:"test-library-plugin"}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
let libs = library.getLibraries();
|
||||||
|
libs.should.have.length(2);
|
||||||
|
|
||||||
|
events.emit("registry:plugin-added","test-library-plugin" )
|
||||||
|
|
||||||
|
libs = library.getLibraries();
|
||||||
|
libs.should.have.length(3);
|
||||||
|
libs[2].should.have.property('id', 'test-plugin-id');
|
||||||
|
libs[2].should.have.property("user", false);
|
||||||
|
});
|
||||||
|
})
|
||||||
|
|
||||||
describe("getEntry", function() {
|
describe("getEntry", function() {
|
||||||
before(function() {
|
before(function() {
|
||||||
library.init({});
|
library.init({});
|
||||||
@ -102,7 +156,7 @@ describe("runtime/library", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it ('returns a flow example entry', function(done) {
|
it ('returns a flow example entry', function(done) {
|
||||||
library.getEntry("_examples_","flows","/test-module/abc").then(function(result) {
|
library.getEntry("examples","flows","/test-module/abc").then(function(result) {
|
||||||
result.should.have.property("library","_examples_")
|
result.should.have.property("library","_examples_")
|
||||||
result.should.have.property("path","/test-module/abc")
|
result.should.have.property("path","/test-module/abc")
|
||||||
done();
|
done();
|
||||||
|
Loading…
Reference in New Issue
Block a user