redis-mock
Version:
Redis client mock object for unit testing
269 lines (212 loc) • 5.31 kB
JavaScript
const helpers = require('../helpers');
const patternToRegex = require('../helpers').patternToRegex;
/**
* Del
*/
exports.del = function (keys, callback) {
if (!(keys instanceof Array)) {
keys = [keys];
}
let keysDeleted = 0;
for (let i = 0; i < keys.length; i++) {
if (keys[i] in this.storage) {
delete this.storage[keys[i]];
keysDeleted++;
}
}
helpers.callCallback(callback, null, keysDeleted);
};
/**
* Exists
*/
exports.exists = function (keys, callback) {
if (!(keys instanceof Array)) {
keys = [keys];
}
let result = 0;
for (let i = 0; i < keys.length; i++) {
if( keys[i] in this.storage) {
result++;
}
}
helpers.callCallback(callback, null, result);
};
exports.type = function(key, callback) {
const type = key in this.storage
? this.storage[key].type
: "none";
helpers.callCallback(callback, null, type);
};
/**
* Expire
*/
exports.expire = function (key, seconds, callback) {
let result = 0;
const obj = this.storage[key];
if (obj) {
var now = new Date().getTime();
var milli = Math.min(seconds*1000, Math.pow(2, 31) - 1);
if (this.storage[key]._expire) {
clearTimeout(this.storage[key]._expire);
}
this.storage[key].expires = new Date(now + milli);
var _expire = setTimeout(() => {
delete this.storage[key];
}, milli);
if (_expire.unref) {
_expire.unref();
}
this.storage[key]._expire = _expire;
result = 1;
}
helpers.callCallback(callback, null, result);
};
exports.pexpire = function (key, ms, callback) {
const computedSeconds = ms > 0 ? ms/1000 : ms;
return this.expire(key, computedSeconds, (err, seconds) => {
helpers.callCallback(callback, err, seconds);
});
};
/**
* Expireat
*/
exports.expireat = function (key, timestamp, callback) {
var result = 0;
var obj = this.storage[key];
if (obj) {
var milli = timestamp * 1000;
if (this.storage[key]._expire) {
clearTimeout((...args) => this.storage[key]._expire(...args));
}
this.storage[key].expires = new Date(milli);
var _expire = setTimeout(() => {
delete this.storage[key];
}, milli - Date.now());
if (_expire.unref) {
_expire.unref();
}
this.storage[key]._expire = _expire;
result = 1;
}
helpers.callCallback(callback, null, result);
};
exports.pexpireat = function (key, timestamp, callback) {
return this.expireat(key, timestamp / 1000, (err, result) => {
helpers.callCallback(callback, err, result);
});
};
/**
* TTL
* http://redis.io/commands/ttl
*/
exports.ttl = function (key, callback) {
var result = 0;
var obj = this.storage[key];
if (obj) {
var now = new Date().getTime();
var expires = this.storage[key].expires instanceof Date ? this.storage[key].expires.getTime() : -1;
var seconds = (expires - now) / 1000;
if (seconds > 0) {
result = seconds;
} else {
result = -1;
}
} else {
result = -2;
}
helpers.callCallback(callback, null, result);
};
exports.pttl = function (key, callback) {
return this.ttl(key, (err, ttl) => {
const computedTtl = ttl > 0 ? ttl * 1000 : ttl;
helpers.callCallback(callback, err, computedTtl);
});
};
/**
* PERSIST
* http://redis.io/commands/persist
*/
exports.persist = function (key, callback) {
var result = 0;
var obj = this.storage[key];
if (obj && obj.expires && obj.expires >= 0) {
clearTimeout(obj._expire);
delete obj.expires;
result = 1;
}
helpers.callCallback(callback, null, result);
};
/**
* Keys
*/
exports.keys = function (pattern, callback) {
var regex = patternToRegex(pattern);
var keys = [];
for (var key in this.storage) {
if (regex.test(key)) {
keys.push(key);
}
}
helpers.callCallback(callback, null, keys);
};
exports.scan = function (index, pattern, count, callback) {
const regex = patternToRegex(pattern || '*');
const keys = [];
let idx = 1;
let resIdx = 0;
count = count || 10;
for (const key in this.storage) {
if (idx >= index && regex.test(key)) {
keys.push(key);
count--;
if(count === 0) {
resIdx = idx+1;
break;
}
}
idx++;
}
helpers.callCallback(callback, null, [resIdx.toString(), keys]);
};
/**
* Rename
* http://redis.io/commands/rename
*/
exports.rename = function (key, newKey, callback) {
var err = null;
if (key in this.storage) {
this.storage[newKey] = this.storage[key];
delete this.storage[key];
} else {
err = new Error("ERR no such key");
}
helpers.callCallback(callback, err, "OK");
};
/**
* Renamenx
* http://redis.io/commands/renamenx
*/
exports.renamenx = function (key, newKey, callback) {
var err = null;
var result;
if (key in this.storage) {
if (newKey in this.storage) {
result = 0;
} else {
this.storage[newKey] = this.storage[key];
delete this.storage[key];
result = 1;
}
} else {
err = new Error("ERR no such key");
}
helpers.callCallback(callback, err, result);
};
/**
* Dbsize
* http://redis.io/commands/dbsize
*/
exports.dbsize = function(callback) {
var size = Object.keys(this.storage).length || 0;
helpers.callCallback(callback, null, size);
};