From f3599f8b1570002fbc88719224f836ad2e3e9877 Mon Sep 17 00:00:00 2001 From: Carlo Cervellin Date: Tue, 20 May 2025 14:32:15 +0200 Subject: [PATCH 1/7] test: add redis-stack-server json module test --- .../modules/redis/src/redis-container.test.ts | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/modules/redis/src/redis-container.test.ts b/packages/modules/redis/src/redis-container.test.ts index 988ace1eb..7b6a6c48a 100644 --- a/packages/modules/redis/src/redis-container.test.ts +++ b/packages/modules/redis/src/redis-container.test.ts @@ -1,7 +1,7 @@ import fs from "fs"; import os from "os"; import path from "path"; -import { createClient } from "redis"; +import { createClient, RedisClientOptions } from "redis"; import { RedisContainer, StartedRedisContainer } from "./redis-container"; describe("RedisContainer", { timeout: 240_000 }, () => { @@ -102,10 +102,26 @@ describe("RedisContainer", { timeout: 240_000 }, () => { }); // } + it("should start with redis-stack-server and json module", async () => { + const password = "testPassword"; + const container = await new RedisContainer("redis/redis-stack-server:latest").withPassword(password).start(); + const client = await connectTo(container, { + password, + }); + + await client.json.set("key", "$", JSON.stringify({ name: "test" })); + const result = await client.json.get("key"); + expect(result).toEqual(JSON.stringify({ name: "test" })); + + await client.disconnect(); + await container.stop(); + }); + // simpleConnect { - async function connectTo(container: StartedRedisContainer) { + async function connectTo(container: StartedRedisContainer, options?: Partial) { const client = createClient({ url: container.getConnectionUrl(), + ...options, }); await client.connect(); expect(client.isOpen).toBeTruthy(); From 700fc03973bbe6728ae5c5198b63044367575ddb Mon Sep 17 00:00:00 2001 From: Carlo Cervellin Date: Tue, 20 May 2025 17:36:44 +0200 Subject: [PATCH 2/7] feat: use redis stack entrypoint for redis stack images --- .../modules/redis/src/redis-container.test.ts | 12 ++++-------- packages/modules/redis/src/redis-container.ts | 17 ++++++++++++----- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/packages/modules/redis/src/redis-container.test.ts b/packages/modules/redis/src/redis-container.test.ts index 7b6a6c48a..fb83f9089 100644 --- a/packages/modules/redis/src/redis-container.test.ts +++ b/packages/modules/redis/src/redis-container.test.ts @@ -1,7 +1,7 @@ import fs from "fs"; import os from "os"; import path from "path"; -import { createClient, RedisClientOptions } from "redis"; +import { createClient } from "redis"; import { RedisContainer, StartedRedisContainer } from "./redis-container"; describe("RedisContainer", { timeout: 240_000 }, () => { @@ -103,11 +103,8 @@ describe("RedisContainer", { timeout: 240_000 }, () => { // } it("should start with redis-stack-server and json module", async () => { - const password = "testPassword"; - const container = await new RedisContainer("redis/redis-stack-server:latest").withPassword(password).start(); - const client = await connectTo(container, { - password, - }); + const container = await new RedisContainer("redis/redis-stack-server:latest").withPassword("testPassword").start(); + const client = await connectTo(container); await client.json.set("key", "$", JSON.stringify({ name: "test" })); const result = await client.json.get("key"); @@ -118,10 +115,9 @@ describe("RedisContainer", { timeout: 240_000 }, () => { }); // simpleConnect { - async function connectTo(container: StartedRedisContainer, options?: Partial) { + async function connectTo(container: StartedRedisContainer) { const client = createClient({ url: container.getConnectionUrl(), - ...options, }); await client.connect(); expect(client.isOpen).toBeTruthy(); diff --git a/packages/modules/redis/src/redis-container.ts b/packages/modules/redis/src/redis-container.ts index 6091872bd..187ea43a7 100644 --- a/packages/modules/redis/src/redis-container.ts +++ b/packages/modules/redis/src/redis-container.ts @@ -38,12 +38,19 @@ export class RedisContainer extends GenericContainer { } } - public override async start(): Promise { - this.withCommand([ - "redis-server", - ...(this.password ? [`--requirepass "${this.password}"`] : []), + public override async start(options?: string[]): Promise { + const redisArgs = [ + ...(this.password ? [`--requirepass ${this.password}`] : []), ...(this.persistenceVolume ? ["--save 1 1 ", "--appendonly yes"] : []), - ]); + ...(options ?? []), + ]; + if (this.imageName.image.includes("redis-stack")) { + this.withEnvironment({ + REDIS_ARGS: redisArgs.join(" "), + }).withEntrypoint(["/entrypoint.sh"]); + } else { + this.withCommand(["redis-server", ...redisArgs]); + } if (this.persistenceVolume) { this.withBindMounts([{ mode: "rw", source: this.persistenceVolume, target: "/data" }]); } From 8e5b84f04c5d445905df8e4192e158be95d526fe Mon Sep 17 00:00:00 2001 From: Carlo Cervellin Date: Tue, 20 May 2025 17:54:13 +0200 Subject: [PATCH 3/7] docs: add docs --- docs/modules/redis.md | 16 ++++++++++++++++ .../modules/redis/src/redis-container.test.ts | 2 ++ 2 files changed, 18 insertions(+) diff --git a/docs/modules/redis.md b/docs/modules/redis.md index 63279a906..aa490c1f4 100644 --- a/docs/modules/redis.md +++ b/docs/modules/redis.md @@ -11,21 +11,37 @@ npm install @testcontainers/redis --save-dev ## Examples + [Start container:](../../packages/modules/redis/src/redis-container.test.ts) inside_block:startContainer + + [Connect redis client to container:](../../packages/modules/redis/src/redis-container.test.ts) inside_block:simpleConnect + + [Start container with password authentication:](../../packages/modules/redis/src/redis-container.test.ts) inside_block:startWithCredentials + + [Define volume for persistent/predefined data:](../../packages/modules/redis/src/redis-container.test.ts) inside_block:persistentData + + +[Define volume for persistent/predefined data:](../../packages/modules/redis/src/redis-container.test.ts) inside_block:startWithRedisStack + + + + + [Execute a command inside the container:](../../packages/modules/redis/src/redis-container.test.ts) inside_block:executeCommand + diff --git a/packages/modules/redis/src/redis-container.test.ts b/packages/modules/redis/src/redis-container.test.ts index fb83f9089..902c16d14 100644 --- a/packages/modules/redis/src/redis-container.test.ts +++ b/packages/modules/redis/src/redis-container.test.ts @@ -102,6 +102,7 @@ describe("RedisContainer", { timeout: 240_000 }, () => { }); // } + // startWithRedisStack { it("should start with redis-stack-server and json module", async () => { const container = await new RedisContainer("redis/redis-stack-server:latest").withPassword("testPassword").start(); const client = await connectTo(container); @@ -113,6 +114,7 @@ describe("RedisContainer", { timeout: 240_000 }, () => { await client.disconnect(); await container.stop(); }); + // } // simpleConnect { async function connectTo(container: StartedRedisContainer) { From bdc077244351d3135cb045764c0159b90926b7eb Mon Sep 17 00:00:00 2001 From: Carlo Cervellin Date: Tue, 20 May 2025 17:56:34 +0200 Subject: [PATCH 4/7] perf: remove unnecessary argument --- packages/modules/redis/src/redis-container.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/modules/redis/src/redis-container.ts b/packages/modules/redis/src/redis-container.ts index 187ea43a7..314ab9ced 100644 --- a/packages/modules/redis/src/redis-container.ts +++ b/packages/modules/redis/src/redis-container.ts @@ -38,11 +38,10 @@ export class RedisContainer extends GenericContainer { } } - public override async start(options?: string[]): Promise { + public override async start(): Promise { const redisArgs = [ ...(this.password ? [`--requirepass ${this.password}`] : []), ...(this.persistenceVolume ? ["--save 1 1 ", "--appendonly yes"] : []), - ...(options ?? []), ]; if (this.imageName.image.includes("redis-stack")) { this.withEnvironment({ From 6df5e26f0a5038c08e536f9a6f7eecbb59ef00e0 Mon Sep 17 00:00:00 2001 From: Carlo Cervellin Date: Tue, 20 May 2025 18:05:27 +0200 Subject: [PATCH 5/7] docs: update --- docs/modules/redis.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/modules/redis.md b/docs/modules/redis.md index aa490c1f4..b6468fe5b 100644 --- a/docs/modules/redis.md +++ b/docs/modules/redis.md @@ -36,7 +36,7 @@ npm install @testcontainers/redis --save-dev -[Define volume for persistent/predefined data:](../../packages/modules/redis/src/redis-container.test.ts) inside_block:startWithRedisStack +[Start container with redis/redis-stack-server image:](../../packages/modules/redis/src/redis-container.test.ts) inside_block:startWithRedisStack From dd559619776bf77d3763fc1f41b3112eeb9ddf29 Mon Sep 17 00:00:00 2001 From: Carlo Cervellin Date: Tue, 20 May 2025 18:06:59 +0200 Subject: [PATCH 6/7] test: update --- packages/modules/redis/src/redis-container.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/modules/redis/src/redis-container.test.ts b/packages/modules/redis/src/redis-container.test.ts index 902c16d14..5e5c0af36 100644 --- a/packages/modules/redis/src/redis-container.test.ts +++ b/packages/modules/redis/src/redis-container.test.ts @@ -107,9 +107,9 @@ describe("RedisContainer", { timeout: 240_000 }, () => { const container = await new RedisContainer("redis/redis-stack-server:latest").withPassword("testPassword").start(); const client = await connectTo(container); - await client.json.set("key", "$", JSON.stringify({ name: "test" })); + await client.json.set("key", "$", { name: "test" }); const result = await client.json.get("key"); - expect(result).toEqual(JSON.stringify({ name: "test" })); + expect(result).toEqual({ name: "test" }); await client.disconnect(); await container.stop(); From 9b345c9e26ba74fee38ddf17a3ea94cf246c3322 Mon Sep 17 00:00:00 2001 From: Carlo Cervellin Date: Tue, 20 May 2025 21:27:55 +0200 Subject: [PATCH 7/7] test: fixed image version --- packages/modules/redis/src/redis-container.test.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/modules/redis/src/redis-container.test.ts b/packages/modules/redis/src/redis-container.test.ts index 5e5c0af36..86fa43ad3 100644 --- a/packages/modules/redis/src/redis-container.test.ts +++ b/packages/modules/redis/src/redis-container.test.ts @@ -104,7 +104,9 @@ describe("RedisContainer", { timeout: 240_000 }, () => { // startWithRedisStack { it("should start with redis-stack-server and json module", async () => { - const container = await new RedisContainer("redis/redis-stack-server:latest").withPassword("testPassword").start(); + const container = await new RedisContainer("redis/redis-stack-server:7.4.0-v4") + .withPassword("testPassword") + .start(); const client = await connectTo(container); await client.json.set("key", "$", { name: "test" });