From bff664192e725c9d75600858d9c520dd6fdad400 Mon Sep 17 00:00:00 2001 From: Bryan Donovan Date: Sun, 15 Jun 2014 10:15:43 -0700 Subject: [PATCH] adding caching.keys() function (issue #6) --- lib/caching.js | 5 +++++ lib/stores/memory.js | 11 +++++++++++ test/caching.unit.js | 42 ++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/lib/caching.js b/lib/caching.js index 9e560db..f410a19 100644 --- a/lib/caching.js +++ b/lib/caching.js @@ -1,3 +1,4 @@ +/*jshint maxcomplexity:10*/ var caching = function (args) { args = args || {}; var self = {}; @@ -61,6 +62,10 @@ var caching = function (args) { self.reset = self.store.reset.bind(self.store); } + if (typeof self.store.keys === 'function') { + self.keys = self.store.keys.bind(self.store); + } + return self; }; diff --git a/lib/stores/memory.js b/lib/stores/memory.js index 351af0d..7d2acd8 100644 --- a/lib/stores/memory.js +++ b/lib/stores/memory.js @@ -39,6 +39,17 @@ var memory_store = function (args) { } }; + self.keys = function (cb) { + var keys = lru_cache.keys(); + if (cb) { + process.nextTick(function () { + cb(null, keys); + }); + } else { + return keys; + } + }; + return self; }; diff --git a/test/caching.unit.js b/test/caching.unit.js index fe7d6d8..a7c1dd1 100644 --- a/test/caching.unit.js +++ b/test/caching.unit.js @@ -1,6 +1,7 @@ // TODO: These are really a mix of unit and integration tests. var assert = require('assert'); +var async = require('async'); var sinon = require('sinon'); var support = require('./support'); var check_err = support.check_err; @@ -132,7 +133,7 @@ describe("caching", function () { }); }); - it("lets us clear the cache without a callback", function (done) { + it("lets us clear the cache without a callback (memory store only)", function (done) { cache.reset(); setTimeout(function () { cache.get(key, function (err, result) { @@ -147,6 +148,43 @@ describe("caching", function () { }); }); + describe("keys()", function () { + var key_count; + var saved_keys = []; + + beforeEach(function (done) { + key_count = 10; + var processed = 0; + + cache = caching({store: 'memory'}); + + function is_done() { + return processed === key_count; + } + + async.until(is_done, function (cb) { + processed += 1; + key = support.random.string(20); + saved_keys.push(key); + value = support.random.string(); + cache.set(key, value, cb); + }, done); + }); + + it("calls back with all keys in cache", function (done) { + cache.keys(function (err, keys) { + check_err(err); + assert.deepEqual(keys.sort, saved_keys.sort); + done(); + }); + }); + + it("lets us get the keys without a callback (memory store only)", function () { + var keys = cache.keys(); + assert.deepEqual(keys.sort, saved_keys.sort); + }); + }); + describe("wrap()", function () { describe("using memory (lru-cache) store", function () { var memory_store_stub; @@ -166,7 +204,7 @@ describe("caching", function () { memory_store.create.restore(); }); - it("calls back with the result of a function", function (done) { + it("calls back with the result of the wrapped function", function (done) { cache.wrap(key, function (cb) { methods.get_widget(name, cb); }, function (err, widget) {