From b60d21dfe2f2875aa642a9a0e33b8214488419c7 Mon Sep 17 00:00:00 2001 From: Fabio Ivona Date: Thu, 27 Jul 2023 11:16:27 +0200 Subject: [PATCH] snapshots code cleanup --- src/Mixins/Expectation.php | 15 ++++---- src/Repositories/SnapshotRepository.php | 44 ++++++----------------- src/TestSuite.php | 18 ++++++++++ tests/Features/Expect/toMatchSnapshot.php | 24 ++++++------- 4 files changed, 48 insertions(+), 53 deletions(-) diff --git a/src/Mixins/Expectation.php b/src/Mixins/Expectation.php index b90e601a..1b8cfa42 100644 --- a/src/Mixins/Expectation.php +++ b/src/Mixins/Expectation.php @@ -805,6 +805,11 @@ final class Expectation */ public function toMatchSnapshot(string $message = ''): self { + $snapshots = TestSuite::getInstance()->snapshots; + + $testCase = TestSuite::getInstance()->test; + assert($testCase instanceof TestCase); + $string = match (true) { is_string($this->value) => $this->value, is_object($this->value) && method_exists($this->value, '__toString') => $this->value->__toString(), @@ -817,12 +822,8 @@ final class Expectation default => InvalidExpectationValue::expected('array|object|string'), }; - $testCase = TestSuite::getInstance()->test; - assert($testCase instanceof TestCase); - $snapshots = TestSuite::getInstance()->snapshots; - - if ($snapshots->has($testCase, $string)) { - [$filename, $content] = $snapshots->get($testCase, $string); + if ($snapshots->has()) { + [$filename, $content] = $snapshots->get(); Assert::assertSame( $content, @@ -830,7 +831,7 @@ final class Expectation $message === '' ? "Failed asserting that the string value matches its snapshot ($filename)." : $message ); } else { - $filename = $snapshots->save($testCase, $string); + $filename = $snapshots->save($string); $testCase::markTestIncomplete('Snapshot created at ['.$filename.'].'); } diff --git a/src/Repositories/SnapshotRepository.php b/src/Repositories/SnapshotRepository.php index 89a4135e..78b2ed11 100644 --- a/src/Repositories/SnapshotRepository.php +++ b/src/Repositories/SnapshotRepository.php @@ -5,8 +5,7 @@ declare(strict_types=1); namespace Pest\Repositories; use Pest\Exceptions\ShouldNotHappen; -use Pest\Support\Str; -use PHPUnit\Framework\TestCase; +use Pest\TestSuite; /** * @internal @@ -25,11 +24,9 @@ final class SnapshotRepository /** * Checks if the snapshot exists. */ - public function has(TestCase $testCase, string $description): bool + public function has(): bool { - [$filename, $description] = $this->getFilenameAndDescription($testCase); - - return file_exists($this->getSnapshotFilename($filename, $description)); + return file_exists($this->getSnapshotFilename()); } /** @@ -39,11 +36,9 @@ final class SnapshotRepository * * @throws ShouldNotHappen */ - public function get(TestCase $testCase, string $description): array + public function get(): array { - [$filename, $description] = $this->getFilenameAndDescription($testCase); - - $contents = file_get_contents($snapshotFilename = $this->getSnapshotFilename($filename, $description)); + $contents = file_get_contents($snapshotFilename = $this->getSnapshotFilename()); if ($contents === false) { throw ShouldNotHappen::fromMessage('Snapshot file could not be read.'); @@ -57,11 +52,9 @@ final class SnapshotRepository /** * Saves the given snapshot for the given test case. */ - public function save(TestCase $testCase, string $snapshot): string + public function save(string $snapshot): string { - [$filename, $description] = $this->getFilenameAndDescription($testCase); - - $snapshotFilename = $this->getSnapshotFilename($filename, $description); + $snapshotFilename = $this->getSnapshotFilename(); if (! file_exists(dirname($snapshotFilename))) { mkdir(dirname($snapshotFilename), 0755, true); @@ -103,33 +96,16 @@ final class SnapshotRepository } } - /** - * Gets the snapshot's "filename" and "description". - * - * @return array{0: string, 1: string} - */ - private function getFilenameAndDescription(TestCase $testCase): array - { - $filename = (fn () => self::$__filename)->call($testCase, $testCase::class); // @phpstan-ignore-line - - $description = str_replace('__pest_evaluable_', '', $testCase->name()); - $datasetAsString = str_replace('__pest_evaluable_', '', Str::evaluable($testCase->dataSetAsStringWithData())); - - $description = str_replace(' ', '_', $description.$datasetAsString); - - return [$filename, $description]; - } - /** * Gets the snapshot's "filename". */ - private function getSnapshotFilename(string $filename, string $description): string + private function getSnapshotFilename(): string { - $relativePath = str_replace($this->testsPath, '', $filename); + $relativePath = str_replace($this->testsPath, '', TestSuite::getInstance()->getFilename()); // remove extension from filename $relativePath = substr($relativePath, 0, (int) strrpos($relativePath, '.')); - return sprintf('%s/%s.snap', $this->testsPath.'/'.$this->snapshotsPath.$relativePath, $description); + return sprintf('%s/%s.snap', $this->testsPath.'/'.$this->snapshotsPath.$relativePath, TestSuite::getInstance()->getDescription()); } } diff --git a/src/TestSuite.php b/src/TestSuite.php index 3504e764..51c1084d 100644 --- a/src/TestSuite.php +++ b/src/TestSuite.php @@ -11,6 +11,7 @@ use Pest\Repositories\BeforeAllRepository; use Pest\Repositories\BeforeEachRepository; use Pest\Repositories\SnapshotRepository; use Pest\Repositories\TestRepository; +use Pest\Support\Str; use PHPUnit\Framework\TestCase; /** @@ -105,4 +106,21 @@ final class TestSuite return self::$instance; } + + public function getFilename(): string + { + assert($this->test instanceof TestCase); + + return (fn () => self::$__filename)->call($this->test, $this->test::class); // @phpstan-ignore-line + } + + public function getDescription(): string + { + assert($this->test instanceof TestCase); + + $description = str_replace('__pest_evaluable_', '', $this->test->name()); + $datasetAsString = str_replace('__pest_evaluable_', '', Str::evaluable($this->test->dataSetAsStringWithData())); + + return str_replace(' ', '_', $description.$datasetAsString); + } } diff --git a/tests/Features/Expect/toMatchSnapshot.php b/tests/Features/Expect/toMatchSnapshot.php index 29a63a59..91647f48 100644 --- a/tests/Features/Expect/toMatchSnapshot.php +++ b/tests/Features/Expect/toMatchSnapshot.php @@ -16,13 +16,13 @@ beforeEach(function () { }); test('pass', function () { - TestSuite::getInstance()->snapshots->save($this, $this->snapshotable); + TestSuite::getInstance()->snapshots->save($this->snapshotable); expect($this->snapshotable)->toMatchSnapshot(); }); test('pass with `__toString`', function () { - TestSuite::getInstance()->snapshots->save($this, $this->snapshotable); + TestSuite::getInstance()->snapshots->save($this->snapshotable); $object = new class($this->snapshotable) { @@ -40,7 +40,7 @@ test('pass with `__toString`', function () { }); test('pass with `toString`', function () { - TestSuite::getInstance()->snapshots->save($this, $this->snapshotable); + TestSuite::getInstance()->snapshots->save($this->snapshotable); $object = new class($this->snapshotable) { @@ -58,8 +58,8 @@ test('pass with `toString`', function () { }); test('pass with dataset', function ($data) { - TestSuite::getInstance()->snapshots->save($this, $this->snapshotable); - [$filename] = TestSuite::getInstance()->snapshots->get($this, $this->snapshotable); + TestSuite::getInstance()->snapshots->save($this->snapshotable); + [$filename] = TestSuite::getInstance()->snapshots->get(); expect($filename)->toEndWith('pass_with_dataset_with_data_set____my_datas_set_value______my_datas_set_value__.snap') ->and($this->snapshotable)->toMatchSnapshot(); @@ -67,8 +67,8 @@ test('pass with dataset', function ($data) { describe('within describe', function () { test('pass with dataset', function ($data) { - TestSuite::getInstance()->snapshots->save($this, $this->snapshotable); - [$filename] = TestSuite::getInstance()->snapshots->get($this, $this->snapshotable); + TestSuite::getInstance()->snapshots->save($this->snapshotable); + [$filename] = TestSuite::getInstance()->snapshots->get(); expect($filename)->toEndWith('pass_with_dataset_with_data_set____my_datas_set_value______my_datas_set_value__.snap') ->and($this->snapshotable)->toMatchSnapshot(); @@ -76,7 +76,7 @@ describe('within describe', function () { })->with(['my-datas-set-value']); test('pass with `toArray`', function () { - TestSuite::getInstance()->snapshots->save($this, json_encode(['key' => $this->snapshotable], JSON_PRETTY_PRINT)); + TestSuite::getInstance()->snapshots->save(json_encode(['key' => $this->snapshotable], JSON_PRETTY_PRINT)); $object = new class($this->snapshotable) { @@ -96,7 +96,7 @@ test('pass with `toArray`', function () { }); test('pass with array', function () { - TestSuite::getInstance()->snapshots->save($this, json_encode(['key' => $this->snapshotable], JSON_PRETTY_PRINT)); + TestSuite::getInstance()->snapshots->save(json_encode(['key' => $this->snapshotable], JSON_PRETTY_PRINT)); expect([ 'key' => $this->snapshotable, @@ -104,19 +104,19 @@ test('pass with array', function () { }); test('failures', function () { - TestSuite::getInstance()->snapshots->save($this, $this->snapshotable); + TestSuite::getInstance()->snapshots->save($this->snapshotable); expect('contain that does not match snapshot')->toMatchSnapshot(); })->throws(ExpectationFailedException::class, 'Failed asserting that two strings are identical.'); test('failures with custom message', function () { - TestSuite::getInstance()->snapshots->save($this, $this->snapshotable); + TestSuite::getInstance()->snapshots->save($this->snapshotable); expect('contain that does not match snapshot')->toMatchSnapshot('oh no'); })->throws(ExpectationFailedException::class, 'oh no'); test('not failures', function () { - TestSuite::getInstance()->snapshots->save($this, $this->snapshotable); + TestSuite::getInstance()->snapshots->save($this->snapshotable); expect($this->snapshotable)->not->toMatchSnapshot(); })->throws(ExpectationFailedException::class);