diff --git a/app/code/Magento/Rss/Model/Rss.php b/app/code/Magento/Rss/Model/Rss.php
index 7461c780fb230..200ffb967ad1a 100644
--- a/app/code/Magento/Rss/Model/Rss.php
+++ b/app/code/Magento/Rss/Model/Rss.php
@@ -8,6 +8,8 @@
use Magento\Framework\App\ObjectManager;
use Magento\Framework\App\Rss\DataProviderInterface;
use Magento\Framework\Serialize\SerializerInterface;
+use Magento\Framework\App\FeedInterface;
+use Magento\Framework\App\FeedFactoryInterface;
/**
* Provides functionality to work with RSS feeds
@@ -27,6 +29,11 @@ class Rss
*/
protected $cache;
+ /**
+ * @var \Magento\Framework\App\FeedFactoryInterface
+ */
+ private $feedFactory;
+
/**
* @var SerializerInterface
*/
@@ -37,13 +44,16 @@ class Rss
*
* @param \Magento\Framework\App\CacheInterface $cache
* @param SerializerInterface|null $serializer
+ * @param FeedFactoryInterface|null $feedFactory
*/
public function __construct(
\Magento\Framework\App\CacheInterface $cache,
- SerializerInterface $serializer = null
+ SerializerInterface $serializer = null,
+ FeedFactoryInterface $feedFactory = null
) {
$this->cache = $cache;
$this->serializer = $serializer ?: ObjectManager::getInstance()->get(SerializerInterface::class);
+ $this->feedFactory = $feedFactory ?: ObjectManager::getInstance()->get(FeedFactoryInterface::class);
}
/**
@@ -92,7 +102,13 @@ public function setDataProvider(DataProviderInterface $dataProvider)
*/
public function createRssXml()
{
- $rssFeedFromArray = \Zend_Feed::importArray($this->getFeeds(), 'rss');
- return $rssFeedFromArray->saveXML();
+ $feed = $this->feedFactory->create(
+ $this->getFeeds(),
+ FeedFactoryInterface::FORMAT_RSS
+ );
+
+ return $feed->getFormattedContentAs(
+ FeedInterface::FORMAT_XML
+ );
}
}
diff --git a/app/code/Magento/Rss/Test/Unit/Controller/Adminhtml/Feed/IndexTest.php b/app/code/Magento/Rss/Test/Unit/Controller/Adminhtml/Feed/IndexTest.php
index 32aab6ffb92bc..8c99576b76fea 100644
--- a/app/code/Magento/Rss/Test/Unit/Controller/Adminhtml/Feed/IndexTest.php
+++ b/app/code/Magento/Rss/Test/Unit/Controller/Adminhtml/Feed/IndexTest.php
@@ -103,14 +103,22 @@ public function testExecuteWithException()
$dataProvider = $this->createMock(\Magento\Framework\App\Rss\DataProviderInterface::class);
$dataProvider->expects($this->once())->method('isAllowed')->will($this->returnValue(true));
- $rssModel = $this->createPartialMock(\Magento\Rss\Model\Rss::class, ['setDataProvider']);
+ $rssModel = $this->createPartialMock(\Magento\Rss\Model\Rss::class, ['setDataProvider', 'createRssXml']);
$rssModel->expects($this->once())->method('setDataProvider')->will($this->returnSelf());
+ $exceptionMock = new \Magento\Framework\Exception\RuntimeException(
+ new \Magento\Framework\Phrase('Any message')
+ );
+
+ $rssModel->expects($this->once())->method('createRssXml')->will(
+ $this->throwException($exceptionMock)
+ );
+
$this->response->expects($this->once())->method('setHeader')->will($this->returnSelf());
$this->rssFactory->expects($this->once())->method('create')->will($this->returnValue($rssModel));
$this->rssManager->expects($this->once())->method('getProvider')->will($this->returnValue($dataProvider));
- $this->expectException('\Zend_Feed_Builder_Exception');
+ $this->expectException(\Magento\Framework\Exception\RuntimeException::class);
$this->controller->execute();
}
}
diff --git a/app/code/Magento/Rss/Test/Unit/Controller/Feed/IndexTest.php b/app/code/Magento/Rss/Test/Unit/Controller/Feed/IndexTest.php
index 71802deee0a8d..ce0bfd455565d 100644
--- a/app/code/Magento/Rss/Test/Unit/Controller/Feed/IndexTest.php
+++ b/app/code/Magento/Rss/Test/Unit/Controller/Feed/IndexTest.php
@@ -52,6 +52,7 @@ protected function setUp()
->disableOriginalConstructor()->getMock();
$objectManagerHelper = new ObjectManagerHelper($this);
+
$this->controller = $objectManagerHelper->getObject(
\Magento\Rss\Controller\Feed\Index::class,
[
@@ -90,14 +91,22 @@ public function testExecuteWithException()
$dataProvider = $this->createMock(\Magento\Framework\App\Rss\DataProviderInterface::class);
$dataProvider->expects($this->once())->method('isAllowed')->will($this->returnValue(true));
- $rssModel = $this->createPartialMock(\Magento\Rss\Model\Rss::class, ['setDataProvider']);
+ $rssModel = $this->createPartialMock(\Magento\Rss\Model\Rss::class, ['setDataProvider', 'createRssXml']);
$rssModel->expects($this->once())->method('setDataProvider')->will($this->returnSelf());
+ $exceptionMock = new \Magento\Framework\Exception\RuntimeException(
+ new \Magento\Framework\Phrase('Any message')
+ );
+
+ $rssModel->expects($this->once())->method('createRssXml')->will(
+ $this->throwException($exceptionMock)
+ );
+
$this->response->expects($this->once())->method('setHeader')->will($this->returnSelf());
$this->rssFactory->expects($this->once())->method('create')->will($this->returnValue($rssModel));
$this->rssManager->expects($this->once())->method('getProvider')->will($this->returnValue($dataProvider));
- $this->expectException('\Zend_Feed_Builder_Exception');
+ $this->expectException(\Magento\Framework\Exception\RuntimeException::class);
$this->controller->execute();
}
}
diff --git a/app/code/Magento/Rss/Test/Unit/Model/RssTest.php b/app/code/Magento/Rss/Test/Unit/Model/RssTest.php
index 6f98b9f202e30..8a5d2efd756a8 100644
--- a/app/code/Magento/Rss/Test/Unit/Model/RssTest.php
+++ b/app/code/Magento/Rss/Test/Unit/Model/RssTest.php
@@ -19,7 +19,7 @@ class RssTest extends \PHPUnit\Framework\TestCase
/**
* @var array
*/
- protected $feedData = [
+ private $feedData = [
'title' => 'Feed Title',
'link' => 'http://magento.com/rss/link',
'description' => 'Feed Description',
@@ -33,6 +33,27 @@ class RssTest extends \PHPUnit\Framework\TestCase
],
];
+ /**
+ * @var string
+ */
+ private $feedXml = '
+
+
+
+ http://magento.com/rss/link
+
+ Sat, 22 Apr 2017 13:21:12 +0200
+ Zend_Feed
+ http://blogs.law.harvard.edu/tech/rss
+ -
+
+ http://magento.com/rss/link/id/1
+
+ Sat, 22 Apr 2017 13:21:12 +0200
+
+
+';
+
/**
* @var ObjectManagerHelper
*/
@@ -43,6 +64,16 @@ class RssTest extends \PHPUnit\Framework\TestCase
*/
private $cacheMock;
+ /**
+ * @var \Magento\Framework\App\FeedFactoryInterface|\PHPUnit_Framework_MockObject_MockObject
+ */
+ private $feedFactoryMock;
+
+ /**
+ * @var \Magento\Framework\App\FeedInterface|\PHPUnit_Framework_MockObject_MockObject
+ */
+ private $feedMock;
+
/**
* @var SerializerInterface|\PHPUnit_Framework_MockObject_MockObject
*/
@@ -52,11 +83,15 @@ protected function setUp()
{
$this->cacheMock = $this->createMock(\Magento\Framework\App\CacheInterface::class);
$this->serializerMock = $this->createMock(SerializerInterface::class);
+ $this->feedFactoryMock = $this->createMock(\Magento\Framework\App\FeedFactoryInterface::class);
+ $this->feedMock = $this->createMock(\Magento\Framework\App\FeedInterface::class);
+
$this->objectManagerHelper = new ObjectManagerHelper($this);
$this->rss = $this->objectManagerHelper->getObject(
\Magento\Rss\Model\Rss::class,
[
'cache' => $this->cacheMock,
+ 'feedFactory' => $this->feedFactoryMock,
'serializer' => $this->serializerMock
]
);
@@ -116,6 +151,16 @@ public function testCreateRssXml()
$dataProvider->expects($this->any())->method('getCacheLifetime')->will($this->returnValue(100));
$dataProvider->expects($this->any())->method('getRssData')->will($this->returnValue($this->feedData));
+ $this->feedMock->expects($this->once())
+ ->method('getFormattedContentAs')
+ ->with(\Magento\Framework\App\FeedInterface::FORMAT_XML)
+ ->will($this->returnValue($this->feedXml));
+
+ $this->feedFactoryMock->expects($this->once())
+ ->method('create')
+ ->with($this->feedData, \Magento\Framework\App\FeedFactoryInterface::FORMAT_RSS)
+ ->will($this->returnValue($this->feedMock));
+
$this->rss->setDataProvider($dataProvider);
$result = $this->rss->createRssXml();
$this->assertContains('', $result);
diff --git a/app/etc/di.xml b/app/etc/di.xml
index e17505e78da31..03cf3294991ae 100755
--- a/app/etc/di.xml
+++ b/app/etc/di.xml
@@ -171,6 +171,8 @@
+
+
@@ -241,6 +243,13 @@
+
+
+
+ - Magento\Framework\App\Feed
+
+
+
Cm\RedisSession\Handler\ConfigInterface
diff --git a/lib/internal/Magento/Framework/App/Feed.php b/lib/internal/Magento/Framework/App/Feed.php
new file mode 100644
index 0000000000000..a76acc2486eb0
--- /dev/null
+++ b/lib/internal/Magento/Framework/App/Feed.php
@@ -0,0 +1,51 @@
+feedProcessor = $feedProcessor;
+ $this->data = $data;
+ }
+
+ /**
+ * Returns the formatted feed content
+ *
+ * @param string $format
+ *
+ * @return string
+ */
+ public function getFormattedContentAs(
+ $format = self::FORMAT_XML
+ ) {
+ $feed = $this->feedProcessor::importArray(
+ $this->data,
+ FeedFactoryInterface::FORMAT_RSS
+ );
+ return $feed->saveXml();
+ }
+}
diff --git a/lib/internal/Magento/Framework/App/FeedFactory.php b/lib/internal/Magento/Framework/App/FeedFactory.php
new file mode 100644
index 0000000000000..87bd87fdc84c2
--- /dev/null
+++ b/lib/internal/Magento/Framework/App/FeedFactory.php
@@ -0,0 +1,81 @@
+objectManager = $objectManger;
+ $this->logger = $logger;
+ $this->formats = $formats;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function create(
+ array $data,
+ $format = FeedFactoryInterface::FORMAT_RSS
+ ) {
+ if (!isset($this->formats[$format])) {
+ throw new \Magento\Framework\Exception\InputException(
+ new \Magento\Framework\Phrase('The format is not supported'),
+ $e
+ );
+ }
+
+ if (!is_subclass_of($this->formats[$format], \Magento\Framework\App\FeedInterface::class)) {
+ throw new \Magento\Framework\Exception\InputException(
+ new \Magento\Framework\Phrase('Wrong format handler type'),
+ $e
+ );
+ }
+
+ try {
+ return $this->objectManager->create(
+ $this->formats[$format],
+ $data
+ );
+ } catch (\Exception $e) {
+ $this->logger->error($e->getMessage());
+ throw new \Magento\Framework\Exception\RuntimeException(
+ new \Magento\Framework\Phrase('There has been an error with import'),
+ $e
+ );
+ }
+ }
+}
diff --git a/lib/internal/Magento/Framework/App/FeedFactoryInterface.php b/lib/internal/Magento/Framework/App/FeedFactoryInterface.php
new file mode 100644
index 0000000000000..b35e3379f9f19
--- /dev/null
+++ b/lib/internal/Magento/Framework/App/FeedFactoryInterface.php
@@ -0,0 +1,31 @@
+