From f8952474b58921dc060e195cf96915bc9c9974e2 Mon Sep 17 00:00:00 2001 From: shibafu Date: Sat, 22 Aug 2020 13:04:46 +0900 Subject: [PATCH] =?UTF-8?q?MetadataResolver=E3=81=AEFixture=E3=82=92?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E3=81=99=E3=82=8B=E4=BB=95=E7=B5=84=E3=81=BF?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 3 + .../MetadataResolver/CreateMockedResolver.php | 60 ++++++++++++++++--- 2 files changed, 56 insertions(+), 7 deletions(-) diff --git a/.env.example b/.env.example index 59585c8..febde32 100644 --- a/.env.example +++ b/.env.example @@ -9,6 +9,9 @@ LOG_CHANNEL=stack # テストにモックを使用するか falseの場合は実際のHTML等を取得してテストする TEST_USE_HTTP_MOCK=true +# テスト用のスナップショットを更新する場合はtrueにする (TEST_USE_HTTP_MOCKと重複させないよう注意) +TEST_UPDATE_SNAPSHOT=false + DB_CONNECTION=pgsql DB_HOST=db DB_PORT=5432 diff --git a/tests/Unit/MetadataResolver/CreateMockedResolver.php b/tests/Unit/MetadataResolver/CreateMockedResolver.php index e7e0bc6..96caa2a 100644 --- a/tests/Unit/MetadataResolver/CreateMockedResolver.php +++ b/tests/Unit/MetadataResolver/CreateMockedResolver.php @@ -3,11 +3,14 @@ namespace Tests\Unit\MetadataResolver; use App\MetadataResolver\Resolver; +use function Clue\StreamFilter\fun; use GuzzleHttp\Client; use GuzzleHttp\Handler\MockHandler; use GuzzleHttp\HandlerStack; use GuzzleHttp\Psr7\Response; use Monolog\Handler\AbstractHandler; +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ResponseInterface; trait CreateMockedResolver { @@ -21,6 +24,18 @@ trait CreateMockedResolver */ protected $handler; + /** + * @var string + */ + protected $snapshotFilename; + + protected function fetchSnapshot(string $filename): string + { + $this->snapshotFilename = $filename; + + return file_get_contents($filename); + } + /** * @param string $resolverClass * @param string $responseText @@ -30,19 +45,27 @@ trait CreateMockedResolver */ protected function createResolver(string $resolverClass, string $responseText, array $headers = [], int $status = 200) { - if (!$this->shouldUseMock()) { + if (!$this->shouldUseMock() && !$this->shouldUpdateSnapshot()) { $this->resolver = app()->make($resolverClass); return $this->resolver; } - $headers += [ - 'content-type' => 'text/html', - ]; + if ($this->shouldUseMock()) { + $headers += [ + 'content-type' => 'text/html', + ]; + + $mockResponse = new Response($status, $headers, $responseText); + $this->handler = new MockHandler([$mockResponse]); + } + + $stack = HandlerStack::create($this->handler); + $client = new Client(['handler' => $stack]); + if ($this->shouldUpdateSnapshot()) { + $stack->push($this->makeUpdateSnapshotMiddleware()); + } - $mockResponse = new Response($status, $headers, $responseText); - $this->handler = new MockHandler([$mockResponse]); - $client = new Client(['handler' => HandlerStack::create($this->handler)]); $this->resolver = app()->make($resolverClass, ['client' => $client]); return $this->resolver; @@ -52,4 +75,27 @@ trait CreateMockedResolver { return (bool) env('TEST_USE_HTTP_MOCK', true); } + + protected function shouldUpdateSnapshot(): bool + { + return (bool) env('TEST_UPDATE_SNAPSHOT', false); + } + + protected function makeUpdateSnapshotMiddleware(): callable + { + return function (callable $next) { + return function (RequestInterface $request, array $options) use ($next) { + return $next($request, $options)->then(function (ResponseInterface $response) { + if (empty($this->snapshotFilename)) { + throw new \RuntimeException('スナップショットのファイル名が分かりません。file_get_contents()を使っている場合、fetchSnapshot()に置き換えてください。'); + } + + file_put_contents($this->snapshotFilename, (string) $response->getBody()); + fwrite(STDERR, "Snapshot Updated: {$this->snapshotFilename}\n"); + + return $response; + }); + }; + }; + } }