3 namespace Tests\Wallabag\ImportBundle\Import
;
5 use M6Web\Component\RedisMock\RedisMockFactory
;
6 use Monolog\Handler\TestHandler
;
8 use Simpleue\Queue\RedisQueue
;
9 use Wallabag\CoreBundle\Entity\Entry
;
10 use Wallabag\ImportBundle\Import\ReadabilityImport
;
11 use Wallabag\ImportBundle\Redis\Producer
;
12 use Wallabag\UserBundle\Entity\User
;
14 class ReadabilityImportTest
extends \PHPUnit_Framework_TestCase
18 protected $logHandler;
19 protected $contentProxy;
20 protected $tagsAssigner;
22 public function testInit()
24 $readabilityImport = $this->getReadabilityImport();
26 $this->assertSame('Readability', $readabilityImport->getName());
27 $this->assertNotEmpty($readabilityImport->getUrl());
28 $this->assertSame('import.readability.description', $readabilityImport->getDescription());
31 public function testImport()
33 $readabilityImport = $this->getReadabilityImport(false, 3);
34 $readabilityImport->setFilepath(__DIR__
. '/../fixtures/readability.json');
36 $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
37 ->disableOriginalConstructor()
40 $entryRepo->expects($this->exactly(3))
41 ->method('findByUrlAndUserId')
45 ->expects($this->any())
46 ->method('getRepository')
47 ->willReturn($entryRepo);
49 $entry = $this->getMockBuilder('Wallabag\CoreBundle\Entity\Entry')
50 ->disableOriginalConstructor()
54 ->expects($this->exactly(3))
55 ->method('updateEntry')
58 $res = $readabilityImport->import();
60 $this->assertTrue($res);
61 $this->assertSame(['skipped' => 0, 'imported' => 3, 'queued' => 0], $readabilityImport->getSummary());
64 public function testImportAndMarkAllAsRead()
66 $readabilityImport = $this->getReadabilityImport(false, 1);
67 $readabilityImport->setFilepath(__DIR__
. '/../fixtures/readability-read.json');
69 $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
70 ->disableOriginalConstructor()
73 $entryRepo->expects($this->exactly(2))
74 ->method('findByUrlAndUserId')
75 ->will($this->onConsecutiveCalls(false, true));
78 ->expects($this->any())
79 ->method('getRepository')
80 ->willReturn($entryRepo);
83 ->expects($this->exactly(1))
84 ->method('updateEntry')
85 ->willReturn(new Entry($this->user
));
87 // check that every entry persisted are archived
89 ->expects($this->any())
91 ->with($this->callback(function ($persistedEntry) {
92 return $persistedEntry->isArchived();
95 $res = $readabilityImport->setMarkAsRead(true)->import();
97 $this->assertTrue($res);
99 $this->assertSame(['skipped' => 1, 'imported' => 1, 'queued' => 0], $readabilityImport->getSummary());
102 public function testImportWithRabbit()
104 $readabilityImport = $this->getReadabilityImport();
105 $readabilityImport->setFilepath(__DIR__
. '/../fixtures/readability.json');
107 $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
108 ->disableOriginalConstructor()
111 $entryRepo->expects($this->never())
112 ->method('findByUrlAndUserId');
115 ->expects($this->never())
116 ->method('getRepository');
118 $entry = $this->getMockBuilder('Wallabag\CoreBundle\Entity\Entry')
119 ->disableOriginalConstructor()
123 ->expects($this->never())
124 ->method('updateEntry');
126 $producer = $this->getMockBuilder('OldSound\RabbitMqBundle\RabbitMq\Producer')
127 ->disableOriginalConstructor()
131 ->expects($this->exactly(3))
134 $readabilityImport->setProducer($producer);
136 $res = $readabilityImport->setMarkAsRead(true)->import();
138 $this->assertTrue($res);
139 $this->assertSame(['skipped' => 0, 'imported' => 0, 'queued' => 3], $readabilityImport->getSummary());
142 public function testImportWithRedis()
144 $readabilityImport = $this->getReadabilityImport();
145 $readabilityImport->setFilepath(__DIR__
. '/../fixtures/readability.json');
147 $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
148 ->disableOriginalConstructor()
151 $entryRepo->expects($this->never())
152 ->method('findByUrlAndUserId');
155 ->expects($this->never())
156 ->method('getRepository');
158 $entry = $this->getMockBuilder('Wallabag\CoreBundle\Entity\Entry')
159 ->disableOriginalConstructor()
163 ->expects($this->never())
164 ->method('updateEntry');
166 $factory = new RedisMockFactory();
167 $redisMock = $factory->getAdapter('Predis\Client', true);
169 $queue = new RedisQueue($redisMock, 'readability');
170 $producer = new Producer($queue);
172 $readabilityImport->setProducer($producer);
174 $res = $readabilityImport->setMarkAsRead(true)->import();
176 $this->assertTrue($res);
177 $this->assertSame(['skipped' => 0, 'imported' => 0, 'queued' => 3], $readabilityImport->getSummary());
179 $this->assertNotEmpty($redisMock->lpop('readability'));
182 public function testImportBadFile()
184 $readabilityImport = $this->getReadabilityImport();
185 $readabilityImport->setFilepath(__DIR__
. '/../fixtures/wallabag-v1.jsonx');
187 $res = $readabilityImport->import();
189 $this->assertFalse($res);
191 $records = $this->logHandler
->getRecords();
192 $this->assertContains('ReadabilityImport: unable to read file', $records[0]['message']);
193 $this->assertSame('ERROR', $records[0]['level_name']);
196 public function testImportUserNotDefined()
198 $readabilityImport = $this->getReadabilityImport(true);
199 $readabilityImport->setFilepath(__DIR__
. '/../fixtures/readability.json');
201 $res = $readabilityImport->import();
203 $this->assertFalse($res);
205 $records = $this->logHandler
->getRecords();
206 $this->assertContains('ReadabilityImport: user is not defined', $records[0]['message']);
207 $this->assertSame('ERROR', $records[0]['level_name']);
210 private function getReadabilityImport($unsetUser = false, $dispatched = 0)
212 $this->user
= new User();
214 $this->em
= $this->getMockBuilder('Doctrine\ORM\EntityManager')
215 ->disableOriginalConstructor()
218 $this->contentProxy
= $this->getMockBuilder('Wallabag\CoreBundle\Helper\ContentProxy')
219 ->disableOriginalConstructor()
222 $this->tagsAssigner
= $this->getMockBuilder('Wallabag\CoreBundle\Helper\TagsAssigner')
223 ->disableOriginalConstructor()
226 $dispatcher = $this->getMockBuilder('Symfony\Component\EventDispatcher\EventDispatcher')
227 ->disableOriginalConstructor()
231 ->expects($this->exactly($dispatched))
232 ->method('dispatch');
234 $wallabag = new ReadabilityImport($this->em
, $this->contentProxy
, $this->tagsAssigner
, $dispatcher);
236 $this->logHandler
= new TestHandler();
237 $logger = new Logger('test', [$this->logHandler
]);
238 $wallabag->setLogger($logger);
240 if (false === $unsetUser) {
241 $wallabag->setUser($this->user
);