98 lines
2.0 KiB
TypeScript
98 lines
2.0 KiB
TypeScript
/**
|
|
* Redis Mock for Testing
|
|
*
|
|
* Provides mock implementations for Redis operations.
|
|
*/
|
|
|
|
/**
|
|
* In-memory store for testing Redis operations
|
|
*/
|
|
class MockRedisStore {
|
|
private store = new Map<string, { value: string; expiresAt: number | null }>();
|
|
|
|
async get(key: string): Promise<string | null> {
|
|
const entry = this.store.get(key);
|
|
if (!entry) return null;
|
|
|
|
if (entry.expiresAt && Date.now() > entry.expiresAt) {
|
|
this.store.delete(key);
|
|
return null;
|
|
}
|
|
|
|
return entry.value;
|
|
}
|
|
|
|
async setex(key: string, seconds: number, value: string): Promise<string> {
|
|
this.store.set(key, {
|
|
value,
|
|
expiresAt: Date.now() + seconds * 1000,
|
|
});
|
|
return 'OK';
|
|
}
|
|
|
|
async set(key: string, value: string): Promise<string> {
|
|
this.store.set(key, {
|
|
value,
|
|
expiresAt: null,
|
|
});
|
|
return 'OK';
|
|
}
|
|
|
|
async del(key: string): Promise<number> {
|
|
const deleted = this.store.delete(key);
|
|
return deleted ? 1 : 0;
|
|
}
|
|
|
|
async exists(key: string): Promise<number> {
|
|
const entry = this.store.get(key);
|
|
if (!entry) return 0;
|
|
|
|
if (entry.expiresAt && Date.now() > entry.expiresAt) {
|
|
this.store.delete(key);
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
async ttl(key: string): Promise<number> {
|
|
const entry = this.store.get(key);
|
|
if (!entry) return -2;
|
|
if (!entry.expiresAt) return -1;
|
|
|
|
const remaining = Math.floor((entry.expiresAt - Date.now()) / 1000);
|
|
return remaining > 0 ? remaining : -2;
|
|
}
|
|
|
|
async flushall(): Promise<string> {
|
|
this.store.clear();
|
|
return 'OK';
|
|
}
|
|
|
|
async quit(): Promise<string> {
|
|
this.store.clear();
|
|
return 'OK';
|
|
}
|
|
|
|
clear() {
|
|
this.store.clear();
|
|
}
|
|
|
|
// For debugging
|
|
getStore() {
|
|
return this.store;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Export singleton instance
|
|
*/
|
|
export const mockRedisClient = new MockRedisStore();
|
|
|
|
/**
|
|
* Reset mock Redis store
|
|
*/
|
|
export const resetRedisMock = () => {
|
|
mockRedisClient.clear();
|
|
};
|