Skip to content

Commit fc47608

Browse files
authored
refactor(test-utils): use separate redis-tag and redis-version CLI arguments (redis#3169)
- Rename dockerImageVersionArgument to dockerImageTagArgument for Docker tag - Add optional dockerImageVersionArgument for explicit Redis version - Update workflow to use matrix object format with tag and version properties - Keep defaultDockerVersion with { tag, version } object format for local development - Version resolution priority: CLI --redis-version > default version > parse from tag - Bump test container version custom-21183968220-debian-amd64
1 parent d8a2f17 commit fc47608

File tree

11 files changed

+104
-36
lines changed

11 files changed

+104
-36
lines changed

.github/workflows/tests.yml

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,15 @@ jobs:
2222
fail-fast: false
2323
matrix:
2424
node-version: ["18", "20", "22"]
25-
redis-version: ["rs-7.4.0-v1", "8.0.2", "8.2", "8.4.0"]
25+
redis:
26+
- tag: "rs-7.4.0-v1"
27+
version: "7.4"
28+
- tag: "8.2"
29+
version: "8.2"
30+
- tag: "8.4.0"
31+
version: "8.4"
32+
- tag: "custom-21183968220-debian-amd64"
33+
version: "8.6"
2634
steps:
2735
- uses: actions/checkout@v4
2836
with:
@@ -39,7 +47,7 @@ jobs:
3947
- name: Build
4048
run: npm run build
4149
- name: Run Tests
42-
run: npm run test -ws --if-present -- --forbid-only --redis-version=${{ matrix.redis-version }}
50+
run: npm run test -ws --if-present -- --forbid-only --redis-tag=${{ matrix.redis.tag }} --redis-version=${{ matrix.redis.version }}
4351
- name: Upload to Codecov
4452
run: |
4553
curl https://keybase.io/codecovsecurity/pgp_keys.asc | gpg --no-default-keyring --keyring trustedkeys.gpg --import

packages/bloom/lib/test-utils.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ import RedisBloomModules from '.';
33

44
export default TestUtils.createFromConfig({
55
dockerImageName: 'redislabs/client-libs-test',
6+
dockerImageTagArgument: 'redis-tag',
67
dockerImageVersionArgument: 'redis-version',
7-
defaultDockerVersion: '8.4.0'
8+
defaultDockerVersion: { tag: 'custom-21183968220-debian-amd64', version: '8.6' }
89
});
910

1011
export const GLOBAL = {

packages/client/lib/sentinel/test-util.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,8 +173,9 @@ export class SentinelFramework extends DockerBase {
173173
this.config = config;
174174
this.#testUtils = TestUtils.createFromConfig({
175175
dockerImageName: 'redislabs/client-libs-test',
176+
dockerImageTagArgument: 'redis-tag',
176177
dockerImageVersionArgument: 'redis-version',
177-
defaultDockerVersion: '8.4.0'
178+
defaultDockerVersion: { tag: 'custom-21183968220-debian-amd64', version: '8.6' }
178179
});
179180
this.#nodeMap = new Map<string, ArrayElement<Awaited<ReturnType<SentinelFramework['spawnRedisSentinelNodes']>>>>();
180181
this.#sentinelMap = new Map<string, ArrayElement<Awaited<ReturnType<SentinelFramework['spawnRedisSentinelSentinels']>>>>();

packages/client/lib/test-utils.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ import { defineScript } from './lua-script';
88
import RedisBloomModules from '@redis/bloom';
99
const utils = TestUtils.createFromConfig({
1010
dockerImageName: 'redislabs/client-libs-test',
11+
dockerImageTagArgument: 'redis-tag',
1112
dockerImageVersionArgument: 'redis-version',
12-
defaultDockerVersion: '8.4.0'
13+
defaultDockerVersion: { tag: 'custom-21183968220-debian-amd64', version: '8.6' }
1314
});
1415

1516
export default utils;

packages/entraid/lib/test-utils.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@ import { EntraidCredentialsProvider } from './entraid-credentials-provider';
55

66
export const testUtils = TestUtils.createFromConfig({
77
dockerImageName: 'redislabs/client-libs-test',
8+
dockerImageTagArgument: 'redis-tag',
89
dockerImageVersionArgument: 'redis-version',
9-
defaultDockerVersion: '8.4.0'
10+
defaultDockerVersion: { tag: 'custom-21183968220-debian-amd64', version: '8.6' }
1011
});
1112

1213
const DEBUG_MODE_ARGS = testUtils.isVersionGreaterThan([7]) ?

packages/json/lib/test-utils.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ import RedisJSON from '.';
33

44
export default TestUtils.createFromConfig({
55
dockerImageName: 'redislabs/client-libs-test',
6+
dockerImageTagArgument: 'redis-tag',
67
dockerImageVersionArgument: 'redis-version',
7-
defaultDockerVersion: '8.4.0'
8+
defaultDockerVersion: { tag: 'custom-21183968220-debian-amd64', version: '8.6' }
89
});
910

1011
export const GLOBAL = {

packages/search/lib/test-utils.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ import { RespVersions } from '@redis/client';
44

55
export default TestUtils.createFromConfig({
66
dockerImageName: 'redislabs/client-libs-test',
7+
dockerImageTagArgument: 'redis-tag',
78
dockerImageVersionArgument: 'redis-version',
8-
defaultDockerVersion: '8.4.0'
9+
defaultDockerVersion: { tag: 'custom-21183968220-debian-amd64', version: '8.6' }
910
});
1011

1112
export const GLOBAL = {

packages/test-utils/lib/index.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ describe('Version Comparison', () => {
9595
];
9696

9797
tests.forEach(([version, min, max, expected]) => {
98-
const testUtils = new TestUtils({ string: version.join('.'), numbers: version }, "test")
98+
const testUtils = new TestUtils({ tag: version.join('.'), numbers: version }, "test")
9999
assert.equal(
100100
testUtils.isVersionInRange(min, max),
101101
expected,

packages/test-utils/lib/index.ts

Lines changed: 77 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -38,26 +38,47 @@ interface TestUtilsConfig {
3838
dockerImageName: string;
3939

4040
/**
41-
* The command-line argument name used to specify the Redis version.
41+
* The command-line argument name used to specify the Docker image tag.
4242
* This argument can be passed when running tests / GH actions.
4343
*
4444
* @example
45+
* If set to 'redis-tag', you can run tests with:
46+
* ```bash
47+
* npm test -- --redis-tag="8.4"
48+
* ```
49+
*/
50+
dockerImageTagArgument: string;
51+
52+
/**
53+
* The command-line argument name used to specify the Redis version.
54+
* This is optional and used when the Docker tag doesn't contain a parseable version.
55+
* If not provided, the version will be parsed from the tag.
56+
*
57+
* @example
4558
* If set to 'redis-version', you can run tests with:
4659
* ```bash
47-
* npm test -- --redis-version="6.2"
60+
* npm test -- --redis-tag="custom-build" --redis-version="8.6"
4861
* ```
62+
* @optional
4963
*/
50-
dockerImageVersionArgument: string;
64+
dockerImageVersionArgument?: string;
5165

5266
/**
53-
* The default Redis version to use if no version is specified via command-line arguments.
54-
* Can be a specific version number (e.g., '6.2'), 'latest', or 'edge'.
55-
* If not provided, defaults to 'latest'.
67+
* The default Docker version to use if no version is specified via command-line arguments.
68+
* Can be a string (e.g., '6.2', 'latest', 'edge') or an object with tag and version
69+
* for cases where the tag doesn't contain a parseable version.
70+
*
71+
* @example
72+
* // Simple string format
73+
* defaultDockerVersion: '8.4'
74+
*
75+
* // Object format for custom tags
76+
* defaultDockerVersion: { tag: 'custom-build-123', version: '8.6' }
5677
*
5778
* @optional
5879
* @default 'latest'
5980
*/
60-
defaultDockerVersion?: string;
81+
defaultDockerVersion?: string | { tag: string; version: string };
6182
}
6283
interface CommonTestOptions {
6384
serverArguments: Array<string>;
@@ -132,7 +153,7 @@ interface AllTestOptions<
132153
}
133154

134155
interface Version {
135-
string: string;
156+
tag: string;
136157
numbers: Array<number>;
137158
}
138159

@@ -158,30 +179,55 @@ export default class TestUtils {
158179
return value;
159180
});
160181
}
161-
static #getVersion(argumentName: string, defaultVersion = 'latest'): Version {
162-
return yargs(hideBin(process.argv))
163-
.option(argumentName, {
182+
static #getVersion(
183+
tagArgumentName: string,
184+
versionArgumentName: string | undefined,
185+
defaultVersion: string | { tag: string; version: string } = 'latest'
186+
): Version {
187+
const isObjectFormat = typeof defaultVersion !== 'string';
188+
const defaultTag = isObjectFormat ? defaultVersion.tag : defaultVersion;
189+
const defaultVersionString = isObjectFormat ? defaultVersion.version : undefined;
190+
191+
const args = yargs(hideBin(process.argv))
192+
.option(tagArgumentName, {
164193
type: 'string',
165-
default: defaultVersion
194+
default: defaultTag,
195+
description: 'Docker image tag to use'
166196
})
167-
.coerce(argumentName, (version: string) => {
168-
return {
169-
string: version,
170-
numbers: TestUtils.parseVersionNumber(version)
171-
};
197+
.option(versionArgumentName ?? 'redis-version', {
198+
type: 'string',
199+
description: 'Redis version (if not parseable from tag)'
172200
})
173-
.demandOption(argumentName)
174-
.parseSync()[argumentName];
201+
.parseSync();
202+
203+
const tag = args[tagArgumentName] as string;
204+
const explicitVersion = versionArgumentName ? args[versionArgumentName] as string | undefined : undefined;
205+
206+
// Priority: 1) CLI --redis-version, 2) default version from object format, 3) parse from tag
207+
let versionToParse: string;
208+
if (explicitVersion) {
209+
versionToParse = explicitVersion;
210+
} else if (tag === defaultTag && defaultVersionString) {
211+
// Using default tag and we have an explicit version for it
212+
versionToParse = defaultVersionString;
213+
} else {
214+
versionToParse = tag;
215+
}
216+
217+
return {
218+
tag,
219+
numbers: TestUtils.parseVersionNumber(versionToParse)
220+
};
175221
}
176222

177223
readonly #VERSION_NUMBERS: Array<number>;
178224
readonly #DOCKER_IMAGE: RedisServerDockerOptions;
179225

180-
constructor({ string, numbers }: Version, dockerImageName: string) {
226+
constructor({ tag, numbers }: Version, dockerImageName: string) {
181227
this.#VERSION_NUMBERS = numbers;
182228
this.#DOCKER_IMAGE = {
183229
image: dockerImageName,
184-
version: string,
230+
version: tag,
185231
mode: "server"
186232
};
187233
}
@@ -191,14 +237,20 @@ export default class TestUtils {
191237
*
192238
* @param config - Configuration object containing Docker image and version settings
193239
* @param config.dockerImageName - The name of the Docker image to use for tests
194-
* @param config.dockerImageVersionArgument - The command-line argument name for specifying Redis version
195-
* @param config.defaultDockerVersion - Optional default Redis version if not specified via arguments
240+
* @param config.dockerImageTagArgument - The command-line argument name for specifying Docker image tag
241+
* @param config.dockerImageVersionArgument - Optional command-line argument name for specifying Redis version
242+
* @param config.defaultDockerVersion - Optional default Docker version if not specified via arguments
196243
* @returns A new TestUtils instance configured with the provided settings
197244
*/
198245
public static createFromConfig(config: TestUtilsConfig) {
199246
return new TestUtils(
200-
TestUtils.#getVersion(config.dockerImageVersionArgument,
201-
config.defaultDockerVersion), config.dockerImageName);
247+
TestUtils.#getVersion(
248+
config.dockerImageTagArgument,
249+
config.dockerImageVersionArgument,
250+
config.defaultDockerVersion
251+
),
252+
config.dockerImageName
253+
);
202254
}
203255

204256
isVersionGreaterThan(minimumVersion: Array<number> | undefined): boolean {

packages/test-utils/lib/test-utils.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ import TestUtils from './index'
22

33
export const testUtils = TestUtils.createFromConfig({
44
dockerImageName: 'redislabs/client-libs-test',
5+
dockerImageTagArgument: 'redis-tag',
56
dockerImageVersionArgument: 'redis-version',
6-
defaultDockerVersion: '8.4.0'
7+
defaultDockerVersion: { tag: 'custom-21183968220-debian-amd64', version: '8.6' }
78
});
89

910

0 commit comments

Comments
 (0)