]>
Commit | Line | Data |
---|---|---|
1 | <?php | |
2 | ||
3 | namespace Tests\AnnotationBundle\Controller; | |
4 | ||
5 | use Tests\Wallabag\AnnotationBundle\WallabagAnnotationTestCase; | |
6 | use Wallabag\AnnotationBundle\Entity\Annotation; | |
7 | use Wallabag\CoreBundle\Entity\Entry; | |
8 | ||
9 | class AnnotationControllerTest extends WallabagAnnotationTestCase | |
10 | { | |
11 | /** | |
12 | * This data provider allow to tests annotation from the : | |
13 | * - API POV (when user use the api to manage annotations) | |
14 | * - and User POV (when user use the web interface - using javascript - to manage annotations). | |
15 | */ | |
16 | public function dataForEachAnnotations() | |
17 | { | |
18 | return [ | |
19 | ['/api/annotations'], | |
20 | ['annotations'], | |
21 | ]; | |
22 | } | |
23 | ||
24 | /** | |
25 | * Test fetching annotations for an entry. | |
26 | * | |
27 | * @dataProvider dataForEachAnnotations | |
28 | */ | |
29 | public function testGetAnnotations($prefixUrl) | |
30 | { | |
31 | $em = $this->client->getContainer()->get('doctrine.orm.entity_manager'); | |
32 | ||
33 | $user = $em | |
34 | ->getRepository('WallabagUserBundle:User') | |
35 | ->findOneByUserName('admin'); | |
36 | $entry = $em | |
37 | ->getRepository('WallabagCoreBundle:Entry') | |
38 | ->findOneByUsernameAndNotArchived('admin'); | |
39 | ||
40 | $annotation = new Annotation($user); | |
41 | $annotation->setEntry($entry); | |
42 | $annotation->setText('This is my annotation /o/'); | |
43 | $annotation->setQuote('content'); | |
44 | ||
45 | $em->persist($annotation); | |
46 | $em->flush(); | |
47 | ||
48 | if ('annotations' === $prefixUrl) { | |
49 | $this->logInAs('admin'); | |
50 | } | |
51 | ||
52 | $this->client->request('GET', $prefixUrl . '/' . $entry->getId() . '.json'); | |
53 | $this->assertSame(200, $this->client->getResponse()->getStatusCode()); | |
54 | ||
55 | $content = json_decode($this->client->getResponse()->getContent(), true); | |
56 | $this->assertGreaterThanOrEqual(1, $content['total']); | |
57 | $this->assertSame($annotation->getText(), $content['rows'][0]['text']); | |
58 | ||
59 | // we need to re-fetch the annotation becase after the flush, it has been "detached" from the entity manager | |
60 | $annotation = $em->getRepository('WallabagAnnotationBundle:Annotation')->findAnnotationById($annotation->getId()); | |
61 | $em->remove($annotation); | |
62 | $em->flush(); | |
63 | } | |
64 | ||
65 | /** | |
66 | * Test creating an annotation for an entry. | |
67 | * | |
68 | * @dataProvider dataForEachAnnotations | |
69 | */ | |
70 | public function testSetAnnotation($prefixUrl) | |
71 | { | |
72 | $em = $this->client->getContainer()->get('doctrine.orm.entity_manager'); | |
73 | ||
74 | if ('annotations' === $prefixUrl) { | |
75 | $this->logInAs('admin'); | |
76 | } | |
77 | ||
78 | /** @var Entry $entry */ | |
79 | $entry = $em | |
80 | ->getRepository('WallabagCoreBundle:Entry') | |
81 | ->findOneByUsernameAndNotArchived('admin'); | |
82 | ||
83 | $headers = ['CONTENT_TYPE' => 'application/json']; | |
84 | $content = json_encode([ | |
85 | 'text' => 'my annotation', | |
86 | 'quote' => 'my quote', | |
87 | 'ranges' => [ | |
88 | ['start' => '', 'startOffset' => 24, 'end' => '', 'endOffset' => 31], | |
89 | ], | |
90 | ]); | |
91 | $this->client->request('POST', $prefixUrl . '/' . $entry->getId() . '.json', [], [], $headers, $content); | |
92 | ||
93 | $this->assertSame(200, $this->client->getResponse()->getStatusCode()); | |
94 | ||
95 | $content = json_decode($this->client->getResponse()->getContent(), true); | |
96 | ||
97 | $this->assertSame('Big boss', $content['user']); | |
98 | $this->assertSame('v1.0', $content['annotator_schema_version']); | |
99 | $this->assertSame('my annotation', $content['text']); | |
100 | $this->assertSame('my quote', $content['quote']); | |
101 | ||
102 | /** @var Annotation $annotation */ | |
103 | $annotation = $this->client->getContainer() | |
104 | ->get('doctrine.orm.entity_manager') | |
105 | ->getRepository('WallabagAnnotationBundle:Annotation') | |
106 | ->findLastAnnotationByPageId($entry->getId(), 1); | |
107 | ||
108 | $this->assertSame('my annotation', $annotation->getText()); | |
109 | } | |
110 | ||
111 | /** | |
112 | * @dataProvider dataForEachAnnotations | |
113 | */ | |
114 | public function testSetAnnotationWithQuoteTooLong($prefixUrl) | |
115 | { | |
116 | $em = $this->client->getContainer()->get('doctrine.orm.entity_manager'); | |
117 | ||
118 | if ('annotations' === $prefixUrl) { | |
119 | $this->logInAs('admin'); | |
120 | } | |
121 | ||
122 | /** @var Entry $entry */ | |
123 | $entry = $em | |
124 | ->getRepository('WallabagCoreBundle:Entry') | |
125 | ->findOneByUsernameAndNotArchived('admin'); | |
126 | ||
127 | $longQuote = str_repeat('a', 10001); | |
128 | $headers = ['CONTENT_TYPE' => 'application/json']; | |
129 | $content = json_encode([ | |
130 | 'text' => 'my annotation', | |
131 | 'quote' => $longQuote, | |
132 | 'ranges' => [ | |
133 | ['start' => '', 'startOffset' => 24, 'end' => '', 'endOffset' => 31], | |
134 | ], | |
135 | ]); | |
136 | $this->client->request('POST', $prefixUrl . '/' . $entry->getId() . '.json', [], [], $headers, $content); | |
137 | ||
138 | $this->assertSame(400, $this->client->getResponse()->getStatusCode()); | |
139 | } | |
140 | ||
141 | /** | |
142 | * Test editing an existing annotation. | |
143 | * | |
144 | * @dataProvider dataForEachAnnotations | |
145 | */ | |
146 | public function testEditAnnotation($prefixUrl) | |
147 | { | |
148 | $em = $this->client->getContainer()->get('doctrine.orm.entity_manager'); | |
149 | ||
150 | $user = $em | |
151 | ->getRepository('WallabagUserBundle:User') | |
152 | ->findOneByUserName('admin'); | |
153 | $entry = $em | |
154 | ->getRepository('WallabagCoreBundle:Entry') | |
155 | ->findOneByUsernameAndNotArchived('admin'); | |
156 | ||
157 | $annotation = new Annotation($user); | |
158 | $annotation->setEntry($entry); | |
159 | $annotation->setText('This is my annotation /o/'); | |
160 | $annotation->setQuote('my quote'); | |
161 | ||
162 | $em->persist($annotation); | |
163 | $em->flush(); | |
164 | ||
165 | $headers = ['CONTENT_TYPE' => 'application/json']; | |
166 | $content = json_encode([ | |
167 | 'text' => 'a modified annotation', | |
168 | ]); | |
169 | $this->client->request('PUT', $prefixUrl . '/' . $annotation->getId() . '.json', [], [], $headers, $content); | |
170 | $this->assertSame(200, $this->client->getResponse()->getStatusCode()); | |
171 | ||
172 | $content = json_decode($this->client->getResponse()->getContent(), true); | |
173 | ||
174 | $this->assertSame('Big boss', $content['user']); | |
175 | $this->assertSame('v1.0', $content['annotator_schema_version']); | |
176 | $this->assertSame('a modified annotation', $content['text']); | |
177 | $this->assertSame('my quote', $content['quote']); | |
178 | ||
179 | /** @var Annotation $annotationUpdated */ | |
180 | $annotationUpdated = $em | |
181 | ->getRepository('WallabagAnnotationBundle:Annotation') | |
182 | ->findOneById($annotation->getId()); | |
183 | $this->assertSame('a modified annotation', $annotationUpdated->getText()); | |
184 | ||
185 | $em->remove($annotationUpdated); | |
186 | $em->flush(); | |
187 | } | |
188 | ||
189 | /** | |
190 | * Test deleting an annotation. | |
191 | * | |
192 | * @dataProvider dataForEachAnnotations | |
193 | */ | |
194 | public function testDeleteAnnotation($prefixUrl) | |
195 | { | |
196 | $em = $this->client->getContainer()->get('doctrine.orm.entity_manager'); | |
197 | ||
198 | $user = $em | |
199 | ->getRepository('WallabagUserBundle:User') | |
200 | ->findOneByUserName('admin'); | |
201 | $entry = $em | |
202 | ->getRepository('WallabagCoreBundle:Entry') | |
203 | ->findOneByUsernameAndNotArchived('admin'); | |
204 | ||
205 | $annotation = new Annotation($user); | |
206 | $annotation->setEntry($entry); | |
207 | $annotation->setText('This is my annotation /o/'); | |
208 | $annotation->setQuote('my quote'); | |
209 | ||
210 | $em->persist($annotation); | |
211 | $em->flush(); | |
212 | ||
213 | if ('annotations' === $prefixUrl) { | |
214 | $this->logInAs('admin'); | |
215 | } | |
216 | ||
217 | $headers = ['CONTENT_TYPE' => 'application/json']; | |
218 | $content = json_encode([ | |
219 | 'text' => 'a modified annotation', | |
220 | ]); | |
221 | $this->client->request('DELETE', $prefixUrl . '/' . $annotation->getId() . '.json', [], [], $headers, $content); | |
222 | $this->assertSame(200, $this->client->getResponse()->getStatusCode()); | |
223 | ||
224 | $content = json_decode($this->client->getResponse()->getContent(), true); | |
225 | ||
226 | $this->assertSame('This is my annotation /o/', $content['text']); | |
227 | ||
228 | $annotationDeleted = $em | |
229 | ->getRepository('WallabagAnnotationBundle:Annotation') | |
230 | ->findOneById($annotation->getId()); | |
231 | ||
232 | $this->assertNull($annotationDeleted); | |
233 | } | |
234 | } |