TplBlock/vendor/jms/serializer/tests/Serializer/GraphNavigatorTest.php
2018-03-26 21:57:35 +02:00

178 lines
7.1 KiB
PHP

<?php
/*
* Copyright 2016 Johannes M. Schmitt <schmittjoh@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
namespace JMS\Serializer\Tests\Serializer;
use Doctrine\Common\Annotations\AnnotationReader;
use JMS\Serializer\Construction\UnserializeObjectConstructor;
use JMS\Serializer\EventDispatcher\EventDispatcher;
use JMS\Serializer\GraphNavigator;
use JMS\Serializer\Handler\HandlerRegistry;
use JMS\Serializer\Handler\SubscribingHandlerInterface;
use JMS\Serializer\Metadata\Driver\AnnotationDriver;
use Metadata\MetadataFactory;
class GraphNavigatorTest extends \PHPUnit_Framework_TestCase
{
private $metadataFactory;
private $handlerRegistry;
private $objectConstructor;
private $dispatcher;
private $navigator;
private $context;
/**
* @expectedException JMS\Serializer\Exception\RuntimeException
* @expectedExceptionMessage Resources are not supported in serialized data.
*/
public function testResourceThrowsException()
{
$this->context->expects($this->any())
->method('getDirection')
->will($this->returnValue(GraphNavigator::DIRECTION_SERIALIZATION));
$this->navigator->accept(STDIN, null, $this->context);
}
public function testNavigatorPassesInstanceOnSerialization()
{
$object = new SerializableClass;
$metadata = $this->metadataFactory->getMetadataForClass(get_class($object));
$self = $this;
$context = $this->context;
$exclusionStrategy = $this->getMockBuilder('JMS\Serializer\Exclusion\ExclusionStrategyInterface')->getMock();
$exclusionStrategy->expects($this->once())
->method('shouldSkipClass')
->will($this->returnCallback(function ($passedMetadata, $passedContext) use ($metadata, $context, $self) {
$self->assertSame($metadata, $passedMetadata);
$self->assertSame($context, $passedContext);
}));
$exclusionStrategy->expects($this->once())
->method('shouldSkipProperty')
->will($this->returnCallback(function ($propertyMetadata, $passedContext) use ($context, $metadata, $self) {
$self->assertSame($metadata->propertyMetadata['foo'], $propertyMetadata);
$self->assertSame($context, $passedContext);
}));
$this->context->expects($this->once())
->method('getExclusionStrategy')
->will($this->returnValue($exclusionStrategy));
$this->context->expects($this->any())
->method('getDirection')
->will($this->returnValue(GraphNavigator::DIRECTION_SERIALIZATION));
$this->context->expects($this->any())
->method('getVisitor')
->will($this->returnValue($this->getMockBuilder('JMS\Serializer\VisitorInterface')->getMock()));
$this->navigator = new GraphNavigator($this->metadataFactory, $this->handlerRegistry, $this->objectConstructor, $this->dispatcher);
$this->navigator->accept($object, null, $this->context);
}
public function testNavigatorPassesNullOnDeserialization()
{
$class = __NAMESPACE__ . '\SerializableClass';
$metadata = $this->metadataFactory->getMetadataForClass($class);
$context = $this->context;
$exclusionStrategy = $this->getMockBuilder('JMS\Serializer\Exclusion\ExclusionStrategyInterface')->getMock();
$exclusionStrategy->expects($this->once())
->method('shouldSkipClass')
->with($metadata, $this->callback(function ($navigatorContext) use ($context) {
return $navigatorContext === $context;
}));
$exclusionStrategy->expects($this->once())
->method('shouldSkipProperty')
->with($metadata->propertyMetadata['foo'], $this->callback(function ($navigatorContext) use ($context) {
return $navigatorContext === $context;
}));
$this->context->expects($this->once())
->method('getExclusionStrategy')
->will($this->returnValue($exclusionStrategy));
$this->context->expects($this->any())
->method('getDirection')
->will($this->returnValue(GraphNavigator::DIRECTION_DESERIALIZATION));
$this->context->expects($this->any())
->method('getVisitor')
->will($this->returnValue($this->getMockBuilder('JMS\Serializer\VisitorInterface')->getMock()));
$this->navigator = new GraphNavigator($this->metadataFactory, $this->handlerRegistry, $this->objectConstructor, $this->dispatcher);
$this->navigator->accept('random', array('name' => $class, 'params' => array()), $this->context);
}
public function testNavigatorChangeTypeOnSerialization()
{
$object = new SerializableClass;
$typeName = 'JsonSerializable';
$this->dispatcher->addListener('serializer.pre_serialize', function ($event) use ($typeName) {
$type = $event->getType();
$type['name'] = $typeName;
$event->setType($type['name'], $type['params']);
});
$this->handlerRegistry->registerSubscribingHandler(new TestSubscribingHandler());
$this->context->expects($this->any())
->method('getDirection')
->will($this->returnValue(GraphNavigator::DIRECTION_SERIALIZATION));
$this->context->expects($this->any())
->method('getVisitor')
->will($this->returnValue($this->getMockBuilder('JMS\Serializer\VisitorInterface')->getMock()));
$this->navigator = new GraphNavigator($this->metadataFactory, $this->handlerRegistry, $this->objectConstructor, $this->dispatcher);
$this->navigator->accept($object, null, $this->context);
}
protected function setUp()
{
$this->context = $this->getMockBuilder('JMS\Serializer\Context')->getMock();
$this->dispatcher = new EventDispatcher();
$this->handlerRegistry = new HandlerRegistry();
$this->objectConstructor = new UnserializeObjectConstructor();
$this->metadataFactory = new MetadataFactory(new AnnotationDriver(new AnnotationReader()));
$this->navigator = new GraphNavigator($this->metadataFactory, $this->handlerRegistry, $this->objectConstructor, $this->dispatcher);
}
}
class SerializableClass
{
public $foo = 'bar';
}
class TestSubscribingHandler implements SubscribingHandlerInterface
{
public static function getSubscribingMethods()
{
return array(array(
'type' => 'JsonSerializable',
'format' => 'foo',
'direction' => GraphNavigator::DIRECTION_SERIALIZATION,
'method' => 'serialize'
));
}
}