lru-memoizer.queumaxage.test.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. var memoizer = require('./..');
  2. var assert = require('chai').assert;
  3. describe('lru-memoizer (queueMaxAge)', function () {
  4. var loadTimes = 0, memoized;
  5. beforeEach(function () {
  6. loadTimes = 0;
  7. });
  8. function observer() {
  9. const listeners = [];
  10. return {
  11. listen(listener) {
  12. listeners.push(listener);
  13. },
  14. trigger() {
  15. listeners.forEach(listener => listener());
  16. }
  17. }
  18. }
  19. it('should create a new queue once expired', function (done) {
  20. memoized = memoizer({
  21. load: function (a, b, onResolve, callback) {
  22. loadTimes++;
  23. onResolve(() => callback(null, a + b));
  24. },
  25. queueMaxAge: 10,
  26. hash: function (a, b) {
  27. return a + '-' + b;
  28. }
  29. });
  30. const observer1 = observer();
  31. const observer2 = observer();
  32. const observer3 = observer();
  33. const resolved = [];
  34. memoized(1, 2, observer1.listen, function (err, result) {
  35. assert.isNull(err);
  36. assert.strictEqual(result, 3);
  37. resolved.push('A');
  38. });
  39. assert.strictEqual(loadTimes, 1);
  40. memoized(1, 2, assert.fail, function (err, result) {
  41. assert.isNull(err);
  42. assert.strictEqual(result, 3);
  43. resolved.push('B');
  44. });
  45. assert.strictEqual(loadTimes, 1);
  46. setTimeout(() => {
  47. // previous queue expired, this calls will be added to a new queue.
  48. memoized(1, 2, observer2.listen, function (err, result) {
  49. assert.isNull(err);
  50. assert.strictEqual(result, 3);
  51. resolved.push('C');
  52. });
  53. memoized(1, 2, assert.fail, function (err, result) {
  54. assert.isNull(err);
  55. assert.strictEqual(result, 3);
  56. resolved.push('D');
  57. });
  58. // only one new invocation to load
  59. assert.strictEqual(loadTimes, 2);
  60. setTimeout(() => {
  61. // second queue expired, this calls will be added to a third queue.
  62. memoized(1, 2, observer3.listen, function (err, result) {
  63. assert.isNull(err);
  64. assert.strictEqual(result, 3);
  65. resolved.push('E');
  66. });
  67. memoized(1, 2, assert.fail.listen, function (err, result) {
  68. assert.isNull(err);
  69. assert.strictEqual(result, 3);
  70. resolved.push('F');
  71. });
  72. assert.strictEqual(loadTimes, 3);
  73. observer1.trigger();
  74. setImmediate(() => {
  75. // first queue was resolved
  76. assert.deepEqual(['A', 'B'], resolved);
  77. observer3.trigger();
  78. setImmediate(() => {
  79. // third queue was resolved
  80. assert.deepEqual(['A', 'B', 'E', 'F'], resolved);
  81. observer2.trigger();
  82. setImmediate(() => {
  83. // second queue was resolved
  84. assert.deepEqual(['A', 'B', 'E', 'F', 'C', 'D'], resolved);
  85. done();
  86. });
  87. });
  88. });
  89. }, 100);
  90. }, 100);
  91. });
  92. });