From 45f0e11f6933c95363a5a8e39e7d78fa6859a447 Mon Sep 17 00:00:00 2001 From: Steffen Beisenherz <13799656+Sironheart@users.noreply.github.com> Date: Sun, 23 Oct 2022 14:56:44 +0200 Subject: [PATCH] feat: Add postgres container --- src/Container/Container.php | 2 +- src/Container/MariaDBContainer.php | 2 +- src/Container/MySQLContainer.php | 2 +- src/Container/OpenSearchContainer.php | 2 +- src/Container/PostgresContainer.php | 33 +++++++++++++++++++++++++++ src/Container/RedisContainer.php | 2 +- tests/Integration/ContainerTest.php | 23 +++++++++++++++++++ 7 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 src/Container/PostgresContainer.php diff --git a/src/Container/Container.php b/src/Container/Container.php index b02b8b6..319454c 100644 --- a/src/Container/Container.php +++ b/src/Container/Container.php @@ -38,7 +38,7 @@ class Container */ private array $mounts = []; - public function __construct(private string $image) + protected function __construct(private string $image) { $this->wait = new WaitForNothing(); } diff --git a/src/Container/MariaDBContainer.php b/src/Container/MariaDBContainer.php index 7096e77..f131692 100644 --- a/src/Container/MariaDBContainer.php +++ b/src/Container/MariaDBContainer.php @@ -8,7 +8,7 @@ use Testcontainer\Wait\WaitForExec; class MariaDBContainer extends Container { - public function __construct(string $version = 'latest', string $mysqlRootPassword = 'root') + private function __construct(string $version, string $mysqlRootPassword) { parent::__construct('mariadb:' . $version); $this->withEnvironment('MARIADB_ROOT_PASSWORD', $mysqlRootPassword); diff --git a/src/Container/MySQLContainer.php b/src/Container/MySQLContainer.php index c233072..d9bfb42 100644 --- a/src/Container/MySQLContainer.php +++ b/src/Container/MySQLContainer.php @@ -8,7 +8,7 @@ use Testcontainer\Wait\WaitForExec; class MySQLContainer extends Container { - public function __construct(string $version = 'latest', string $mysqlRootPassword = 'root') + private function __construct(string $version, string $mysqlRootPassword) { parent::__construct('mysql:' . $version); $this->withEnvironment('MYSQL_ROOT_PASSWORD', $mysqlRootPassword); diff --git a/src/Container/OpenSearchContainer.php b/src/Container/OpenSearchContainer.php index 569864c..87c7f3a 100644 --- a/src/Container/OpenSearchContainer.php +++ b/src/Container/OpenSearchContainer.php @@ -8,7 +8,7 @@ use Testcontainer\Wait\WaitForHttp; class OpenSearchContainer extends Container { - public function __construct(string $version = 'latest') + private function __construct(string $version) { parent::__construct('opensearchproject/opensearch:' . $version); $this->withEnvironment('discovery.type', 'single-node'); diff --git a/src/Container/PostgresContainer.php b/src/Container/PostgresContainer.php new file mode 100644 index 0000000..cccb20c --- /dev/null +++ b/src/Container/PostgresContainer.php @@ -0,0 +1,33 @@ +withEnvironment('POSTGRES_PASSWORD', $rootPassword); + } + + public static function make(string $version = 'latest', string $mysqlRootPassword = 'root'): self + { + return new self($version, $mysqlRootPassword); + } + + public function withPostgresUser(string $username): self + { + $this->withEnvironment('POSTGRES_USER', $username); + + return $this; + } + + public function withPostgresDatabase(string $database): self + { + $this->withEnvironment('POSTGRES_DB', $database); + + return $this; + } +} diff --git a/src/Container/RedisContainer.php b/src/Container/RedisContainer.php index ab8e9c2..f6aef9f 100644 --- a/src/Container/RedisContainer.php +++ b/src/Container/RedisContainer.php @@ -8,7 +8,7 @@ use Testcontainer\Wait\WaitForLog; class RedisContainer extends Container { - public function __construct(string $version = 'latest') + private function __construct(string $version) { parent::__construct('redis:' . $version); $this->withWait(new WaitForLog('Ready to accept connections')); diff --git a/tests/Integration/ContainerTest.php b/tests/Integration/ContainerTest.php index 9cf947c..3550670 100644 --- a/tests/Integration/ContainerTest.php +++ b/tests/Integration/ContainerTest.php @@ -9,6 +9,7 @@ use Redis; use Testcontainer\Container\MariaDBContainer; use Testcontainer\Container\MySQLContainer; use Testcontainer\Container\OpenSearchContainer; +use Testcontainer\Container\PostgresContainer; use Testcontainer\Container\RedisContainer; class ContainerTest extends TestCase @@ -95,4 +96,26 @@ class ContainerTest extends TestCase $this->assertEquals('docker-cluster', $data['cluster_name']); } + + public function testPostgreSQLContainer(): void + { + $container = PostgresContainer::make('latest', 'test') + ->withPostgresUser('test') + ->withPostgresDatabase('foo'); + + + $pdo = new \PDO( + sprintf('postgres:host=%s;port=3306', $container->getAddress()), + 'test', + 'test', + ); + + $query = $pdo->query('SHOW databases'); + + $this->assertInstanceOf(\PDOStatement::class, $query); + + $databases = $query->fetchAll(\PDO::FETCH_COLUMN); + + $this->assertContains('foo', $databases); + } }