Browse Source

Evolution #176: Modération commentaire

bastien 13 years ago
parent
commit
2ee127966a

+ 1 - 5
src/Muzich/CoreBundle/Entity/Element.php View File

@@ -530,11 +530,7 @@ class Element
530 530
   
531 531
   public function getCountCommentReport()
532 532
   {
533
-    if (is_null($this->count_comment_report))
534
-    {
535
-      return false;
536
-    }
537
-    return $this->has_comment_report;
533
+    return $this->count_comment_report;
538 534
   }
539 535
   
540 536
   public function setCountCommentReport($count)

+ 182 - 0
src/Muzich/CoreBundle/Tests/Controller/CommentControllerTest.php View File

@@ -207,4 +207,186 @@ class CommentControllerTest extends FunctionalTest
207 207
     $this->assertEquals($response['status'], 'error');
208 208
   }
209 209
   
210
+  /**
211
+   * Test du signalement de commentaires non appropriés
212
+   * Puis de leurs modérations
213
+   */
214
+  public function testAlertAndModerate()
215
+  {
216
+    // Première chose: dans ce test on a besoin de tester la modération.
217
+    // Du coup bux doit être promus admin
218
+    $this->client = self::createClient();
219
+    $output = $this->runCommand(
220
+      $this->client, 
221
+      "fos:user:promote bux ROLE_ADMIN"
222
+    );
223
+
224
+    /**
225
+     * Scénario: joelle signale deux commentaires: un de bux et un de paul
226
+     * sur l'élément d'ed cox.
227
+     * En moderation 
228
+     * * un commentaire (bux) est effectivement refusé: 
229
+     *   (TODO dans le code) Le compteur de mauvaise attitude augmente
230
+     * * un commentaire (paul) est considéré comme ok, le compteur (faux signalement) 
231
+     *   de joelle s'incrémente de 1.
232
+     */
233
+    
234
+    $em = $this->client->getKernel()->getContainer()->get('doctrine')->getEntityManager();
235
+    $this->connectUser('joelle', 'toor');
236
+    $joelle = $this->getUser();
237
+    $joelle_fake_alerts = $joelle->getBadReportCount();
238
+    
239
+    // On récupère les deux commentaires
240
+    $element = $this->getDoctrine()->getRepository('MuzichCoreBundle:Element')
241
+      ->findOneByName('Ed Cox - La fanfare des teuffeurs (Hardcordian)')
242
+    ;
243
+    $cm = new CommentsManager($element->getComments());
244
+    $comment_bux  = $cm->get(0);
245
+    $comment_paul = $cm->get(1);
246
+    
247
+    // En base rien n'a encore été touché
248
+    $this->assertEquals(0, $cm->countCommentAlert());
249
+    $this->assertEquals(null, $element->getCountCommentReport());
250
+    
251
+    // joelle signale deux éléments
252
+    $this->crawler = $this->client->request(
253
+      'GET', 
254
+      $this->generateUrl('ajax_alert_comment', array(
255
+        'element_id' => $element->getId(),
256
+        'date'       => $comment_bux['d'],
257
+        'token'      => $joelle->getPersonalHash()
258
+      )),
259
+      array(), 
260
+      array(), 
261
+      array('HTTP_X-Requested-With' => 'XMLHttpRequest')
262
+    );
263
+    
264
+    $this->isResponseSuccess();
265
+    
266
+    $response = json_decode($this->client->getResponse()->getContent(), true);
267
+    $this->assertEquals($response['status'], 'success');
268
+    
269
+    // Les données en bases ont évolués
270
+    // On récupère les deux commentaires
271
+    $element = $this->getDoctrine()->getRepository('MuzichCoreBundle:Element')
272
+      ->findOneByName('Ed Cox - La fanfare des teuffeurs (Hardcordian)')
273
+    ;
274
+    $cm = new CommentsManager($element->getComments());
275
+    $comment_bux  = $cm->get(0);
276
+    $comment_paul = $cm->get(1);
277
+    
278
+    $this->assertEquals(1, $cm->countCommentAlert());
279
+    $this->assertEquals(1, $element->getCountCommentReport());
280
+    
281
+    // deuxième signalement
282
+    $this->crawler = $this->client->request(
283
+      'GET', 
284
+      $this->generateUrl('ajax_alert_comment', array(
285
+        'element_id' => $element->getId(),
286
+        'date'       => $comment_paul['d'],
287
+        'token'      => $joelle->getPersonalHash()
288
+      )),
289
+      array(), 
290
+      array(), 
291
+      array('HTTP_X-Requested-With' => 'XMLHttpRequest')
292
+    );
293
+    
294
+    $this->isResponseSuccess();
295
+    
296
+    $response = json_decode($this->client->getResponse()->getContent(), true);
297
+    $this->assertEquals($response['status'], 'success');
298
+    
299
+    // Les données en bases ont évolués
300
+    // On récupère les deux commentaires
301
+    $element = $this->getDoctrine()->getRepository('MuzichCoreBundle:Element')
302
+      ->findOneByName('Ed Cox - La fanfare des teuffeurs (Hardcordian)')
303
+    ;
304
+    $cm = new CommentsManager($element->getComments());
305
+    $comment_bux  = $cm->get(0);
306
+    $comment_paul = $cm->get(1);
307
+    
308
+    $this->assertEquals(2, $cm->countCommentAlert());
309
+    $this->assertEquals(2, $element->getCountCommentReport());
310
+    
311
+    /**
312
+     * On passe maintenant a la modération
313
+     */
314
+    
315
+    $this->disconnectUser();
316
+    $this->connectUser('bux', 'toor');
317
+    $bux = $this->getUser();
318
+    
319
+    // bux ouvre la page de modération des commentaires
320
+    $this->crawler = $this->client->request('GET', $this->generateUrl('moderate_comments_index'));
321
+    
322
+    // On voit les deux commentaires signalés dans la liste
323
+    $this->exist('li.comment:contains("C\'est trop bon hein ?")');
324
+    $this->exist('li.comment:contains("C\'est pas mal en effet")');
325
+    
326
+    // Refus de celui de bux
327
+    $this->crawler = $this->client->request(
328
+      'GET', 
329
+      $this->generateUrl('moderate_comment_refuse', array(
330
+        'element_id' => $element->getId(),
331
+        'date'       => $comment_bux['d']
332
+      )),
333
+      array(), 
334
+      array(), 
335
+      array('HTTP_X-Requested-With' => 'XMLHttpRequest')
336
+    );
337
+    
338
+    $this->isResponseSuccess();
339
+    
340
+    $response = json_decode($this->client->getResponse()->getContent(), true);
341
+    $this->assertEquals($response['status'], 'success');
342
+    
343
+    // TODO: check du compteur de mauvais comportements de bux
344
+    
345
+    // la base est a jour
346
+    $element = $this->getDoctrine()->getRepository('MuzichCoreBundle:Element')
347
+      ->findOneByName('Ed Cox - La fanfare des teuffeurs (Hardcordian)')
348
+    ;
349
+    $cm = new CommentsManager($element->getComments());
350
+    
351
+    $this->assertEquals(1, $cm->countCommentAlert());
352
+    $this->assertEquals(1, $element->getCountCommentReport());
353
+    
354
+    // Clean de celui de paul
355
+    $this->crawler = $this->client->request(
356
+      'GET', 
357
+      $this->generateUrl('moderate_comment_clean', array(
358
+        'element_id' => $element->getId(),
359
+        'date'       => $comment_paul['d']
360
+      )),
361
+      array(), 
362
+      array(), 
363
+      array('HTTP_X-Requested-With' => 'XMLHttpRequest')
364
+    );
365
+    
366
+    $this->isResponseSuccess();
367
+    
368
+    $response = json_decode($this->client->getResponse()->getContent(), true);
369
+    $this->assertEquals($response['status'], 'success');
370
+    
371
+    // la base est a jour
372
+    $element = $this->getDoctrine()->getRepository('MuzichCoreBundle:Element')
373
+      ->findOneByName('Ed Cox - La fanfare des teuffeurs (Hardcordian)')
374
+    ;
375
+    $cm = new CommentsManager($element->getComments());
376
+    
377
+    $this->assertEquals(0, $cm->countCommentAlert());
378
+    $this->assertEquals(0, $element->getCountCommentReport());
379
+    
380
+    // Mais comme joelle a signalé un commentaire considéré comme ok par la modération
381
+    // joelle vois son compteur de faux signalement incrémenté
382
+    $joelle = $this->getUser('joelle');
383
+    $this->assertEquals($joelle_fake_alerts+1, $joelle->getBadReportCount());
384
+    
385
+    // Et si on se rend sur la page home, le commentaire de bux a disparu
386
+    $this->crawler = $this->client->request('GET', $this->generateUrl('home'));
387
+    
388
+    $this->exist('li.comment:contains("C\'est pas mal en effet")');
389
+    $this->notExist('li.comment:contains("C\'est trop bon hein ?")');
390
+  }
391
+  
210 392
 }

+ 31 - 0
src/Muzich/CoreBundle/lib/FunctionalTest.php View File

@@ -6,6 +6,10 @@ use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
6 6
 use Symfony\Bundle\FrameworkBundle\Client;
7 7
 use Symfony\Component\DomCrawler\Crawler;
8 8
 
9
+use Symfony\Bundle\FrameworkBundle\Console\Application;
10
+use Symfony\Component\Console\Input\StringInput;
11
+use Symfony\Component\Console\Output\StreamOutput;
12
+
9 13
 class FunctionalTest extends WebTestCase
10 14
 {
11 15
   /**
@@ -440,4 +444,31 @@ class FunctionalTest extends WebTestCase
440 444
     ;
441 445
     $this->assertTrue(!is_null($element));
442 446
   }
447
+  
448
+  /**
449
+   * Runs a command and returns it output
450
+   * 
451
+   * @author Alexandre Salomé <alexandre.salome@gmail.com>
452
+   */
453
+  public function runCommand(Client $client, $command)
454
+  {
455
+      $application = new Application($client->getKernel());
456
+      $application->setAutoExit(false);
457
+
458
+      $fp = tmpfile();
459
+      $input = new StringInput($command);
460
+      $output = new StreamOutput($fp);
461
+
462
+      $application->run($input, $output);
463
+
464
+      fseek($fp, 0);
465
+      $output = '';
466
+      while (!feof($fp)) {
467
+          $output = fread($fp, 4096);
468
+      }
469
+      fclose($fp);
470
+
471
+      return $output;
472
+  }
473
+  
443 474
 }