storage-manager.test.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import { beforeEach, describe, expect, it, vi } from 'vitest';
  2. import { StorageManager } from './storage-manager';
  3. describe('storageManager', () => {
  4. let storageManager: StorageManager<{ age: number; name: string }>;
  5. beforeEach(() => {
  6. vi.useFakeTimers();
  7. localStorage.clear();
  8. storageManager = new StorageManager<{ age: number; name: string }>({
  9. prefix: 'test_',
  10. });
  11. });
  12. it('should set and get an item', () => {
  13. storageManager.setItem('user', { age: 30, name: 'John Doe' });
  14. const user = storageManager.getItem('user');
  15. expect(user).toEqual({ age: 30, name: 'John Doe' });
  16. });
  17. it('should return default value if item does not exist', () => {
  18. const user = storageManager.getItem('nonexistent', {
  19. age: 0,
  20. name: 'Default User',
  21. });
  22. expect(user).toEqual({ age: 0, name: 'Default User' });
  23. });
  24. it('should remove an item', () => {
  25. storageManager.setItem('user', { age: 30, name: 'John Doe' });
  26. storageManager.removeItem('user');
  27. const user = storageManager.getItem('user');
  28. expect(user).toBeNull();
  29. });
  30. it('should clear all items with the prefix', () => {
  31. storageManager.setItem('user1', { age: 30, name: 'John Doe' });
  32. storageManager.setItem('user2', { age: 25, name: 'Jane Doe' });
  33. storageManager.clear();
  34. expect(storageManager.getItem('user1')).toBeNull();
  35. expect(storageManager.getItem('user2')).toBeNull();
  36. });
  37. it('should clear expired items', () => {
  38. storageManager.setItem('user', { age: 30, name: 'John Doe' }, 1000); // 1秒过期
  39. vi.advanceTimersByTime(1001); // 快进时间
  40. storageManager.clearExpiredItems();
  41. const user = storageManager.getItem('user');
  42. expect(user).toBeNull();
  43. });
  44. it('should not clear non-expired items', () => {
  45. storageManager.setItem('user', { age: 30, name: 'John Doe' }, 10_000); // 10秒过期
  46. vi.advanceTimersByTime(5000); // 快进时间
  47. storageManager.clearExpiredItems();
  48. const user = storageManager.getItem('user');
  49. expect(user).toEqual({ age: 30, name: 'John Doe' });
  50. });
  51. it('should handle JSON parse errors gracefully', () => {
  52. localStorage.setItem('test_user', '{ invalid JSON }');
  53. const user = storageManager.getItem('user', {
  54. age: 0,
  55. name: 'Default User',
  56. });
  57. expect(user).toEqual({ age: 0, name: 'Default User' });
  58. });
  59. it('should return null for non-existent items without default value', () => {
  60. const user = storageManager.getItem('nonexistent');
  61. expect(user).toBeNull();
  62. });
  63. it('should overwrite existing items', () => {
  64. storageManager.setItem('user', { age: 30, name: 'John Doe' });
  65. storageManager.setItem('user', { age: 25, name: 'Jane Doe' });
  66. const user = storageManager.getItem('user');
  67. expect(user).toEqual({ age: 25, name: 'Jane Doe' });
  68. });
  69. it('should handle items without expiry correctly', () => {
  70. storageManager.setItem('user', { age: 30, name: 'John Doe' });
  71. vi.advanceTimersByTime(5000);
  72. const user = storageManager.getItem('user');
  73. expect(user).toEqual({ age: 30, name: 'John Doe' });
  74. });
  75. it('should remove expired items when accessed', () => {
  76. storageManager.setItem('user', { age: 30, name: 'John Doe' }, 1000); // 1秒过期
  77. vi.advanceTimersByTime(1001); // 快进时间
  78. const user = storageManager.getItem('user');
  79. expect(user).toBeNull();
  80. });
  81. it('should not remove non-expired items when accessed', () => {
  82. storageManager.setItem('user', { age: 30, name: 'John Doe' }, 10_000); // 10秒过期
  83. vi.advanceTimersByTime(5000); // 快进时间
  84. const user = storageManager.getItem('user');
  85. expect(user).toEqual({ age: 30, name: 'John Doe' });
  86. });
  87. it('should handle multiple items with different expiry times', () => {
  88. storageManager.setItem('user1', { age: 30, name: 'John Doe' }, 1000); // 1秒过期
  89. storageManager.setItem('user2', { age: 25, name: 'Jane Doe' }, 2000); // 2秒过期
  90. vi.advanceTimersByTime(1500); // 快进时间
  91. storageManager.clearExpiredItems();
  92. const user1 = storageManager.getItem('user1');
  93. const user2 = storageManager.getItem('user2');
  94. expect(user1).toBeNull();
  95. expect(user2).toEqual({ age: 25, name: 'Jane Doe' });
  96. });
  97. it('should handle items with no expiry', () => {
  98. storageManager.setItem('user', { age: 30, name: 'John Doe' });
  99. vi.advanceTimersByTime(10_000); // 快进时间
  100. storageManager.clearExpiredItems();
  101. const user = storageManager.getItem('user');
  102. expect(user).toEqual({ age: 30, name: 'John Doe' });
  103. });
  104. it('should clear all items correctly', () => {
  105. storageManager.setItem('user1', { age: 30, name: 'John Doe' });
  106. storageManager.setItem('user2', { age: 25, name: 'Jane Doe' });
  107. storageManager.clear();
  108. const user1 = storageManager.getItem('user1');
  109. const user2 = storageManager.getItem('user2');
  110. expect(user1).toBeNull();
  111. expect(user2).toBeNull();
  112. });
  113. });