]> git.immae.eu Git - github/wallabag/wallabag.git/blame - tests/Wallabag/ImportBundle/Import/ReadabilityImportTest.php
Merge pull request #2879 from matteocoder/matteocoder-patch-1
[github/wallabag/wallabag.git] / tests / Wallabag / ImportBundle / Import / ReadabilityImportTest.php
CommitLineData
a1a10770
JB
1<?php
2
3namespace Tests\Wallabag\ImportBundle\Import;
4
5use Wallabag\ImportBundle\Import\ReadabilityImport;
6use Wallabag\UserBundle\Entity\User;
7use Wallabag\CoreBundle\Entity\Entry;
b3437d58 8use Wallabag\ImportBundle\Redis\Producer;
a1a10770
JB
9use Monolog\Logger;
10use Monolog\Handler\TestHandler;
b3437d58
JB
11use Simpleue\Queue\RedisQueue;
12use M6Web\Component\RedisMock\RedisMockFactory;
a1a10770
JB
13
14class ReadabilityImportTest extends \PHPUnit_Framework_TestCase
15{
16 protected $user;
17 protected $em;
18 protected $logHandler;
19 protected $contentProxy;
20
7816eb62 21 private function getReadabilityImport($unsetUser = false, $dispatched = 0)
a1a10770
JB
22 {
23 $this->user = new User();
24
25 $this->em = $this->getMockBuilder('Doctrine\ORM\EntityManager')
26 ->disableOriginalConstructor()
27 ->getMock();
28
29 $this->contentProxy = $this->getMockBuilder('Wallabag\CoreBundle\Helper\ContentProxy')
30 ->disableOriginalConstructor()
31 ->getMock();
32
7816eb62
JB
33 $dispatcher = $this->getMockBuilder('Symfony\Component\EventDispatcher\EventDispatcher')
34 ->disableOriginalConstructor()
35 ->getMock();
36
37 $dispatcher
38 ->expects($this->exactly($dispatched))
39 ->method('dispatch');
40
41 $wallabag = new ReadabilityImport($this->em, $this->contentProxy, $dispatcher);
a1a10770
JB
42
43 $this->logHandler = new TestHandler();
44 $logger = new Logger('test', [$this->logHandler]);
45 $wallabag->setLogger($logger);
46
47 if (false === $unsetUser) {
48 $wallabag->setUser($this->user);
49 }
50
51 return $wallabag;
52 }
53
54 public function testInit()
55 {
56 $readabilityImport = $this->getReadabilityImport();
57
58 $this->assertEquals('Readability', $readabilityImport->getName());
59 $this->assertNotEmpty($readabilityImport->getUrl());
60 $this->assertEquals('import.readability.description', $readabilityImport->getDescription());
61 }
62
63 public function testImport()
64 {
7816eb62 65 $readabilityImport = $this->getReadabilityImport(false, 24);
a1a10770
JB
66 $readabilityImport->setFilepath(__DIR__.'/../fixtures/readability.json');
67
68 $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
69 ->disableOriginalConstructor()
70 ->getMock();
71
7230e4c3 72 $entryRepo->expects($this->exactly(24))
a1a10770 73 ->method('findByUrlAndUserId')
7230e4c3 74 ->willReturn(false);
a1a10770
JB
75
76 $this->em
77 ->expects($this->any())
78 ->method('getRepository')
79 ->willReturn($entryRepo);
80
81 $entry = $this->getMockBuilder('Wallabag\CoreBundle\Entity\Entry')
82 ->disableOriginalConstructor()
83 ->getMock();
84
85 $this->contentProxy
7230e4c3 86 ->expects($this->exactly(24))
a1a10770
JB
87 ->method('updateEntry')
88 ->willReturn($entry);
89
90 $res = $readabilityImport->import();
91
92 $this->assertTrue($res);
c80cc01a 93 $this->assertEquals(['skipped' => 0, 'imported' => 24, 'queued' => 0], $readabilityImport->getSummary());
a1a10770
JB
94 }
95
96 public function testImportAndMarkAllAsRead()
97 {
7816eb62 98 $readabilityImport = $this->getReadabilityImport(false, 1);
a1a10770
JB
99 $readabilityImport->setFilepath(__DIR__.'/../fixtures/readability-read.json');
100
101 $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
102 ->disableOriginalConstructor()
103 ->getMock();
104
105 $entryRepo->expects($this->exactly(2))
106 ->method('findByUrlAndUserId')
7230e4c3 107 ->will($this->onConsecutiveCalls(false, true));
a1a10770
JB
108
109 $this->em
110 ->expects($this->any())
111 ->method('getRepository')
112 ->willReturn($entryRepo);
113
114 $this->contentProxy
7230e4c3 115 ->expects($this->exactly(1))
a1a10770
JB
116 ->method('updateEntry')
117 ->willReturn(new Entry($this->user));
118
119 // check that every entry persisted are archived
120 $this->em
121 ->expects($this->any())
122 ->method('persist')
123 ->with($this->callback(function ($persistedEntry) {
124 return $persistedEntry->isArchived();
125 }));
126
127 $res = $readabilityImport->setMarkAsRead(true)->import();
128
129 $this->assertTrue($res);
130
c80cc01a 131 $this->assertEquals(['skipped' => 1, 'imported' => 1, 'queued' => 0], $readabilityImport->getSummary());
13470c35
JB
132 }
133
134 public function testImportWithRabbit()
135 {
136 $readabilityImport = $this->getReadabilityImport();
137 $readabilityImport->setFilepath(__DIR__.'/../fixtures/readability.json');
138
139 $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
140 ->disableOriginalConstructor()
141 ->getMock();
142
143 $entryRepo->expects($this->never())
144 ->method('findByUrlAndUserId');
145
146 $this->em
147 ->expects($this->never())
148 ->method('getRepository');
149
150 $entry = $this->getMockBuilder('Wallabag\CoreBundle\Entity\Entry')
151 ->disableOriginalConstructor()
152 ->getMock();
153
154 $this->contentProxy
155 ->expects($this->never())
156 ->method('updateEntry');
157
158 $producer = $this->getMockBuilder('OldSound\RabbitMqBundle\RabbitMq\Producer')
159 ->disableOriginalConstructor()
160 ->getMock();
161
162 $producer
7230e4c3 163 ->expects($this->exactly(24))
13470c35
JB
164 ->method('publish');
165
b3437d58 166 $readabilityImport->setProducer($producer);
13470c35
JB
167
168 $res = $readabilityImport->setMarkAsRead(true)->import();
169
170 $this->assertTrue($res);
c80cc01a 171 $this->assertEquals(['skipped' => 0, 'imported' => 0, 'queued' => 24], $readabilityImport->getSummary());
a1a10770
JB
172 }
173
b3437d58
JB
174 public function testImportWithRedis()
175 {
176 $readabilityImport = $this->getReadabilityImport();
177 $readabilityImport->setFilepath(__DIR__.'/../fixtures/readability.json');
178
179 $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
180 ->disableOriginalConstructor()
181 ->getMock();
182
183 $entryRepo->expects($this->never())
184 ->method('findByUrlAndUserId');
185
186 $this->em
187 ->expects($this->never())
188 ->method('getRepository');
189
190 $entry = $this->getMockBuilder('Wallabag\CoreBundle\Entity\Entry')
191 ->disableOriginalConstructor()
192 ->getMock();
193
194 $this->contentProxy
195 ->expects($this->never())
196 ->method('updateEntry');
197
198 $factory = new RedisMockFactory();
199 $redisMock = $factory->getAdapter('Predis\Client', true);
200
201 $queue = new RedisQueue($redisMock, 'readability');
202 $producer = new Producer($queue);
203
204 $readabilityImport->setProducer($producer);
205
206 $res = $readabilityImport->setMarkAsRead(true)->import();
207
208 $this->assertTrue($res);
c80cc01a 209 $this->assertEquals(['skipped' => 0, 'imported' => 0, 'queued' => 24], $readabilityImport->getSummary());
b3437d58
JB
210
211 $this->assertNotEmpty($redisMock->lpop('readability'));
212 }
213
a1a10770
JB
214 public function testImportBadFile()
215 {
216 $readabilityImport = $this->getReadabilityImport();
217 $readabilityImport->setFilepath(__DIR__.'/../fixtures/wallabag-v1.jsonx');
218
219 $res = $readabilityImport->import();
220
221 $this->assertFalse($res);
222
223 $records = $this->logHandler->getRecords();
224 $this->assertContains('ReadabilityImport: unable to read file', $records[0]['message']);
225 $this->assertEquals('ERROR', $records[0]['level_name']);
226 }
227
228 public function testImportUserNotDefined()
229 {
230 $readabilityImport = $this->getReadabilityImport(true);
231 $readabilityImport->setFilepath(__DIR__.'/../fixtures/readability.json');
232
233 $res = $readabilityImport->import();
234
235 $this->assertFalse($res);
236
237 $records = $this->logHandler->getRecords();
238 $this->assertContains('ReadabilityImport: user is not defined', $records[0]['message']);
239 $this->assertEquals('ERROR', $records[0]['level_name']);
240 }
241}