loopback-datasource-juggler/test/kvao/iterate-keys.suite.js

70 lines
2.1 KiB
JavaScript
Raw Normal View History

2019-05-08 15:45:37 +00:00
// Copyright IBM Corp. 2016,2018. All Rights Reserved.
// Node module: loopback-datasource-juggler
// This file is licensed under the MIT License.
// License text available at https://opensource.org/licenses/MIT
'use strict';
2018-12-07 14:54:29 +00:00
const asyncIterators = require('async-iterators');
const bdd = require('../helpers/bdd-if');
const helpers = require('./_helpers');
const should = require('should');
module.exports = function(dataSourceFactory, connectorCapabilities) {
2018-12-07 14:54:29 +00:00
const canIterateKeys = connectorCapabilities.canIterateKeys !== false;
bdd.describeIf(canIterateKeys, 'iterateKeys', function() {
2018-12-07 14:54:29 +00:00
let CacheItem;
beforeEach(setupCacheItem);
it('returns AsyncIterator covering all keys', function() {
return helpers.givenKeys(CacheItem, ['key1', 'key2'])
.then(function() {
2018-12-07 14:54:29 +00:00
const it = CacheItem.iterateKeys();
should(it).have.property('next');
return toArray(it);
})
.then(function(keys) {
keys.sort();
should(keys).eql(['key1', 'key2']);
});
});
it('returns AsyncIterator supporting Promises', function() {
2018-12-07 14:54:29 +00:00
let iterator;
return helpers.givenKeys(CacheItem, ['key'])
.then(function() {
iterator = CacheItem.iterateKeys();
return iterator.next();
})
.then(function(key) {
should(key).equal('key');
return iterator.next();
})
.then(function(key) {
// Note: AsyncIterator contract requires `undefined` to signal
// the end of the sequence. Other false-y values like `null`
// don't work.
should(key).equal(undefined);
});
});
function setupCacheItem() {
return helpers.givenCacheItem(dataSourceFactory)
.then(ModelCtor => CacheItem = ModelCtor);
}
});
};
// A promisified version of asyncIterators.toArray
// Node.js 8.x does not have util.promisify function,
// we are adding promise support manually here
function toArray(iter) {
return new Promise((resolve, reject) => {
asyncIterators.toArray(iter, (err, result) => {
if (err) reject(err);
else resolve(result);
});
});
}