/** * @test */ public function serializeObjectAsPropertyArrayForDoctrineCollectionPropertyBuildsTheCorrectArrayStructureAndStoresEveryObjectInsideSeparately() { $propertyClassName1 = 'DummyClass' . md5(uniqid(mt_rand(), true)); $propertyClassName2 = 'DummyClass' . md5(uniqid(mt_rand(), true)); eval('class ' . $propertyClassName1 . ' {}'); eval('class ' . $propertyClassName2 . ' {}'); $propertyClass1 = new $propertyClassName1(); $propertyClass2 = new $propertyClassName2(); $className = 'DummyClass' . md5(uniqid(mt_rand(), true)); eval('class ' . $className . ' { private $collectionProperty; public function __construct($object1, $object2) { $this->collectionProperty = new \\Doctrine\\Common\\Collections\\ArrayCollection(); $this->collectionProperty->add($object1); $this->collectionProperty->add($object2); } public function getCollectionProperty() { return $this->collectionProperty; } }'); $mockReflectionService = $this->getMockBuilder(ReflectionService::class)->disableOriginalConstructor()->getMock(); $mockReflectionService->expects($this->at(0))->method('getClassPropertyNames')->with($className)->will($this->returnValue(['collectionProperty'])); $mockReflectionService->expects($this->at(1))->method('getClassPropertyNames')->will($this->returnValue([])); $mockReflectionService->expects($this->at(2))->method('getClassPropertyNames')->will($this->returnValue([])); $mockReflectionService->expects($this->at(3))->method('getClassPropertyNames')->will($this->returnValue([])); $mockReflectionService->expects($this->any())->method('isPropertyTaggedWith')->with($className, 'collectionProperty', 'transient')->will($this->returnValue(false)); $objectSerializer = new ObjectSerializer($this->getMockBuilder(SessionInterface::class)->disableOriginalConstructor()->getMock()); $objectSerializer->injectReflectionService($mockReflectionService); $objectHash1 = spl_object_hash($propertyClass1); $objectHash2 = spl_object_hash($propertyClass2); $object = new $className($propertyClass1, $propertyClass2); $expectedArray = [$objectHash1 => [ObjectSerializer::CLASSNAME => $propertyClassName1, ObjectSerializer::PROPERTIES => []], $objectHash2 => [ObjectSerializer::CLASSNAME => $propertyClassName2, ObjectSerializer::PROPERTIES => []], spl_object_hash($object) => [ObjectSerializer::CLASSNAME => $className, ObjectSerializer::PROPERTIES => ['collectionProperty' => [ObjectSerializer::TYPE => 'Collection', ObjectSerializer::CLASSNAME => 'Doctrine\\Common\\Collections\\ArrayCollection', ObjectSerializer::VALUE => [$objectHash1, $objectHash2]]]]]; $this->assertEquals($expectedArray, $objectSerializer->serializeObjectAsPropertyArray($object)); }