diff --git a/composer.json b/composer.json index 8b040008..6f3aeae7 100644 --- a/composer.json +++ b/composer.json @@ -35,7 +35,7 @@ "amphp/cache": "^1.4.0", "amphp/windows-registry": "v0.3.3", "guzzlehttp/guzzle": "^6.5.8|^7.4.5", - "phpunit/phpunit": ">=8.5.23", + "phpunit/phpunit": ">=8.5.23 <10", "tienvx/composer-downloads-plugin": "^1.1.0" }, "require-dev": { @@ -45,7 +45,7 @@ "slim/psr7": "^1.2.0", "friendsofphp/php-cs-fixer": "^3.0", "php-amqplib/php-amqplib": "^3.0", - "phpstan/phpstan": "^0.12.90" + "phpstan/phpstan": "^1.9" }, "autoload": { "psr-4": { diff --git a/src/PhpPact/Exception/ConnectionException.php b/src/PhpPact/Exception/ConnectionException.php index 0cb54cf7..813f6603 100644 --- a/src/PhpPact/Exception/ConnectionException.php +++ b/src/PhpPact/Exception/ConnectionException.php @@ -10,8 +10,8 @@ */ class ConnectionException extends Exception { - public function __construct(string $message) + public function __construct(string $message, \Exception $previous = null) { - parent::__construct($message, 0, null); + parent::__construct($message, 0, $previous); } } diff --git a/src/PhpPact/Standalone/MockService/MockServer.php b/src/PhpPact/Standalone/MockService/MockServer.php index 41492b59..b4b559e0 100644 --- a/src/PhpPact/Standalone/MockService/MockServer.php +++ b/src/PhpPact/Standalone/MockService/MockServer.php @@ -3,12 +3,12 @@ namespace PhpPact\Standalone\MockService; use Exception; -use GuzzleHttp\Exception\ConnectException; use PhpPact\Http\GuzzleClient; use PhpPact\Standalone\Exception\HealthCheckFailedException; use PhpPact\Standalone\Installer\Model\Scripts; use PhpPact\Standalone\MockService\Service\MockServerHttpService; use PhpPact\Standalone\Runner\ProcessRunner; +use PhpPact\Exception\ConnectionException; /** * Ruby Standalone Mock Server Wrapper @@ -135,15 +135,12 @@ private function verifyHealthCheck(): bool ++$tries; try { - $status = $service->healthCheck(); - - return $status; - } catch (ConnectException $e) { + return $service->healthCheck(); + } catch (ConnectionException $e) { \sleep($retrySec); } } while ($tries <= $maxTries); - // @phpstan-ignore-next-line throw new HealthCheckFailedException("Failed to make connection to Mock Server in {$maxTries} attempts."); } } diff --git a/src/PhpPact/Standalone/MockService/Service/MockServerHttpService.php b/src/PhpPact/Standalone/MockService/Service/MockServerHttpService.php index 3d2ac348..2c13e83a 100644 --- a/src/PhpPact/Standalone/MockService/Service/MockServerHttpService.php +++ b/src/PhpPact/Standalone/MockService/Service/MockServerHttpService.php @@ -2,11 +2,13 @@ namespace PhpPact\Standalone\MockService\Service; +use GuzzleHttp\Exception\RequestException; use PhpPact\Consumer\Model\Interaction; use PhpPact\Consumer\Model\Message; use PhpPact\Exception\ConnectionException; use PhpPact\Http\ClientInterface; use PhpPact\Standalone\MockService\MockServerConfigInterface; +use GuzzleHttp\Exception\ConnectException as GuzzleConnectionException; /** * Http Service that interacts with the Ruby Standalone Mock Server. @@ -45,18 +47,24 @@ public function healthCheck(): bool { $uri = $this->config->getBaseUri()->withPath('/'); - $response = $this->client->get($uri, [ - 'headers' => [ - 'Content-Type' => 'application/json', - 'X-Pact-Mock-Service' => true, - ], - ]); - - $body = $response->getBody()->getContents(); - - if ($response->getStatusCode() !== 200 - || $body !== "Mock service running\n") { - throw new ConnectionException('Failed to receive a successful response from the Mock Server.'); + try { + $response = $this->client->get($uri, [ + 'headers' => [ + 'Content-Type' => 'application/json', + 'X-Pact-Mock-Service' => true, + ], + ]); + + $body = $response->getBody()->getContents(); + + if ($response->getStatusCode() !== 200 + || $body !== "Mock service running\n") { + throw new ConnectionException('Failed to receive a successful response from the Mock Server.'); + } + } catch (RequestException $e) { + throw new ConnectionException('Failed to receive a successful response from the Mock Server.', $e); + } catch (GuzzleConnectionException $e) { + throw new ConnectionException('Failed to receive a successful response from the Mock Server.', $e); } return true; diff --git a/tests/PhpPact/Consumer/InteractionBuilderTest.php b/tests/PhpPact/Consumer/InteractionBuilderTest.php index 06567a76..3bdd9a14 100644 --- a/tests/PhpPact/Consumer/InteractionBuilderTest.php +++ b/tests/PhpPact/Consumer/InteractionBuilderTest.php @@ -1,7 +1,8 @@ disableOriginalConstructor() ->getMock(); - $connectionException = $this->getMockBuilder(ConnectException::class) + $connectionException = $this->getMockBuilder(ConnectionException::class) ->disableOriginalConstructor() ->getMock(); diff --git a/tests/PhpPact/Standalone/MockServer/Service/MockServerHttpServiceTest.php b/tests/PhpPact/Standalone/MockServer/Service/MockServerHttpServiceTest.php index cfb86df6..9f831646 100644 --- a/tests/PhpPact/Standalone/MockServer/Service/MockServerHttpServiceTest.php +++ b/tests/PhpPact/Standalone/MockServer/Service/MockServerHttpServiceTest.php @@ -1,6 +1,6 @@