cache-service-shared-tests.ts 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import { CacheService } from '@vendure/core';
  2. import { expect } from 'vitest';
  3. import { TestingCacheTtlProvider } from '../../src/cache/cache-ttl-provider';
  4. export async function getReturnsUndefinedForNonExistentKey(cacheService: CacheService) {
  5. const result = await cacheService.get('non-existent-key');
  6. expect(result).toBeUndefined();
  7. }
  8. export async function setsAKey(cacheService: CacheService) {
  9. await cacheService.set('test-key', 'test-value');
  10. const result = await cacheService.get('test-key');
  11. expect(result).toBe('test-value');
  12. }
  13. export async function setsObjectValue(cacheService: CacheService) {
  14. const obj = { name: 'test', value: 42 };
  15. await cacheService.set('test-key', obj);
  16. const result = await cacheService.get('test-key');
  17. expect(result).toEqual(obj);
  18. }
  19. export async function setsArrayValue(cacheService: CacheService) {
  20. const arr = [1, 2, 3, 4, 5];
  21. await cacheService.set('test-key', arr);
  22. const result = await cacheService.get('test-key');
  23. expect(result).toEqual(arr);
  24. }
  25. export async function setsArrayOfObjects(cacheService: CacheService) {
  26. const arr = [
  27. { name: 'test1', value: 42 },
  28. { name: 'test2', value: 43 },
  29. ];
  30. await cacheService.set('test-key', arr);
  31. const result = await cacheService.get('test-key');
  32. expect(result).toEqual(arr);
  33. }
  34. export async function deletesAKey(cacheService: CacheService) {
  35. await cacheService.set('test-key', 'test-value');
  36. await cacheService.delete('test-key');
  37. const result = await cacheService.get('test-key');
  38. expect(result).toBeUndefined();
  39. }
  40. export async function setsAKeyWithTtl(cacheService: CacheService, ttlProvider: TestingCacheTtlProvider) {
  41. ttlProvider.setTime(new Date().getTime());
  42. await cacheService.set('test-key', 'test-value', { ttl: 1000 });
  43. const result = await cacheService.get('test-key');
  44. expect(result).toBe('test-value');
  45. ttlProvider.incrementTime(2000);
  46. const result2 = await cacheService.get('test-key');
  47. expect(result2).toBeUndefined();
  48. }
  49. export async function evictsTheOldestKeyWhenCacheIsFull(cacheService: CacheService) {
  50. await cacheService.set('key1', 'value1');
  51. await cacheService.set('key2', 'value2');
  52. await cacheService.set('key3', 'value3');
  53. await cacheService.set('key4', 'value4');
  54. await cacheService.set('key5', 'value5');
  55. const result1 = await cacheService.get('key1');
  56. expect(result1).toBe('value1');
  57. await cacheService.set('key6', 'value6');
  58. const result2 = await cacheService.get('key1');
  59. expect(result2).toBeUndefined();
  60. }
  61. export async function invalidatesBySingleTag(cacheService: CacheService) {
  62. await cacheService.set('taggedKey1.1', 'value1', { tags: ['tag1.1'] });
  63. await cacheService.set('taggedKey1.2', 'value2', { tags: ['tag1.2'] });
  64. expect(await cacheService.get('taggedKey1.1')).toBe('value1');
  65. expect(await cacheService.get('taggedKey1.2')).toBe('value2');
  66. await cacheService.invalidateTags(['tag1.1']);
  67. expect(await cacheService.get('taggedKey1.1')).toBeUndefined();
  68. expect(await cacheService.get('taggedKey1.2')).toBe('value2');
  69. }
  70. export async function invalidatesByMultipleTags(cacheService: CacheService) {
  71. await cacheService.set('taggedKey2.1', 'value1', { tags: ['tag2.1'] });
  72. await cacheService.set('taggedKey2.2', 'value2', { tags: ['tag2.2'] });
  73. expect(await cacheService.get('taggedKey2.1')).toBe('value1');
  74. expect(await cacheService.get('taggedKey2.2')).toBe('value2');
  75. await cacheService.invalidateTags(['tag2.1', 'tag2.2']);
  76. expect(await cacheService.get('taggedKey2.1')).toBeUndefined();
  77. expect(await cacheService.get('taggedKey2.2')).toBeUndefined();
  78. }
  79. export async function invalidatesManyByMultipleTags(cacheService: CacheService) {
  80. await cacheService.set('taggedKey3.1', 'data', { tags: ['tag3.1', 'tag3.4'] });
  81. await cacheService.set('taggedKey3.2', 'data', { tags: ['tag3.2', 'tag3.1'] });
  82. await cacheService.set('taggedKey3.3', 'data', { tags: ['tag3.4'] });
  83. await cacheService.set('taggedKey3.4', 'data', { tags: ['tag3.1'] });
  84. await cacheService.set('taggedKey3.5', 'data', { tags: ['tag3.2'] });
  85. await cacheService.invalidateTags(['tag3.2', 'tag3.4']);
  86. expect(await cacheService.get('taggedKey3.1')).toBeUndefined();
  87. expect(await cacheService.get('taggedKey3.2')).toBeUndefined();
  88. expect(await cacheService.get('taggedKey3.3')).toBeUndefined();
  89. expect(await cacheService.get('taggedKey3.4')).toBe('data');
  90. expect(await cacheService.get('taggedKey3.5')).toBeUndefined();
  91. }
  92. export async function invalidatesALargeNumberOfKeysByTag(cacheService: CacheService) {
  93. for (let i = 0; i < 100; i++) {
  94. await cacheService.set(`taggedKey${i}`, `value${i}`, { tags: ['tag'] });
  95. }
  96. await cacheService.invalidateTags(['tag']);
  97. for (let i = 0; i < 100; i++) {
  98. expect(await cacheService.get(`taggedKey${i}`)).toBeUndefined();
  99. }
  100. }