2015-12-30 12:26:30 +00:00
< ? php
2024-02-19 00:30:12 +00:00
namespace Tests\Wallabag\Import ;
2015-12-30 12:26:30 +00:00
2022-09-01 18:54:56 +00:00
use Doctrine\ORM\EntityManager ;
use Doctrine\ORM\UnitOfWork ;
2017-07-01 07:52:38 +00:00
use M6Web\Component\RedisMock\RedisMockFactory ;
2015-12-30 12:26:30 +00:00
use Monolog\Handler\TestHandler ;
2017-07-01 07:52:38 +00:00
use Monolog\Logger ;
2017-12-16 21:17:42 +00:00
use PHPUnit\Framework\TestCase ;
2022-09-01 18:54:56 +00:00
use Predis\Client ;
2016-09-09 19:02:03 +00:00
use Simpleue\Queue\RedisQueue ;
2022-09-01 18:54:56 +00:00
use Symfony\Component\EventDispatcher\EventDispatcher ;
2024-02-19 00:30:12 +00:00
use Wallabag\Entity\Entry ;
use Wallabag\Entity\User ;
use Wallabag\Helper\ContentProxy ;
use Wallabag\Helper\TagsAssigner ;
use Wallabag\Import\WallabagV1Import ;
use Wallabag\Redis\Producer ;
use Wallabag\Repository\EntryRepository ;
2015-12-30 12:26:30 +00:00
2017-12-16 21:17:42 +00:00
class WallabagV1ImportTest extends TestCase
2015-12-30 12:26:30 +00:00
{
protected $user ;
protected $em ;
protected $logHandler ;
2016-02-11 12:27:17 +00:00
protected $contentProxy ;
2017-05-27 20:08:14 +00:00
protected $tagsAssigner ;
protected $uow ;
2016-12-16 14:46:21 +00:00
protected $fetchingErrorMessageTitle = 'No title found' ;
protected $fetchingErrorMessage = 'wallabag can\'t retrieve contents for this article. Please <a href="http://doc.wallabag.org/en/master/user/errors_during_fetching.html#how-can-i-help-to-fix-that">troubleshoot this issue</a>.' ;
2016-02-11 12:27:17 +00:00
2015-12-30 12:26:30 +00:00
public function testInit ()
{
$wallabagV1Import = $this -> getWallabagV1Import ();
2017-07-01 07:52:38 +00:00
$this -> assertSame ( 'wallabag v1' , $wallabagV1Import -> getName ());
2015-12-31 10:24:46 +00:00
$this -> assertNotEmpty ( $wallabagV1Import -> getUrl ());
2017-07-01 07:52:38 +00:00
$this -> assertSame ( 'import.wallabag_v1.description' , $wallabagV1Import -> getDescription ());
2015-12-30 12:26:30 +00:00
}
public function testImport ()
{
2017-05-16 19:17:10 +00:00
$wallabagV1Import = $this -> getWallabagV1Import ( false , 1 );
2023-12-31 17:21:09 +00:00
$wallabagV1Import -> setFilepath ( __DIR__ . '/../fixtures/Import/wallabag-v1.json' );
2015-12-30 12:26:30 +00:00
2022-09-01 18:54:56 +00:00
$entryRepo = $this -> getMockBuilder ( EntryRepository :: class )
2015-12-30 12:26:30 +00:00
-> disableOriginalConstructor ()
-> getMock ();
2017-05-16 19:17:10 +00:00
$entryRepo -> expects ( $this -> exactly ( 2 ))
2016-01-15 14:28:22 +00:00
-> method ( 'findByUrlAndUserId' )
2016-02-11 14:48:20 +00:00
-> will ( $this -> onConsecutiveCalls ( false , true , false , false ));
2015-12-30 12:26:30 +00:00
$this -> em
-> expects ( $this -> any ())
-> method ( 'getRepository' )
-> willReturn ( $entryRepo );
2022-09-01 18:54:56 +00:00
$entry = $this -> getMockBuilder ( Entry :: class )
2016-02-11 14:48:20 +00:00
-> disableOriginalConstructor ()
-> getMock ();
$this -> contentProxy
2017-05-16 19:17:10 +00:00
-> expects ( $this -> exactly ( 1 ))
2017-06-01 09:31:45 +00:00
-> method ( 'updateEntry' )
2016-02-11 14:48:20 +00:00
-> willReturn ( $entry );
2015-12-30 12:26:30 +00:00
$res = $wallabagV1Import -> import ();
$this -> assertTrue ( $res );
2017-07-01 07:52:38 +00:00
$this -> assertSame ([ 'skipped' => 1 , 'imported' => 1 , 'queued' => 0 ], $wallabagV1Import -> getSummary ());
2016-03-04 09:04:51 +00:00
}
public function testImportAndMarkAllAsRead ()
{
2016-11-02 06:10:23 +00:00
$wallabagV1Import = $this -> getWallabagV1Import ( false , 3 );
2023-12-31 17:21:09 +00:00
$wallabagV1Import -> setFilepath ( __DIR__ . '/../fixtures/Import/wallabag-v1-read.json' );
2016-03-04 09:04:51 +00:00
2022-09-01 18:54:56 +00:00
$entryRepo = $this -> getMockBuilder ( EntryRepository :: class )
2016-03-04 09:04:51 +00:00
-> disableOriginalConstructor ()
-> getMock ();
$entryRepo -> expects ( $this -> exactly ( 3 ))
-> method ( 'findByUrlAndUserId' )
-> will ( $this -> onConsecutiveCalls ( false , false , false ));
$this -> em
-> expects ( $this -> any ())
-> method ( 'getRepository' )
-> willReturn ( $entryRepo );
2016-03-27 18:35:56 +00:00
$this -> contentProxy
-> expects ( $this -> exactly ( 3 ))
2017-06-01 09:31:45 +00:00
-> method ( 'updateEntry' )
2016-03-27 18:35:56 +00:00
-> willReturn ( new Entry ( $this -> user ));
2016-03-04 09:04:51 +00:00
// check that every entry persisted are archived
$this -> em
-> expects ( $this -> any ())
-> method ( 'persist' )
2016-03-08 14:22:35 +00:00
-> with ( $this -> callback ( function ( $persistedEntry ) {
2020-06-15 11:37:50 +00:00
return ( bool ) $persistedEntry -> isArchived ();
2016-03-04 09:04:51 +00:00
}));
$res = $wallabagV1Import -> setMarkAsRead ( true ) -> import ();
$this -> assertTrue ( $res );
2017-07-01 07:52:38 +00:00
$this -> assertSame ([ 'skipped' => 0 , 'imported' => 3 , 'queued' => 0 ], $wallabagV1Import -> getSummary ());
2016-09-09 16:02:29 +00:00
}
public function testImportWithRabbit ()
{
$wallabagV1Import = $this -> getWallabagV1Import ();
2023-12-31 17:21:09 +00:00
$wallabagV1Import -> setFilepath ( __DIR__ . '/../fixtures/Import/wallabag-v1.json' );
2016-09-09 16:02:29 +00:00
2022-09-01 18:54:56 +00:00
$entryRepo = $this -> getMockBuilder ( EntryRepository :: class )
2016-09-09 16:02:29 +00:00
-> disableOriginalConstructor ()
-> getMock ();
$entryRepo -> expects ( $this -> never ())
-> method ( 'findByUrlAndUserId' );
$this -> em
-> expects ( $this -> never ())
-> method ( 'getRepository' );
2022-09-01 18:54:56 +00:00
$entry = $this -> getMockBuilder ( Entry :: class )
2016-09-09 16:02:29 +00:00
-> disableOriginalConstructor ()
-> getMock ();
$this -> contentProxy
-> expects ( $this -> never ())
2017-06-01 09:31:45 +00:00
-> method ( 'updateEntry' );
2016-09-09 16:02:29 +00:00
2022-09-01 18:54:56 +00:00
$producer = $this -> getMockBuilder ( \OldSound\RabbitMqBundle\RabbitMq\Producer :: class )
2016-09-09 16:02:29 +00:00
-> disableOriginalConstructor ()
-> getMock ();
$producer
2017-05-16 19:17:10 +00:00
-> expects ( $this -> exactly ( 2 ))
2016-09-09 16:02:29 +00:00
-> method ( 'publish' );
2016-09-09 19:02:03 +00:00
$wallabagV1Import -> setProducer ( $producer );
2016-09-09 16:02:29 +00:00
$res = $wallabagV1Import -> setMarkAsRead ( true ) -> import ();
$this -> assertTrue ( $res );
2017-07-01 07:52:38 +00:00
$this -> assertSame ([ 'skipped' => 0 , 'imported' => 0 , 'queued' => 2 ], $wallabagV1Import -> getSummary ());
2015-12-30 12:26:30 +00:00
}
2016-09-09 19:02:03 +00:00
public function testImportWithRedis ()
{
$wallabagV1Import = $this -> getWallabagV1Import ();
2023-12-31 17:21:09 +00:00
$wallabagV1Import -> setFilepath ( __DIR__ . '/../fixtures/Import/wallabag-v1.json' );
2016-09-09 19:02:03 +00:00
2022-09-01 18:54:56 +00:00
$entryRepo = $this -> getMockBuilder ( EntryRepository :: class )
2016-09-09 19:02:03 +00:00
-> disableOriginalConstructor ()
-> getMock ();
$entryRepo -> expects ( $this -> never ())
-> method ( 'findByUrlAndUserId' );
$this -> em
-> expects ( $this -> never ())
-> method ( 'getRepository' );
2022-09-01 18:54:56 +00:00
$entry = $this -> getMockBuilder ( Entry :: class )
2016-09-09 19:02:03 +00:00
-> disableOriginalConstructor ()
-> getMock ();
$this -> contentProxy
-> expects ( $this -> never ())
2017-06-01 09:31:45 +00:00
-> method ( 'updateEntry' );
2016-09-09 19:02:03 +00:00
$factory = new RedisMockFactory ();
2022-09-01 18:54:56 +00:00
$redisMock = $factory -> getAdapter ( Client :: class , true );
2016-09-09 19:02:03 +00:00
$queue = new RedisQueue ( $redisMock , 'wallabag_v1' );
$producer = new Producer ( $queue );
$wallabagV1Import -> setProducer ( $producer );
$res = $wallabagV1Import -> setMarkAsRead ( true ) -> import ();
$this -> assertTrue ( $res );
2017-07-01 07:52:38 +00:00
$this -> assertSame ([ 'skipped' => 0 , 'imported' => 0 , 'queued' => 2 ], $wallabagV1Import -> getSummary ());
2016-09-09 19:02:03 +00:00
$this -> assertNotEmpty ( $redisMock -> lpop ( 'wallabag_v1' ));
}
2015-12-30 12:26:30 +00:00
public function testImportBadFile ()
{
$wallabagV1Import = $this -> getWallabagV1Import ();
2023-12-31 17:21:09 +00:00
$wallabagV1Import -> setFilepath ( __DIR__ . '/../fixtures/Import/wallabag-v1.jsonx' );
2015-12-30 12:26:30 +00:00
$res = $wallabagV1Import -> import ();
$this -> assertFalse ( $res );
$records = $this -> logHandler -> getRecords ();
2020-06-15 11:37:50 +00:00
$this -> assertStringContainsString ( 'WallabagImport: unable to read file' , $records [ 0 ][ 'message' ]);
2017-07-01 07:52:38 +00:00
$this -> assertSame ( 'ERROR' , $records [ 0 ][ 'level_name' ]);
2015-12-30 12:26:30 +00:00
}
public function testImportUserNotDefined ()
{
$wallabagV1Import = $this -> getWallabagV1Import ( true );
2023-12-31 17:21:09 +00:00
$wallabagV1Import -> setFilepath ( __DIR__ . '/../fixtures/Import/wallabag-v1.json' );
2015-12-30 12:26:30 +00:00
$res = $wallabagV1Import -> import ();
$this -> assertFalse ( $res );
$records = $this -> logHandler -> getRecords ();
2020-06-15 11:37:50 +00:00
$this -> assertStringContainsString ( 'WallabagImport: user is not defined' , $records [ 0 ][ 'message' ]);
2017-07-01 07:52:38 +00:00
$this -> assertSame ( 'ERROR' , $records [ 0 ][ 'level_name' ]);
}
private function getWallabagV1Import ( $unsetUser = false , $dispatched = 0 )
{
$this -> user = new User ();
2022-09-01 18:54:56 +00:00
$this -> em = $this -> getMockBuilder ( EntityManager :: class )
2017-07-01 07:52:38 +00:00
-> disableOriginalConstructor ()
-> getMock ();
2022-09-01 18:54:56 +00:00
$this -> uow = $this -> getMockBuilder ( UnitOfWork :: class )
2017-07-01 07:52:38 +00:00
-> disableOriginalConstructor ()
-> getMock ();
$this -> em
-> expects ( $this -> any ())
-> method ( 'getUnitOfWork' )
-> willReturn ( $this -> uow );
$this -> uow
-> expects ( $this -> any ())
-> method ( 'getScheduledEntityInsertions' )
-> willReturn ([]);
2022-09-01 18:54:56 +00:00
$this -> contentProxy = $this -> getMockBuilder ( ContentProxy :: class )
2017-07-01 07:52:38 +00:00
-> disableOriginalConstructor ()
-> getMock ();
2022-09-01 18:54:56 +00:00
$this -> tagsAssigner = $this -> getMockBuilder ( TagsAssigner :: class )
2017-07-01 07:52:38 +00:00
-> disableOriginalConstructor ()
-> getMock ();
2022-09-01 18:54:56 +00:00
$dispatcher = $this -> getMockBuilder ( EventDispatcher :: class )
2017-07-01 07:52:38 +00:00
-> disableOriginalConstructor ()
-> getMock ();
$dispatcher
-> expects ( $this -> exactly ( $dispatched ))
-> method ( 'dispatch' );
2022-08-27 18:57:18 +00:00
$this -> logHandler = new TestHandler ();
$logger = new Logger ( 'test' , [ $this -> logHandler ]);
2017-07-01 07:52:38 +00:00
$wallabag = new WallabagV1Import (
$this -> em ,
$this -> contentProxy ,
$this -> tagsAssigner ,
$dispatcher ,
2022-08-27 18:57:18 +00:00
$logger ,
2017-07-01 07:52:38 +00:00
$this -> fetchingErrorMessageTitle ,
$this -> fetchingErrorMessage
);
if ( false === $unsetUser ) {
$wallabag -> setUser ( $this -> user );
}
return $wallabag ;
2015-12-30 12:26:30 +00:00
}
}