text: /**
   * 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 sinon = require("sinon");
  
  var NR_TEST_UTILS = require("nr-test-utils");
  var context = NR_TEST_UTILS.require("@node-red/runtime/lib/api/context")
  
  var mockLog = () => ({
      log: sinon.stub(),
      debug: sinon.stub(),
      trace: sinon.stub(),
      warn: sinon.stub(),
      info: sinon.stub(),
      metric: sinon.stub(),
      audit: sinon.stub(),
      _: function() { return "abc"}
  })
  
  var mockContext = function(contents) {
      return {
          get: function(key,store,callback) {
              if (contents.hasOwnProperty(store) && contents[store].hasOwnProperty(key)) {
                  callback(null,contents[store][key]);
              } else {
                  callback(null,undefined);
              }
          },
          keys: function(store,callback) {
              if (contents.hasOwnProperty(store)) {
                  callback(null,Object.keys(contents[store]));
              } else {
                  callback("err store");
              }
          }
      }
  }
  describe("runtime-api/context", function() {
      describe("getValue", function() {
          var contexts = {
              global: mockContext({ default: {abc:111}, file: {abc:222}}),
              flow1: mockContext({ default: {abc:333}, file: {abc:444}})
          }
          var nodeContext = mockContext({ default: {abc:555}, file: {abc:666}})
  
          beforeEach(function() {
              context.init({
                  nodes: {
                      listContextStores: function() {
                          return { default: 'default', stores: [ 'default', 'file' ] }
                      },
                      getContext: function(id) {
                          return contexts[id]
                      },
                      getNode: function(id) {
                          if (id === 'known') {
                              return {
                                  context: function() { return nodeContext }
                              }
                          } else {
                              return null;
                          }
                      }
                  },
                  settings: {
                      functionGlobalContext: {
                          fgc:1234
                      }
                  },
                  log: mockLog()
              })
          });
  
          it('gets global value of default store', function() {
              return context.getValue({
                  scope: 'global',
                  id: undefined,
                  store: undefined, // use default
                  key: 'abc'
              }).then(function(result) {
                  result.should.have.property('msg','111');
                  result.should.have.property('format','number');
              })
          })
          it('gets global value of specified store', function() {
              return context.getValue({
                  scope: 'global',
                  id: undefined,
                  store: 'file',
                  key: 'abc'
              }).then(function(result) {
                  result.should.have.property('msg','222');
                  result.should.have.property('format','number');
              })
          })
          it('gets flow value of default store', function() {
              return context.getValue({
                  scope: 'flow',
                  id: 'flow1',
                  store: undefined, // use default
                  key: 'abc'
              }).then(function(result) {
                  result.should.have.property('msg','333');
                  result.should.have.property('format','number');
              })
          })
          it('gets flow value of specified store', function() {
              return context.getValue({
                  scope: 'flow',
                  id: 'flow1',
                  store: 'file',
                  key: 'abc'
              }).then(function(result) {
                  result.should.have.property('msg','444');
                  result.should.have.property('format','number');
              })
          })
          it('gets node value of default store', function() {
              return context.getValue({
                  scope: 'node',
                  id: 'known',
                  store: undefined, // use default
                  key: 'abc'
              }).then(function(result) {
                  result.should.have.property('msg','555');
                  result.should.have.property('format','number');
              })
          })
          it('gets node value of specified store', function() {
              return context.getValue({
                  scope: 'node',
                  id: 'known',
                  store: 'file',
                  key: 'abc'
              }).then(function(result) {
                  result.should.have.property('msg','666');
                  result.should.have.property('format','number');
              })
          })
  
          it('404s for unknown store', function(done) {
              context.getValue({
                  scope: 'global',
                  id: undefined,
                  store: 'unknown',
                  key: 'abc'
              }).then(function(result) {
                  done("getValue for unknown store should not resolve");
              }).catch(function(err) {
                  err.should.have.property('code','not_found')
                  err.should.have.property('status',404);
                  done();
              })
          })
  
  
          it('gets all global value properties', function() {
              return context.getValue({
                  scope: 'global',
                  id: undefined,
                  store: undefined, // use default
                  key: undefined, //
              }).then(function(result) {
                  result.should.eql({
                      default: { abc: { msg: '111', format: 'number' } },
                      file: { abc: { msg: '222', format: 'number' } }
                  });
              })
          })
          it('gets all flow value properties', function() {
              return context.getValue({
                  scope: 'flow',
                  id: 'flow1',
                  store: undefined, // use default
                  key: undefined, //
              }).then(function(result) {
                  result.should.eql({
                      default: { abc: { msg: '333', format: 'number' } },
                      file: { abc: { msg: '444', format: 'number' } }
                  });
              })
          })
          it('gets all node value properties', function() {
              return context.getValue({
                  scope: 'node',
                  id: 'known',
                  store: undefined, // use default
                  key: undefined, //
              }).then(function(result) {
                  result.should.eql({
                      default: { abc: { msg: '555', format: 'number' } },
                      file: { abc: { msg: '666', format: 'number' } }
                  });
              })
          })
  
      })
  });
  