]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
Merge pull request #2222 from wallabag/add-date-on-article-view
authorNicolas Lœuillet <nicolas@loeuillet.org>
Mon, 22 Aug 2016 07:40:21 +0000 (09:40 +0200)
committerGitHub <noreply@github.com>
Mon, 22 Aug 2016 07:40:21 +0000 (09:40 +0200)
Added creation date and reading time on article view

21 files changed:
src/Wallabag/CoreBundle/Controller/EntryController.php
src/Wallabag/CoreBundle/Resources/translations/messages.da.yml
src/Wallabag/CoreBundle/Resources/translations/messages.de.yml
src/Wallabag/CoreBundle/Resources/translations/messages.en.yml
src/Wallabag/CoreBundle/Resources/translations/messages.es.yml
src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml
src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml
src/Wallabag/CoreBundle/Resources/translations/messages.it.yml
src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml
src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml
src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml
src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml
src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entry.html.twig
src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig
src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entry.html.twig
src/Wallabag/ImportBundle/Import/AbstractImport.php [new file with mode: 0644]
src/Wallabag/ImportBundle/Import/PocketImport.php
src/Wallabag/ImportBundle/Import/WallabagImport.php
tests/Wallabag/ImportBundle/Import/PocketImportTest.php
tests/Wallabag/ImportBundle/Import/WallabagV2ImportTest.php
tests/Wallabag/ImportBundle/fixtures/wallabag-v2-empty.json [new file with mode: 0644]

index 4eb314f7510b68133f418d16dba774abe5b9e6fe..ccdf940669bde3d5aa00073256c5607e8ba1805c 100644 (file)
@@ -357,7 +357,7 @@ class EntryController extends Controller
     }
 
     /**
-     * Changes favorite status for an entry.
+     * Changes starred status for an entry.
      *
      * @param Request $request
      * @param Entry   $entry
index 0dcf7caa7b0801a6b66111dce6625e0f09f4734d..c066aaf798b52ab4ef7cbbeafb3e5e784506083e 100644 (file)
@@ -178,7 +178,7 @@ entry:
             back_to_homepage: 'Tilbage'
             set_as_read: 'Marker som læst'
             # set_as_unread: 'Mark as unread'
-            set_as_favorite: 'Marker som favorit'
+            set_as_starred: 'Marker som favorit'
             view_original_article: 'Originalartikel'
             # re_fetch_content: 'Re-fetch content'
             delete: 'Slet'
index 533078dbcb6e9dd78c809cd2e5fffa6681a188e4..28d826b66d1a5c7c1c11b86411f422829a09d826 100644 (file)
@@ -178,7 +178,7 @@ entry:
             back_to_homepage: 'Zurück'
             set_as_read: 'Als gelesen markieren'
             set_as_unread: 'Als ungelesen markieren'
-            set_as_favorite: 'Favorisieren'
+            set_as_starred: 'Favorisieren'
             view_original_article: 'Original-Artikel'
             re_fetch_content: 'Inhalt neu laden'
             delete: 'Löschen'
index 19b592e031f9cb1c81d2d8e62c29c81614fb3cbb..c6633f5ba115e04204bb0c3f64df00cfe6349f91 100644 (file)
@@ -148,7 +148,7 @@ entry:
         reading_time_less_one_minute_short: '<small class="inferieur">&lt;</small> 1 min'
         original_article: 'original'
         toogle_as_read: 'Toggle mark as read'
-        toogle_as_star: 'Toggle favorite'
+        toogle_as_star: 'Toggle starred'
         delete: 'Delete'
         export_title: 'Export'
     filters:
@@ -178,7 +178,7 @@ entry:
             back_to_homepage: 'Back'
             set_as_read: 'Mark as read'
             set_as_unread: 'Mark as unread'
-            set_as_favorite: 'Favorite'
+            set_as_starred: 'Toggle starred'
             view_original_article: 'Original article'
             re_fetch_content: 'Re-fetch content'
             delete: 'Delete'
index 21f26d9e65de83111e357d2acf94cde1a6f812e9..266b4af5b933f3a732069b7e4a7713d6b17ff85e 100644 (file)
@@ -178,7 +178,7 @@ entry:
             back_to_homepage: 'Regrese a la página principal'
             set_as_read: 'Marcar como leído'
             set_as_unread: 'Marcar como no leído'
-            set_as_favorite: 'Marcar como favorito'
+            set_as_starred: 'Marcar como favorito'
             view_original_article: 'Artículo original'
             re_fetch_content: 'Redescargar el contenido'
             delete: 'Suprimir'
index 6dedd984a0edd6904c8e07ed88afbe290f5d1f58..c2350019c3df9180c5801fdc334de0858f415ce8 100644 (file)
@@ -178,7 +178,7 @@ entry:
             back_to_homepage: 'بازگشت'
             set_as_read: 'خوانده‌شده'
             set_as_unread: 'به عنوان خوانده‌نشده علامت بزن'
-            set_as_favorite: 'برگزیده'
+            set_as_starred: 'برگزیده'
             view_original_article: 'مقالهٔ اصلی'
             re_fetch_content: 'مقاله‌ها را دوباره دریافت کن'
             delete: 'پاک کردن'
index 829df809762aa1d373459d6653671f178ab90986..25d9ec59bacc5c9d33d380a72d9c8c581f5710e0 100644 (file)
@@ -178,7 +178,7 @@ entry:
             back_to_homepage: 'Retour'
             set_as_read: 'Marquer comme lu'
             set_as_unread: 'Marquer comme non lu'
-            set_as_favorite: 'Mettre en favori'
+            set_as_starred: 'Mettre en favori'
             view_original_article: 'Article original'
             re_fetch_content: 'Recharger le contenu'
             delete: 'Supprimer'
index a7291a1b704025b0bb7a60c570445ee35f1c74dc..231ba7596761e0f5d21970090f2c39465065f1b8 100644 (file)
@@ -177,7 +177,7 @@ entry:
             back_to_homepage: 'Indietro'
             set_as_read: 'Segna come già letto'
             set_as_unread: 'Segna come da leggere'
-            set_as_favorite: 'Segna come preferito'
+            set_as_starred: 'Segna come preferito'
             view_original_article: 'Contenuto originale'
             re_fetch_content: 'Ri-ottieni pagina'
             delete: 'Elimina'
index 8531f7ee4c52cccf78d7e45433a2a3f42fd810b4..6e71b850492f3ef56901cfb010005bf85b817d3a 100644 (file)
@@ -178,7 +178,7 @@ entry:
             back_to_homepage: 'Tornar'
             set_as_read: 'Marcar coma legit'
             set_as_unread: 'Marcar coma pas legit'
-            set_as_favorite: 'Metre en favori'
+            set_as_starred: 'Metre en favori'
             view_original_article: 'Article original'
             re_fetch_content: 'Tornar cargar lo contengut'
             delete: 'Suprimir'
index bd45767d74f17c6a9914c9522986062333f8ebfe..2db26cf182a1cbe8b71ba2e32c6b7eb8a26bb22d 100644 (file)
@@ -178,7 +178,7 @@ entry:
             back_to_homepage: 'Cofnij'
             set_as_read: 'Oznacz jako przeczytane'
             set_as_unread: 'Oznacz jako nieprzeczytane'
-            set_as_favorite: 'Ulubione'
+            set_as_starred: 'Ulubione'
             view_original_article: 'Oryginalny artykuł'
             re_fetch_content: 'Pobierz ponownie treść'
             delete: 'Usuń'
index 8455a6bda4199ed6735bf9dadb40b372ad67a6e1..d8f09bc98cac95509d746cac6434a838d7ecf77e 100644 (file)
@@ -178,7 +178,7 @@ entry:
             back_to_homepage: 'Înapoi'
             set_as_read: 'Marchează ca citit'
             # set_as_unread: 'Mark as unread'
-            set_as_favorite: 'Favorit'
+            set_as_starred: 'Favorit'
             view_original_article: 'Articol original'
             # re_fetch_content: 'Re-fetch content'
             delete: 'Șterge'
index 8d3d4524eff811460d4d08f7f088509c70ce337c..074d13e24183f22fc6f07c04ddeb9d3ff68a79f4 100644 (file)
@@ -178,7 +178,7 @@ entry:
             back_to_homepage: 'Back'
             set_as_read: 'Okundu olarak işaretle'
             set_as_unread: 'Okunmadı olarak işaretle'
-            set_as_favorite: 'Favorilere ekle/çıkar'
+            set_as_starred: 'Favorilere ekle/çıkar'
             view_original_article: 'Orijinal makale'
             re_fetch_content: 'İçeriği yenile'
             delete: 'Sil'
index 6bf8572546941959e3c04d9beabf49db8c8d07fd..d7374dc7551a34e156395ccfc3db37ab3bf963b1 100644 (file)
@@ -14,7 +14,7 @@
             <li><a href="{{ entry.url|e }}" target="_blank" title="{{ 'entry.view.original_article'|trans }} : {{ entry.title|e }}" class="tool link icon icon-link"><span>{{ entry.domainName|removeWww }}</span></a></li>
             <li><a title="{{ 'entry.view.left_menu.re_fetch_content'|trans }}" class="tool icon icon-reload" href="{{ path('reload_entry', { 'id': entry.id }) }}"><span>{{ 'entry.view.left_menu.re_fetch_content'|trans }}</span></a></li>
             <li><a title="{% if entry.isArchived == 0 %}{{ 'entry.view.left_menu.set_as_read'|trans }}{% else %}{{ 'entry.view.left_menu.set_as_unread'|trans }}{% endif %}" class="tool icon icon-check {% if entry.isArchived == 0 %}archive-off{% else %}archive{% endif %}" href="{{ path('archive_entry', { 'id': entry.id }) }}"><span>{% if entry.isArchived == 0 %}{{ 'entry.view.left_menu.set_as_read'|trans }}{% else %}{{ 'entry.view.left_menu.set_as_unread'|trans }}{% endif %}</span></a></li>
-            <li><a title="{{ 'entry.view.left_menu.set_as_favorite'|trans }}" class="tool icon icon-star {% if entry.isStarred == 0 %}fav-off{% else %}fav{% endif %}" href="{{ path('star_entry', { 'id': entry.id }) }}"><span>{{ 'entry.view.left_menu.set_as_favorite'|trans }}</span></a></li>
+            <li><a title="{{ 'entry.view.left_menu.set_as_starred'|trans }}" class="tool icon icon-star {% if entry.isStarred == 0 %}fav-off{% else %}fav{% endif %}" href="{{ path('star_entry', { 'id': entry.id }) }}"><span>{{ 'entry.view.left_menu.set_as_starred'|trans }}</span></a></li>
             <li><a id="nav-btn-add-tag" title="{{ 'entry.view.left_menu.add_a_tag'|trans }}"><span>{{ 'entry.view.left_menu.add_a_tag'|trans }}</span></a></li>
             <li><a title="{{ 'entry.view.left_menu.delete'|trans }}" class="tool delete icon icon-trash" href="{{ path('delete_entry', { 'id': entry.id }) }}"><span>{{ 'entry.view.left_menu.delete'|trans }}</span></a></li>
             {% if craue_setting('share_twitter') %}<li><a href="https://twitter.com/home?status={{entry.title|url_encode}}%20{{ entry.url|url_encode }}%20via%20@wallabagapp" target="_blank" class="tool twitter icon icon-twitter" title="Tweet"><span>Tweet</span></a></li>{% endif %}
@@ -85,7 +85,7 @@
                 $("body").css("cursor", "auto");
             });*/
 
-            // toggle favorite property of current article
+            // toggle starred property of current article
           /*  $('#setFav').click(function(){
                 $("body").css("cursor", "wait");
                 $.ajax( { url: '{{ path('star_entry', { 'id': entry.id }) }}' }).done(
index 920fa9334bf69799d8dd5cdf11079bc82b58ad1f..c8e4a533902ab1ee2844a694fb72d6bc23811614 100644 (file)
@@ -77,7 +77,7 @@
                         <ul class="tools links right">
                             <li>
                                 <a title="{{ 'entry.list.toogle_as_read'|trans }}" class="tool grey-text {% if entry.isArchived == 0 %}mdi-action-done{% else %}mdi-content-redo{% endif %}" href="{{ path('archive_entry', { 'id': entry.id }) }}"></a>
-                                <a title="{{ 'entry.list.toogle_as_star'|trans }}" class="tool grey-text {% if entry.isStarred == 0 %}mdi-action-favorite-outline{% else %}mdi-action-favorite{% endif %}" href="{{ path('star_entry', { 'id': entry.id }) }}"></a>
+                                <a title="{{ 'entry.list.toogle_as_star'|trans }}" class="tool grey-text {% if entry.isStarred == 0 %}mdi-toggle-star-outline{% else %}mdi-toggle-star{% endif %}" href="{{ path('star_entry', { 'id': entry.id }) }}"></a>
                                 <a title="{{ 'entry.list.delete'|trans }}" class="tool grey-text delete mdi-action-delete " href="{{ path('delete_entry', { 'id': entry.id }) }}"></a>
                             </li>
                         </ul>
index 4f58b692a7f808030c086f257b88b49f5a7103bb..2ee615aa03dbf467ba92d557f83e5948f1308beb 100644 (file)
@@ -24,8 +24,8 @@
                     </a>
                 </li>
                 <li>
-                    <a class="waves-effect" title="{{ 'entry.view.left_menu.set_as_favorite'|trans }}" href="{{ path('star_entry', { 'id': entry.id }) }}" id="setFav">
-                        <i class="{% if entry.isStarred == 0 %}mdi-action-favorite-outline{% else %}mdi-action-favorite{% endif %} small"></i>
+                    <a class="waves-effect" title="{{ 'entry.view.left_menu.set_as_starred'|trans }}" href="{{ path('star_entry', { 'id': entry.id }) }}" id="setFav">
+                        <i class="{% if entry.isStarred == 0 %}mdi-toggle-star-outline{% else %}mdi-toggle-star{% endif %} small"></i>
                     </a>
                 </li>
                 <li>
@@ -70,9 +70,9 @@
         </li>
 
         <li class="bold hide-on-med-and-down">
-            <a class="waves-effect collapsible-header" title="{{ 'entry.view.left_menu.set_as_favorite'|trans }}" href="{{ path('star_entry', { 'id': entry.id }) }}" id="setFav">
-                <i class="{% if entry.isStarred == 0 %}mdi-action-favorite-outline{% else %}mdi-action-favorite{% endif %} small"></i>
-                <span>{{ 'entry.view.left_menu.set_as_favorite'|trans }}</span>
+            <a class="waves-effect collapsible-header" title="{{ 'entry.view.left_menu.set_as_starred'|trans }}" href="{{ path('star_entry', { 'id': entry.id }) }}" id="setFav">
+                <i class="{% if entry.isStarred == 0 %}mdi-toggle-star-outline{% else %}mdi-toggle-star{% endif %} small"></i>
+                <span>{{ 'entry.view.left_menu.set_as_starred'|trans }}</span>
             </a>
             <div class="collapsible-body"></div>
         </li>
diff --git a/src/Wallabag/ImportBundle/Import/AbstractImport.php b/src/Wallabag/ImportBundle/Import/AbstractImport.php
new file mode 100644 (file)
index 0000000..14377a3
--- /dev/null
@@ -0,0 +1,47 @@
+<?php
+
+namespace Wallabag\ImportBundle\Import;
+
+use Psr\Log\LoggerInterface;
+use Psr\Log\NullLogger;
+use Doctrine\ORM\EntityManager;
+use Wallabag\CoreBundle\Helper\ContentProxy;
+use Wallabag\CoreBundle\Entity\Entry;
+
+abstract class AbstractImport implements ImportInterface
+{
+    protected $em;
+    protected $logger;
+    protected $contentProxy;
+
+    public function __construct(EntityManager $em, ContentProxy $contentProxy)
+    {
+        $this->em = $em;
+        $this->logger = new NullLogger();
+        $this->contentProxy = $contentProxy;
+    }
+
+    public function setLogger(LoggerInterface $logger)
+    {
+        $this->logger = $logger;
+    }
+
+    /**
+     * Fetch content from the ContentProxy (using graby).
+     * If it fails return false instead of the updated entry.
+     *
+     * @param Entry  $entry   Entry to update
+     * @param string $url     Url to grab content for
+     * @param array  $content An array with AT LEAST keys title, html, url, language & content_type to skip the fetchContent from the url
+     *
+     * @return Entry|false
+     */
+    protected function fetchContent(Entry $entry, $url, array $content = [])
+    {
+        try {
+            return $this->contentProxy->updateEntry($entry, $url, $content);
+        } catch (\Exception $e) {
+            return false;
+        }
+    }
+}
index 29361a328cf11d44c62f4b1e18c1288b8a4ae15d..798cfdaefe05cc0746340d8f21b2b8b38e2d616b 100644 (file)
@@ -2,7 +2,6 @@
 
 namespace Wallabag\ImportBundle\Import;
 
-use Psr\Log\LoggerInterface;
 use Psr\Log\NullLogger;
 use Doctrine\ORM\EntityManager;
 use GuzzleHttp\Client;
@@ -12,12 +11,9 @@ use Wallabag\CoreBundle\Entity\Entry;
 use Wallabag\CoreBundle\Helper\ContentProxy;
 use Craue\ConfigBundle\Util\Config;
 
-class PocketImport implements ImportInterface
+class PocketImport extends AbstractImport
 {
     private $user;
-    private $em;
-    private $contentProxy;
-    private $logger;
     private $client;
     private $consumerKey;
     private $skippedEntries = 0;
@@ -34,11 +30,6 @@ class PocketImport implements ImportInterface
         $this->logger = new NullLogger();
     }
 
-    public function setLogger(LoggerInterface $logger)
-    {
-        $this->logger = $logger;
-    }
-
     /**
      * {@inheritdoc}
      */
@@ -219,14 +210,20 @@ class PocketImport implements ImportInterface
             }
 
             $entry = new Entry($this->user);
-            $entry = $this->contentProxy->updateEntry($entry, $url);
+            $entry = $this->fetchContent($entry, $url);
+
+            // jump to next entry in case of problem while getting content
+            if (false === $entry) {
+                ++$this->skippedEntries;
+                continue;
+            }
 
             // 0, 1, 2 - 1 if the item is archived - 2 if the item should be deleted
             if ($pocketEntry['status'] == 1 || $this->markAsRead) {
                 $entry->setArchived(true);
             }
 
-            // 0 or 1 - 1 If the item is favorited
+            // 0 or 1 - 1 If the item is starred
             if ($pocketEntry['favorite'] == 1) {
                 $entry->setStarred(true);
             }
index 65803823b04bac3f4b008b778564291d13655a6d..a1cc085b3e12c14a8ba0ceaccbde48b7f5a3c0ea 100644 (file)
@@ -2,19 +2,12 @@
 
 namespace Wallabag\ImportBundle\Import;
 
-use Psr\Log\LoggerInterface;
-use Psr\Log\NullLogger;
-use Doctrine\ORM\EntityManager;
 use Wallabag\CoreBundle\Entity\Entry;
 use Wallabag\UserBundle\Entity\User;
-use Wallabag\CoreBundle\Helper\ContentProxy;
 
-abstract class WallabagImport implements ImportInterface
+abstract class WallabagImport extends AbstractImport
 {
     protected $user;
-    protected $em;
-    protected $logger;
-    protected $contentProxy;
     protected $skippedEntries = 0;
     protected $importedEntries = 0;
     protected $filepath;
@@ -35,18 +28,6 @@ abstract class WallabagImport implements ImportInterface
         '',
     ];
 
-    public function __construct(EntityManager $em, ContentProxy $contentProxy)
-    {
-        $this->em = $em;
-        $this->logger = new NullLogger();
-        $this->contentProxy = $contentProxy;
-    }
-
-    public function setLogger(LoggerInterface $logger)
-    {
-        $this->logger = $logger;
-    }
-
     /**
      * We define the user in a custom call because on the import command there is no logged in user.
      * So we can't retrieve user from the `security.token_storage` service.
@@ -159,12 +140,18 @@ abstract class WallabagImport implements ImportInterface
 
             $data = $this->prepareEntry($importedEntry, $this->markAsRead);
 
-            $entry = $this->contentProxy->updateEntry(
+            $entry = $this->fetchContent(
                 new Entry($this->user),
                 $importedEntry['url'],
                 $data
             );
 
+            // jump to next entry in case of problem while getting content
+            if (false === $entry) {
+                ++$this->skippedEntries;
+                continue;
+            }
+
             if (array_key_exists('tags', $data)) {
                 $this->contentProxy->assignTagsToEntry(
                     $entry,
index 41f9b51f2bd4108438d341ac5aa036d3b4eaacb6..8534e1c8fa832c9e401a8b6248a9e892b7154319 100644 (file)
@@ -390,4 +390,55 @@ class PocketImportTest extends \PHPUnit_Framework_TestCase
         $this->assertContains('PocketImport: Failed to import', $records[0]['message']);
         $this->assertEquals('ERROR', $records[0]['level_name']);
     }
+
+    public function testImportWithExceptionFromGraby()
+    {
+        $client = new Client();
+
+        $mock = new Mock([
+            new Response(200, ['Content-Type' => 'application/json'], Stream::factory(json_encode(['access_token' => 'wunderbar_token']))),
+            new Response(200, ['Content-Type' => 'application/json'], Stream::factory('
+                {
+                    "status": 1,
+                    "list": {
+                        "229279689": {
+                            "resolved_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview"
+                        }
+                    }
+                }
+            ')),
+        ]);
+
+        $client->getEmitter()->attach($mock);
+
+        $pocketImport = $this->getPocketImport();
+
+        $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $entryRepo->expects($this->once())
+            ->method('findByUrlAndUserId')
+            ->will($this->onConsecutiveCalls(false, true));
+
+        $this->em
+            ->expects($this->once())
+            ->method('getRepository')
+            ->willReturn($entryRepo);
+
+        $entry = new Entry($this->user);
+
+        $this->contentProxy
+            ->expects($this->once())
+            ->method('updateEntry')
+            ->will($this->throwException(new \Exception()));
+
+        $pocketImport->setClient($client);
+        $pocketImport->authorize('wunderbar_code');
+
+        $res = $pocketImport->import();
+
+        $this->assertTrue($res);
+        $this->assertEquals(['skipped' => 1, 'imported' => 0], $pocketImport->getSummary());
+    }
 }
index 8ec66b12e41672b4d7e223217d8231b550386a5f..4a45e0f0a6779ab750f710ce157e85b235aa8c9e 100644 (file)
@@ -143,4 +143,44 @@ class WallabagV2ImportTest extends \PHPUnit_Framework_TestCase
         $this->assertContains('WallabagImport: user is not defined', $records[0]['message']);
         $this->assertEquals('ERROR', $records[0]['level_name']);
     }
+
+    public function testImportEmptyFile()
+    {
+        $wallabagV2Import = $this->getWallabagV2Import();
+        $wallabagV2Import->setFilepath(__DIR__.'/../fixtures/wallabag-v2-empty.json');
+
+        $res = $wallabagV2Import->import();
+
+        $this->assertFalse($res);
+        $this->assertEquals(['skipped' => 0, 'imported' => 0], $wallabagV2Import->getSummary());
+    }
+
+    public function testImportWithExceptionFromGraby()
+    {
+        $wallabagV2Import = $this->getWallabagV2Import();
+        $wallabagV2Import->setFilepath(__DIR__.'/../fixtures/wallabag-v2.json');
+
+        $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $entryRepo->expects($this->exactly(24))
+            ->method('findByUrlAndUserId')
+            ->will($this->onConsecutiveCalls(false, true, false));
+
+        $this->em
+            ->expects($this->any())
+            ->method('getRepository')
+            ->willReturn($entryRepo);
+
+        $this->contentProxy
+            ->expects($this->exactly(2))
+            ->method('updateEntry')
+            ->will($this->throwException(new \Exception()));
+
+        $res = $wallabagV2Import->import();
+
+        $this->assertTrue($res);
+        $this->assertEquals(['skipped' => 24, 'imported' => 0], $wallabagV2Import->getSummary());
+    }
 }
diff --git a/tests/Wallabag/ImportBundle/fixtures/wallabag-v2-empty.json b/tests/Wallabag/ImportBundle/fixtures/wallabag-v2-empty.json
new file mode 100644 (file)
index 0000000..e69de29