3 namespace Tests\Wallabag\ImportBundle\Import
;
5 use Wallabag\ImportBundle\Import\ReadabilityImport
;
6 use Wallabag\UserBundle\Entity\User
;
7 use Wallabag\CoreBundle\Entity\Entry
;
8 use Wallabag\ImportBundle\Redis\Producer
;
10 use Monolog\Handler\TestHandler
;
11 use Simpleue\Queue\RedisQueue
;
12 use M6Web\Component\RedisMock\RedisMockFactory
;
14 class ReadabilityImportTest
extends \PHPUnit_Framework_TestCase
18 protected $logHandler;
19 protected $contentProxy;
21 private function getReadabilityImport($unsetUser = false)
23 $this->user
= new User();
25 $this->em
= $this->getMockBuilder('Doctrine\ORM\EntityManager')
26 ->disableOriginalConstructor()
29 $this->contentProxy
= $this->getMockBuilder('Wallabag\CoreBundle\Helper\ContentProxy')
30 ->disableOriginalConstructor()
33 $wallabag = new ReadabilityImport($this->em
, $this->contentProxy
);
35 $this->logHandler
= new TestHandler();
36 $logger = new Logger('test', [$this->logHandler
]);
37 $wallabag->setLogger($logger);
39 if (false === $unsetUser) {
40 $wallabag->setUser($this->user
);
46 public function testInit()
48 $readabilityImport = $this->getReadabilityImport();
50 $this->assertEquals('Readability', $readabilityImport->getName());
51 $this->assertNotEmpty($readabilityImport->getUrl());
52 $this->assertEquals('import.readability.description', $readabilityImport->getDescription());
55 public function testImport()
57 $readabilityImport = $this->getReadabilityImport();
58 $readabilityImport->setFilepath(__DIR__
.'/../fixtures/readability.json');
60 $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
61 ->disableOriginalConstructor()
64 $entryRepo->expects($this->exactly(24))
65 ->method('findByUrlAndUserId')
69 ->expects($this->any())
70 ->method('getRepository')
71 ->willReturn($entryRepo);
73 $entry = $this->getMockBuilder('Wallabag\CoreBundle\Entity\Entry')
74 ->disableOriginalConstructor()
78 ->expects($this->exactly(24))
79 ->method('updateEntry')
82 $res = $readabilityImport->import();
84 $this->assertTrue($res);
85 $this->assertEquals(['skipped' => 0, 'imported' => 24, 'queued' => 0], $readabilityImport->getSummary());
88 public function testImportAndMarkAllAsRead()
90 $readabilityImport = $this->getReadabilityImport();
91 $readabilityImport->setFilepath(__DIR__
.'/../fixtures/readability-read.json');
93 $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
94 ->disableOriginalConstructor()
97 $entryRepo->expects($this->exactly(2))
98 ->method('findByUrlAndUserId')
99 ->will($this->onConsecutiveCalls(false, true));
102 ->expects($this->any())
103 ->method('getRepository')
104 ->willReturn($entryRepo);
107 ->expects($this->exactly(1))
108 ->method('updateEntry')
109 ->willReturn(new Entry($this->user
));
111 // check that every entry persisted are archived
113 ->expects($this->any())
115 ->with($this->callback(function ($persistedEntry) {
116 return $persistedEntry->isArchived();
119 $res = $readabilityImport->setMarkAsRead(true)->import();
121 $this->assertTrue($res);
123 $this->assertEquals(['skipped' => 1, 'imported' => 1, 'queued' => 0], $readabilityImport->getSummary());
126 public function testImportWithRabbit()
128 $readabilityImport = $this->getReadabilityImport();
129 $readabilityImport->setFilepath(__DIR__
.'/../fixtures/readability.json');
131 $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
132 ->disableOriginalConstructor()
135 $entryRepo->expects($this->never())
136 ->method('findByUrlAndUserId');
139 ->expects($this->never())
140 ->method('getRepository');
142 $entry = $this->getMockBuilder('Wallabag\CoreBundle\Entity\Entry')
143 ->disableOriginalConstructor()
147 ->expects($this->never())
148 ->method('updateEntry');
150 $producer = $this->getMockBuilder('OldSound\RabbitMqBundle\RabbitMq\Producer')
151 ->disableOriginalConstructor()
155 ->expects($this->exactly(24))
158 $readabilityImport->setProducer($producer);
160 $res = $readabilityImport->setMarkAsRead(true)->import();
162 $this->assertTrue($res);
163 $this->assertEquals(['skipped' => 0, 'imported' => 0, 'queued' => 24], $readabilityImport->getSummary());
166 public function testImportWithRedis()
168 $readabilityImport = $this->getReadabilityImport();
169 $readabilityImport->setFilepath(__DIR__
.'/../fixtures/readability.json');
171 $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
172 ->disableOriginalConstructor()
175 $entryRepo->expects($this->never())
176 ->method('findByUrlAndUserId');
179 ->expects($this->never())
180 ->method('getRepository');
182 $entry = $this->getMockBuilder('Wallabag\CoreBundle\Entity\Entry')
183 ->disableOriginalConstructor()
187 ->expects($this->never())
188 ->method('updateEntry');
190 $factory = new RedisMockFactory();
191 $redisMock = $factory->getAdapter('Predis\Client', true);
193 $queue = new RedisQueue($redisMock, 'readability');
194 $producer = new Producer($queue);
196 $readabilityImport->setProducer($producer);
198 $res = $readabilityImport->setMarkAsRead(true)->import();
200 $this->assertTrue($res);
201 $this->assertEquals(['skipped' => 0, 'imported' => 0, 'queued' => 24], $readabilityImport->getSummary());
203 $this->assertNotEmpty($redisMock->lpop('readability'));
206 public function testImportBadFile()
208 $readabilityImport = $this->getReadabilityImport();
209 $readabilityImport->setFilepath(__DIR__
.'/../fixtures/wallabag-v1.jsonx');
211 $res = $readabilityImport->import();
213 $this->assertFalse($res);
215 $records = $this->logHandler
->getRecords();
216 $this->assertContains('ReadabilityImport: unable to read file', $records[0]['message']);
217 $this->assertEquals('ERROR', $records[0]['level_name']);
220 public function testImportUserNotDefined()
222 $readabilityImport = $this->getReadabilityImport(true);
223 $readabilityImport->setFilepath(__DIR__
.'/../fixtures/readability.json');
225 $res = $readabilityImport->import();
227 $this->assertFalse($res);
229 $records = $this->logHandler
->getRecords();
230 $this->assertContains('ReadabilityImport: user is not defined', $records[0]['message']);
231 $this->assertEquals('ERROR', $records[0]['level_name']);