'use strict'; var bdd = require('../helpers/bdd-if'); var should = require('should'); var helpers = require('./_helpers'); var Promise = require('bluebird'); module.exports = function(dataSourceFactory, connectorCapabilities) { // While we support millisecond precision, for the purpose of tests // it's better to use intervals at least 10ms long. var ttlPrecision = connectorCapabilities.ttlPrecision || 10; var canExpire = connectorCapabilities.canExpire !== false; bdd.describeIf(canExpire, 'expire', function() { var CacheItem; beforeEach(setupCacheItem); it('sets key ttl - Callback API', function(done) { CacheItem.set('a-key', 'a-value', function(err) { if (err) return done(err); CacheItem.expire('a-key', ttlPrecision, function(err) { if (err) return done(err); setTimeout(function() { CacheItem.get('a-key', function(err, value) { if (err) return done(err); should.equal(value, null); done(); }); }, 2 * ttlPrecision); }); }); }); it('sets key ttl - Promise API', function() { return CacheItem.set('a-key', 'a-value') .then(function() { return CacheItem.expire('a-key', ttlPrecision); }) .delay(2 * ttlPrecision) .then(function() { return CacheItem.get('a-key'); }) .then(function(value) { should.equal(value, null); }); }); it('returns error when expiring a key that has expired', function() { return Promise.resolve(CacheItem.set('expired-key', 'a-value', ttlPrecision)) .delay(2 * ttlPrecision) .then(function() { return CacheItem.expire('expired-key', 1000); }) .then( function() { throw new Error('expire() should have failed'); }, function(err) { err.message.should.match(/expired-key/); err.should.have.property('statusCode', 404); } ); }); it('returns error when key does not exist', function() { return CacheItem.expire('key-does-not-exist', ttlPrecision).then( function() { throw new Error('expire() should have failed'); }, function(err) { err.message.should.match(/key-does-not-exist/); err.should.have.property('statusCode', 404); } ); }); function setupCacheItem() { return helpers.givenCacheItem(dataSourceFactory) .then(ModelCtor => CacheItem = ModelCtor); }; }); };