diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0d94fdc4..0caebe33 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -60,6 +60,7 @@ jobs: - name: Tests run: ./vendor/bin/pest --exclude-testsuite=Browser,Performance env: + TESTCONTAINERS: false DB_CONNECTION: mysql DB_HOST: 127.0.0.1 DB_PORT: 3306 @@ -118,6 +119,7 @@ jobs: - name: Browser Tests run: ./vendor/bin/pest --testsuite=Browser --ci env: + TESTCONTAINERS: false DB_CONNECTION: mysql DB_HOST: 127.0.0.1 DB_PORT: 3306 @@ -197,6 +199,7 @@ jobs: - name: Performance Tests run: ./vendor/bin/pest --testsuite=Performance env: + TESTCONTAINERS: false DB_CONNECTION: mysql DB_HOST: 127.0.0.1 DB_PORT: 3306 diff --git a/composer.json b/composer.json index 127a61cf..e64d69f2 100644 --- a/composer.json +++ b/composer.json @@ -32,7 +32,8 @@ "nunomaduro/collision": "^8.6", "pestphp/pest": "^4.1", "pestphp/pest-plugin-browser": "^4.0", - "pestphp/pest-plugin-laravel": "^4.0" + "pestphp/pest-plugin-laravel": "^4.0", + "testcontainers/testcontainers": "^1.0" }, "autoload": { "psr-4": { diff --git a/composer.lock b/composer.lock index 827c0021..1046b99b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6542d8efaa85230382eec1ee7879b3a2", + "content-hash": "3d386f9d4f41f3e20d9431bb81b4e030", "packages": [ { "name": "bacon/bacon-qr-code", @@ -8731,6 +8731,155 @@ ], "time": "2025-08-24T17:25:34+00:00" }, + { + "name": "beluga-php/docker-php", + "version": "v1.45.6", + "source": { + "type": "git", + "url": "https://github.com/beluga-php/docker-php.git", + "reference": "2eaf579e19ed08e8d3360bee545ad85f18deadc0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/beluga-php/docker-php/zipball/2eaf579e19ed08e8d3360bee545ad85f18deadc0", + "reference": "2eaf579e19ed08e8d3360bee545ad85f18deadc0", + "shasum": "" + }, + "require": { + "beluga-php/docker-php-api": "7.1.45.*", + "nyholm/psr7": "^1.8", + "php": ">=8.1", + "php-http/client-common": "^2.7", + "php-http/discovery": "^1.19", + "php-http/socket-client": "^2.3", + "psr/http-message": "^2.0", + "symfony/filesystem": "^6.3 || ^7.0 || ^8.0", + "symfony/process": "^6.3 || ^7.0 || ^8.0", + "symfony/serializer": "^6.3 || ^7.0 || ^8.0" + }, + "conflict": { + "docker-php/docker-php": "*", + "nikic/php-parser": "<4.13", + "php-http/message": "<1.15" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.42", + "friendsofphp/php-cs-fixer": "^3.8", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5.46", + "psy/psysh": "^0.12.8", + "roave/security-advisories": "dev-latest" + }, + "type": "library", + "extra": { + "branch-alias": { + "1.41": "1.41.x-dev", + "1.42": "1.42.x-dev", + "1.43": "1.43.x-dev", + "1.44": "1.44.x-dev", + "dev-master": "1.45.x-dev" + } + }, + "autoload": { + "psr-4": { + "Docker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A Docker PHP client", + "support": { + "issues": "https://github.com/beluga-php/docker-php/issues", + "source": "https://github.com/beluga-php/docker-php/tree/v1.45.6" + }, + "funding": [ + { + "url": "https://github.com/flavioheleno", + "type": "github" + } + ], + "time": "2025-12-27T21:42:50+00:00" + }, + { + "name": "beluga-php/docker-php-api", + "version": "v7.1.45.4", + "source": { + "type": "git", + "url": "https://github.com/beluga-php/docker-php-api.git", + "reference": "8f3ed3b9a69e161489e07664b99eb73258e7eef2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/beluga-php/docker-php-api/zipball/8f3ed3b9a69e161489e07664b99eb73258e7eef2", + "reference": "8f3ed3b9a69e161489e07664b99eb73258e7eef2", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "jane-php/json-schema-runtime": "^7.5", + "jane-php/open-api-runtime": "^7.5", + "php": ">=8.1", + "php-http/client-common": "^2.7", + "php-http/discovery": "^1.19", + "php-http/multipart-stream-builder": "^1.3", + "psr/http-client": "^1.0", + "psr/http-client-implementation": "*", + "psr/http-factory": "^1.0", + "psr/http-factory-implementation": "*", + "psr/http-message": "^2.0", + "psr/http-message-implementation": "*", + "symfony/deprecation-contracts": "^3.3", + "symfony/options-resolver": "^6.3 || ^7.0 || ^8.0", + "symfony/serializer": "^6.3 || ^7.0 || ^8.0", + "symfony/validator": "^6.3 || ^7.0 || ^8.0" + }, + "conflict": { + "docker-php/docker-php-api": "*" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.42", + "friendsofphp/php-cs-fixer": "^3.8", + "jane-php/open-api-3": "^7.4", + "roave/security-advisories": "dev-latest" + }, + "type": "library", + "extra": { + "branch-alias": { + "6.1.36": "6.1.36.x-dev", + "6.1.41": "6.1.41.x-dev", + "7.1.41": "7.1.41.x-dev", + "7.1.42": "7.1.42.x-dev", + "7.1.43": "7.1.43.x-dev", + "7.1.44": "7.1.44.x-dev", + "7.1.45": "7.1.45.x-dev", + "dev-main": "7.1.46.x-dev" + } + }, + "autoload": { + "psr-4": { + "Docker\\API\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Docker API generated files from OpenAPI Specification", + "support": { + "issues": "https://github.com/beluga-php/docker-php-api/issues", + "source": "https://github.com/beluga-php/docker-php-api/tree/v7.1.45.4" + }, + "funding": [ + { + "url": "https://github.com/flavioheleno", + "type": "github" + } + ], + "time": "2026-01-09T13:29:42+00:00" + }, { "name": "brianium/paratest", "version": "v7.19.0", @@ -8824,6 +8973,72 @@ ], "time": "2026-02-06T10:53:26+00:00" }, + { + "name": "clue/stream-filter", + "version": "v1.7.0", + "source": { + "type": "git", + "url": "https://github.com/clue/stream-filter.git", + "reference": "049509fef80032cb3f051595029ab75b49a3c2f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/stream-filter/zipball/049509fef80032cb3f051595029ab75b49a3c2f7", + "reference": "049509fef80032cb3f051595029ab75b49a3c2f7", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "Clue\\StreamFilter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "A simple and modern approach to stream filtering in PHP", + "homepage": "https://github.com/clue/stream-filter", + "keywords": [ + "bucket brigade", + "callback", + "filter", + "php_user_filter", + "stream", + "stream_filter_append", + "stream_filter_register" + ], + "support": { + "issues": "https://github.com/clue/stream-filter/issues", + "source": "https://github.com/clue/stream-filter/tree/v1.7.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2023-12-20T15:40:13+00:00" + }, { "name": "daverandom/libdns", "version": "v2.1.0", @@ -9162,6 +9377,131 @@ }, "time": "2025-04-30T06:54:44+00:00" }, + { + "name": "jane-php/json-schema-runtime", + "version": "v7.10.4", + "source": { + "type": "git", + "url": "https://github.com/janephp/json-schema-runtime.git", + "reference": "f1f96868836e7b9cfa45eb40d3afcd989f079a3a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/janephp/json-schema-runtime/zipball/f1f96868836e7b9cfa45eb40d3afcd989f079a3a", + "reference": "f1f96868836e7b9cfa45eb40d3afcd989f079a3a", + "shasum": "" + }, + "require": { + "ext-json": "*", + "league/uri": "^6.7.2 || ^7.4", + "php": "^8.1", + "php-jsonpointer/php-jsonpointer": "^3.0 || ^4.0", + "symfony/serializer": "^5.4 || ^6.4 || ^7.0 || ^8.0", + "symfony/yaml": "^5.4 || ^6.4 || ^7.0 || ^8.0" + }, + "conflict": { + "symfony/framework-bundle": "5.1.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-next": "7-dev" + } + }, + "autoload": { + "psr-4": { + "Jane\\Component\\JsonSchemaRuntime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Joel Wurtz", + "email": "jwurtz@jolicode.com" + }, + { + "name": "Baptiste Leduc", + "email": "baptiste.leduc@gmail.com" + } + ], + "description": "Jane runtime Library", + "support": { + "source": "https://github.com/janephp/json-schema-runtime/tree/v7.10.4" + }, + "time": "2026-01-12T19:55:34+00:00" + }, + { + "name": "jane-php/open-api-runtime", + "version": "v7.10.4", + "source": { + "type": "git", + "url": "https://github.com/janephp/open-api-runtime.git", + "reference": "825670a6cbd0e2b8246af0c1b15ce4b986318942" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/janephp/open-api-runtime/zipball/825670a6cbd0e2b8246af0c1b15ce4b986318942", + "reference": "825670a6cbd0e2b8246af0c1b15ce4b986318942", + "shasum": "" + }, + "require": { + "jane-php/json-schema-runtime": "^7.0", + "nyholm/psr7": "^1.8", + "php": "^8.1", + "php-http/client-common": "^2.0", + "php-http/discovery": "^1.6", + "php-http/multipart-stream-builder": "^1.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "symfony/options-resolver": "^5.4 || ^6.4 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5", + "symfony/serializer": "^5.4 || ^6.4 || ^7.0 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-next": "7-dev" + } + }, + "autoload": { + "psr-4": { + "Jane\\Component\\OpenApiRuntime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Joel Wurtz", + "email": "jwurtz@jolicode.com" + }, + { + "name": "Baptiste Leduc", + "email": "baptiste.leduc@gmail.com" + } + ], + "description": "Jane OpenAPI Runtime Library, dependencies and utility class for a library generated by jane/openapi", + "support": { + "source": "https://github.com/janephp/open-api-runtime/tree/v7.10.4" + }, + "time": "2026-01-12T19:55:34+00:00" + }, { "name": "kelunik/certificate", "version": "v1.1.3", @@ -10616,6 +10956,503 @@ }, "time": "2022-02-21T01:04:05+00:00" }, + { + "name": "php-http/client-common", + "version": "2.7.3", + "source": { + "type": "git", + "url": "https://github.com/php-http/client-common.git", + "reference": "dcc6de29c90dd74faab55f71b79d89409c4bf0c1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/client-common/zipball/dcc6de29c90dd74faab55f71b79d89409c4bf0c1", + "reference": "dcc6de29c90dd74faab55f71b79d89409c4bf0c1", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "php-http/httplug": "^2.0", + "php-http/message": "^1.6", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0 || ^2.0", + "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0 || ^7.0 || ^8.0", + "symfony/polyfill-php80": "^1.17" + }, + "require-dev": { + "doctrine/instantiator": "^1.1", + "guzzlehttp/psr7": "^1.4", + "nyholm/psr7": "^1.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.33 || ^9.6.7" + }, + "suggest": { + "ext-json": "To detect JSON responses with the ContentTypePlugin", + "ext-libxml": "To detect XML responses with the ContentTypePlugin", + "php-http/cache-plugin": "PSR-6 Cache plugin", + "php-http/logger-plugin": "PSR-3 Logger plugin", + "php-http/stopwatch-plugin": "Symfony Stopwatch plugin" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Client\\Common\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Common HTTP Client implementations and tools for HTTPlug", + "homepage": "http://httplug.io", + "keywords": [ + "client", + "common", + "http", + "httplug" + ], + "support": { + "issues": "https://github.com/php-http/client-common/issues", + "source": "https://github.com/php-http/client-common/tree/2.7.3" + }, + "time": "2025-11-29T19:12:34+00:00" + }, + { + "name": "php-http/discovery", + "version": "1.20.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/discovery.git", + "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/discovery/zipball/82fe4c73ef3363caed49ff8dd1539ba06044910d", + "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0|^2.0", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "nyholm/psr7": "<1.0", + "zendframework/zend-diactoros": "*" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "*", + "psr/http-factory-implementation": "*", + "psr/http-message-implementation": "*" + }, + "require-dev": { + "composer/composer": "^1.0.2|^2.0", + "graham-campbell/phpspec-skip-example-extension": "^5.0", + "php-http/httplug": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", + "sebastian/comparator": "^3.0.5 || ^4.0.8", + "symfony/phpunit-bridge": "^6.4.4 || ^7.0.1" + }, + "type": "composer-plugin", + "extra": { + "class": "Http\\Discovery\\Composer\\Plugin", + "plugin-optional": true + }, + "autoload": { + "psr-4": { + "Http\\Discovery\\": "src/" + }, + "exclude-from-classmap": [ + "src/Composer/Plugin.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", + "homepage": "http://php-http.org", + "keywords": [ + "adapter", + "client", + "discovery", + "factory", + "http", + "message", + "psr17", + "psr7" + ], + "support": { + "issues": "https://github.com/php-http/discovery/issues", + "source": "https://github.com/php-http/discovery/tree/1.20.0" + }, + "time": "2024-10-02T11:20:13+00:00" + }, + { + "name": "php-http/httplug", + "version": "2.4.1", + "source": { + "type": "git", + "url": "https://github.com/php-http/httplug.git", + "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/httplug/zipball/5cad731844891a4c282f3f3e1b582c46839d22f4", + "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "php-http/promise": "^1.1", + "psr/http-client": "^1.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0", + "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eric GELOEN", + "email": "geloen.eric@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "HTTPlug, the HTTP client abstraction for PHP", + "homepage": "http://httplug.io", + "keywords": [ + "client", + "http" + ], + "support": { + "issues": "https://github.com/php-http/httplug/issues", + "source": "https://github.com/php-http/httplug/tree/2.4.1" + }, + "time": "2024-09-23T11:39:58+00:00" + }, + { + "name": "php-http/message", + "version": "1.16.2", + "source": { + "type": "git", + "url": "https://github.com/php-http/message.git", + "reference": "06dd5e8562f84e641bf929bfe699ee0f5ce8080a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/message/zipball/06dd5e8562f84e641bf929bfe699ee0f5ce8080a", + "reference": "06dd5e8562f84e641bf929bfe699ee0f5ce8080a", + "shasum": "" + }, + "require": { + "clue/stream-filter": "^1.5", + "php": "^7.2 || ^8.0", + "psr/http-message": "^1.1 || ^2.0" + }, + "provide": { + "php-http/message-factory-implementation": "1.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.6", + "ext-zlib": "*", + "guzzlehttp/psr7": "^1.0 || ^2.0", + "laminas/laminas-diactoros": "^2.0 || ^3.0", + "php-http/message-factory": "^1.0.2", + "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1", + "slim/slim": "^3.0" + }, + "suggest": { + "ext-zlib": "Used with compressor/decompressor streams", + "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories", + "laminas/laminas-diactoros": "Used with Diactoros Factories", + "slim/slim": "Used with Slim Framework PSR-7 implementation" + }, + "type": "library", + "autoload": { + "files": [ + "src/filters.php" + ], + "psr-4": { + "Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "HTTP Message related tools", + "homepage": "http://php-http.org", + "keywords": [ + "http", + "message", + "psr-7" + ], + "support": { + "issues": "https://github.com/php-http/message/issues", + "source": "https://github.com/php-http/message/tree/1.16.2" + }, + "time": "2024-10-02T11:34:13+00:00" + }, + { + "name": "php-http/multipart-stream-builder", + "version": "1.4.2", + "source": { + "type": "git", + "url": "https://github.com/php-http/multipart-stream-builder.git", + "reference": "10086e6de6f53489cca5ecc45b6f468604d3460e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/multipart-stream-builder/zipball/10086e6de6f53489cca5ecc45b6f468604d3460e", + "reference": "10086e6de6f53489cca5ecc45b6f468604d3460e", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "php-http/discovery": "^1.15", + "psr/http-factory-implementation": "^1.0" + }, + "require-dev": { + "nyholm/psr7": "^1.0", + "php-http/message": "^1.5", + "php-http/message-factory": "^1.0.2", + "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Message\\MultipartStream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com" + } + ], + "description": "A builder class that help you create a multipart stream", + "homepage": "http://php-http.org", + "keywords": [ + "factory", + "http", + "message", + "multipart stream", + "stream" + ], + "support": { + "issues": "https://github.com/php-http/multipart-stream-builder/issues", + "source": "https://github.com/php-http/multipart-stream-builder/tree/1.4.2" + }, + "time": "2024-09-04T13:22:54+00:00" + }, + { + "name": "php-http/promise", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/php-http/promise.git", + "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/promise/zipball/fc85b1fba37c169a69a07ef0d5a8075770cc1f83", + "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "friends-of-phpspec/phpspec-code-coverage": "^4.3.2 || ^6.3", + "phpspec/phpspec": "^5.1.2 || ^6.2 || ^7.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Joel Wurtz", + "email": "joel.wurtz@gmail.com" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Promise used for asynchronous HTTP requests", + "homepage": "http://httplug.io", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/php-http/promise/issues", + "source": "https://github.com/php-http/promise/tree/1.3.1" + }, + "time": "2024-03-15T13:55:21+00:00" + }, + { + "name": "php-http/socket-client", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/socket-client.git", + "reference": "99bb89004e04b92bf4b688d40a1f06494a7063b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/socket-client/zipball/99bb89004e04b92bf4b688d40a1f06494a7063b3", + "reference": "99bb89004e04b92bf4b688d40a1f06494a7063b3", + "shasum": "" + }, + "require": { + "nyholm/psr7": "^1.8.1", + "php": "^8.1", + "php-http/httplug": "^2.4", + "psr/http-client": "^1.0", + "psr/http-message": "^1.0 || ^2.0", + "symfony/options-resolver": "^2.6 || ^3.4 || ^4.4 || ^5.0 || ^6.0 || ^7.0 || ^8.0" + }, + "conflict": { + "guzzlehttp/psr7": "<2.0" + }, + "provide": { + "php-http/client-implementation": "1.0", + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "ext-openssl": "*", + "friendsofphp/php-cs-fixer": "^3.51", + "php-http/client-common": "^2.7", + "php-http/client-integration-tests": "^4.0", + "php-http/message": "^1.16", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^10.0 || ^11.0 || ^12.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Http\\Client\\Socket\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Joel Wurtz", + "email": "jwurtz@jolicode.com" + } + ], + "description": "Socket client for PHP-HTTP", + "support": { + "issues": "https://github.com/php-http/socket-client/issues", + "source": "https://github.com/php-http/socket-client/tree/2.4.0" + }, + "time": "2026-01-10T10:45:38+00:00" + }, + { + "name": "php-jsonpointer/php-jsonpointer", + "version": "v4.0.0", + "source": { + "type": "git", + "url": "https://github.com/raphaelstolt/php-jsonpointer.git", + "reference": "fd50fc1aecd80dedb5bc59c9a1d70d4cfec7933b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/raphaelstolt/php-jsonpointer/zipball/fd50fc1aecd80dedb5bc59c9a1d70d4cfec7933b", + "reference": "fd50fc1aecd80dedb5bc59c9a1d70d4cfec7933b", + "shasum": "" + }, + "require": { + "php": ">=7.4" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.0", + "phpunit/phpunit": "8.*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Rs\\Json": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Raphael Stolt", + "email": "raphael.stolt@gmail.com", + "homepage": "http://raphaelstolt.blogspot.com/" + } + ], + "description": "Implementation of JSON Pointer (http://tools.ietf.org/html/rfc6901)", + "homepage": "https://github.com/raphaelstolt/php-jsonpointer", + "keywords": [ + "json", + "json pointer", + "json traversal" + ], + "support": { + "issues": "https://github.com/raphaelstolt/php-jsonpointer/issues", + "source": "https://github.com/raphaelstolt/php-jsonpointer/tree/v4.0.0" + }, + "time": "2022-01-11T14:28:07+00:00" + }, { "name": "phpdocumentor/reflection-common", "version": "2.2.0", @@ -12264,6 +13101,266 @@ ], "time": "2024-10-20T05:08:20+00:00" }, + { + "name": "symfony/filesystem", + "version": "v8.0.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "d937d400b980523dc9ee946bb69972b5e619058d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/d937d400b980523dc9ee946bb69972b5e619058d", + "reference": "d937d400b980523dc9ee946bb69972b5e619058d", + "shasum": "" + }, + "require": { + "php": ">=8.4", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "require-dev": { + "symfony/process": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v8.0.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2025-12-01T09:13:36+00:00" + }, + { + "name": "symfony/serializer", + "version": "v8.0.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/serializer.git", + "reference": "867a38a1927d23a503f7248aa182032c6ea42702" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/serializer/zipball/867a38a1927d23a503f7248aa182032c6ea42702", + "reference": "867a38a1927d23a503f7248aa182032c6ea42702", + "shasum": "" + }, + "require": { + "php": ">=8.4", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<5.2|>=6", + "phpdocumentor/type-resolver": "<1.5.1", + "symfony/property-info": "<7.3" + }, + "require-dev": { + "phpdocumentor/reflection-docblock": "^5.2", + "phpstan/phpdoc-parser": "^1.0|^2.0", + "seld/jsonlint": "^1.10", + "symfony/cache": "^7.4|^8.0", + "symfony/config": "^7.4|^8.0", + "symfony/console": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/error-handler": "^7.4|^8.0", + "symfony/filesystem": "^7.4|^8.0", + "symfony/form": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/messenger": "^7.4|^8.0", + "symfony/mime": "^7.4|^8.0", + "symfony/property-access": "^7.4|^8.0", + "symfony/property-info": "^7.4|^8.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/type-info": "^7.4|^8.0", + "symfony/uid": "^7.4|^8.0", + "symfony/validator": "^7.4|^8.0", + "symfony/var-dumper": "^7.4|^8.0", + "symfony/var-exporter": "^7.4|^8.0", + "symfony/yaml": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Serializer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/serializer/tree/v8.0.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-01-27T09:06:43+00:00" + }, + { + "name": "symfony/validator", + "version": "v8.0.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/validator.git", + "reference": "ba171e89ee2d01c24c1d8201d59ec595ef4adba1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/validator/zipball/ba171e89ee2d01c24c1d8201d59ec595ef4adba1", + "reference": "ba171e89ee2d01c24c1d8201d59ec595ef4adba1", + "shasum": "" + }, + "require": { + "php": ">=8.4", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.0", + "symfony/translation-contracts": "^2.5|^3" + }, + "conflict": { + "doctrine/lexer": "<1.1", + "symfony/doctrine-bridge": "<7.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3|^4", + "symfony/cache": "^7.4|^8.0", + "symfony/config": "^7.4|^8.0", + "symfony/console": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/finder": "^7.4|^8.0", + "symfony/http-client": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/intl": "^7.4|^8.0", + "symfony/mime": "^7.4|^8.0", + "symfony/process": "^7.4|^8.0", + "symfony/property-access": "^7.4|^8.0", + "symfony/property-info": "^7.4|^8.0", + "symfony/string": "^7.4|^8.0", + "symfony/translation": "^7.4|^8.0", + "symfony/type-info": "^7.4|^8.0", + "symfony/yaml": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Validator\\": "" + }, + "exclude-from-classmap": [ + "/Tests/", + "/Resources/bin/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to validate values", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/validator/tree/v8.0.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-01-27T09:06:10+00:00" + }, { "name": "symfony/yaml", "version": "v8.0.1", @@ -12398,6 +13495,65 @@ }, "time": "2026-02-17T17:25:14+00:00" }, + { + "name": "testcontainers/testcontainers", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/testcontainers/testcontainers-php.git", + "reference": "f78f10d283477cf8d3a7ceee34fb4449d1522f0e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/testcontainers/testcontainers-php/zipball/f78f10d283477cf8d3a7ceee34fb4449d1522f0e", + "reference": "f78f10d283477cf8d3a7ceee34fb4449d1522f0e", + "shasum": "" + }, + "require": { + "beluga-php/docker-php": "^1.45", + "ext-curl": "*", + "php": ">= 8.1" + }, + "require-dev": { + "brianium/paratest": "^6.11", + "ext-mongodb": "*", + "ext-pdo": "*", + "ext-pdo_mysql": "*", + "ext-pdo_pgsql": "*", + "friendsofphp/php-cs-fixer": "^3.92", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "predis/predis": "^3.0 || ^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Testcontainers\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Soner Sayakci", + "email": "github@shyim.de" + } + ], + "description": "Testcontainers implementation in PHP", + "keywords": [ + "docker", + "testcontainers" + ], + "support": { + "issues": "https://github.com/testcontainers/testcontainers-php/issues", + "source": "https://github.com/testcontainers/testcontainers-php/tree/1.0.4" + }, + "time": "2025-12-27T08:07:16+00:00" + }, { "name": "theseer/tokenizer", "version": "2.0.1", diff --git a/phpunit.xml b/phpunit.xml index 1ce6f296..f0136703 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -1,7 +1,7 @@ @@ -29,7 +29,6 @@ - diff --git a/tests/bootstrap.php b/tests/bootstrap.php new file mode 100644 index 00000000..4a9ea10b --- /dev/null +++ b/tests/bootstrap.php @@ -0,0 +1,73 @@ +withMySQLDatabase('testing') + ->withMySQLUser('testing', 'testing') + ->start(); + + // Stop and remove the container when the PHP process exits, even on + // crashes or SIGINT. testcontainers-php has no built-in cleanup. + register_shutdown_function(function () use ($container): void { + $container->stop(); + }); + + $host = $container->getHost(); + $port = (string) $container->getFirstMappedPort(); + + // Set environment variables before Laravel boots so config/database.php + // reads the dynamic host and port via env(). Both putenv() and $_ENV/$_SERVER + // are needed because Laravel's env() helper checks multiple sources. + $env = [ + 'DB_CONNECTION' => 'mysql', + 'DB_HOST' => $host, + 'DB_PORT' => $port, + 'DB_DATABASE' => 'testing', + 'DB_USERNAME' => 'testing', + 'DB_PASSWORD' => 'testing', + ]; + + // Generate an APP_KEY if one is not already set, so tests can run + // without a .env file (e.g. fresh worktrees, CI environments). + if (empty($_SERVER['APP_KEY'] ?? $_ENV['APP_KEY'] ?? getenv('APP_KEY'))) { + $env['APP_KEY'] = 'base64:'.base64_encode(random_bytes(32)); + } + + foreach ($env as $key => $value) { + putenv("{$key}={$value}"); + $_ENV[$key] = $value; + $_SERVER[$key] = $value; + } +}