Skip to content

Commit 9e17ab0

Browse files
Merge pull request #82 from nclavaud/object_driver
Add ObjectDriver
2 parents 4496294 + c186d98 commit 9e17ab0

File tree

4 files changed

+186
-1
lines changed

4 files changed

+186
-1
lines changed

README.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,28 @@ protected function getSnapshotDirectory(): string
203203
}
204204
```
205205

206+
### Using specific Drivers
207+
208+
The driver used to serialize the data can be specificied as second argument of the
209+
`assertMatchesSnapshot` method, so you can pick one that better suits your needs:
210+
211+
```php
212+
use Spatie\Snapshots\Drivers\ObjectDriver;
213+
use Spatie\Snapshots\MatchesSnapshots;
214+
215+
class OrderTest
216+
{
217+
use MatchesSnapshots;
218+
219+
public function test_snapshot_with_object_driver()
220+
{
221+
$order = new Order(1);
222+
223+
$this->assertMatchesSnapshot($order, new ObjectDriver());
224+
}
225+
}
226+
```
227+
206228
### Writing Custom Drivers
207229

208230
Drivers ensure that different types of data can be serialized and matched in their own way. A driver is a class that implements the `Spatie\Snapshots\Driver` interface, which requires three method implementations: `serialize`, `extension` and `match`.

composer.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@
2222
"require": {
2323
"php": "^7.4",
2424
"ext-dom": "*",
25-
"phpunit/phpunit": "^8.3|^9",
25+
"phpunit/phpunit": "^8.3|^9.0",
26+
"symfony/property-access": "^4.0|^5.0",
27+
"symfony/serializer": "^4.0|^5.0",
2628
"symfony/yaml": "^4.0|^5.0"
2729
},
2830
"autoload": {

src/Drivers/ObjectDriver.php

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
3+
namespace Spatie\Snapshots\Drivers;
4+
5+
use PHPUnit\Framework\Assert;
6+
use Spatie\Snapshots\Driver;
7+
use Symfony\Component\Serializer\Encoder\JsonEncoder;
8+
use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;
9+
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
10+
use Symfony\Component\Serializer\Serializer;
11+
12+
class ObjectDriver implements Driver
13+
{
14+
public function serialize($data): string
15+
{
16+
$normalizers = [
17+
new DateTimeNormalizer(),
18+
new ObjectNormalizer(),
19+
];
20+
21+
$encoders = [
22+
new JsonEncoder(),
23+
];
24+
25+
$serializer = new Serializer($normalizers, $encoders);
26+
27+
return $serializer->serialize(
28+
$data,
29+
'json',
30+
[
31+
'json_encode_options' => JSON_PRETTY_PRINT,
32+
]
33+
);
34+
}
35+
36+
public function extension(): string
37+
{
38+
return 'json';
39+
}
40+
41+
public function match($expected, $actual)
42+
{
43+
Assert::assertJsonStringEqualsJsonString($expected, $this->serialize($actual));
44+
}
45+
}
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
<?php
2+
3+
namespace Spatie\Snapshots\Test\Unit\Drivers;
4+
5+
use PHPUnit\Framework\TestCase;
6+
use Spatie\Snapshots\Drivers\ObjectDriver;
7+
8+
class ObjectDriverTest extends TestCase
9+
{
10+
/** @test */
11+
public function it_can_serialize_a_string()
12+
{
13+
$driver = new ObjectDriver();
14+
15+
$this->assertEquals('"foo"', $driver->serialize('foo'));
16+
}
17+
18+
/** @test */
19+
public function it_can_serialize_an_integer()
20+
{
21+
$driver = new ObjectDriver();
22+
23+
$this->assertEquals('1', $driver->serialize(1));
24+
}
25+
26+
/** @test */
27+
public function it_can_serialize_a_float()
28+
{
29+
$driver = new ObjectDriver();
30+
31+
$this->assertEquals('1.5', $driver->serialize(1.5));
32+
}
33+
34+
/** @test */
35+
public function it_can_serialize_an_associative_array()
36+
{
37+
$driver = new ObjectDriver();
38+
39+
$expected = <<<'JSON'
40+
{
41+
"foo": {
42+
"bar": "baz"
43+
}
44+
}
45+
JSON;
46+
47+
$this->assertEquals($expected, $driver->serialize(['foo' => ['bar' => 'baz']]));
48+
}
49+
50+
/** @test */
51+
public function it_can_serialize_an_indexed_array_without_keys()
52+
{
53+
$driver = new ObjectDriver();
54+
55+
$expected = <<<'JSON'
56+
[
57+
"foo",
58+
"bar"
59+
]
60+
JSON;
61+
62+
$this->assertEquals($expected, $driver->serialize(['foo', 'bar']));
63+
}
64+
65+
/** @test */
66+
public function it_can_serialize_a_simple_object()
67+
{
68+
$driver = new ObjectDriver();
69+
70+
$expected = <<<'JSON'
71+
{
72+
"foo": "bar"
73+
}
74+
JSON;
75+
76+
$this->assertEquals($expected, $driver->serialize((object) ['foo' => 'bar']));
77+
}
78+
79+
/** @test */
80+
public function it_can_serialize_a_class_instance()
81+
{
82+
$driver = new ObjectDriver();
83+
84+
$expected = <<<'JSON'
85+
{
86+
"name": "My name",
87+
"valid": true,
88+
"dateTime": "2020-01-01T15:00:00+01:00",
89+
"public": "public"
90+
}
91+
JSON;
92+
93+
$this->assertEquals($expected, $driver->serialize(new Obj()));
94+
}
95+
}
96+
97+
class Obj
98+
{
99+
private $private = 'private';
100+
public $public = 'public';
101+
102+
public function getName()
103+
{
104+
return 'My name';
105+
}
106+
107+
public function isValid()
108+
{
109+
return true;
110+
}
111+
112+
public function getDateTime()
113+
{
114+
return new \DateTimeImmutable('2020-01-01 15:00:00+01:00');
115+
}
116+
}

0 commit comments

Comments
 (0)