From f09f54e9eea91bb4eaa56b632e2c130d271f45ac Mon Sep 17 00:00:00 2001
From: llaffont <llaffont@afi-sa.fr>
Date: Mon, 30 Nov 2015 15:02:52 +0100
Subject: [PATCH] dev #31762 workflow notifications

send mail to validators with dynamic workflows
---
 .../admin/controllers/CmsController.php       |   2 +-
 library/Class/Article.php                     |   7 ++
 .../admin/controllers/CmsControllerTest.php   | 100 +++++++++++++-----
 3 files changed, 80 insertions(+), 29 deletions(-)

diff --git a/application/modules/admin/controllers/CmsController.php b/application/modules/admin/controllers/CmsController.php
index f4bee15637e..ea60bdbe735 100644
--- a/application/modules/admin/controllers/CmsController.php
+++ b/application/modules/admin/controllers/CmsController.php
@@ -366,7 +366,7 @@ class Admin_CmsController extends ZendAfi_Controller_Action {
 
   protected function _getValidatorsMail($article) {
     return array_unique(
-                        Class_Permission::getWorkflow(Class_Article::STATUS_VALIDATED)
+                        Class_Permission::getWorkflow($article->getNextWorkflowStatus())
                         ->getUsersOnModel($article->getCategorie())
                         ->collect('mail')
                         ->getArrayCopy());
diff --git a/library/Class/Article.php b/library/Class/Article.php
index 12b30b0b88a..65260057830 100644
--- a/library/Class/Article.php
+++ b/library/Class/Article.php
@@ -609,6 +609,13 @@ class Class_Article extends Storm_Model_Abstract {
   }
 
 
+  public function getNextWorkflowStatus() {
+    $statuses = array_keys($this->getKnownStatus());
+    $current = array_search($this->getStatus(), $statuses);
+    return $statuses[$current + 1];
+  }
+
+
   /**
    * Retourne les traductions des articles valides et pour la langue courant
    * @param array
diff --git a/tests/application/modules/admin/controllers/CmsControllerTest.php b/tests/application/modules/admin/controllers/CmsControllerTest.php
index a6028e76b5d..bcabf5d7fc0 100644
--- a/tests/application/modules/admin/controllers/CmsControllerTest.php
+++ b/tests/application/modules/admin/controllers/CmsControllerTest.php
@@ -1498,6 +1498,9 @@ class CmsControllerNewsAddActionPostWithoutWorkflowTest extends CmsControllerWit
 
 
 abstract class CmsControllerWorkflowTestCase extends CmsControllerWithPermissionTestCase {
+  protected
+    $mock_transport;
+
   public function setUp() {
     parent::setUp();
     $this->mock_transport = new MockMailTransport();
@@ -1599,8 +1602,8 @@ class CmsControllerWorkflowWithPermissionsTest extends CmsControllerWorkflowPerm
 
 class CmsControllerNewsAddActionPostWithWorkflowTest
   extends CmsControllerWorkflowTestCase {
-  protected $_article,
-    $mock_transport,
+
+  protected
     $_basePostDatas = ['titre' => 'Katsuhiro Otomo en dédicace !',
                        'debut' => '',
                        'fin' => '',
@@ -1612,12 +1615,7 @@ class CmsControllerNewsAddActionPostWithWorkflowTest
 
   public function setUp() {
     parent::setUp();
-    $this->_basePostDatas['auteur'] = $this->fixture('Class_Users',
-                                                     ['id' => 1,
-                                                      'login' => 'l',
-                                                      'password' => 'l',
-                                                      'nom' => 'Batman',
-                                                      'mail' => 'l@afi-sa.fr']);;
+
     $this->fixture('Class_Article',
                    ['id' => 18,
                     'id_user' => '',
@@ -1625,6 +1623,12 @@ class CmsControllerNewsAddActionPostWithWorkflowTest
                     'contenu' => 'September News',
                     'description' => '',
                     'status' =>'',
+                    'auteur' =>  $this->fixture('Class_Users',
+                                                ['id' => 1,
+                                                 'login' => 'l',
+                                                 'password' => 'l',
+                                                 'nom' => 'Batman',
+                                                 'mail' => 'batman@afi-sa.fr']),
                     'categorie' => Class_ArticleCategorie::find(34)]);
   }
 
@@ -1635,17 +1639,6 @@ class CmsControllerNewsAddActionPostWithWorkflowTest
     $this->postDispatch('/admin/cms/edit/id/18', $data);
   }
 
-
-  protected function postArticleToDynamicStatus() {
-    $this->fixture('Class_AdminVar',
-                   ['id' => 'WORKFLOW',
-                    'valeur' => '[{"id":"12", "label":"A valider "}]']);
-    $data = $this->_basePostDatas;
-    $data['status'] = 12;
-    $this->postDispatch('/admin/cms/edit/id/18', $data);
-  }
-
-
   /** @test */
   public function statusShouldBeUpdated() {
     $this->postArticleValidated();
@@ -1657,15 +1650,7 @@ class CmsControllerNewsAddActionPostWithWorkflowTest
   /** @test */
   public function validatedNewsShouldSendMailToAuthor() {
     $this->postArticleValidated();
-    $this->assertEquals('l@afi-sa.fr',
-                        $this->mock_transport->getSentMails()[0]->getRecipients()[0]);
-  }
-
-
-  /** @test */
-  public function dynamicStatusShouldSendMailToAdmins() {
-    $this->postArticleToDynamicStatus();
-    $this->assertEquals('laurent@afi-sa.fr',
+    $this->assertEquals('batman@afi-sa.fr',
                         $this->mock_transport->getSentMails()[0]->getRecipients()[0]);
   }
 
@@ -1805,6 +1790,65 @@ class CmsControllerNewsAddActionPostWithWorkflowTest
 
 
 
+class CmsControllerNewsAddActionPostWithDynamicWorkflowTest  extends CmsControllerWorkflowTestCase {
+  public function setUp() {
+    parent::setUp();
+    $this->fixture('Class_AdminVar',
+                   ['id' => 'WORKFLOW',
+                    'valeur' => '[{"id":"12", "label":"A lire"}]']);
+  }
+
+
+  protected function _postDataTo($datas, $url) {
+    $datas = array_merge(['titre' => 'Katsuhiro Otomo en dédicace !',
+                          'debut' => '',
+                          'fin' => '',
+                          'events_debut' => '',
+                          'events_fin' => '',
+                          'description' => '',
+                          'id_cat' => $this->_cat_a_la_une->getId(),
+                          'contenu' => 'Ne manquez pas cet évènement.'],
+                         $datas);
+
+    $this->postDispatch($url, $datas);
+  }
+
+
+  /** @test */
+  public function newArticleSavedWithDynamicStatusALireShouldSendMailToAdmin() {
+    $this->_postDataTo(['status' => 12], '/admin/cms/add/id_cat/23');
+
+    $this->assertEquals(['laurent@afi-sa.fr', 'bernard@afi-sa.fr'],
+                        $this->mock_transport->getSentMails()[0]->getRecipients());
+  }
+
+
+  /** @test */
+  public function newArticleSavedWithStatusPendingShouldNotSendMail() {
+    $this->_postDataTo(['status' => Class_Article::STATUS_VALIDATION_PENDING],
+                       '/admin/cms/add/id_cat/23');
+
+    $this->assertEmpty($this->mock_transport->getSentMails());
+  }
+
+
+  /** @test */
+  public function newArticleSavedWithStatusPendingShouldSendMailToGroupTestingWithRights() {
+
+    Class_Permission::findDynamicWorkflow(12)
+      ->permitTo($this->_group_testing, $this->_cat_a_la_une);
+
+
+    $this->_postDataTo(['status' => Class_Article::STATUS_VALIDATION_PENDING],
+                       '/admin/cms/add/id_cat/23');
+
+    $this->assertEquals(['admin@afi-sa.fr'],
+                        $this->mock_transport->getSentMails()[0]->getRecipients());
+  }
+}
+
+
+
 
 class CmsControllerWorkflowArticleRefusedTest extends CmsControllerWorkflowTestCase {
   public function setUp() {
-- 
GitLab