Skip to content

Commit ed58dbd

Browse files
author
Cristian Greco
committed
Refactor flag management to base class
1 parent 94cefb3 commit ed58dbd

File tree

4 files changed

+54
-103
lines changed

4 files changed

+54
-103
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { GenericContainer, Wait } from "testcontainers";
2+
import { EmulatorFlagsManager } from "./emulator-flags-manager";
3+
4+
export class AbstractGcloudEmulator extends GenericContainer {
5+
private readonly flagsManager: EmulatorFlagsManager;
6+
7+
constructor(
8+
image: string,
9+
port: number,
10+
private readonly cmd: string,
11+
) {
12+
super(image);
13+
this.flagsManager = new EmulatorFlagsManager();
14+
this.withExposedPorts(port)
15+
.withFlag("host-port", `0.0.0.0:${port}`)
16+
.withWaitStrategy(Wait.forLogMessage(/.*running.*/))
17+
.withStartupTimeout(120_000);
18+
}
19+
20+
/**
21+
* Adds flag as argument to emulator start command.
22+
* Adding same flag name twice replaces existing flag value.
23+
* @param name flag name. Must be set to non-empty string. May optionally contain -- prefix.
24+
* @param value flag value. May be empty string.
25+
* @returns this instance for chaining.
26+
*/
27+
public withFlag(name: string, value: string) {
28+
this.flagsManager.withFlag(name, value);
29+
return this;
30+
}
31+
32+
public override async beforeContainerCreated(): Promise<void> {
33+
this.withCommand(["/bin/sh", "-c", `${this.cmd} ${this.flagsManager.expandFlags()}`]);
34+
}
35+
}

packages/modules/gcloud/src/datastore-emulator-container.ts

Lines changed: 5 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,16 @@
1-
import { AbstractStartedContainer, GenericContainer, StartedTestContainer, Wait } from "testcontainers";
2-
import { EmulatorFlagsManager } from "./emulator-flags-manager";
1+
import { AbstractStartedContainer, StartedTestContainer } from "testcontainers";
2+
import { AbstractGcloudEmulator } from "./abstract-gcloud-emulator";
33

44
const EMULATOR_PORT = 8080;
5-
const CMD = `gcloud beta emulators firestore start`;
65
const DEFAULT_IMAGE = "gcr.io/google.com/cloudsdktool/cloud-sdk";
76

8-
export class DatastoreEmulatorContainer extends GenericContainer {
9-
private readonly _flagsManager: EmulatorFlagsManager;
7+
export class DatastoreEmulatorContainer extends AbstractGcloudEmulator {
108
constructor(image = DEFAULT_IMAGE) {
11-
super(image);
12-
this._flagsManager = new EmulatorFlagsManager();
13-
this.withExposedPorts(EMULATOR_PORT)
14-
.withFlag("host-port", `0.0.0.0:${EMULATOR_PORT}`)
15-
.withFlag("database-mode", `datastore-mode`)
16-
.withWaitStrategy(Wait.forLogMessage(/.*running.*/, 1))
17-
.withStartupTimeout(120_000);
18-
}
19-
20-
private getCmd(): string {
21-
return `${CMD} ${this.flagsManager.expandFlags()}`;
22-
}
23-
24-
private get flagsManager() {
25-
return this._flagsManager;
26-
}
27-
28-
/**
29-
* Adds flag as argument to emulator start command.
30-
* Adding same flag name twice replaces existing flag value.
31-
* @param name flag name. Must be set to non-empty string. May optionally contain -- prefix.
32-
* @param value flag value. May be empty string.
33-
* @returns this instance for chaining.
34-
*/
35-
public withFlag(name: string, value: string) {
36-
this.flagsManager.withFlag(name, value);
37-
return this;
9+
super(image, EMULATOR_PORT, "gcloud beta emulators firestore start");
10+
this.withFlag("database-mode", `datastore-mode`);
3811
}
3912

4013
public override async start(): Promise<StartedDatastoreEmulatorContainer> {
41-
// expand all flags and get final command
42-
this.withCommand(["/bin/sh", "-c", this.getCmd()]);
4314
return new StartedDatastoreEmulatorContainer(await super.start());
4415
}
4516
}

packages/modules/gcloud/src/firestore-emulator-container.ts

Lines changed: 4 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,15 @@
1-
import { AbstractStartedContainer, GenericContainer, StartedTestContainer, Wait } from "testcontainers";
2-
import { EmulatorFlagsManager } from "./emulator-flags-manager";
1+
import { AbstractStartedContainer, StartedTestContainer } from "testcontainers";
2+
import { AbstractGcloudEmulator } from "./abstract-gcloud-emulator";
33

44
const EMULATOR_PORT = 8080;
5-
const CMD = `gcloud beta emulators firestore start`;
65
const DEFAULT_IMAGE = "gcr.io/google.com/cloudsdktool/cloud-sdk";
76

8-
export class FirestoreEmulatorContainer extends GenericContainer {
9-
private readonly _flagsManager: EmulatorFlagsManager;
7+
export class FirestoreEmulatorContainer extends AbstractGcloudEmulator {
108
constructor(image = DEFAULT_IMAGE) {
11-
super(image);
12-
this._flagsManager = new EmulatorFlagsManager();
13-
this.withExposedPorts(EMULATOR_PORT)
14-
.withFlag("host-port", `0.0.0.0:${EMULATOR_PORT}`)
15-
.withWaitStrategy(Wait.forLogMessage(/.*running.*/, 1))
16-
.withStartupTimeout(120_000);
17-
}
18-
19-
private getCmd(): string {
20-
return `${CMD} ${this.flagsManager.expandFlags()}`;
21-
}
22-
23-
private get flagsManager() {
24-
return this._flagsManager;
25-
}
26-
27-
/**
28-
* Adds flag as argument to emulator start command.
29-
* Adding same flag name twice replaces existing flag value.
30-
* @param name flag name. Must be set to non-empty string. May optionally contain -- prefix.
31-
* @param value flag value. May be empty string.
32-
* @returns this instance for chaining.
33-
*/
34-
public withFlag(name: string, value: string) {
35-
this.flagsManager.withFlag(name, value);
36-
return this;
9+
super(image, EMULATOR_PORT, "gcloud beta emulators firestore start");
3710
}
3811

3912
public override async start(): Promise<StartedFirestoreEmulatorContainer> {
40-
// expand all flags and get final command
41-
this.withCommand(["/bin/sh", "-c", this.getCmd()]);
4213
return new StartedFirestoreEmulatorContainer(await super.start());
4314
}
4415
}

packages/modules/gcloud/src/pubsub-emulator-container.ts

Lines changed: 10 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,15 @@
1-
import { AbstractStartedContainer, GenericContainer, StartedTestContainer, Wait } from "testcontainers";
2-
import { EmulatorFlagsManager } from "./emulator-flags-manager";
1+
import { AbstractStartedContainer, StartedTestContainer, Wait } from "testcontainers";
2+
import { AbstractGcloudEmulator } from "./abstract-gcloud-emulator";
33

44
const EMULATOR_PORT = 8085;
5-
const CMD = "gcloud beta emulators pubsub start";
65
const DEFAULT_IMAGE = "gcr.io/google.com/cloudsdktool/google-cloud-cli";
76

8-
export class PubSubEmulatorContainer extends GenericContainer {
9-
private readonly _flagsManager: EmulatorFlagsManager;
7+
export class PubSubEmulatorContainer extends AbstractGcloudEmulator {
108
private _projectId?: string;
119

1210
constructor(image = DEFAULT_IMAGE) {
13-
super(image);
14-
this._flagsManager = new EmulatorFlagsManager();
15-
this.withExposedPorts(EMULATOR_PORT)
16-
.withFlag("host-port", `0.0.0.0:${EMULATOR_PORT}`)
17-
.withWaitStrategy(Wait.forLogMessage(/Server started/g, 1))
18-
.withStartupTimeout(120_000);
19-
}
20-
21-
private getCmd(): string {
22-
return `${CMD} ${this.flagsManager.expandFlags()}`;
23-
}
24-
25-
private get flagsManager() {
26-
return this._flagsManager;
27-
}
28-
29-
/**
30-
* Adds flag as argument to emulator start command.
31-
* Adding same flag name twice replaces existing flag value.
32-
* @param name flag name. Must be set to non-empty string. May optionally contain -- prefix.
33-
* @param value flag value. May be empty string.
34-
* @returns this instance for chaining.
35-
*/
36-
public withFlag(name: string, value: string) {
37-
this.flagsManager.withFlag(name, value);
38-
return this;
11+
super(image, EMULATOR_PORT, "gcloud beta emulators pubsub start");
12+
this.withWaitStrategy(Wait.forLogMessage(/Server started/g));
3913
}
4014

4115
public withProjectId(projectId: string): this {
@@ -44,18 +18,18 @@ export class PubSubEmulatorContainer extends GenericContainer {
4418
}
4519

4620
public override async start(): Promise<StartedPubSubEmulatorContainer> {
47-
// Determine the valid command-line prompt when starting the Pub/Sub emulator
4821
const selectedProjectId = this._projectId ?? "test-project";
49-
this.withFlag("project", selectedProjectId)
50-
// expand all flags and get final command
51-
.withCommand(["/bin/sh", "-c", this.getCmd()]);
22+
this.withFlag("project", selectedProjectId);
5223

5324
return new StartedPubSubEmulatorContainer(await super.start(), selectedProjectId);
5425
}
5526
}
5627

5728
export class StartedPubSubEmulatorContainer extends AbstractStartedContainer {
58-
constructor(startedTestContainer: StartedTestContainer, private readonly projectId: string) {
29+
constructor(
30+
startedTestContainer: StartedTestContainer,
31+
private readonly projectId: string,
32+
) {
5933
super(startedTestContainer);
6034
}
6135

0 commit comments

Comments
 (0)