From 2b9a0617bcb06977502f3746ab73d8f3eb398318 Mon Sep 17 00:00:00 2001 From: Charles Sprayberry Date: Thu, 2 Mar 2023 17:41:12 -0500 Subject: [PATCH] Add support for MySQL in PdoConnectionAdapter --- CHANGELOG.md | 3 ++ docker-compose.yml | 18 +++++++++ docker/mysql/Dockerfile | 7 ++++ docker/php/Dockerfile | 2 +- resources/schemas/mysql.sql | 5 +++ src/PdoDriver.php | 4 +- .../MysqlPdoConnectionAdapterTest.php | 38 +++++++++++++++++++ 7 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 docker/mysql/Dockerfile create mode 100644 resources/schemas/mysql.sql create mode 100644 tests/Integration/MysqlPdoConnectionAdapterTest.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 19a32ae..66efae6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,10 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased Changes +## [0.2.0](https://github.com/cspray/database-test-case/releases/tag/0.2.0) - 2023-03-02 + ### Added - Introduces a `Cspray\DatabaseTestCase\AbstractConnectionAdapter` for implementing functionality common across all `Cspray\DatabaseTestCase\ConnectionAdapter` implementations. - Provides the `Cspray\DatabaseTestCase\AmpPostgresConnectionAdapter` for working with the amphp/postgres library. +- Adds support for MySQL in `Cspray\DatabaseTestCase\PdoConnecitonAdapter`. The enum `Cspray\DatabaseTestCase\PdoDriver` has been updated to include this new option. ### Changed diff --git a/docker-compose.yml b/docker-compose.yml index 9d2b1ab..c8a2a59 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,6 +13,21 @@ services: networks: databasetestcase: + mysql: + build: + context: . + dockerfile: docker/mysql/Dockerfile + volumes: + - mysqldata:/var/lib/mysql + restart: unless-stopped + environment: + - MYSQL_DATABASE=mysql + - MYSQL_USER=mysql + - MYSQL_PASSWORD=mysql + - MYSQL_ROOT_PASSWORD=mysql + networks: + databasetestcase: + tests: build: context: . @@ -21,6 +36,8 @@ services: depends_on: postgres: condition: service_healthy + mysql: + condition: service_healthy volumes: - ./src:/app/src - ./tests:/app/tests @@ -34,4 +51,5 @@ networks: databasetestcase: volumes: + mysqldata: pgdata: \ No newline at end of file diff --git a/docker/mysql/Dockerfile b/docker/mysql/Dockerfile new file mode 100644 index 0000000..37602b9 --- /dev/null +++ b/docker/mysql/Dockerfile @@ -0,0 +1,7 @@ +FROM mysql:8-debian + +COPY /resources/schemas/mysql.sql /docker-entrypoint-initdb.d/ + +HEALTHCHECK --interval=5s --start-period=7s --retries=5 --timeout=5s CMD mysqladmin ping -h localhost + +USER mysql diff --git a/docker/php/Dockerfile b/docker/php/Dockerfile index 4c719e0..8fbe6d0 100644 --- a/docker/php/Dockerfile +++ b/docker/php/Dockerfile @@ -4,7 +4,7 @@ RUN apt-get update -y \ && apt-get upgrade -y RUN apt-get install git libsodium-dev libzip-dev libpq-dev -y -RUN docker-php-ext-install sodium zip pdo pdo_pgsql pgsql +RUN docker-php-ext-install sodium zip pdo pdo_pgsql pdo_mysql pgsql RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini" diff --git a/resources/schemas/mysql.sql b/resources/schemas/mysql.sql new file mode 100644 index 0000000..3b157fa --- /dev/null +++ b/resources/schemas/mysql.sql @@ -0,0 +1,5 @@ +CREATE TABLE my_table ( + id INT PRIMARY KEY AUTO_INCREMENT, + name VARCHAR(255), + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL +); \ No newline at end of file diff --git a/src/PdoDriver.php b/src/PdoDriver.php index edab1e7..34e9eaf 100644 --- a/src/PdoDriver.php +++ b/src/PdoDriver.php @@ -4,10 +4,12 @@ enum PdoDriver : string{ case Postgresql = 'pdo_pgsql'; + case Mysql = 'pdo_mysql'; public function getDsnIdentifier() : string { return match ($this) { - self::Postgresql => 'pgsql' + self::Postgresql => 'pgsql', + self::Mysql => 'mysql' }; } } \ No newline at end of file diff --git a/tests/Integration/MysqlPdoConnectionAdapterTest.php b/tests/Integration/MysqlPdoConnectionAdapterTest.php new file mode 100644 index 0000000..494826b --- /dev/null +++ b/tests/Integration/MysqlPdoConnectionAdapterTest.php @@ -0,0 +1,38 @@ +query('SELECT COUNT(*) AS "count" FROM ' . $table) + ->fetch(PDO::FETCH_ASSOC)['count']; + } + + protected static function getConnectionAdapter() : ConnectionAdapter { + return new PdoConnectionAdapter( + new ConnectionAdapterConfig( + 'mysql', + 'mysql', + 3306, + 'mysql', + 'mysql' + ), + PdoDriver::Mysql + ); + } +} \ No newline at end of file