trading-platform-backend/src/__tests__/mocks/redis.mock.ts

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();
};