From c3cd667286e186e016f6c523162ebcabfcc7f173 Mon Sep 17 00:00:00 2001 From: George Armstrong Date: Wed, 16 Jul 2025 17:58:31 +1000 Subject: [PATCH 1/6] Update nats-container.ts --- packages/modules/nats/src/nats-container.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/modules/nats/src/nats-container.ts b/packages/modules/nats/src/nats-container.ts index c3c5eb356..eb99506b1 100755 --- a/packages/modules/nats/src/nats-container.ts +++ b/packages/modules/nats/src/nats-container.ts @@ -10,7 +10,8 @@ const PASS_ARGUMENT_KEY = "--pass"; export class NatsContainer extends GenericContainer { private args = new Set(); private values = new Map(); - + private useCredenitals = true + constructor(image: string) { super(image); @@ -42,6 +43,11 @@ export class NatsContainer extends GenericContainer { return this; } + public noCredentials(): this { + this.useCredentials = false + return this + } + public withArg(name: string, value: string): this; public withArg(name: string): this; public withArg(...args: [string, string] | [string]): this { @@ -69,7 +75,7 @@ export class NatsContainer extends GenericContainer { public override async start(): Promise { this.withCommand(this.getNormalizedCommand()); - return new StartedNatsContainer(await super.start(), this.getUser(), this.getPass()); + return new StartedNatsContainer(await super.start(), this.useCredentials && this.getUser() || undefined, this.useCredentials && this.getPass() || undefined); } private getUser(): string | undefined { From cf96b476a3990fa34e3b6978848a7b39581894c0 Mon Sep 17 00:00:00 2001 From: george Date: Wed, 16 Jul 2025 18:14:23 +1000 Subject: [PATCH 2/6] allow no credentials in nats module --- .../modules/nats/src/nats-container.test.ts | 15 +++++++++- packages/modules/nats/src/nats-container.ts | 28 +++++++++++++------ 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/packages/modules/nats/src/nats-container.test.ts b/packages/modules/nats/src/nats-container.test.ts index ef73b2a5a..f5d2960c2 100644 --- a/packages/modules/nats/src/nats-container.test.ts +++ b/packages/modules/nats/src/nats-container.test.ts @@ -20,7 +20,20 @@ describe("NatsContainer", { timeout: 180_000 }, () => { await container.stop(); }); - // } + + it("should start, connect and close when noCredentials is true", async () => { + const container = await new NatsContainer(IMAGE).withCredentials(false).start(); + + // establish connection + const nc = await connect(container.getConnectionOptions()); + // close the connection + await nc.close(); + // check if the close was OK + const err = await nc.closed(); + expect(err).toBe(undefined); + + await container.stop(); + }); it("should start, connect and close using scratch image", async () => { const container = await new NatsContainer("nats:2.11").start(); diff --git a/packages/modules/nats/src/nats-container.ts b/packages/modules/nats/src/nats-container.ts index eb99506b1..1d92c5fee 100755 --- a/packages/modules/nats/src/nats-container.ts +++ b/packages/modules/nats/src/nats-container.ts @@ -10,8 +10,8 @@ const PASS_ARGUMENT_KEY = "--pass"; export class NatsContainer extends GenericContainer { private args = new Set(); private values = new Map(); - private useCredenitals = true - + private useCredentials = true; + constructor(image: string) { super(image); @@ -43,9 +43,16 @@ export class NatsContainer extends GenericContainer { return this; } - public noCredentials(): this { - this.useCredentials = false - return this + public withCredentials(useCredentials: boolean): this { + this.useCredentials = useCredentials; + if (!useCredentials) { + this.args.delete(USER_ARGUMENT_KEY); + this.args.delete(PASS_ARGUMENT_KEY); + } else { + this.withUsername("test"); + this.withPass("test"); + } + return this; } public withArg(name: string, value: string): this; @@ -75,7 +82,11 @@ export class NatsContainer extends GenericContainer { public override async start(): Promise { this.withCommand(this.getNormalizedCommand()); - return new StartedNatsContainer(await super.start(), this.useCredentials && this.getUser() || undefined, this.useCredentials && this.getPass() || undefined); + return new StartedNatsContainer( + await super.start(), + (this.useCredentials && this.getUser()) || undefined, + (this.useCredentials && this.getPass()) || undefined + ); } private getUser(): string | undefined { @@ -111,11 +122,12 @@ export class StartedNatsContainer extends AbstractStartedContainer { ) { super(startedTestContainer); const port = startedTestContainer.getMappedPort(CLIENT_PORT); - this.connectionOptions = { + this.connectionOptions = Object.assign({ servers: `${this.startedTestContainer.getHost()}:${port}`, + user: this.username, pass: this.password, - }; + }); } public getConnectionOptions(): NatsConnectionOptions { From 476b4ab75c11b1d9d2f4cda73a6fc2fa2b3f306f Mon Sep 17 00:00:00 2001 From: george Date: Wed, 16 Jul 2025 18:16:14 +1000 Subject: [PATCH 3/6] remove object assign and lint --- packages/modules/nats/src/nats-container.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/modules/nats/src/nats-container.ts b/packages/modules/nats/src/nats-container.ts index 1d92c5fee..9ea52a288 100755 --- a/packages/modules/nats/src/nats-container.ts +++ b/packages/modules/nats/src/nats-container.ts @@ -122,12 +122,11 @@ export class StartedNatsContainer extends AbstractStartedContainer { ) { super(startedTestContainer); const port = startedTestContainer.getMappedPort(CLIENT_PORT); - this.connectionOptions = Object.assign({ + this.connectionOptions = { servers: `${this.startedTestContainer.getHost()}:${port}`, - user: this.username, pass: this.password, - }); + }; } public getConnectionOptions(): NatsConnectionOptions { From 4542bbdd8c34a757f54d6ae00adf3feabc4b0a18 Mon Sep 17 00:00:00 2001 From: george Date: Wed, 16 Jul 2025 18:20:06 +1000 Subject: [PATCH 4/6] add docs --- docs/modules/nats.md | 4 ++++ packages/modules/nats/src/nats-container.test.ts | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/modules/nats.md b/docs/modules/nats.md index b79f13299..ec66e015e 100644 --- a/docs/modules/nats.md +++ b/docs/modules/nats.md @@ -22,6 +22,10 @@ npm install @testcontainers/nats --save-dev [Set credentials:](../../packages/modules/nats/src/nats-container.test.ts) inside_block:credentials + +[No credentials:](../../packages/modules/nats/src/nats-container.test.ts) inside_block:noCredentials + + [Enable JetStream:](../../packages/modules/nats/src/nats-container.test.ts) inside_block:jetstream \ No newline at end of file diff --git a/packages/modules/nats/src/nats-container.test.ts b/packages/modules/nats/src/nats-container.test.ts index f5d2960c2..455aba1d3 100644 --- a/packages/modules/nats/src/nats-container.test.ts +++ b/packages/modules/nats/src/nats-container.test.ts @@ -20,7 +20,7 @@ describe("NatsContainer", { timeout: 180_000 }, () => { await container.stop(); }); - + // noCredentials { it("should start, connect and close when noCredentials is true", async () => { const container = await new NatsContainer(IMAGE).withCredentials(false).start(); @@ -34,6 +34,7 @@ describe("NatsContainer", { timeout: 180_000 }, () => { await container.stop(); }); + //} it("should start, connect and close using scratch image", async () => { const container = await new NatsContainer("nats:2.11").start(); From 109fc797a91f4418548c0d3263916fbe0f9b3fb5 Mon Sep 17 00:00:00 2001 From: george Date: Wed, 16 Jul 2025 18:21:54 +1000 Subject: [PATCH 5/6] style fix --- packages/modules/nats/src/nats-container.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/modules/nats/src/nats-container.test.ts b/packages/modules/nats/src/nats-container.test.ts index 455aba1d3..1c292385c 100644 --- a/packages/modules/nats/src/nats-container.test.ts +++ b/packages/modules/nats/src/nats-container.test.ts @@ -34,7 +34,7 @@ describe("NatsContainer", { timeout: 180_000 }, () => { await container.stop(); }); - //} + // } it("should start, connect and close using scratch image", async () => { const container = await new NatsContainer("nats:2.11").start(); From 8570b79d63b1e34785956a13c44cef7efa4b0d47 Mon Sep 17 00:00:00 2001 From: george Date: Thu, 17 Jul 2025 11:31:27 +1000 Subject: [PATCH 6/6] refactor: update connection options assertions in NatsContainer tests --- packages/modules/nats/src/nats-container.test.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/modules/nats/src/nats-container.test.ts b/packages/modules/nats/src/nats-container.test.ts index 1c292385c..5bd9aca74 100644 --- a/packages/modules/nats/src/nats-container.test.ts +++ b/packages/modules/nats/src/nats-container.test.ts @@ -9,10 +9,11 @@ describe("NatsContainer", { timeout: 180_000 }, () => { // connect { it("should start, connect and close", async () => { const container = await new NatsContainer(IMAGE).start(); - + expect(container.getConnectionOptions().pass).toEqual("test"); + expect(container.getConnectionOptions().user).toEqual("test"); // establish connection const nc = await connect(container.getConnectionOptions()); - // close the connection + await nc.close(); // check if the close was OK const err = await nc.closed(); @@ -23,7 +24,8 @@ describe("NatsContainer", { timeout: 180_000 }, () => { // noCredentials { it("should start, connect and close when noCredentials is true", async () => { const container = await new NatsContainer(IMAGE).withCredentials(false).start(); - + expect(container.getConnectionOptions().user).toBeUndefined(); + expect(container.getConnectionOptions().pass).toBeUndefined(); // establish connection const nc = await connect(container.getConnectionOptions()); // close the connection