/** * @param object $entity * @param bool $mockToken * @param bool $mockUser * @param bool $detachedUser * @param bool $reloadUser * @dataProvider prePersistAndPreUpdateDataProvider */ public function testPreUpdate($entity, $mockToken = false, $mockUser = false, $detachedUser = null, $reloadUser = null) { $oldDate = new \DateTime('2012-12-12 12:12:12'); $oldUser = new User(); $oldUser->setFirstName('oldUser'); if ($entity instanceof Contact) { $entity->setUpdatedAt($oldDate); $entity->setUpdatedBy($oldUser); } $initialEntity = clone $entity; $newUser = null; if ($mockUser) { $newUser = new User(); $newUser->setFirstName('newUser'); } $this->mockSecurityContext($mockToken, $mockUser, $newUser); $unitOfWork = $this->getMockBuilder('Doctrine\\ORM\\UnitOfWork')->setMethods(array('propertyChanged', 'getEntityState'))->disableOriginalConstructor()->getMock(); $entityManager = $this->getEntityManagerMock($reloadUser, $newUser); $entityManager->expects($this->any())->method('getUnitOfWork')->will($this->returnValue($unitOfWork)); if ($entity instanceof Contact) { $callIndex = 0; if (null !== $detachedUser) { $unitOfWork->expects($this->at($callIndex++))->method('getEntityState')->with($newUser)->will($this->returnValue($detachedUser ? UnitOfWork::STATE_DETACHED : UnitOfWork::STATE_MANAGED)); } $unitOfWork->expects($this->at($callIndex++))->method('propertyChanged')->with($entity, 'updatedAt', $oldDate, $this->isInstanceOf('\\DateTime')); $unitOfWork->expects($this->at($callIndex))->method('propertyChanged')->with($entity, 'updatedBy', $oldUser, $newUser); } else { $unitOfWork->expects($this->never())->method($this->anything()); } $changeSet = array(); $args = new PreUpdateEventArgs($entity, $entityManager, $changeSet); $this->contactListener->preUpdate($args); if (!$entity instanceof Contact) { $this->assertEquals($initialEntity, $entity); return; } $this->assertInstanceOf('\\DateTime', $entity->getUpdatedAt()); if ($mockToken && $mockUser) { $this->assertEquals($newUser, $entity->getUpdatedBy()); } else { $this->assertNull($entity->getUpdatedBy()); } }