From dac1a3d20fe6672b04e5e020c66896b3b14fd848 Mon Sep 17 00:00:00 2001 From: Hazelnoot Date: Wed, 1 Oct 2025 11:28:46 -0400 Subject: [PATCH] add FakeCacheManagementService testing utility --- .../test/misc/FakeCacheManagementService.ts | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 packages/backend/test/misc/FakeCacheManagementService.ts diff --git a/packages/backend/test/misc/FakeCacheManagementService.ts b/packages/backend/test/misc/FakeCacheManagementService.ts new file mode 100644 index 0000000000..1b5b891e1e --- /dev/null +++ b/packages/backend/test/misc/FakeCacheManagementService.ts @@ -0,0 +1,73 @@ +/* + * SPDX-FileCopyrightText: hazelnoot and other Sharkey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + +import * as Redis from 'ioredis'; +import { Injectable } from '@nestjs/common'; +import { GodOfTimeService } from './GodOfTimeService.js'; +import { MockInternalEventService } from './MockInternalEventService.js'; +import { MockRedis } from './MockRedis.js'; +import type { QuantumKVOpts } from '@/misc/QuantumKVCache.js'; +import type { RedisKVCacheOpts, RedisSingleCacheOpts } from '@/misc/cache.js'; +import type { TimeService } from '@/core/TimeService.js'; +import type { InternalEventService } from '@/core/InternalEventService.js'; +import { + CacheManagementService, + type ManagedMemoryKVCache, + type ManagedMemorySingleCache, + type ManagedRedisKVCache, + type ManagedRedisSingleCache, + type ManagedQuantumKVCache, +} from '@/core/CacheManagementService.js'; + +/** + * Fake implementation of cache management that suppresses all caching behavior. + * The returned cache instances are real and fully functional, but expiration is negative to ensure that data is immediately discarded and nothing is cached. + * Essentially, it strips out the caching behavior and converts caches into pure data accessors. + */ +@Injectable() +export class FakeCacheManagementService extends CacheManagementService { + constructor(opts?: { + redisClient?: Redis.Redis; + timeService?: TimeService; + internalEventService?: InternalEventService; + }) { + const timeService = opts?.timeService ?? new GodOfTimeService(); + const redisClient = opts?.redisClient ?? new MockRedis(timeService); + const internalEventService = opts?.internalEventService ?? new MockInternalEventService(); + + super(redisClient, timeService, internalEventService); + } + + createMemoryKVCache(): ManagedMemoryKVCache { + return super.createMemoryKVCache(-1); + } + + createMemorySingleCache(): ManagedMemorySingleCache { + return super.createMemorySingleCache(-1); + } + + createRedisKVCache(name: string, opts: RedisKVCacheOpts): ManagedRedisKVCache { + return super.createRedisKVCache(name, { + ...opts, + lifetime: -1, + memoryCacheLifetime: -1, + }); + } + + createRedisSingleCache(name: string, opts: RedisSingleCacheOpts): ManagedRedisSingleCache { + return super.createRedisSingleCache(name, { + ...opts, + lifetime: -1, + memoryCacheLifetime: -1, + }); + } + + createQuantumKVCache(name: string, opts: QuantumKVOpts): ManagedQuantumKVCache { + return super.createQuantumKVCache(name, { + ...opts, + lifetime: -1, + }); + } +}