public function testWarmUpAndIsOptional() { $oroProvider = $this->getMock('Oro\\Bundle\\EmailBundle\\Entity\\Provider\\EmailOwnerProviderInterface'); $oroProvider->expects($this->any())->method('getEmailOwnerClass')->will($this->returnValue('Oro\\TestUser')); $oroCrmProvider = $this->getMock('Oro\\Bundle\\EmailBundle\\Entity\\Provider\\EmailOwnerProviderInterface'); $oroCrmProvider->expects($this->any())->method('getEmailOwnerClass')->will($this->returnValue('OroCRM\\TestContact')); $acmeProvider = $this->getMock('Oro\\Bundle\\EmailBundle\\Entity\\Provider\\EmailOwnerProviderInterface'); $acmeProvider->expects($this->any())->method('getEmailOwnerClass')->will($this->returnValue('Acme\\TestUser')); $storage = new EmailOwnerProviderStorage(); $storage->addProvider($oroProvider); $storage->addProvider($oroCrmProvider); $storage->addProvider($acmeProvider); $kernel = $this->getMock('Symfony\\Component\\HttpKernel\\KernelInterface'); $warmer = $this->getMockBuilder('Oro\\Bundle\\EmailBundle\\Cache\\EntityCacheWarmer')->setConstructorArgs(array($storage, 'SomeDir', 'Test\\SomeNamespace', 'Test%sProxy', $kernel))->setMethods(array('createFilesystem', 'createTwigEnvironment', 'writeCacheFile'))->getMock(); $fs = $this->getMockBuilder('Symfony\\Component\\Filesystem\\Filesystem')->disableOriginalConstructor()->getMock(); $twig = $this->getMockBuilder('\\Twig_Environment')->disableOriginalConstructor()->getMock(); $warmer->expects($this->once())->method('createFilesystem')->will($this->returnValue($fs)); $warmer->expects($this->once())->method('createTwigEnvironment')->will($this->returnValue($twig)); $fs->expects($this->once())->method('exists')->with($this->equalTo('SomeDir')); $fs->expects($this->once())->method('mkdir')->with($this->equalTo('SomeDir'), $this->equalTo(0777)); $this->setTwigAndSaveExpectations($twig, $warmer, '.php', 0); $this->setTwigAndSaveExpectations($twig, $warmer, '.orm.yml', 1); $warmer->warmup(''); $this->assertFalse($warmer->isOptional()); }
public function setUp() { $this->fixtures = ['primaryEmail' => [1 => (new EmailAddress(1))->setEmail('*****@*****.**'), 2 => (new EmailAddress(2))->setEmail('*****@*****.**')], 'email' => ['*****@*****.**' => (new EmailAddress(1))->setEmail('*****@*****.**'), '*****@*****.**' => (new EmailAddress(2))->setEmail('*****@*****.**')]]; $emailOwnerProvider = $this->getMock('Oro\\Bundle\\EmailBundle\\Entity\\Provider\\EmailOwnerProviderInterface'); $emailOwnerProvider->expects($this->any())->method('getEmailOwnerClass')->will($this->returnValue('Oro\\Bundle\\EmailBundle\\Tests\\Unit\\Entity\\TestFixtures\\TestEmailOwner')); $this->emailOwnerProviderStorage = $this->getMockBuilder('Oro\\Bundle\\EmailBundle\\Entity\\Provider\\EmailOwnerProviderStorage')->disableOriginalConstructor()->getMock(); $this->emailOwnerProviderStorage->expects($this->any())->method('getProviders')->will($this->returnValue([$emailOwnerProvider, $emailOwnerProvider])); $this->emailOwnerProviderStorage->expects($this->any())->method('getEmailOwnerFieldName')->will($this->onConsecutiveCalls('primaryEmail', 'homeEmail')); $emailAddressRepository = $this->getMockBuilder('Doctrine\\ORM\\EntityRepository')->disableOriginalConstructor()->getMock(); $emailAddressRepository->expects($this->any())->method('findOneBy')->will($this->returnCallback(function (array $criteria) { return $this->findEmailAddressBy($criteria['email']); })); $emailAddressRepository->expects($this->any())->method('findBy')->will($this->returnCallback(function (array $criteria) { $keys = array_keys($criteria); $owner = $criteria[$keys[0]]; $emailAddress = $this->findEmailAddressBy($owner->getId(), $keys[0]); if ($emailAddress) { return [$emailAddress]; } return []; })); $em = $this->getMockBuilder('Doctrine\\ORM\\EntityManager')->disableOriginalConstructor()->getMock(); $this->emailAddressManager = $this->getMockBuilder('Oro\\Bundle\\EmailBundle\\Entity\\Manager\\EmailAddressManager')->disableOriginalConstructor()->getMock(); $this->emailAddressManager->expects($this->any())->method('getEmailAddressRepository')->will($this->returnValue($emailAddressRepository)); $this->emailAddressManager->expects($this->any())->method('newEmailAddress')->will($this->returnValue(new EmailAddress())); $this->emailAddressManager->expects($this->any())->method('getEntityManager')->will($this->returnValue($em)); $this->emailOwnerManager = new EmailOwnerManager($this->emailOwnerProviderStorage, $this->emailAddressManager); }
/** * Constructor. * * @param EmailOwnerProviderStorage $emailOwnerProviderStorage * @param EmailAddressManager $emailAddressManager */ public function __construct(EmailOwnerProviderStorage $emailOwnerProviderStorage, EmailAddressManager $emailAddressManager) { foreach ($emailOwnerProviderStorage->getProviders() as $provider) { $fieldName = $emailOwnerProviderStorage->getEmailOwnerFieldName($provider); $this->emailOwnerClasses[$fieldName] = $provider->getEmailOwnerClass(); } $this->emailAddressManager = $emailAddressManager; }
/** * Constructor. * * @param EmailOwnerProviderStorage $emailOwnerProviderStorage * @param EmailAddressManager $emailAddressManager */ public function __construct(EmailOwnerProviderStorage $emailOwnerProviderStorage, EmailAddressManager $emailAddressManager) { foreach ($emailOwnerProviderStorage->getProviders() as $provider) { $fieldName = sprintf('owner%d', count($this->emailOwnerClasses) + 1); $this->emailOwnerClasses[$fieldName] = $provider->getEmailOwnerClass(); } $this->emailAddressManager = $emailAddressManager; }
/** * Constructor. * * @param EmailOwnerProviderStorage $emailOwnerProviderStorage * @param string $entityCacheDir * @param string $entityCacheNamespace * @param string $entityProxyNameTemplate */ public function __construct(EmailOwnerProviderStorage $emailOwnerProviderStorage, $entityCacheDir, $entityCacheNamespace, $entityProxyNameTemplate) { foreach ($emailOwnerProviderStorage->getProviders() as $provider) { $this->emailOwnerClasses[count($this->emailOwnerClasses) + 1] = $provider->getEmailOwnerClass(); } $this->entityCacheDir = $entityCacheDir; $this->entityCacheNamespace = $entityCacheNamespace; $this->entityProxyNameTemplate = $entityProxyNameTemplate; }
/** * @param object $entity * @return bool */ public function supportOwnerProvider($entity) { foreach ($this->emailOwnerStorage->getProviders() as $provider) { if ($this->activityListChainProvider->isSupportedTargetEntity($entity) && $provider->getEmailOwnerClass() === ClassUtils::getClass($entity)) { return true; } } return false; }
/** * Find an entity object which is an owner of the given email address * * @param \Doctrine\ORM\EntityManager $em * @param string $email * @return EmailOwnerInterface */ public function findEmailOwner(EntityManager $em, $email) { $emailOwner = null; foreach ($this->emailOwnerProviderStorage->getProviders() as $provider) { $emailOwner = $provider->findEmailOwner($em, $email); if ($emailOwner !== null) { break; } } return $emailOwner; }
public function testStorage() { $provider1 = $this->getMock('Oro\\Bundle\\EmailBundle\\Entity\\Provider\\EmailOwnerProviderInterface'); $provider2 = $this->getMock('Oro\\Bundle\\EmailBundle\\Entity\\Provider\\EmailOwnerProviderInterface'); $storage = new EmailOwnerProviderStorage(); $storage->addProvider($provider1); $storage->addProvider($provider2); $result = $storage->getProviders(); $this->assertCount(2, $result); $this->assertTrue($provider1 === $result[0]); $this->assertTrue($provider2 === $result[1]); }
protected function setUp() { $this->emailOwnerManager = $this->getMockBuilder('Oro\\Bundle\\EmailBundle\\Entity\\Manager\\EmailOwnerManager')->disableOriginalConstructor()->getMock(); $this->emailActivityManager = $this->getMockBuilder('Oro\\Bundle\\EmailBundle\\Entity\\Manager\\EmailActivityManager')->disableOriginalConstructor()->getMock(); $this->emailThreadManager = $this->getMockBuilder('Oro\\Bundle\\EmailBundle\\Entity\\Manager\\EmailThreadManager')->disableOriginalConstructor()->getMock(); $this->registry = $this->getMockBuilder('Doctrine\\Bundle\\DoctrineBundle\\Registry')->setMethods(['getRepository', 'getEmailsByOwnerEntity'])->disableOriginalConstructor()->getMock(); $this->userEmailOwnerProvider = $this->getMockBuilder('Oro\\Bundle\\UserBundle\\Entity\\Provider\\EmailOwnerProvider')->disableOriginalConstructor()->getMock(); $this->chainProvider = $this->getMockBuilder('Oro\\Bundle\\ActivityListBundle\\Provider\\ActivityListChainProvider')->disableOriginalConstructor()->getMock(); $this->emailOwnerStorage = new EmailOwnerProviderStorage(); $this->emailOwnerStorage->addProvider($this->userEmailOwnerProvider); $this->emailOwnersProvider = $this->getMockBuilder('Oro\\Bundle\\EmailBundle\\Provider\\EmailOwnersProvider')->setConstructorArgs([$this->chainProvider, $this->emailOwnerStorage, $this->registry])->setMethods(['supportOwnerProvider'])->getMock(); $this->listener = new EntityListener($this->emailOwnerManager, $this->emailActivityManager, $this->emailThreadManager, $this->emailOwnersProvider); }
public function testPrepareQueryOneProviderGiven() { $provider = $this->getMock('Oro\\Bundle\\EmailBundle\\Entity\\Provider\\EmailOwnerProviderInterface'); $provider->expects($this->any())->method('getEmailOwnerClass')->will($this->returnValue(self::TEST_ENTITY)); $this->registry->addProvider($provider); $this->formatter->expects($this->once())->method('getFormattedNameDQL')->with($this->equalTo('owner1'), $this->equalTo(self::TEST_ENTITY))->will($this->returnValue(self::TEST_NAME_DQL_FORMATTED)); $em = $this->getTestEntityManager(); $qb = $em->createQueryBuilder(); $qb->select('e')->from('OroEmailBundle:Email', 'e')->leftJoin('e.fromEmailAddress', self::JOIN_ALIAS); $this->factory->prepareQuery($qb); // @codingStandardsIgnoreStart $this->assertEquals("SELECT e, " . "CONCAT('', CASE WHEN a.hasOwner = true THEN (" . "CASE WHEN a.owner1 IS NOT NULL THEN CONCAT(a.firstName, CONCAT(a.lastName, '')) ELSE '' END" . ") ELSE a.email END) as fromEmailExpression " . "FROM OroEmailBundle:Email e LEFT JOIN e.fromEmailAddress a LEFT JOIN a.owner1 owner1", $qb->getDQL()); // @codingStandardsIgnoreEnd }
/** * @param string[] $emailsToLoad * * @return array * key = email address * value = array * known => true/false * false if the address belongs to user only * true if the address belongs to not excluded owners * user => user id */ protected function getKnownEmailAddresses(array $emailsToLoad) { $repo = $this->emailAddressManager->getEmailAddressRepository($this->em); $qb = $repo->createQueryBuilder('a')->where('a.hasOwner = :hasOwner AND a.email IN (:emails)')->setParameter('hasOwner', true)->setParameter('emails', $emailsToLoad); $select = 'a.email'; $userIdField = null; $mailboxIdField = null; $ownerIdFields = []; foreach ($this->emailOwnerProviderStorage->getProviders() as $provider) { $ownerClass = $provider->getEmailOwnerClass(); $isUser = $ownerClass === 'Oro\\Bundle\\UserBundle\\Entity\\User'; $isMailbox = $ownerClass === 'Oro\\Bundle\\EmailBundle\\Entity\\Mailbox'; $field = $this->emailOwnerProviderStorage->getEmailOwnerFieldName($provider); if ($isUser) { $userIdField = $field; } if ($isMailbox) { $mailboxIdField = $field; } if (isset($this->exclusions[$ownerClass])) { if ($isUser) { $select .= sprintf(',IDENTITY(a.%1$s) AS %1$s', $field); } else { $qb->andWhere(sprintf('a.%s IS NULL', $field)); } } else { $select .= sprintf(',IDENTITY(a.%1$s) AS %1$s', $field); $ownerIdFields[] = $field; } } $qb->select($select); $data = $qb->getQuery()->getArrayResult(); $result = $this->prepareKnownEmailAddressesData($data, $ownerIdFields, $userIdField, $mailboxIdField); return $result; }
/** * @param string $emailFromTableAlias EmailAddress table alias of joined Email#fromEmailAddress association * * @return string */ protected function getFromEmailExpression($emailFromTableAlias) { $providers = $this->emailOwnerProviderStorage->getProviders(); if (empty($providers)) { return sprintf('%s.email', $emailFromTableAlias); } $expressionsByOwner = []; foreach ($providers as $provider) { $relationAlias = $this->emailOwnerProviderStorage->getEmailOwnerFieldName($provider); $expressionsByOwner[$relationAlias] = $this->entityNameResolver->getNameDQL($provider->getEmailOwnerClass(), $relationAlias); } $expression = ''; foreach ($expressionsByOwner as $alias => $expressionPart) { $expression .= sprintf('WHEN %s.%s IS NOT NULL THEN %s ', $emailFromTableAlias, $alias, $expressionPart); } $expression = sprintf('CASE %sELSE \'\' END', $expression); // if has owner then use expression to expose formatted name, use email otherwise return sprintf('CONCAT(\'\', CASE WHEN %1$s.hasOwner = true THEN (%2$s) ELSE %1$s.email END) as fromEmailExpression', $emailFromTableAlias, $expression); }
/** * @param RegistryInterface $registry * @param string $className * @param EmailOwnerProviderStorage $emailOwnerProviderStorage * @param UserConfigManager $userConfigManager */ public function __construct(RegistryInterface $registry, $className, EmailOwnerProviderStorage $emailOwnerProviderStorage, UserConfigManager $userConfigManager) { $this->registry = $registry; $this->className = $className; $this->alias = 'o'; // default for ($i = 1; $i <= count($emailOwnerProviderStorage->getProviders()); $i++) { $this->emailOwnerFieldNames[] = sprintf('owner%d', $i); } $firstNames = array(); $lastNames = array(); foreach ($this->emailOwnerFieldNames as $fieldName) { $firstNames[] = sprintf('%s.firstName', $fieldName); $lastNames[] = sprintf('%s.lastName', $fieldName); } $firstName = sprintf('COALESCE(%s, \'\')', implode(', ', $firstNames)); $lastName = sprintf('COALESCE(%s, \'\')', implode(', ', $lastNames)); // TODO: refactor usage of email name formats https://magecore.atlassian.net/browse/BAP-2007 $nameFormat = '%first% %last%'; $this->fromEmailExpression = $this->buildFromEmailExpression($nameFormat, $firstName, $lastName) . ' as FromEmailExpression'; }
/** * @param string[] $emailsToLoad * * @return array * key = email address * value = array * known => true/false * false if the address belongs to user only * true if the address belongs to not excluded owners * user => user id */ protected function getKnownEmailAddresses(array $emailsToLoad) { $repo = $this->emailAddressManager->getEmailAddressRepository($this->em); $qb = $repo->createQueryBuilder('a')->where('a.hasOwner = :hasOwner AND a.email IN (:emails)')->setParameter('hasOwner', true)->setParameter('emails', $emailsToLoad); $select = 'a.email'; $userIdField = null; $mailboxIdField = null; $ownerIdFields = []; foreach ($this->emailOwnerProviderStorage->getProviders() as $provider) { $ownerClass = $provider->getEmailOwnerClass(); $isUser = $ownerClass === 'Oro\\Bundle\\UserBundle\\Entity\\User'; $isMailbox = $ownerClass === 'Oro\\Bundle\\EmailBundle\\Entity\\Mailbox'; $field = $this->emailOwnerProviderStorage->getEmailOwnerFieldName($provider); if ($isUser) { $userIdField = $field; } if ($isMailbox) { $mailboxIdField = $field; } if (isset($this->exclusions[$ownerClass])) { if ($isUser) { $select .= sprintf(',IDENTITY(a.%1$s) AS %1$s', $field); } else { $qb->andWhere(sprintf('a.%s IS NULL', $field)); } } else { $select .= sprintf(',IDENTITY(a.%1$s) AS %1$s', $field); $ownerIdFields[] = $field; } } $qb->select($select); $result = []; $data = $qb->getQuery()->getArrayResult(); foreach ($data as $item) { $known = false; foreach ($ownerIdFields as $field) { if ($item[$field] !== null) { $known = true; break; } } $email = strtolower($item['email']); $userId = $item[$userIdField]; $mailboxId = $item[$mailboxIdField]; $result[$email] = $userId === null ? ['known' => $known] : ['known' => $known, 'user' => (int) $userId]; if ($mailboxId !== null) { $result[$email]['mailbox'] = $mailboxId; } } return $result; }
/** * Create a proxy class for EmailAddress entity and save it in cache * * @param Filesystem $fs * @param \Twig_Environment $twig */ protected function processEmailAddressTemplate(Filesystem $fs, \Twig_Environment $twig) { // Ensure the cache directory exists if (!$fs->exists($this->entityCacheDir)) { $fs->mkdir($this->entityCacheDir, 0777); } $args = array(); $providers = $this->emailOwnerProviderStorage->getProviders(); foreach ($providers as $provider) { $args[] = array('targetEntity' => $provider->getEmailOwnerClass(), 'columnName' => $this->emailOwnerProviderStorage->getEmailOwnerColumnName($provider), 'fieldName' => $this->emailOwnerProviderStorage->getEmailOwnerFieldName($provider)); } $className = sprintf($this->entityProxyNameTemplate, 'EmailAddress'); $twigParams = array('namespace' => $this->entityCacheNamespace, 'className' => $className, 'owners' => $args); // generate a proxy class $content = $twig->render('EmailAddress.php.twig', $twigParams); $this->writeCacheFile(sprintf('%s%s%s.php', $this->entityCacheDir, DIRECTORY_SEPARATOR, $className), $content); // generate ORM mappings for a proxy class $content = $twig->render('EmailAddress.orm.yml.twig', $twigParams); $this->writeCacheFile(sprintf('%s%s%s.orm.yml', $this->entityCacheDir, DIRECTORY_SEPARATOR, $className), $content); }
/** * @return string */ protected function getUserOwnerFieldName() { return $this->emailOwnerProviderStorage->getEmailOwnerFieldName(ArrayUtil::find(function (EmailOwnerProviderInterface $provider) { return $provider->getEmailOwnerClass() === 'Oro\\Bundle\\UserBundle\\Entity\\User'; }, $this->emailOwnerProviderStorage->getProviders())); }
private function getEmailOwnerProviderStorage() { $provider1 = $this->getMock('Oro\\Bundle\\EmailBundle\\Entity\\Provider\\EmailOwnerProviderInterface'); $provider1->expects($this->any())->method('getEmailOwnerClass')->will($this->returnValue('Oro\\Bundle\\EmailBundle\\Tests\\Unit\\Entity\\TestFixtures\\TestEmailOwner')); $provider2 = $this->getMock('Oro\\Bundle\\EmailBundle\\Entity\\Provider\\EmailOwnerProviderInterface'); $provider2->expects($this->any())->method('getEmailOwnerClass')->will($this->returnValue('Oro\\Bundle\\EmailBundle\\Tests\\Unit\\Entity\\TestFixtures\\TestEmailOwnerWithoutEmail')); $storage = new EmailOwnerProviderStorage(); $storage->addProvider($provider1); $storage->addProvider($provider2); return $storage; }