From 52e8c50dc8d51d6a6edd36d18b7444ef27274a0c Mon Sep 17 00:00:00 2001 From: Leibale Date: Mon, 20 Nov 2023 12:47:13 -0500 Subject: [PATCH] add testWithClientPool and first pool test --- packages/client/lib/client/pool.spec.ts | 11 ++++ packages/test-utils/lib/index.ts | 72 ++++++++++++++++++++++--- 2 files changed, 77 insertions(+), 6 deletions(-) create mode 100644 packages/client/lib/client/pool.spec.ts diff --git a/packages/client/lib/client/pool.spec.ts b/packages/client/lib/client/pool.spec.ts new file mode 100644 index 0000000000..8ab4bb556b --- /dev/null +++ b/packages/client/lib/client/pool.spec.ts @@ -0,0 +1,11 @@ +import { strict as assert } from 'node:assert'; +import testUtils, { GLOBAL } from '../test-utils'; + +describe.only('RedisClientPool', () => { + testUtils.testWithClientPool('sendCommand', async pool => { + assert.equal( + await pool.sendCommand(['PING']), + 'PONG' + ); + }, GLOBAL.SERVERS.OPEN); +}); diff --git a/packages/test-utils/lib/index.ts b/packages/test-utils/lib/index.ts index 5343beb91b..87ba34db7e 100644 --- a/packages/test-utils/lib/index.ts +++ b/packages/test-utils/lib/index.ts @@ -8,6 +8,9 @@ import { createClient, RedisClientOptions, RedisClientType, + RedisPoolOptions, + RedisClientPoolType, + createClientPool, createCluster, RedisClusterOptions, RedisClusterType @@ -23,6 +26,7 @@ interface TestUtilsConfig { } interface CommonTestOptions { + serverArguments: Array; minimumDockerVersion?: Array; } @@ -33,11 +37,21 @@ interface ClientTestOptions< RESP extends RespVersions, TYPE_MAPPING extends TypeMapping > extends CommonTestOptions { - serverArguments: Array; clientOptions?: Partial>; disableClientSetup?: boolean; } +interface ClientPoolTestOptions< + M extends RedisModules, + F extends RedisFunctions, + S extends RedisScripts, + RESP extends RespVersions, + TYPE_MAPPING extends TypeMapping +> extends CommonTestOptions { + clientOptions?: Partial>; + poolOptions?: RedisPoolOptions; +} + interface ClusterTestOptions< M extends RedisModules, F extends RedisFunctions, @@ -46,7 +60,6 @@ interface ClusterTestOptions< TYPE_MAPPING extends TypeMapping // POLICIES extends CommandPolicies > extends CommonTestOptions { - serverArguments: Array; clusterConfiguration?: Partial>; numberOfMasters?: number; numberOfReplicas?: number; @@ -164,9 +177,9 @@ export default class TestUtils { if (!dockerPromise) return this.skip(); const client = createClient({ - ...options?.clientOptions, + ...options.clientOptions, socket: { - ...options?.clientOptions?.socket, + ...options.clientOptions?.socket, // TODO // @ts-ignore port: (await dockerPromise).port @@ -191,6 +204,53 @@ export default class TestUtils { }); } + testWithClientPool< + M extends RedisModules = {}, + F extends RedisFunctions = {}, + S extends RedisScripts = {}, + RESP extends RespVersions = 2, + TYPE_MAPPING extends TypeMapping = {} + >( + title: string, + fn: (client: RedisClientPoolType) => unknown, + options: ClientPoolTestOptions + ): void { + let dockerPromise: ReturnType; + if (this.isVersionGreaterThan(options.minimumDockerVersion)) { + const dockerImage = this.#DOCKER_IMAGE; + before(function () { + this.timeout(30000); + + dockerPromise = spawnRedisServer(dockerImage, options.serverArguments); + return dockerPromise; + }); + } + + it(title, async function () { + if (!dockerPromise) return this.skip(); + + const pool = createClientPool({ + ...options.clientOptions, + socket: { + ...options.clientOptions?.socket, + // TODO + // @ts-ignore + port: (await dockerPromise).port + } + }, options.poolOptions); + + await pool.connect(); + + try { + await pool.flushAll(); + await fn(pool); + } finally { + await pool.flushAll(); + pool.destroy(); + } + }); + } + static async #clusterFlushAll< M extends RedisModules, F extends RedisFunctions, @@ -228,8 +288,8 @@ export default class TestUtils { dockersPromise = spawnRedisCluster({ ...dockerImage, - numberOfMasters: options?.numberOfMasters, - numberOfReplicas: options?.numberOfReplicas + numberOfMasters: options.numberOfMasters, + numberOfReplicas: options.numberOfReplicas }, options.serverArguments); return dockersPromise; });