mirror of
				https://github.com/node-red/node-red.git
				synced 2025-03-01 10:36:34 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			272 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			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();
 | |
|             });
 | |
|         });
 | |
|     });
 | |
| 
 | |
| });
 |