From bab07a55948d6a4f6d1cd1709250557c40ecd50e Mon Sep 17 00:00:00 2001 From: David Buchmann Date: Fri, 28 Apr 2023 11:35:03 +0200 Subject: [PATCH] upgrade phpspec to return correct types from test doubles --- .github/workflows/static.yml | 2 +- .github/workflows/tests.yml | 19 ++++------ CHANGELOG.md | 5 +++ composer.json | 2 +- .../Generator/HeaderCacheKeyGeneratorSpec.php | 13 ++++--- spec/Cache/Generator/SimpleGeneratorSpec.php | 24 ++++++++----- spec/CachePluginSpec.php | 36 +++++++++++-------- 7 files changed, 59 insertions(+), 42 deletions(-) diff --git a/.github/workflows/static.yml b/.github/workflows/static.yml index 4e821aa..5762374 100644 --- a/.github/workflows/static.yml +++ b/.github/workflows/static.yml @@ -13,7 +13,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: PHPStan uses: docker://oskarstark/phpstan-ga diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 1bbd75a..5dcde71 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -12,11 +12,11 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - php: ['7.1', '7.2', '7.3', '7.4', '8.0'] + php: ['7.1', '7.2', '7.3', '7.4', '8.0', '8.1', '8.2'] steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Setup PHP uses: shivammathur/setup-php@v2 @@ -25,15 +25,8 @@ jobs: tools: composer:v2 coverage: none - - name: Install PHP 7 dependencies + - name: Install PHP dependencies run: composer update --prefer-dist --no-interaction --no-progress - if: "matrix.php != '8.0'" - - - name: Install PHP 8 dependencies - run: | - composer require "phpdocumentor/reflection-docblock:^5.2@dev" --no-interaction --no-update - composer update --prefer-dist --prefer-stable --no-interaction --no-progress --ignore-platform-req=php - if: "matrix.php == '8.0'" - name: Execute tests run: composer test @@ -43,11 +36,11 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - php: ['7.1', '7.2', '7.3', '7.4'] + php: ['7.1', '7.4', '8.0'] steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Setup PHP uses: shivammathur/setup-php@v2 @@ -70,7 +63,7 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Setup PHP uses: shivammathur/setup-php@v2 diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f00605..754de2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Change Log +## 1.7.6 - 2023-04-23 + +- Test with PHP 8.1 and 8.2 +- Made phpspec tests compatible with PSR-7 2.0 strict typing + ## 1.7.5 - 2022-01-18 - Allow installation with psr/cache 3.0 (1.0 and 2.0 are still allowed too) diff --git a/composer.json b/composer.json index 08dc4bf..4283bb3 100644 --- a/composer.json +++ b/composer.json @@ -18,7 +18,7 @@ "symfony/options-resolver": "^2.6 || ^3.0 || ^4.0 || ^5.0 || ^6.0" }, "require-dev": { - "phpspec/phpspec": "^5.1 || ^6.0" + "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0" }, "autoload": { "psr-4": { diff --git a/spec/Cache/Generator/HeaderCacheKeyGeneratorSpec.php b/spec/Cache/Generator/HeaderCacheKeyGeneratorSpec.php index de20cad..2b2be5a 100644 --- a/spec/Cache/Generator/HeaderCacheKeyGeneratorSpec.php +++ b/spec/Cache/Generator/HeaderCacheKeyGeneratorSpec.php @@ -5,6 +5,9 @@ use PhpSpec\ObjectBehavior; use Psr\Http\Message\RequestInterface; use Psr\Http\Message\StreamInterface; +use Http\Client\Common\Plugin\Cache\Generator\HeaderCacheKeyGenerator; +use Http\Client\Common\Plugin\Cache\Generator\CacheKeyGenerator; +use Psr\Http\Message\UriInterface; class HeaderCacheKeyGeneratorSpec extends ObjectBehavior { @@ -15,18 +18,20 @@ public function let() public function it_is_initializable() { - $this->shouldHaveType('Http\Client\Common\Plugin\Cache\Generator\HeaderCacheKeyGenerator'); + $this->shouldHaveType(HeaderCacheKeyGenerator::class); } public function it_is_a_key_generator() { - $this->shouldImplement('Http\Client\Common\Plugin\Cache\Generator\CacheKeyGenerator'); + $this->shouldImplement(CacheKeyGenerator::class); } - public function it_generates_cache_from_request(RequestInterface $request, StreamInterface $body) + public function it_generates_cache_from_request(RequestInterface $request, UriInterface $uri, StreamInterface $body) { + $uri->__toString()->shouldBeCalled()->willReturn('http://example.com/foo'); + $request->getMethod()->shouldBeCalled()->willReturn('GET'); - $request->getUri()->shouldBeCalled()->willReturn('http://example.com/foo'); + $request->getUri()->shouldBeCalled()->willReturn($uri); $request->getHeaderLine('Authorization')->shouldBeCalled()->willReturn('bar'); $request->getHeaderLine('Content-Type')->shouldBeCalled()->willReturn('application/baz'); $request->getBody()->shouldBeCalled()->willReturn($body); diff --git a/spec/Cache/Generator/SimpleGeneratorSpec.php b/spec/Cache/Generator/SimpleGeneratorSpec.php index 9ee102c..8c5f930 100644 --- a/spec/Cache/Generator/SimpleGeneratorSpec.php +++ b/spec/Cache/Generator/SimpleGeneratorSpec.php @@ -4,33 +4,41 @@ use PhpSpec\ObjectBehavior; use Psr\Http\Message\RequestInterface; +use Http\Client\Common\Plugin\Cache\Generator\CacheKeyGenerator; +use Http\Client\Common\Plugin\Cache\Generator\SimpleGenerator; +use Psr\Http\Message\StreamInterface; +use Psr\Http\Message\UriInterface; class SimpleGeneratorSpec extends ObjectBehavior { public function it_is_initializable() { - $this->shouldHaveType('Http\Client\Common\Plugin\Cache\Generator\SimpleGenerator'); + $this->shouldHaveType(SimpleGenerator::class); } public function it_is_a_key_generator() { - $this->shouldImplement('Http\Client\Common\Plugin\Cache\Generator\CacheKeyGenerator'); + $this->shouldImplement(CacheKeyGenerator::class); } - public function it_generates_cache_from_request(RequestInterface $request) + public function it_generates_cache_from_request(RequestInterface $request, UriInterface $uri, StreamInterface $body) { + $uri->__toString()->shouldBeCalled()->willReturn('http://example.com/foo'); + $body->__toString()->shouldBeCalled()->willReturn('bar'); $request->getMethod()->shouldBeCalled()->willReturn('GET'); - $request->getUri()->shouldBeCalled()->willReturn('http://example.com/foo'); - $request->getBody()->shouldBeCalled()->willReturn('bar'); + $request->getUri()->shouldBeCalled()->willReturn($uri); + $request->getBody()->shouldBeCalled()->willReturn($body); $this->generate($request)->shouldReturn('GET http://example.com/foo bar'); } - public function it_generates_cache_from_request_with_no_body(RequestInterface $request) + public function it_generates_cache_from_request_with_no_body(RequestInterface $request, UriInterface $uri, StreamInterface $body) { + $uri->__toString()->shouldBeCalled()->willReturn('http://example.com/foo'); + $body->__toString()->shouldBeCalled()->willReturn(''); $request->getMethod()->shouldBeCalled()->willReturn('GET'); - $request->getUri()->shouldBeCalled()->willReturn('http://example.com/foo'); - $request->getBody()->shouldBeCalled()->willReturn(''); + $request->getUri()->shouldBeCalled()->willReturn($uri); + $request->getBody()->shouldBeCalled()->willReturn($body); // No extra space after uri $this->generate($request)->shouldReturn('GET http://example.com/foo'); diff --git a/spec/CachePluginSpec.php b/spec/CachePluginSpec.php index 75b7c33..64390cb 100644 --- a/spec/CachePluginSpec.php +++ b/spec/CachePluginSpec.php @@ -13,6 +13,8 @@ use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\StreamInterface; use Psr\Http\Message\UriInterface; +use Http\Client\Common\Plugin\CachePlugin; +use Http\Client\Common\Plugin; class CachePluginSpec extends ObjectBehavior { @@ -26,12 +28,12 @@ function let(CacheItemPoolInterface $pool, StreamFactory $streamFactory) function it_is_initializable(CacheItemPoolInterface $pool) { - $this->shouldHaveType('Http\Client\Common\Plugin\CachePlugin'); + $this->shouldHaveType(CachePlugin::class); } function it_is_a_plugin() { - $this->shouldImplement('Http\Client\Common\Plugin'); + $this->shouldImplement(Plugin::class); } function it_caches_responses(CacheItemPoolInterface $pool, CacheItemInterface $item, RequestInterface $request, UriInterface $uri, ResponseInterface $response, StreamInterface $stream) @@ -44,7 +46,7 @@ function it_caches_responses(CacheItemPoolInterface $pool, CacheItemInterface $i $request->getMethod()->willReturn('GET'); $request->getUri()->willReturn($uri); $uri->__toString()->willReturn('https://example.com/'); - $request->getBody()->shouldBeCalled(); + $request->getBody()->shouldBeCalled()->willReturn($stream); $response->getStatusCode()->willReturn(200); $response->getBody()->willReturn($stream); @@ -72,12 +74,13 @@ function it_caches_responses(CacheItemPoolInterface $pool, CacheItemInterface $i $this->handleRequest($request, $next, function () {}); } - function it_doesnt_store_failed_responses(CacheItemPoolInterface $pool, CacheItemInterface $item, RequestInterface $request, UriInterface $uri, ResponseInterface $response) + function it_doesnt_store_failed_responses(CacheItemPoolInterface $pool, CacheItemInterface $item, RequestInterface $request, UriInterface $uri, StreamInterface $requestBody, ResponseInterface $response) { $request->getMethod()->willReturn('GET'); $request->getUri()->willReturn($uri); $uri->__toString()->willReturn('https://example.com/'); - $request->getBody()->shouldBeCalled(); + $request->getBody()->shouldBeCalled()->willReturn($requestBody); + $requestBody->__toString()->shouldBeCalled()->willReturn('body'); $response->getStatusCode()->willReturn(400); $response->getHeader('Cache-Control')->willReturn([]); @@ -187,7 +190,7 @@ function it_calculate_age_from_response(CacheItemPoolInterface $pool, CacheItemI $request->getMethod()->willReturn('GET'); $request->getUri()->willReturn($uri); $uri->__toString()->willReturn('https://example.com/'); - $request->getBody()->shouldBeCalled(); + $request->getBody()->shouldBeCalled()->willReturn($stream); $response->getStatusCode()->willReturn(200); $response->getBody()->willReturn($stream); @@ -223,7 +226,7 @@ function it_saves_etag(CacheItemPoolInterface $pool, CacheItemInterface $item, R $stream->__toString()->willReturn($httpBody); $stream->isSeekable()->willReturn(true); $stream->rewind()->shouldBeCalled(); - $request->getBody()->shouldBeCalled(); + $request->getBody()->shouldBeCalled()->willReturn($stream); $request->getMethod()->willReturn('GET'); $request->getUri()->willReturn($uri); @@ -261,7 +264,8 @@ function it_adds_etag_and_modfied_since_to_request(CacheItemPoolInterface $pool, $request->getMethod()->willReturn('GET'); $request->getUri()->willReturn($uri); $uri->__toString()->willReturn('https://example.com/'); - $request->getBody()->shouldBeCalled(); + $request->getBody()->shouldBeCalled()->willReturn($stream); + $stream->__toString()->shouldBeCalled()->willReturn(''); $request->withHeader('If-Modified-Since', 'Thursday, 01-Jan-70 01:18:31 GMT')->shouldBeCalled()->willReturn($request); $request->withHeader('If-None-Match', 'foo_etag')->shouldBeCalled()->willReturn($request); @@ -285,14 +289,15 @@ function it_adds_etag_and_modfied_since_to_request(CacheItemPoolInterface $pool, $this->handleRequest($request, $next, function () {}); } - function it_servces_a_cached_response(CacheItemPoolInterface $pool, CacheItemInterface $item, RequestInterface $request, UriInterface $uri, ResponseInterface $response, StreamInterface $stream, StreamFactory $streamFactory) + function it_serves_a_cached_response(CacheItemPoolInterface $pool, CacheItemInterface $item, RequestInterface $request, UriInterface $uri, StreamInterface $requestBody, ResponseInterface $response, StreamInterface $stream, StreamFactory $streamFactory) { $httpBody = 'body'; $request->getMethod()->willReturn('GET'); $request->getUri()->willReturn($uri); $uri->__toString()->willReturn('https://example.com/'); - $request->getBody()->shouldBeCalled(); + $request->getBody()->shouldBeCalled()->willReturn($requestBody); + $requestBody->__toString()->shouldBeCalled()->willReturn(''); $pool->getItem(Argument::any())->shouldBeCalled()->willReturn($item); $item->isHit()->willReturn(true); @@ -315,14 +320,15 @@ function it_servces_a_cached_response(CacheItemPoolInterface $pool, CacheItemInt $this->handleRequest($request, $next, function () {}); } - function it_serves_and_resaved_expired_response(CacheItemPoolInterface $pool, CacheItemInterface $item, RequestInterface $request, UriInterface $uri, ResponseInterface $response, StreamInterface $stream, StreamFactory $streamFactory) + function it_serves_and_resaved_expired_response(CacheItemPoolInterface $pool, CacheItemInterface $item, RequestInterface $request, UriInterface $uri, StreamInterface $requestStream, ResponseInterface $response, StreamInterface $stream, StreamFactory $streamFactory) { $httpBody = 'body'; $request->getMethod()->willReturn('GET'); $request->getUri()->willReturn($uri); $uri->__toString()->willReturn('https://example.com/'); - $request->getBody()->shouldBeCalled(); + $request->getBody()->shouldBeCalled()->willReturn($requestStream); + $requestStream->__toString()->willReturn(''); $request->withHeader(Argument::any(), Argument::any())->willReturn($request); $request->withHeader(Argument::any(), Argument::any())->willReturn($request); @@ -385,7 +391,7 @@ function it_caches_private_responses_when_allowed( $request->getMethod()->willReturn('GET'); $request->getUri()->willReturn($uri); $uri->__toString()->willReturn('https://example.com/'); - $request->getBody()->shouldBeCalled(); + $request->getBody()->shouldBeCalled()->willReturn($stream); $response->getStatusCode()->willReturn(200); $response->getBody()->willReturn($stream); @@ -435,7 +441,7 @@ function it_does_not_store_responses_of_requests_to_blacklisted_paths( $request->getMethod()->willReturn('GET'); $request->getUri()->willReturn($uri); $uri->__toString()->willReturn('https://example.com/foo'); - $request->getBody()->shouldBeCalled(); + $request->getBody()->shouldBeCalled()->willReturn($stream); $response->getStatusCode()->willReturn(200); $response->getBody()->willReturn($stream); @@ -482,7 +488,7 @@ function it_stores_responses_of_requests_not_in_blacklisted_paths( $request->getMethod()->willReturn('GET'); $request->getUri()->willReturn($uri); $uri->__toString()->willReturn('https://example.com/'); - $request->getBody()->shouldBeCalled(); + $request->getBody()->shouldBeCalled()->willReturn($stream); $response->getStatusCode()->willReturn(200); $response->getBody()->willReturn($stream);