From 39e0d61dec25a21011e1393e8c42b0c2e481445f Mon Sep 17 00:00:00 2001 From: Fabio Ivona Date: Thu, 27 Jul 2023 11:10:42 +0200 Subject: [PATCH 1/9] phpstan fix --- src/Expectation.php | 2 +- src/Expectations/OppositeExpectation.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Expectation.php b/src/Expectation.php index dc6a2d81..a868591a 100644 --- a/src/Expectation.php +++ b/src/Expectation.php @@ -430,7 +430,7 @@ final class Expectation { return Targeted::make( $this, - fn (ObjectDescription $object): bool => ! enum_exists($object->name) && $object->reflectionClass->isReadOnly(), + fn (ObjectDescription $object): bool => ! enum_exists($object->name) && $object->reflectionClass->isReadOnly(), //@phpstan-ignore-line 'to be readonly', FileLineFinder::where(fn (string $line): bool => str_contains($line, 'class')), ); diff --git a/src/Expectations/OppositeExpectation.php b/src/Expectations/OppositeExpectation.php index da4598f2..bf0351a6 100644 --- a/src/Expectations/OppositeExpectation.php +++ b/src/Expectations/OppositeExpectation.php @@ -109,7 +109,7 @@ final class OppositeExpectation { return Targeted::make( $this->original, - fn (ObjectDescription $object): bool => ! enum_exists($object->name) && ! $object->reflectionClass->isReadOnly(), + fn (ObjectDescription $object): bool => ! enum_exists($object->name) && ! $object->reflectionClass->isReadOnly(), //@phpstan-ignore-line 'not to be readonly', FileLineFinder::where(fn (string $line): bool => str_contains($line, 'class')), ); From b60d21dfe2f2875aa642a9a0e33b8214488419c7 Mon Sep 17 00:00:00 2001 From: Fabio Ivona Date: Thu, 27 Jul 2023 11:16:27 +0200 Subject: [PATCH 2/9] 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); From 1efb9de04339bc06aeef6252ff194df665806087 Mon Sep 17 00:00:00 2001 From: Fabio Ivona Date: Thu, 27 Jul 2023 11:46:22 +0200 Subject: [PATCH 3/9] multiple snapshots --- src/Mixins/Expectation.php | 3 +- src/Repositories/SnapshotRepository.php | 31 ++++++++++++++++++- .../multiple_snapshot_expectations.snap | 1 + .../multiple_snapshot_expectations__2.snap | 1 + ...with_datasets_with_data_set___1____1_.snap | 1 + ...h_datasets_with_data_set___1____1___2.snap | 1 + ...asets_with_data_set____bar______bar__.snap | 1 + ...ts_with_data_set____bar______bar____2.snap | 1 + ...asets_with_data_set____baz______baz__.snap | 1 + ...ts_with_data_set____baz______baz____2.snap | 1 + ...asets_with_data_set____foo______foo__.snap | 1 + ...ts_with_data_set____foo______foo____2.snap | 1 + .../pass_with______toString___2.snap | 7 +++++ .../pass_with__toArray___2.snap | 3 ++ .../pass_with__toString___2.snap | 7 +++++ .../toMatchSnapshot/pass_with_array__2.snap | 3 ++ tests/Features/Expect/toMatchSnapshot.php | 12 +++++++ 17 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations.snap create mode 100644 tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations__2.snap create mode 100644 tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set___1____1_.snap create mode 100644 tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set___1____1___2.snap create mode 100644 tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____bar______bar__.snap create mode 100644 tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____bar______bar____2.snap create mode 100644 tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____baz______baz__.snap create mode 100644 tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____baz______baz____2.snap create mode 100644 tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____foo______foo__.snap create mode 100644 tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____foo______foo____2.snap create mode 100644 tests/.pest/snapshots/Features/Expect/toMatchSnapshot/pass_with______toString___2.snap create mode 100644 tests/.pest/snapshots/Features/Expect/toMatchSnapshot/pass_with__toArray___2.snap create mode 100644 tests/.pest/snapshots/Features/Expect/toMatchSnapshot/pass_with__toString___2.snap create mode 100644 tests/.pest/snapshots/Features/Expect/toMatchSnapshot/pass_with_array__2.snap diff --git a/src/Mixins/Expectation.php b/src/Mixins/Expectation.php index 1b8cfa42..6eed299a 100644 --- a/src/Mixins/Expectation.php +++ b/src/Mixins/Expectation.php @@ -806,6 +806,7 @@ final class Expectation public function toMatchSnapshot(string $message = ''): self { $snapshots = TestSuite::getInstance()->snapshots; + $snapshots->startNewExpectation(); $testCase = TestSuite::getInstance()->test; assert($testCase instanceof TestCase); @@ -833,7 +834,7 @@ final class Expectation } else { $filename = $snapshots->save($string); - $testCase::markTestIncomplete('Snapshot created at ['.$filename.'].'); + //$testCase::markTestIncomplete('Snapshot created at ['.$filename.'].'); } return $this; diff --git a/src/Repositories/SnapshotRepository.php b/src/Repositories/SnapshotRepository.php index 78b2ed11..da321dfb 100644 --- a/src/Repositories/SnapshotRepository.php +++ b/src/Repositories/SnapshotRepository.php @@ -12,6 +12,8 @@ use Pest\TestSuite; */ final class SnapshotRepository { + private static array $expectationsCounter = []; + /** * Creates a snapshot repository instance. */ @@ -106,6 +108,33 @@ final class SnapshotRepository // remove extension from filename $relativePath = substr($relativePath, 0, (int) strrpos($relativePath, '.')); - return sprintf('%s/%s.snap', $this->testsPath.'/'.$this->snapshotsPath.$relativePath, TestSuite::getInstance()->getDescription()); + $description = TestSuite::getInstance()->getDescription(); + + if($this->getCurrentSnapshotCounter() > 1){ + $description .= '__' . $this->getCurrentSnapshotCounter(); + } + + return sprintf('%s/%s.snap', $this->testsPath.'/'.$this->snapshotsPath.$relativePath, $description); + } + + private function getCurrentSnapshotKey(): string + { + return TestSuite::getInstance()->getFilename().'###'.TestSuite::getInstance()->getDescription(); + } + + private function getCurrentSnapshotCounter(): int + { + return self::$expectationsCounter[$this->getCurrentSnapshotKey()] ?? 0; + } + + public function startNewExpectation(): void + { + $key = $this->getCurrentSnapshotKey(); + + if(!isset(self::$expectationsCounter[$key])){ + self::$expectationsCounter[$key] = 0; + } + + self::$expectationsCounter[$key]++; } } diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations.snap new file mode 100644 index 00000000..7b5a8676 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations.snap @@ -0,0 +1 @@ +foo bar 1 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations__2.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations__2.snap new file mode 100644 index 00000000..206d0d02 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations__2.snap @@ -0,0 +1 @@ +foo bar 2 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set___1____1_.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set___1____1_.snap new file mode 100644 index 00000000..7b5a8676 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set___1____1_.snap @@ -0,0 +1 @@ +foo bar 1 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set___1____1___2.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set___1____1___2.snap new file mode 100644 index 00000000..206d0d02 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set___1____1___2.snap @@ -0,0 +1 @@ +foo bar 2 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____bar______bar__.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____bar______bar__.snap new file mode 100644 index 00000000..7b5a8676 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____bar______bar__.snap @@ -0,0 +1 @@ +foo bar 1 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____bar______bar____2.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____bar______bar____2.snap new file mode 100644 index 00000000..206d0d02 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____bar______bar____2.snap @@ -0,0 +1 @@ +foo bar 2 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____baz______baz__.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____baz______baz__.snap new file mode 100644 index 00000000..7b5a8676 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____baz______baz__.snap @@ -0,0 +1 @@ +foo bar 1 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____baz______baz____2.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____baz______baz____2.snap new file mode 100644 index 00000000..206d0d02 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____baz______baz____2.snap @@ -0,0 +1 @@ +foo bar 2 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____foo______foo__.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____foo______foo__.snap new file mode 100644 index 00000000..7b5a8676 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____foo______foo__.snap @@ -0,0 +1 @@ +foo bar 1 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____foo______foo____2.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____foo______foo____2.snap new file mode 100644 index 00000000..206d0d02 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____foo______foo____2.snap @@ -0,0 +1 @@ +foo bar 2 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/pass_with______toString___2.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/pass_with______toString___2.snap new file mode 100644 index 00000000..c2b4dc0a --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/pass_with______toString___2.snap @@ -0,0 +1,7 @@ +
+
+
+

Snapshot

+
+
+
\ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/pass_with__toArray___2.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/pass_with__toArray___2.snap new file mode 100644 index 00000000..afd4f5f9 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/pass_with__toArray___2.snap @@ -0,0 +1,3 @@ +{ + "key": "
\n
\n
\n

Snapshot<\/h1>\n <\/div>\n <\/div>\n <\/div>" +} \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/pass_with__toString___2.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/pass_with__toString___2.snap new file mode 100644 index 00000000..c2b4dc0a --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/pass_with__toString___2.snap @@ -0,0 +1,7 @@ +
+
+
+

Snapshot

+
+
+
\ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/pass_with_array__2.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/pass_with_array__2.snap new file mode 100644 index 00000000..afd4f5f9 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/pass_with_array__2.snap @@ -0,0 +1,3 @@ +{ + "key": "
\n
\n
\n

Snapshot<\/h1>\n <\/div>\n <\/div>\n <\/div>" +} \ No newline at end of file diff --git a/tests/Features/Expect/toMatchSnapshot.php b/tests/Features/Expect/toMatchSnapshot.php index 91647f48..655ffbf0 100644 --- a/tests/Features/Expect/toMatchSnapshot.php +++ b/tests/Features/Expect/toMatchSnapshot.php @@ -120,3 +120,15 @@ test('not failures', function () { expect($this->snapshotable)->not->toMatchSnapshot(); })->throws(ExpectationFailedException::class); + +test('multiple snapshot expectations', function () { + expect("foo bar 1")->toMatchSnapshot(); + + expect("foo bar 2")->toMatchSnapshot(); +}); + +test('multiple snapshot expectations with datasets', function () { + expect("foo bar 1")->toMatchSnapshot(); + + expect("foo bar 2")->toMatchSnapshot(); +})->with([1, 'foo', 'bar', 'baz']); From 4e719214c63e96179c9258be18f743015bae3129 Mon Sep 17 00:00:00 2001 From: Fabio Ivona Date: Tue, 1 Aug 2023 17:13:15 +0200 Subject: [PATCH 4/9] fix incomplete tests while updating snapshots --- src/Factories/TestCaseFactory.php | 22 ++++++++++++++++++++++ src/Mixins/Expectation.php | 3 ++- src/TestSuite.php | 9 ++++++++- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/Factories/TestCaseFactory.php b/src/Factories/TestCaseFactory.php index cbe50985..7b9da1f9 100644 --- a/src/Factories/TestCaseFactory.php +++ b/src/Factories/TestCaseFactory.php @@ -189,7 +189,29 @@ final class TestCaseFactory private static \$__filename = '$filename'; + private array \$__snapshotChanges = []; + $methodsCode + + /** @postCondition */ + protected function __MarkTestIncompleteIfSnapshotHaveChanged(): void + { + if (empty(\$this->__snapshotChanges)) { + return; + } + + if (count(\$this->__snapshotChanges) === 1) { + \$this->markTestIncomplete(\$this->__snapshotChanges[0]); + + return; + } + + \$formattedMessages = implode(PHP_EOL, array_map(function (string \$message) { + return "- \$message"; + }, \$this->__snapshotChanges)); + + \$this->markTestIncomplete(\$formattedMessages); + } } PHP; diff --git a/src/Mixins/Expectation.php b/src/Mixins/Expectation.php index 6eed299a..fe49cb0f 100644 --- a/src/Mixins/Expectation.php +++ b/src/Mixins/Expectation.php @@ -834,7 +834,8 @@ final class Expectation } else { $filename = $snapshots->save($string); - //$testCase::markTestIncomplete('Snapshot created at ['.$filename.'].'); + // $testCase::markTestIncomplete('Snapshot created at ['.$filename.'].'); + TestSuite::getInstance()->registerSnapshotChange("Snapshot created at [$filename]"); } return $this; diff --git a/src/TestSuite.php b/src/TestSuite.php index 51c1084d..e27ec155 100644 --- a/src/TestSuite.php +++ b/src/TestSuite.php @@ -100,7 +100,7 @@ final class TestSuite return self::$instance; } - if (! self::$instance instanceof self) { + if (!self::$instance instanceof self) { Panic::with(new InvalidPestCommand()); } @@ -114,6 +114,13 @@ final class TestSuite return (fn () => self::$__filename)->call($this->test, $this->test::class); // @phpstan-ignore-line } + public function registerSnapshotChange(string $message): void + { + assert($this->test instanceof TestCase); + + (fn () => $this->__snapshotChanges[] = $message)->call($this->test, $this->test::class); // @phpstan-ignore-line + } + public function getDescription(): string { assert($this->test instanceof TestCase); From 844d1759813ca041d911aa1b8a4323de3318cdd6 Mon Sep 17 00:00:00 2001 From: Fabio Ivona Date: Tue, 1 Aug 2023 17:14:49 +0200 Subject: [PATCH 5/9] refactor --- src/TestSuite.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/TestSuite.php b/src/TestSuite.php index e27ec155..5bfc03a2 100644 --- a/src/TestSuite.php +++ b/src/TestSuite.php @@ -114,13 +114,6 @@ final class TestSuite return (fn () => self::$__filename)->call($this->test, $this->test::class); // @phpstan-ignore-line } - public function registerSnapshotChange(string $message): void - { - assert($this->test instanceof TestCase); - - (fn () => $this->__snapshotChanges[] = $message)->call($this->test, $this->test::class); // @phpstan-ignore-line - } - public function getDescription(): string { assert($this->test instanceof TestCase); @@ -130,4 +123,11 @@ final class TestSuite return str_replace(' ', '_', $description.$datasetAsString); } + + public function registerSnapshotChange(string $message): void + { + assert($this->test instanceof TestCase); + + (fn () => $this->__snapshotChanges[] = $message)->call($this->test, $this->test::class); // @phpstan-ignore-line + } } From fe3747f8501d475b651eb6f51da4e0a69ab6c46a Mon Sep 17 00:00:00 2001 From: Fabio Ivona Date: Tue, 1 Aug 2023 17:15:44 +0200 Subject: [PATCH 6/9] lint --- src/Repositories/SnapshotRepository.php | 6 +++--- src/TestSuite.php | 2 +- tests/Features/Expect/toMatchSnapshot.php | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Repositories/SnapshotRepository.php b/src/Repositories/SnapshotRepository.php index da321dfb..fe71b64a 100644 --- a/src/Repositories/SnapshotRepository.php +++ b/src/Repositories/SnapshotRepository.php @@ -110,8 +110,8 @@ final class SnapshotRepository $description = TestSuite::getInstance()->getDescription(); - if($this->getCurrentSnapshotCounter() > 1){ - $description .= '__' . $this->getCurrentSnapshotCounter(); + if ($this->getCurrentSnapshotCounter() > 1) { + $description .= '__'.$this->getCurrentSnapshotCounter(); } return sprintf('%s/%s.snap', $this->testsPath.'/'.$this->snapshotsPath.$relativePath, $description); @@ -131,7 +131,7 @@ final class SnapshotRepository { $key = $this->getCurrentSnapshotKey(); - if(!isset(self::$expectationsCounter[$key])){ + if (! isset(self::$expectationsCounter[$key])) { self::$expectationsCounter[$key] = 0; } diff --git a/src/TestSuite.php b/src/TestSuite.php index 5bfc03a2..c6e4debd 100644 --- a/src/TestSuite.php +++ b/src/TestSuite.php @@ -100,7 +100,7 @@ final class TestSuite return self::$instance; } - if (!self::$instance instanceof self) { + if (! self::$instance instanceof self) { Panic::with(new InvalidPestCommand()); } diff --git a/tests/Features/Expect/toMatchSnapshot.php b/tests/Features/Expect/toMatchSnapshot.php index 655ffbf0..86320e38 100644 --- a/tests/Features/Expect/toMatchSnapshot.php +++ b/tests/Features/Expect/toMatchSnapshot.php @@ -122,13 +122,13 @@ test('not failures', function () { })->throws(ExpectationFailedException::class); test('multiple snapshot expectations', function () { - expect("foo bar 1")->toMatchSnapshot(); + expect('foo bar 1')->toMatchSnapshot(); - expect("foo bar 2")->toMatchSnapshot(); + expect('foo bar 2')->toMatchSnapshot(); }); test('multiple snapshot expectations with datasets', function () { - expect("foo bar 1")->toMatchSnapshot(); + expect('foo bar 1')->toMatchSnapshot(); - expect("foo bar 2")->toMatchSnapshot(); + expect('foo bar 2')->toMatchSnapshot(); })->with([1, 'foo', 'bar', 'baz']); From 0518971d2f371041ff4fa80c0ac67a09adff1bd4 Mon Sep 17 00:00:00 2001 From: Fabio Ivona Date: Tue, 1 Aug 2023 17:16:50 +0200 Subject: [PATCH 7/9] refactor --- src/TestSuite.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/TestSuite.php b/src/TestSuite.php index c6e4debd..885baa2f 100644 --- a/src/TestSuite.php +++ b/src/TestSuite.php @@ -128,6 +128,6 @@ final class TestSuite { assert($this->test instanceof TestCase); - (fn () => $this->__snapshotChanges[] = $message)->call($this->test, $this->test::class); // @phpstan-ignore-line + (fn (): string => $this->__snapshotChanges[] = $message)->call($this->test, $this->test::class); // @phpstan-ignore-line } } From 0221c2a643f67ea554170bd48a7668de57648ef3 Mon Sep 17 00:00:00 2001 From: Fabio Ivona Date: Tue, 1 Aug 2023 17:18:55 +0200 Subject: [PATCH 8/9] refactor --- src/Repositories/SnapshotRepository.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Repositories/SnapshotRepository.php b/src/Repositories/SnapshotRepository.php index fe71b64a..1cd3e666 100644 --- a/src/Repositories/SnapshotRepository.php +++ b/src/Repositories/SnapshotRepository.php @@ -12,6 +12,7 @@ use Pest\TestSuite; */ final class SnapshotRepository { + /** @var array */ private static array $expectationsCounter = []; /** From 9afe2296a6b66d1415561181a2f77955d43a6a09 Mon Sep 17 00:00:00 2001 From: Fabio Ivona Date: Wed, 2 Aug 2023 10:23:27 +0200 Subject: [PATCH 9/9] fix line endings on Windows --- src/Mixins/Expectation.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Mixins/Expectation.php b/src/Mixins/Expectation.php index fe49cb0f..d3d8cbd3 100644 --- a/src/Mixins/Expectation.php +++ b/src/Mixins/Expectation.php @@ -827,14 +827,13 @@ final class Expectation [$filename, $content] = $snapshots->get(); Assert::assertSame( - $content, - $string, + strtr($content, ["\r\n" => "\n", "\r" => "\n"]), + strtr($string, ["\r\n" => "\n", "\r" => "\n"]), $message === '' ? "Failed asserting that the string value matches its snapshot ($filename)." : $message ); } else { $filename = $snapshots->save($string); - // $testCase::markTestIncomplete('Snapshot created at ['.$filename.'].'); TestSuite::getInstance()->registerSnapshotChange("Snapshot created at [$filename]"); }