cache-service-shared-tests.ts 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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 setsAKeyWithSubSecondTtl(
  50. cacheService: CacheService,
  51. ttlProvider: TestingCacheTtlProvider,
  52. ) {
  53. ttlProvider.setTime(new Date().getTime());
  54. await cacheService.set('test-key', 'test-value', { ttl: 900 });
  55. const result = await cacheService.get('test-key');
  56. expect(result).toBe('test-value');
  57. ttlProvider.incrementTime(2000);
  58. const result2 = await cacheService.get('test-key');
  59. expect(result2).toBeUndefined();
  60. }
  61. export async function evictsTheOldestKeyWhenCacheIsFull(cacheService: CacheService) {
  62. await cacheService.set('key1', 'value1');
  63. await new Promise(resolve => setTimeout(resolve, 1));
  64. await cacheService.set('key2', 'value2');
  65. await new Promise(resolve => setTimeout(resolve, 1));
  66. await cacheService.set('key3', 'value3');
  67. await new Promise(resolve => setTimeout(resolve, 1));
  68. await cacheService.set('key4', 'value4');
  69. await new Promise(resolve => setTimeout(resolve, 1));
  70. await cacheService.set('key5', 'value5');
  71. await new Promise(resolve => setTimeout(resolve, 1));
  72. const result1 = await cacheService.get('key1');
  73. expect(result1).toBe('value1');
  74. await cacheService.set('key6', 'value6');
  75. const result2 = await cacheService.get('key1');
  76. expect(result2).toBeUndefined();
  77. }
  78. export async function invalidatesBySingleTag(cacheService: CacheService) {
  79. await cacheService.set('taggedKey1.1', 'value1', { tags: ['tag1.1'] });
  80. await cacheService.set('taggedKey1.2', 'value2', { tags: ['tag1.2'] });
  81. expect(await cacheService.get('taggedKey1.1')).toBe('value1');
  82. expect(await cacheService.get('taggedKey1.2')).toBe('value2');
  83. await cacheService.invalidateTags(['tag1.1']);
  84. expect(await cacheService.get('taggedKey1.1')).toBeUndefined();
  85. expect(await cacheService.get('taggedKey1.2')).toBe('value2');
  86. }
  87. export async function invalidatesByMultipleTags(cacheService: CacheService) {
  88. await cacheService.set('taggedKey2.1', 'value1', { tags: ['tag2.1'] });
  89. await cacheService.set('taggedKey2.2', 'value2', { tags: ['tag2.2'] });
  90. expect(await cacheService.get('taggedKey2.1')).toBe('value1');
  91. expect(await cacheService.get('taggedKey2.2')).toBe('value2');
  92. await cacheService.invalidateTags(['tag2.1', 'tag2.2']);
  93. expect(await cacheService.get('taggedKey2.1')).toBeUndefined();
  94. expect(await cacheService.get('taggedKey2.2')).toBeUndefined();
  95. }
  96. export async function invalidatesManyByMultipleTags(cacheService: CacheService) {
  97. await cacheService.set('taggedKey3.1', 'data', { tags: ['tag3.1', 'tag3.4'] });
  98. await cacheService.set('taggedKey3.2', 'data', { tags: ['tag3.2', 'tag3.1'] });
  99. await cacheService.set('taggedKey3.3', 'data', { tags: ['tag3.4'] });
  100. await cacheService.set('taggedKey3.4', 'data', { tags: ['tag3.1'] });
  101. await cacheService.set('taggedKey3.5', 'data', { tags: ['tag3.2'] });
  102. await cacheService.invalidateTags(['tag3.2', 'tag3.4']);
  103. expect(await cacheService.get('taggedKey3.1')).toBeUndefined();
  104. expect(await cacheService.get('taggedKey3.2')).toBeUndefined();
  105. expect(await cacheService.get('taggedKey3.3')).toBeUndefined();
  106. expect(await cacheService.get('taggedKey3.4')).toBe('data');
  107. expect(await cacheService.get('taggedKey3.5')).toBeUndefined();
  108. }
  109. export async function invalidatesALargeNumberOfKeysByTag(cacheService: CacheService) {
  110. for (let i = 0; i < 100; i++) {
  111. await cacheService.set(`taggedKey${i}`, `value${i}`, { tags: ['tag'] });
  112. }
  113. await cacheService.invalidateTags(['tag']);
  114. for (let i = 0; i < 100; i++) {
  115. expect(await cacheService.get(`taggedKey${i}`)).toBeUndefined();
  116. }
  117. }
  118. export async function invalidTTLsShouldNotSetKey(cacheService: CacheService) {
  119. await cacheService.set('test-key', 'test-value', { ttl: -1500 });
  120. const result = await cacheService.get('test-key');
  121. expect(result).toBeUndefined();
  122. }