@jintianxiayu/cache-decorator 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,254 +3,254 @@ import { CacheProviderRegistry } from '../src/core/cache-provider-registry';
3
3
  import { MemoryCacheProvider } from '../src/core/native-cache';
4
4
 
5
5
  describe('@Cache 装饰器', () => {
6
- beforeAll(() => {
7
- CacheProviderRegistry.register('memory', new MemoryCacheProvider());
8
- CacheProviderRegistry.setDefault('memory');
9
- });
10
-
11
- beforeEach(() => {
12
- const provider = CacheProviderRegistry.get();
13
- provider.clear();
14
- });
15
-
16
- describe('基础缓存', () => {
17
- it('应缓存方法结果', async () => {
18
- class UserService {
19
- callCount = 0;
20
-
21
- @Cache('user-cache')
22
- async getUser(id: number) {
23
- this.callCount++;
24
- return { id, name: 'test' };
25
- }
26
- }
27
-
28
- const service = new UserService();
29
- const result1 = await service.getUser(1);
30
- const result2 = await service.getUser(1);
31
-
32
- expect(result1).toEqual({ id: 1, name: 'test' });
33
- expect(result2).toEqual({ id: 1, name: 'test' });
34
- expect(service.callCount).toBe(1);
6
+ beforeAll(() => {
7
+ CacheProviderRegistry.register('memory', new MemoryCacheProvider());
8
+ CacheProviderRegistry.setDefault('memory');
35
9
  });
36
10
 
37
- it('不同参数应分别缓存', async () => {
38
- class UserService {
39
- callCount = 0;
40
-
41
- @Cache('user-cache')
42
- async getUser(id: number) {
43
- this.callCount++;
44
- return { id };
45
- }
46
- }
47
-
48
- const service = new UserService();
49
- await service.getUser(1);
50
- await service.getUser(2);
11
+ beforeEach(() => {
12
+ const provider = CacheProviderRegistry.get();
13
+ provider.clear();
14
+ });
51
15
 
52
- expect(service.callCount).toBe(2);
16
+ describe('基础缓存', () => {
17
+ it('应缓存方法结果', async () => {
18
+ class UserService {
19
+ callCount = 0;
20
+
21
+ @Cache('user-cache')
22
+ async getUser(id: number) {
23
+ this.callCount++;
24
+ return { id, name: 'test' };
25
+ }
26
+ }
27
+
28
+ const service = new UserService();
29
+ const result1 = await service.getUser(1);
30
+ const result2 = await service.getUser(1);
31
+
32
+ expect(result1).toEqual({ id: 1, name: 'test' });
33
+ expect(result2).toEqual({ id: 1, name: 'test' });
34
+ expect(service.callCount).toBe(1);
35
+ });
36
+
37
+ it('不同参数应分别缓存', async () => {
38
+ class UserService {
39
+ callCount = 0;
40
+
41
+ @Cache('user-cache')
42
+ async getUser(id: number) {
43
+ this.callCount++;
44
+ return { id };
45
+ }
46
+ }
47
+
48
+ const service = new UserService();
49
+ await service.getUser(1);
50
+ await service.getUser(2);
51
+
52
+ expect(service.callCount).toBe(2);
53
+ });
53
54
  });
54
- });
55
55
 
56
- describe('TTL 过期', () => {
57
- it('应在 TTL 后失效', async () => {
58
- jest.useFakeTimers();
56
+ describe('TTL 过期', () => {
57
+ it('应在 TTL 后失效', async () => {
58
+ jest.useFakeTimers();
59
59
 
60
- class UserService {
61
- @Cache('user-cache', { ttl: 60 })
62
- async getUser(id: number) {
63
- return { id };
64
- }
65
- }
60
+ class UserService {
61
+ @Cache('user-cache', { ttl: 60 })
62
+ async getUser(id: number) {
63
+ return { id };
64
+ }
65
+ }
66
66
 
67
- const service = new UserService();
68
- const result1 = await service.getUser(1);
69
- expect(result1).toEqual({ id: 1 });
67
+ const service = new UserService();
68
+ const result1 = await service.getUser(1);
69
+ expect(result1).toEqual({ id: 1 });
70
70
 
71
- jest.advanceTimersByTime(60001);
71
+ jest.advanceTimersByTime(60001);
72
72
 
73
- const result2 = await service.getUser(1);
74
- expect(result2).toEqual({ id: 1 });
73
+ const result2 = await service.getUser(1);
74
+ expect(result2).toEqual({ id: 1 });
75
75
 
76
- jest.useRealTimers();
77
- });
78
- });
79
-
80
- describe('缓存命中', () => {
81
- it('应直接返回缓存值', async () => {
82
- class UserService {
83
- callCount = 0;
84
-
85
- @Cache('user-cache')
86
- async getUser(id: number) {
87
- this.callCount++;
88
- return { id, timestamp: Date.now() };
89
- }
90
- }
91
-
92
- const service = new UserService();
93
- const result1 = await service.getUser(1);
94
- const result2 = await service.getUser(1);
95
-
96
- expect(result1.id).toBe(1);
97
- expect(result2.id).toBe(1);
98
- expect(result1.timestamp).toBe(result2.timestamp);
99
- expect(service.callCount).toBe(1);
100
- });
101
- });
102
-
103
- describe('错误结果缓存', () => {
104
- it.skip('应缓存错误结果', async () => {
105
- class UserService {
106
- callCount = 0;
107
-
108
- @Cache('user-cache')
109
- async getUser(_id: number) {
110
- this.callCount++;
111
- throw new Error('user not found');
112
- }
113
- }
114
-
115
- const service = new UserService();
116
-
117
- try {
118
- await service.getUser(1);
119
- } catch (e) {
120
- // expected
121
- }
122
- try {
123
- await service.getUser(1);
124
- } catch (e) {
125
- // expected
126
- }
127
- expect(service.callCount).toBe(1);
128
- });
129
- });
130
-
131
- describe('请求合并', () => {
132
- it.skip('并发请求应返回同一 Promise', async () => {
133
- let resolvePromise: ((value: number) => void) | undefined;
134
- let callCount = 0;
135
-
136
- class UserService {
137
- @Cache('user-cache')
138
- async getUser(_id: number): Promise<number> {
139
- callCount++;
140
- return new Promise(resolve => {
141
- resolvePromise = resolve;
142
- });
143
- }
144
- }
145
-
146
- const service = new UserService();
147
- const promise1 = service.getUser(1);
148
- const promise2 = service.getUser(1);
149
-
150
- await new Promise(resolve => setTimeout(resolve, 10));
151
-
152
- expect(callCount).toBe(1);
153
- expect(promise1).toBe(promise2);
154
-
155
- resolvePromise!(42);
156
-
157
- const [result1, result2] = await Promise.all([promise1, promise2]);
158
- expect(result1).toBe(42);
159
- expect(result2).toBe(42);
160
- expect(callCount).toBe(1);
161
- });
162
- });
163
-
164
- describe('key 选项', () => {
165
- it('key 为 undefined 时使用自动生成逻辑', async () => {
166
- class UserService {
167
- callCount = 0;
168
-
169
- @Cache('user-cache', { key: undefined })
170
- async getUser(id: number) {
171
- this.callCount++;
172
- return { id };
173
- }
174
- }
175
-
176
- const service = new UserService();
177
- await service.getUser(1);
178
- await service.getUser(1);
179
- expect(service.callCount).toBe(1);
76
+ jest.useRealTimers();
77
+ });
180
78
  });
181
79
 
182
- it('key 为 null 时使用自动生成逻辑', async () => {
183
- class UserService {
184
- callCount = 0;
185
-
186
- @Cache('user-cache', { key: null })
187
- async getUser(id: number) {
188
- this.callCount++;
189
- return { id };
190
- }
191
- }
192
-
193
- const service = new UserService();
194
- await service.getUser(1);
195
- await service.getUser(1);
196
- expect(service.callCount).toBe(1);
80
+ describe('缓存命中', () => {
81
+ it('应直接返回缓存值', async () => {
82
+ class UserService {
83
+ callCount = 0;
84
+
85
+ @Cache('user-cache')
86
+ async getUser(id: number) {
87
+ this.callCount++;
88
+ return { id, timestamp: Date.now() };
89
+ }
90
+ }
91
+
92
+ const service = new UserService();
93
+ const result1 = await service.getUser(1);
94
+ const result2 = await service.getUser(1);
95
+
96
+ expect(result1.id).toBe(1);
97
+ expect(result2.id).toBe(1);
98
+ expect(result1.timestamp).toBe(result2.timestamp);
99
+ expect(service.callCount).toBe(1);
100
+ });
197
101
  });
198
102
 
199
- it('key 为字符串时使用字符串值', async () => {
200
- class UserService {
201
- callCount = 0;
202
-
203
- @Cache('user-cache', { key: 'specific-key' })
204
- async getUser(id: number) {
205
- this.callCount++;
206
- return { id };
207
- }
208
- }
209
-
210
- const service = new UserService();
211
- await service.getUser(1);
212
- await service.getUser(2);
213
- expect(service.callCount).toBe(1);
103
+ describe('错误结果缓存', () => {
104
+ it.skip('应缓存错误结果', async () => {
105
+ class UserService {
106
+ callCount = 0;
107
+
108
+ @Cache('user-cache')
109
+ async getUser(_id: number) {
110
+ this.callCount++;
111
+ throw new Error('user not found');
112
+ }
113
+ }
114
+
115
+ const service = new UserService();
116
+
117
+ try {
118
+ await service.getUser(1);
119
+ } catch (e) {
120
+ // expected
121
+ }
122
+ try {
123
+ await service.getUser(1);
124
+ } catch (e) {
125
+ // expected
126
+ }
127
+ expect(service.callCount).toBe(1);
128
+ });
214
129
  });
215
130
 
216
- it('key 为函数时使用函数返回值', async () => {
217
- class UserService {
218
- callCount = 0;
219
-
220
- @Cache('user-cache', { key: (...args: unknown[]) => String(args[0]) })
221
- async getUser(id: number) {
222
- this.callCount++;
223
- return { id };
224
- }
225
- }
226
-
227
- const service = new UserService();
228
- await service.getUser(1);
229
- await service.getUser(1);
230
- expect(service.callCount).toBe(1);
231
- await service.getUser(2);
232
- expect(service.callCount).toBe(2);
131
+ describe('请求合并', () => {
132
+ it.skip('并发请求应返回同一 Promise', async () => {
133
+ let resolvePromise: ((value: number) => void) | undefined;
134
+ let callCount = 0;
135
+
136
+ class UserService {
137
+ @Cache('user-cache')
138
+ async getUser(_id: number): Promise<number> {
139
+ callCount++;
140
+ return new Promise((resolve) => {
141
+ resolvePromise = resolve;
142
+ });
143
+ }
144
+ }
145
+
146
+ const service = new UserService();
147
+ const promise1 = service.getUser(1);
148
+ const promise2 = service.getUser(1);
149
+
150
+ await new Promise((resolve) => setTimeout(resolve, 10));
151
+
152
+ expect(callCount).toBe(1);
153
+ expect(promise1).toBe(promise2);
154
+
155
+ resolvePromise!(42);
156
+
157
+ const [result1, result2] = await Promise.all([promise1, promise2]);
158
+ expect(result1).toBe(42);
159
+ expect(result2).toBe(42);
160
+ expect(callCount).toBe(1);
161
+ });
233
162
  });
234
163
 
235
- it('key 函数抛出异常时降级到自动生成', async () => {
236
- class UserService {
237
- callCount = 0;
238
-
239
- @Cache('user-cache', {
240
- key: () => {
241
- throw new Error('bad key');
242
- },
243
- })
244
- async getUser(id: number) {
245
- this.callCount++;
246
- return { id };
247
- }
248
- }
249
-
250
- const service = new UserService();
251
- await service.getUser(1);
252
- await service.getUser(1);
253
- expect(service.callCount).toBe(1);
164
+ describe('key 选项', () => {
165
+ it('key undefined 时使用自动生成逻辑', async () => {
166
+ class UserService {
167
+ callCount = 0;
168
+
169
+ @Cache('user-cache', { key: undefined })
170
+ async getUser(id: number) {
171
+ this.callCount++;
172
+ return { id };
173
+ }
174
+ }
175
+
176
+ const service = new UserService();
177
+ await service.getUser(1);
178
+ await service.getUser(1);
179
+ expect(service.callCount).toBe(1);
180
+ });
181
+
182
+ it('key 为 null 时使用自动生成逻辑', async () => {
183
+ class UserService {
184
+ callCount = 0;
185
+
186
+ @Cache('user-cache', { key: null })
187
+ async getUser(id: number) {
188
+ this.callCount++;
189
+ return { id };
190
+ }
191
+ }
192
+
193
+ const service = new UserService();
194
+ await service.getUser(1);
195
+ await service.getUser(1);
196
+ expect(service.callCount).toBe(1);
197
+ });
198
+
199
+ it('key 为字符串时使用字符串值', async () => {
200
+ class UserService {
201
+ callCount = 0;
202
+
203
+ @Cache('user-cache', { key: 'specific-key' })
204
+ async getUser(id: number) {
205
+ this.callCount++;
206
+ return { id };
207
+ }
208
+ }
209
+
210
+ const service = new UserService();
211
+ await service.getUser(1);
212
+ await service.getUser(2);
213
+ expect(service.callCount).toBe(1);
214
+ });
215
+
216
+ it('key 为函数时使用函数返回值', async () => {
217
+ class UserService {
218
+ callCount = 0;
219
+
220
+ @Cache('user-cache', { key: (...args: unknown[]) => String(args[0]) })
221
+ async getUser(id: number) {
222
+ this.callCount++;
223
+ return { id };
224
+ }
225
+ }
226
+
227
+ const service = new UserService();
228
+ await service.getUser(1);
229
+ await service.getUser(1);
230
+ expect(service.callCount).toBe(1);
231
+ await service.getUser(2);
232
+ expect(service.callCount).toBe(2);
233
+ });
234
+
235
+ it('key 函数抛出异常时降级到自动生成', async () => {
236
+ class UserService {
237
+ callCount = 0;
238
+
239
+ @Cache('user-cache', {
240
+ key: () => {
241
+ throw new Error('bad key');
242
+ },
243
+ })
244
+ async getUser(id: number) {
245
+ this.callCount++;
246
+ return { id };
247
+ }
248
+ }
249
+
250
+ const service = new UserService();
251
+ await service.getUser(1);
252
+ await service.getUser(1);
253
+ expect(service.callCount).toBe(1);
254
+ });
254
255
  });
255
- });
256
- });
256
+ });
@@ -1,37 +1,37 @@
1
1
  import { KeyBuilder } from '../src/core/key-builder';
2
2
 
3
3
  describe('KeyBuilder', () => {
4
- describe('build', () => {
5
- it('应生成包含缓存名的 key', () => {
6
- const key = KeyBuilder.build('user-cache', []);
7
- expect(key).toBe('user-cache');
8
- });
4
+ describe('build', () => {
5
+ it('应生成包含缓存名的 key', () => {
6
+ const key = KeyBuilder.build('user-cache', []);
7
+ expect(key).toBe('user-cache');
8
+ });
9
9
 
10
- it('应生成包含参数值的 key', () => {
11
- const key = KeyBuilder.build('user-cache', [1]);
12
- expect(key).toBe('user-cache:1');
13
- });
10
+ it('应生成包含参数值的 key', () => {
11
+ const key = KeyBuilder.build('user-cache', [1]);
12
+ expect(key).toBe('user-cache:1');
13
+ });
14
14
 
15
- it('应处理多个参数', () => {
16
- const key = KeyBuilder.build('user-cache', [1, 'test']);
17
- expect(key).toBe('user-cache:1&test');
18
- });
15
+ it('应处理多个参数', () => {
16
+ const key = KeyBuilder.build('user-cache', [1, 'test']);
17
+ expect(key).toBe('user-cache:1&test');
18
+ });
19
19
 
20
- it('应处理对象参数', () => {
21
- const key = KeyBuilder.build('user-cache', [{ id: 1, name: 'test' }]);
22
- expect(key).toBe('user-cache:{"id":1,"name":"test"}');
23
- });
20
+ it('应处理对象参数', () => {
21
+ const key = KeyBuilder.build('user-cache', [{ id: 1, name: 'test' }]);
22
+ expect(key).toBe('user-cache:{"id":1,"name":"test"}');
23
+ });
24
24
 
25
- it('应处理 null 和 undefined', () => {
26
- const key1 = KeyBuilder.build('user-cache', [null]);
27
- const key2 = KeyBuilder.build('user-cache', [undefined]);
28
- expect(key1).toBe('user-cache:null');
29
- expect(key2).toBe('user-cache:null');
30
- });
25
+ it('应处理 null 和 undefined', () => {
26
+ const key1 = KeyBuilder.build('user-cache', [null]);
27
+ const key2 = KeyBuilder.build('user-cache', [undefined]);
28
+ expect(key1).toBe('user-cache:null');
29
+ expect(key2).toBe('user-cache:null');
30
+ });
31
31
 
32
- it('应处理数字和布尔值', () => {
33
- const key = KeyBuilder.build('user-cache', [123, true, false]);
34
- expect(key).toBe('user-cache:123&true&false');
32
+ it('应处理数字和布尔值', () => {
33
+ const key = KeyBuilder.build('user-cache', [123, true, false]);
34
+ expect(key).toBe('user-cache:123&true&false');
35
+ });
35
36
  });
36
- });
37
- });
37
+ });
@@ -1,71 +1,71 @@
1
1
  import { MemoryCacheProvider } from '../src/core/native-cache';
2
2
 
3
3
  describe('MemoryCacheProvider', () => {
4
- let provider: MemoryCacheProvider;
4
+ let provider: MemoryCacheProvider;
5
5
 
6
- beforeEach(() => {
7
- provider = new MemoryCacheProvider();
8
- });
9
-
10
- describe('get & set', () => {
11
- it('应返回已缓存的值', () => {
12
- provider.set('key1', 'value1');
13
- expect(provider.get('key1')).toBe('value1');
6
+ beforeEach(() => {
7
+ provider = new MemoryCacheProvider();
14
8
  });
15
9
 
16
- it('应返回 undefined 对不存在的键', () => {
17
- expect(provider.get('nonexistent')).toBeUndefined();
10
+ describe('get & set', () => {
11
+ it('应返回已缓存的值', () => {
12
+ provider.set('key1', 'value1');
13
+ expect(provider.get('key1')).toBe('value1');
14
+ });
15
+
16
+ it('应返回 undefined 对不存在的键', () => {
17
+ expect(provider.get('nonexistent')).toBeUndefined();
18
+ });
18
19
  });
19
- });
20
20
 
21
- describe('TTL', () => {
22
- it('应在 TTL 后失效', () => {
23
- jest.useFakeTimers();
21
+ describe('TTL', () => {
22
+ it('应在 TTL 后失效', () => {
23
+ jest.useFakeTimers();
24
24
 
25
- provider.set('key1', 'value1', 5);
26
- expect(provider.get('key1')).toBe('value1');
25
+ provider.set('key1', 'value1', 5);
26
+ expect(provider.get('key1')).toBe('value1');
27
27
 
28
- jest.advanceTimersByTime(5001);
29
- expect(provider.get('key1')).toBeUndefined();
28
+ jest.advanceTimersByTime(5001);
29
+ expect(provider.get('key1')).toBeUndefined();
30
30
 
31
- jest.useRealTimers();
32
- });
31
+ jest.useRealTimers();
32
+ });
33
33
 
34
- it('无 TTL 时不应失效', () => {
35
- provider.set('key1', 'value1');
36
- expect(provider.get('key1')).toBe('value1');
34
+ it('无 TTL 时不应失效', () => {
35
+ provider.set('key1', 'value1');
36
+ expect(provider.get('key1')).toBe('value1');
37
+ });
37
38
  });
38
- });
39
39
 
40
- describe('delete', () => {
41
- it('应删除指定键', () => {
42
- provider.set('key1', 'value1');
43
- provider.delete('key1');
44
- expect(provider.get('key1')).toBeUndefined();
40
+ describe('delete', () => {
41
+ it('应删除指定键', () => {
42
+ provider.set('key1', 'value1');
43
+ provider.delete('key1');
44
+ expect(provider.get('key1')).toBeUndefined();
45
+ });
45
46
  });
46
- });
47
47
 
48
- describe('clear', () => {
49
- it('应清除所有缓存', () => {
50
- provider.set('key1', 'value1');
51
- provider.set('key2', 'value2');
52
- provider.clear();
53
- expect(provider.get('key1')).toBeUndefined();
54
- expect(provider.get('key2')).toBeUndefined();
48
+ describe('clear', () => {
49
+ it('应清除所有缓存', () => {
50
+ provider.set('key1', 'value1');
51
+ provider.set('key2', 'value2');
52
+ provider.clear();
53
+ expect(provider.get('key1')).toBeUndefined();
54
+ expect(provider.get('key2')).toBeUndefined();
55
+ });
55
56
  });
56
- });
57
57
 
58
- describe('deleteByPattern', () => {
59
- it('应删除匹配模式的键', () => {
60
- provider.set('user:1', 'user1');
61
- provider.set('user:2', 'user2');
62
- provider.set('order:1', 'order1');
58
+ describe('deleteByPattern', () => {
59
+ it('应删除匹配模式的键', () => {
60
+ provider.set('user:1', 'user1');
61
+ provider.set('user:2', 'user2');
62
+ provider.set('order:1', 'order1');
63
63
 
64
- provider.deleteByPattern('user:*');
64
+ provider.deleteByPattern('user:*');
65
65
 
66
- expect(provider.get('user:1')).toBeUndefined();
67
- expect(provider.get('user:2')).toBeUndefined();
68
- expect(provider.get('order:1')).toBe('order1');
66
+ expect(provider.get('user:1')).toBeUndefined();
67
+ expect(provider.get('user:2')).toBeUndefined();
68
+ expect(provider.get('order:1')).toBe('order1');
69
+ });
69
70
  });
70
- });
71
- });
71
+ });