use Wallabag\CoreBundle\Entity\Entry;
use Wallabag\CoreBundle\Tools\Utils;
use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeExtensionGuesser;
-use Symfony\Component\Config\Definition\Exception\Exception;
/**
* This kind of proxy class take care of getting the content from an url
}
/**
- * Update existing entry by fetching from URL using Graby.
+ * Update entry using either fetched or provided content.
*
- * @param Entry $entry Entry to update
- * @param string $url Url to grab content for
+ * @param Entry $entry Entry to update
+ * @param string $url Url of the content
+ * @param array $content Array with content provided for import with AT LEAST keys title, html, url to skip the fetchContent from the url
+ * @param bool $disableContentUpdate Whether to skip trying to fetch content using Graby
*/
- public function updateEntry(Entry $entry, $url)
+ public function updateEntry(Entry $entry, $url, array $content = [], $disableContentUpdate = false)
{
- $content = $this->graby->fetchContent($url);
-
- // be sure to keep the url in case of error
- // so we'll be able to refetch it in the future
- $content['url'] = $content['url'] ?: $url;
-
- $this->stockEntry($entry, $content);
- }
-
- /**
- * Import entry using either fetched or provided content.
- *
- * @param Entry $entry Entry to update
- * @param array $content Array with content provided for import with AT LEAST keys title, html, url to skip the fetchContent from the url
- * @param bool $disableContentUpdate Whether to skip trying to fetch content using Graby
- */
- public function importEntry(Entry $entry, array $content, $disableContentUpdate = false)
- {
- try {
- $this->validateContent($content);
- } catch (\Exception $e) {
- // validation failed but do we want to disable updating content?
- if (true === $disableContentUpdate) {
- throw $e;
- }
+ if (!empty($content['html'])) {
+ $content['html'] = $this->graby->cleanupHtml($content['html'], $url);
}
- if (false === $disableContentUpdate) {
+ if ((empty($content) || false === $this->validateContent($content)) && false === $disableContentUpdate) {
try {
- $fetchedContent = $this->graby->fetchContent($content['url']);
+ $fetchedContent = $this->graby->fetchContent($url);
} catch (\Exception $e) {
$this->logger->error('Error while trying to fetch content from URL.', [
- 'entry_url' => $content['url'],
+ 'entry_url' => $url,
'error_msg' => $e->getMessage(),
]);
}
// when content is imported, we have information in $content
// in case fetching content goes bad, we'll keep the imported information instead of overriding them
- if ($fetchedContent['html'] !== $this->fetchingErrorMessage) {
+ if (empty($content) || $fetchedContent['html'] !== $this->fetchingErrorMessage) {
$content = $fetchedContent;
}
}
+ // be sure to keep the url in case of error
+ // so we'll be able to refetch it in the future
+ $content['url'] = !empty($content['url']) ? $content['url'] : $url;
+
$this->stockEntry($entry, $content);
}
try {
$entry->setPublishedAt(new \DateTime($date));
} catch (\Exception $e) {
- $this->logger->warning('Error while defining date', ['e' => $e, 'url' => $url, 'date' => $content['date']]);
+ $this->logger->warning('Error while defining date', ['e' => $e, 'url' => $content['url'], 'date' => $content['date']]);
}
}
* Validate that the given content has at least a title, an html and a url.
*
* @param array $content
+ *
+ * @return bool true if valid otherwise false
*/
private function validateContent(array $content)
{
- if (empty($content['title'])) {
- throw new Exception('Missing title from imported entry!');
- }
-
- if (empty($content['url'])) {
- throw new Exception('Missing URL from imported entry!');
- }
-
- if (empty($content['html'])) {
- throw new Exception('Missing html from imported entry!');
- }
+ return !empty($content['title']) && !empty($content['html']) && !empty($content['url']);
}
}
*/
protected function fetchContent(Entry $entry, $url, array $content = [])
{
- // be sure to set at least the given url
- $content['url'] = isset($content['url']) ? $content['url'] : $url;
-
try {
- $this->contentProxy->importEntry($entry, $content, $this->disableContentUpdate);
+ $this->contentProxy->updateEntry($entry, $url, $content, $this->disableContentUpdate);
} catch (\Exception $e) {
$this->logger->error('Error trying to import an entry.', [
- 'entry_url' => $content['url'],
+ 'entry_url' => $url,
'error_msg' => $e->getMessage(),
]);
}
$this->assertEquals(302, $client->getResponse()->getStatusCode());
$this->assertEquals($entryUri, $client->getResponse()->getTargetUrl());
- // re-retrieve the entry to be sure to get fresh data from database (mostly for tags)
+ // re-retrieve the entry to be sure to get fresh data from database (mostly for tags)
$entry = $this->getEntityManager()->getRepository(Entry::class)->find($entry->getId());
$this->assertNotContains($this->tagName, $entry->getTags());
use Wallabag\UserBundle\Entity\User;
use Wallabag\CoreBundle\Helper\RuleBasedTagger;
use Graby\Graby;
-use Monolog\Handler\TestHandler;
-use Monolog\Logger;
class ContentProxyTest extends \PHPUnit_Framework_TestCase
{
->method('tag');
$logHandler = new TestHandler();
- $logger = new Logger('test', array($logHandler));
+ $logger = new Logger('test', [$logHandler]);
$proxy = new ContentProxy((new Graby()), $tagger, $logger, $this->fetchingErrorMessage);
$entry = new Entry(new User());
- $proxy->importEntry(
+ $proxy->updateEntry(
$entry,
+ 'http://1.1.1.1',
[
'html' => str_repeat('this is my content', 325),
'title' => 'this is my title',
$entry = new Entry(new User());
$proxy->updateEntry(
$entry,
+ 'http://1.1.1.1',
[
'html' => str_repeat('this is my content', 325),
'title' => 'this is my title',
public function testTaggerThrowException()
{
- $graby = $this->getMockBuilder('Graby\Graby')
- ->disableOriginalConstructor()
- ->getMock();
-
$tagger = $this->getTaggerMock();
$tagger->expects($this->once())
->method('tag')
->will($this->throwException(new \Exception()));
- $proxy = new ContentProxy($graby, $tagger, $this->getLogger(), $this->fetchingErrorMessage);
-
+ $proxy = new ContentProxy((new Graby()), $tagger, $this->getLogger(), $this->fetchingErrorMessage);
$entry = new Entry(new User());
- $content = array(
- 'html' => str_repeat('this is my content', 325),
- 'title' => 'this is my title',
- 'url' => 'http://1.1.1.1',
- 'content_type' => 'text/html',
- 'language' => 'fr',
+ $proxy->updateEntry(
+ $entry,
+ 'http://1.1.1.1',
+ [
+ 'html' => str_repeat('this is my content', 325),
+ 'title' => 'this is my title',
+ 'url' => 'http://1.1.1.1',
+ 'content_type' => 'text/html',
+ 'language' => 'fr',
+ ]
);
- $proxy->importEntry($entry, $content, true);
$this->assertCount(0, $entry->getTags());
}
->method('tag');
$proxy = new ContentProxy((new Graby()), $tagger, $this->getLogger(), $this->fetchingErrorMessage);
- $entry = $proxy->updateEntry(
- new Entry(new User()),
+ $entry = new Entry(new User());
+ $proxy->updateEntry(
+ $entry,
'http://1.1.1.1',
[
'html' => $html,
$this->contentProxy
->expects($this->exactly(1))
- ->method('importEntry')
+ ->method('updateEntry')
->willReturn($entry);
$res = $chromeImport->import();
$this->contentProxy
->expects($this->exactly(1))
- ->method('importEntry')
+ ->method('updateEntry')
->willReturn(new Entry($this->user));
// check that every entry persisted are archived
$this->contentProxy
->expects($this->never())
- ->method('importEntry');
+ ->method('updateEntry');
$producer = $this->getMockBuilder('OldSound\RabbitMqBundle\RabbitMq\Producer')
->disableOriginalConstructor()
$this->contentProxy
->expects($this->never())
- ->method('importEntry');
+ ->method('updateEntry');
$factory = new RedisMockFactory();
$redisMock = $factory->getAdapter('Predis\Client', true);
$this->contentProxy
->expects($this->exactly(2))
- ->method('importEntry')
+ ->method('updateEntry')
->willReturn($entry);
$res = $firefoxImport->import();
$this->contentProxy
->expects($this->exactly(1))
- ->method('importEntry')
+ ->method('updateEntry')
->willReturn(new Entry($this->user));
// check that every entry persisted are archived
$this->contentProxy
->expects($this->never())
- ->method('importEntry');
+ ->method('updateEntry');
$producer = $this->getMockBuilder('OldSound\RabbitMqBundle\RabbitMq\Producer')
->disableOriginalConstructor()
$this->contentProxy
->expects($this->never())
- ->method('importEntry');
+ ->method('updateEntry');
$factory = new RedisMockFactory();
$redisMock = $factory->getAdapter('Predis\Client', true);
$this->contentProxy
->expects($this->exactly(4))
- ->method('importEntry')
+ ->method('updateEntry')
->willReturn($entry);
$res = $instapaperImport->import();
$this->contentProxy
->expects($this->once())
- ->method('importEntry')
+ ->method('updateEntry')
->willReturn(new Entry($this->user));
// check that every entry persisted are archived
$this->contentProxy
->expects($this->never())
- ->method('importEntry');
+ ->method('updateEntry');
$producer = $this->getMockBuilder('OldSound\RabbitMqBundle\RabbitMq\Producer')
->disableOriginalConstructor()
$this->contentProxy
->expects($this->never())
- ->method('importEntry');
+ ->method('updateEntry');
$factory = new RedisMockFactory();
$redisMock = $factory->getAdapter('Predis\Client', true);
$this->contentProxy
->expects($this->once())
- ->method('importEntry')
+ ->method('updateEntry')
->willReturn($entry);
$pocketImport->setClient($client);
$this->contentProxy
->expects($this->exactly(2))
- ->method('importEntry')
+ ->method('updateEntry')
->willReturn($entry);
$pocketImport->setClient($client);
$this->contentProxy
->expects($this->never())
- ->method('importEntry');
+ ->method('updateEntry');
$producer = $this->getMockBuilder('OldSound\RabbitMqBundle\RabbitMq\Producer')
->disableOriginalConstructor()
$this->contentProxy
->expects($this->never())
- ->method('ImportEntry');
+ ->method('updateEntry');
$factory = new RedisMockFactory();
$redisMock = $factory->getAdapter('Predis\Client', true);
$this->contentProxy
->expects($this->once())
- ->method('importEntry')
+ ->method('updateEntry')
->will($this->throwException(new \Exception()));
$pocketImport->setClient($client);
$this->contentProxy
->expects($this->exactly(3))
- ->method('importEntry')
+ ->method('updateEntry')
->willReturn($entry);
$res = $readabilityImport->import();
$this->contentProxy
->expects($this->exactly(1))
- ->method('importEntry')
+ ->method('updateEntry')
->willReturn(new Entry($this->user));
// check that every entry persisted are archived
$this->contentProxy
->expects($this->never())
- ->method('importEntry');
+ ->method('updateEntry');
$producer = $this->getMockBuilder('OldSound\RabbitMqBundle\RabbitMq\Producer')
->disableOriginalConstructor()
$this->contentProxy
->expects($this->never())
- ->method('importEntry');
+ ->method('updateEntry');
$factory = new RedisMockFactory();
$redisMock = $factory->getAdapter('Predis\Client', true);
$this->contentProxy
->expects($this->exactly(1))
- ->method('importEntry')
+ ->method('updateEntry')
->willReturn($entry);
$res = $wallabagV1Import->import();
$this->contentProxy
->expects($this->exactly(3))
- ->method('importEntry')
+ ->method('updateEntry')
->willReturn(new Entry($this->user));
// check that every entry persisted are archived
$this->contentProxy
->expects($this->never())
- ->method('importEntry');
+ ->method('updateEntry');
$producer = $this->getMockBuilder('OldSound\RabbitMqBundle\RabbitMq\Producer')
->disableOriginalConstructor()
$this->contentProxy
->expects($this->never())
- ->method('importEntry');
+ ->method('updateEntry');
$factory = new RedisMockFactory();
$redisMock = $factory->getAdapter('Predis\Client', true);
$this->contentProxy
->expects($this->exactly(2))
- ->method('importEntry')
+ ->method('updateEntry')
->willReturn(new Entry($this->user));
$res = $wallabagV2Import->import();
$this->contentProxy
->expects($this->exactly(2))
- ->method('importEntry')
+ ->method('updateEntry')
->willReturn(new Entry($this->user));
// check that every entry persisted are archived
$this->contentProxy
->expects($this->never())
- ->method('importEntry');
+ ->method('updateEntry');
$producer = $this->getMockBuilder('OldSound\RabbitMqBundle\RabbitMq\Producer')
->disableOriginalConstructor()
$this->contentProxy
->expects($this->never())
- ->method('importEntry');
+ ->method('updateEntry');
$factory = new RedisMockFactory();
$redisMock = $factory->getAdapter('Predis\Client', true);
$this->contentProxy
->expects($this->exactly(2))
- ->method('importEntry')
+ ->method('updateEntry')
->will($this->throwException(new \Exception()));
$res = $wallabagV2Import->import();