Пример #1
0
 public function testCreateAllSpool()
 {
     $this->importDataSet(ORIGINAL_ROOT . 'typo3/sysext/core/Tests/Functional/Fixtures/tt_content.xml');
     $db = $this->getDatabaseConnection();
     $count = $db->exec_SELECTcountRows('*', 'tx_newsletter_domain_model_newsletter', 'begin_time != 0 AND end_time != 0');
     $this->assertSame(0, $count);
     Tools::createAllSpool();
     $count = $db->exec_SELECTcountRows('*', 'tx_newsletter_domain_model_newsletter', 'begin_time != 0 AND end_time != 0');
     $this->assertSame(1, $count, 'newsletter should be marked as spooled');
     $count = $db->exec_SELECTcountRows('*', 'tx_newsletter_domain_model_email', 'newsletter = 20 AND begin_time = 0');
     $this->assertSame(2, $count, 'two emails must have been created but not sent yet');
     $lastInsertedEmail = $db->exec_SELECTgetSingleRow('*', 'tx_newsletter_domain_model_email', 'newsletter = 20 AND begin_time = 0');
     $this->assertNotSame(md5('0' . $lastInsertedEmail['recipient_address']), $lastInsertedEmail['auth_code'], 'the UID used in authCode must never be 0');
     $this->assertSame(md5($lastInsertedEmail['uid'] . $lastInsertedEmail['recipient_address']), $lastInsertedEmail['auth_code'], 'the UID used in authCode should be the real value');
     // Prepare a mock to always validate content
     /** @var \Ecodev\Newsletter\Utility\Validator|\PHPUnit_Framework_MockObject_MockObject $mockValidator */
     $mockValidator = $this->getMock(\Ecodev\Newsletter\Utility\Validator::class, ['validate'], [], '', false);
     $mockValidator->method('validate')->will($this->returnValue(['content' => 'some very interesting content <a href="http://example.com/fake-content">link</a>', 'errors' => [], 'warnings' => [], 'infos' => []]));
     // Force email to NOT be sent
     global $TYPO3_CONF_VARS;
     $TYPO3_CONF_VARS['MAIL']['transport'] = 'Swift_NullTransport';
     /** @var \Ecodev\Newsletter\Domain\Repository\NewsletterRepository $newsletterRepository */
     $newsletterRepository = $this->objectManager->get(\Ecodev\Newsletter\Domain\Repository\NewsletterRepository::class);
     $newsletter = $newsletterRepository->findByUid(20);
     $newsletter->setValidator($mockValidator);
     Tools::runSpool($newsletter);
     $count = $db->exec_SELECTcountRows('*', 'tx_newsletter_domain_model_email', 'newsletter = 20 AND begin_time != 0 AND end_time != 0 AND recipient_data != ""');
     $this->assertSame(2, $count, 'should have sent two emails');
     $count = $db->exec_SELECTcountRows('*', 'tx_newsletter_domain_model_link', 'newsletter = 20');
     $this->assertSame(1, $count, 'should have on1 new link');
 }
Пример #2
0
 public function testCreateAllSpool()
 {
     $this->importDataSet(ORIGINAL_ROOT . 'typo3/sysext/core/Tests/Functional/Fixtures/tt_content.xml');
     $db = $this->getDatabaseConnection();
     $count = $db->exec_SELECTcountRows('*', 'tx_newsletter_domain_model_newsletter', 'begin_time != 0 AND end_time != 0');
     $this->assertEquals(0, $count);
     \Ecodev\Newsletter\Tools::createAllSpool();
     $count = $db->exec_SELECTcountRows('*', 'tx_newsletter_domain_model_newsletter', 'begin_time != 0 AND end_time != 0');
     $this->assertEquals(1, $count, 'newsletter should be marked as spooled');
     $count = $db->exec_SELECTcountRows('*', 'tx_newsletter_domain_model_email', 'newsletter = 20 AND begin_time = 0');
     $this->assertEquals(2, $count, 'two emails must have been created but not sent yet');
     // Prepare a mock to always validate content
     $mockValidator = $this->getMock('Ecodev\\Newsletter\\Utility\\Validator', array('validate'), array(), '', false);
     $mockValidator->method('validate')->will($this->returnValue(array('content' => 'some very interesting content <a href="http://example.com/fake-content">link</a>', 'errors' => array(), 'warnings' => array(), 'infos' => array())));
     // Force email to NOT be sent
     global $TYPO3_CONF_VARS;
     $TYPO3_CONF_VARS['MAIL']['transport'] = 'Swift_NullTransport';
     $newsletterRepository = $this->objectManager->get('Ecodev\\Newsletter\\Domain\\Repository\\NewsletterRepository');
     $newsletter = $newsletterRepository->findByUid(20);
     $newsletter->setValidator($mockValidator);
     \Ecodev\Newsletter\Tools::runSpool($newsletter);
     $count = $db->exec_SELECTcountRows('*', 'tx_newsletter_domain_model_email', 'newsletter = 20 AND begin_time != 0 AND end_time != 0 AND recipient_data != ""');
     $this->assertEquals(2, $count, 'should have sent two emails');
     $count = $db->exec_SELECTcountRows('*', 'tx_newsletter_domain_model_link', 'newsletter = 20');
     $this->assertEquals(1, $count, 'should have on1 new link');
 }
Пример #3
0
 /**
  * Creates a new Newsletter and forwards to the list action.
  *
  * @param \Ecodev\Newsletter\Domain\Model\Newsletter $newNewsletter a fresh Newsletter object which has not yet been added to the repository
  * @dontverifyrequesthash
  * @dontvalidate $newNewsletter
  * @ignorevalidation $newNewsletter
  */
 public function createAction(Newsletter $newNewsletter = null)
 {
     $limitTestRecipientCount = 10;
     // This is a low limit, technically, but it does not make sense to test a newsletter for more people than that anyway
     $recipientList = $newNewsletter->getRecipientList();
     $recipientList->init();
     $count = $recipientList->getCount();
     $validatedContent = $newNewsletter->getValidatedContent($language);
     // If we attempt to create a newsletter as a test but it has too many recipient, reject it (we cannot safely send several emails wihtout slowing down respoonse and/or timeout issues)
     if ($newNewsletter->getIsTest() && $count > $limitTestRecipientCount) {
         $this->addFlashMessage($this->translate('flashmessage_test_maximum_recipients', [$count, $limitTestRecipientCount]), $this->translate('flashmessage_test_maximum_recipients_title'), \TYPO3\CMS\Core\Messaging\FlashMessage::ERROR);
         $this->view->assign('success', false);
     } elseif (count($validatedContent['errors'])) {
         $this->addFlashMessage('The newsletter HTML content does not validate. See tab "Newsletter > Status" for details.', $this->translate('flashmessage_newsletter_invalid'), \TYPO3\CMS\Core\Messaging\FlashMessage::ERROR);
         $this->view->assign('success', false);
     } else {
         // If it's a test newsletter, it's planned to be sent right now
         if ($newNewsletter->getIsTest()) {
             $newNewsletter->setPlannedTime(new DateTime());
         }
         // Save the new newsletter
         $this->newsletterRepository->add($newNewsletter);
         $this->persistenceManager->persistAll();
         $this->view->assign('success', true);
         // If it is test newsletter, send it immediately
         if ($newNewsletter->getIsTest()) {
             try {
                 // Fill the spool and run the queue
                 Tools::createSpool($newNewsletter);
                 Tools::runSpool($newNewsletter);
                 $this->addFlashMessage($this->translate('flashmessage_test_newsletter_sent'), $this->translate('flashmessage_test_newsletter_sent_title'), \TYPO3\CMS\Core\Messaging\FlashMessage::OK);
             } catch (\Exception $exception) {
                 $this->addFlashMessage($exception->getMessage(), $this->translate('flashmessage_test_newsletter_error'), \TYPO3\CMS\Core\Messaging\FlashMessage::ERROR);
             }
         } else {
             $this->addFlashMessage($this->translate('flashmessage_newsletter_queued'), $this->translate('flashmessage_newsletter_queued_title'), \TYPO3\CMS\Core\Messaging\FlashMessage::OK);
         }
     }
     $this->view->setVariablesToRender(['data', 'success', 'flashMessages']);
     $this->view->setConfiguration(['data' => self::resolveJsonViewConfiguration()]);
     $this->view->assign('data', $newNewsletter);
     $this->flushFlashMessages();
 }