befly 3.8.20 → 3.8.24

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.
@@ -0,0 +1,231 @@
1
+ /**
2
+ * RedisHelper 测试
3
+ * 测试 Redis 操作功能
4
+ */
5
+
6
+ import { describe, test, expect, beforeAll, afterAll } from 'bun:test';
7
+ import { Database } from '../lib/database.js';
8
+ import { RedisHelper } from '../lib/redisHelper.js';
9
+ import { defaultOptions } from '../config.js';
10
+
11
+ let redis: RedisHelper;
12
+
13
+ beforeAll(async () => {
14
+ // 使用项目默认配置连接 Redis
15
+ await Database.connectRedis(defaultOptions.redis);
16
+ // 使用项目配置的 prefix
17
+ redis = new RedisHelper(defaultOptions.redis.prefix);
18
+ });
19
+
20
+ afterAll(async () => {
21
+ // 清理测试数据
22
+ await redis.del('test:string');
23
+ await redis.del('test:object');
24
+ await redis.del('test:set');
25
+ await redis.del('test:ttl');
26
+ await redis.del('test:expire');
27
+
28
+ await Database.disconnectRedis();
29
+ });
30
+
31
+ describe('RedisHelper - 字符串操作', () => {
32
+ test('setString - 设置字符串', async () => {
33
+ const result = await redis.setString('test:string', 'Hello Redis');
34
+ expect(result).toBe('OK');
35
+ });
36
+
37
+ test('getString - 获取字符串', async () => {
38
+ await redis.setString('test:string', 'Hello Redis');
39
+ const value = await redis.getString('test:string');
40
+ expect(value).toBe('Hello Redis');
41
+ });
42
+
43
+ test('getString - 获取不存在的键', async () => {
44
+ const value = await redis.getString('test:non_existent');
45
+ expect(value).toBeNull();
46
+ });
47
+
48
+ test('setString - 设置带过期时间的字符串', async () => {
49
+ const result = await redis.setString('test:ttl', 'Expire Test', 2);
50
+ expect(result).toBe('OK');
51
+
52
+ const value = await redis.getString('test:ttl');
53
+ expect(value).toBe('Expire Test');
54
+
55
+ // 等待过期
56
+ await new Promise((resolve) => setTimeout(resolve, 2100));
57
+
58
+ const expiredValue = await redis.getString('test:ttl');
59
+ expect(expiredValue).toBeNull();
60
+ });
61
+ });
62
+
63
+ describe('RedisHelper - 对象操作', () => {
64
+ test('setObject - 设置对象', async () => {
65
+ const obj = { name: 'Test', age: 25, tags: ['a', 'b'] };
66
+ const result = await redis.setObject('test:object', obj);
67
+ expect(result).toBe('OK');
68
+ });
69
+
70
+ test('getObject - 获取对象', async () => {
71
+ const obj = { name: 'Test', age: 25, tags: ['a', 'b'] };
72
+ await redis.setObject('test:object', obj);
73
+
74
+ const value = await redis.getObject<any>('test:object');
75
+ expect(value).toEqual(obj);
76
+ });
77
+
78
+ test('getObject - 获取不存在的对象', async () => {
79
+ const value = await redis.getObject('test:non_existent_obj');
80
+ expect(value).toBeNull();
81
+ });
82
+
83
+ test('setObject - 设置带过期时间的对象', async () => {
84
+ const obj = { data: 'test' };
85
+ const result = await redis.setObject('test:object:ttl', obj, 1);
86
+ expect(result).toBe('OK');
87
+
88
+ await new Promise((resolve) => setTimeout(resolve, 1100));
89
+
90
+ const expiredValue = await redis.getObject('test:object:ttl');
91
+ expect(expiredValue).toBeNull();
92
+ });
93
+
94
+ test('delObject - 删除对象', async () => {
95
+ await redis.setObject('test:delete', { data: 'test' });
96
+ await redis.delObject('test:delete');
97
+
98
+ const value = await redis.getObject('test:delete');
99
+ expect(value).toBeNull();
100
+ });
101
+ });
102
+
103
+ describe('RedisHelper - Set 操作', () => {
104
+ test('sadd - 添加成员到 Set', async () => {
105
+ const count = await redis.sadd('test:set', ['member1', 'member2', 'member3']);
106
+ expect(count).toBeGreaterThan(0);
107
+ });
108
+
109
+ test('sismember - 检查成员是否存在', async () => {
110
+ await redis.sadd('test:set', ['member1']);
111
+
112
+ const exists = await redis.sismember('test:set', 'member1');
113
+ expect(exists).toBe(true);
114
+
115
+ const notExists = await redis.sismember('test:set', 'non_existent');
116
+ expect(notExists).toBe(false);
117
+ });
118
+
119
+ test('scard - 获取 Set 成员数量', async () => {
120
+ await redis.del('test:set:count');
121
+ await redis.sadd('test:set:count', ['m1', 'm2', 'm3']);
122
+
123
+ const count = await redis.scard('test:set:count');
124
+ expect(count).toBe(3);
125
+
126
+ await redis.del('test:set:count');
127
+ });
128
+
129
+ test('smembers - 获取所有成员', async () => {
130
+ await redis.del('test:set:members');
131
+ await redis.sadd('test:set:members', ['a', 'b', 'c']);
132
+
133
+ const members = await redis.smembers('test:set:members');
134
+ expect(members.length).toBe(3);
135
+ expect(members).toContain('a');
136
+ expect(members).toContain('b');
137
+ expect(members).toContain('c');
138
+
139
+ await redis.del('test:set:members');
140
+ });
141
+ });
142
+
143
+ describe('RedisHelper - 键操作', () => {
144
+ test('exists - 检查键是否存在', async () => {
145
+ await redis.setString('test:exists', 'value');
146
+
147
+ const exists = await redis.exists('test:exists');
148
+ expect(exists).toBe(true);
149
+
150
+ const notExists = await redis.exists('test:not_exists');
151
+ expect(notExists).toBe(false);
152
+
153
+ await redis.del('test:exists');
154
+ });
155
+
156
+ test('expire - 设置过期时间', async () => {
157
+ await redis.setString('test:expire', 'value');
158
+ const result = await redis.expire('test:expire', 1);
159
+ expect(result).toBe(1);
160
+
161
+ await new Promise((resolve) => setTimeout(resolve, 1100));
162
+
163
+ const value = await redis.getString('test:expire');
164
+ expect(value).toBeNull();
165
+ });
166
+
167
+ test('ttl - 获取剩余过期时间', async () => {
168
+ await redis.setString('test:ttl:check', 'value', 10);
169
+
170
+ const ttl = await redis.ttl('test:ttl:check');
171
+ expect(ttl).toBeGreaterThan(0);
172
+ expect(ttl).toBeLessThanOrEqual(10);
173
+
174
+ await redis.del('test:ttl:check');
175
+ });
176
+
177
+ test('del - 删除键', async () => {
178
+ await redis.setString('test:delete:key', 'value');
179
+
180
+ const count = await redis.del('test:delete:key');
181
+ expect(count).toBe(1);
182
+
183
+ const value = await redis.getString('test:delete:key');
184
+ expect(value).toBeNull();
185
+ });
186
+ });
187
+
188
+ describe('RedisHelper - ID 生成', () => {
189
+ test('genTimeID - 生成唯一 ID', async () => {
190
+ const id1 = await redis.genTimeID();
191
+ const id2 = await redis.genTimeID();
192
+
193
+ expect(typeof id1).toBe('number');
194
+ expect(typeof id2).toBe('number');
195
+ expect(id1).not.toBe(id2);
196
+ expect(id1.toString().length).toBe(14);
197
+ });
198
+
199
+ test('genTimeIDBatch - 批量生成 ID', async () => {
200
+ const ids = await redis.genTimeIDBatch(10);
201
+
202
+ expect(ids.length).toBe(10);
203
+ expect(ids.every((id) => typeof id === 'number')).toBe(true);
204
+ expect(ids.every((id) => id.toString().length === 14)).toBe(true);
205
+
206
+ // 验证 ID 唯一性
207
+ const uniqueIds = new Set(ids);
208
+ expect(uniqueIds.size).toBe(10);
209
+ });
210
+
211
+ test('genTimeIDBatch - 空数组', async () => {
212
+ const ids = await redis.genTimeIDBatch(0);
213
+ expect(ids.length).toBe(0);
214
+ });
215
+
216
+ test('genTimeIDBatch - 超过最大限制', async () => {
217
+ try {
218
+ await redis.genTimeIDBatch(10001);
219
+ expect(true).toBe(false); // 不应该执行到这里
220
+ } catch (error: any) {
221
+ expect(error.message).toContain('超过最大限制');
222
+ }
223
+ });
224
+ });
225
+
226
+ describe('RedisHelper - 连接测试', () => {
227
+ test('ping - 测试连接', async () => {
228
+ const result = await redis.ping();
229
+ expect(result).toBe('PONG');
230
+ });
231
+ });