From e5908d6b3032b16ec60e400dad06e85833f15cf8 Mon Sep 17 00:00:00 2001
From: Alex Pott <alex.a.pott@googlemail.com>
Date: Thu, 28 Jul 2016 15:19:09 +0100
Subject: [PATCH] Issue #2546004 by neclimdul, quietone, hussainweb, benjy,
 phenaproxima, mikeryan: Add message service to migrate events

---
 core/modules/migrate/src/Event/EventBase.php  | 60 +++++++++++++++++++
 .../migrate/src/Event/MigrateImportEvent.php  | 34 +----------
 .../src/Event/MigratePostRowSaveEvent.php     | 14 ++++-
 .../src/Event/MigratePreRowSaveEvent.php      | 28 +++------
 .../modules/migrate/src/MigrateExecutable.php |  8 +--
 .../tests/src/Unit/Event/EventBaseTest.php    | 44 ++++++++++++++
 .../src/Unit/Event/MigrateImportEventTest.php | 43 +++++++++++++
 .../Event/MigratePostRowSaveEventTest.php     | 41 +++++++++++++
 .../Unit/Event/MigratePreRowSaveEventTest.php | 27 +++++++++
 9 files changed, 239 insertions(+), 60 deletions(-)
 create mode 100644 core/modules/migrate/src/Event/EventBase.php
 create mode 100644 core/modules/migrate/tests/src/Unit/Event/EventBaseTest.php
 create mode 100644 core/modules/migrate/tests/src/Unit/Event/MigrateImportEventTest.php
 create mode 100644 core/modules/migrate/tests/src/Unit/Event/MigratePostRowSaveEventTest.php
 create mode 100644 core/modules/migrate/tests/src/Unit/Event/MigratePreRowSaveEventTest.php

diff --git a/core/modules/migrate/src/Event/EventBase.php b/core/modules/migrate/src/Event/EventBase.php
new file mode 100644
index 000000000000..b2284744b92c
--- /dev/null
+++ b/core/modules/migrate/src/Event/EventBase.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace Drupal\migrate\Event;
+
+use Drupal\migrate\Plugin\MigrationInterface;
+use Drupal\migrate\MigrateMessageInterface;
+use Symfony\Component\EventDispatcher\Event as SymfonyEvent;
+
+class EventBase extends SymfonyEvent {
+
+  /**
+   * The migration.
+   *
+   * @var \Drupal\migrate\Plugin\MigrationInterface
+   */
+  protected $migration;
+
+  /**
+   * The current message service.
+   *
+   * @var \Drupal\migrate\MigrateMessageInterface
+   */
+  protected $message;
+
+  /**
+   * Constructs a Migrate event object.
+   *
+   * @param \Drupal\migrate\Plugin\MigrationInterface $migration
+   *   The migration being run.
+   * @param \Drupal\migrate\MigrateMessageInterface $message
+   *   The Migrate message service.
+   */
+  public function __construct(MigrationInterface $migration, MigrateMessageInterface $message) {
+    $this->migration = $migration;
+    $this->message = $message;
+  }
+
+  /**
+   * Gets the migration.
+   *
+   * @return \Drupal\migrate\Plugin\MigrationInterface
+   *   The migration being run.
+   */
+  public function getMigration() {
+    return $this->migration;
+  }
+
+  /**
+   * Logs a message using the Migrate message service.
+   *
+   * @param string $message
+   *   The message to log.
+   * @param string $type
+   *   The type of message, for example: status or warning.
+   */
+  public function logMessage($message, $type = 'status') {
+    $this->message->display($message, $type);
+  }
+
+}
diff --git a/core/modules/migrate/src/Event/MigrateImportEvent.php b/core/modules/migrate/src/Event/MigrateImportEvent.php
index 2ccecfb5f68c..954117156de5 100644
--- a/core/modules/migrate/src/Event/MigrateImportEvent.php
+++ b/core/modules/migrate/src/Event/MigrateImportEvent.php
@@ -2,39 +2,7 @@
 
 namespace Drupal\migrate\Event;
 
-use Drupal\migrate\Plugin\MigrationInterface;
-use Symfony\Component\EventDispatcher\Event;
-
 /**
  * Wraps a pre- or post-import event for event listeners.
  */
-class MigrateImportEvent extends Event {
-
-  /**
-   * Migration entity.
-   *
-   * @var \Drupal\migrate\Plugin\MigrationInterface
-   */
-  protected $migration;
-
-  /**
-   * Constructs an import event object.
-   *
-   * @param \Drupal\migrate\Plugin\MigrationInterface $migration
-   *   Migration entity.
-   */
-  public function __construct(MigrationInterface $migration) {
-    $this->migration = $migration;
-  }
-
-  /**
-   * Gets the migration entity.
-   *
-   * @return \Drupal\migrate\Plugin\MigrationInterface
-   *   The migration entity involved.
-   */
-  public function getMigration() {
-    return $this->migration;
-  }
-
-}
+class MigrateImportEvent extends EventBase {}
diff --git a/core/modules/migrate/src/Event/MigratePostRowSaveEvent.php b/core/modules/migrate/src/Event/MigratePostRowSaveEvent.php
index ce30a79c9127..e16a259351c0 100644
--- a/core/modules/migrate/src/Event/MigratePostRowSaveEvent.php
+++ b/core/modules/migrate/src/Event/MigratePostRowSaveEvent.php
@@ -3,6 +3,7 @@
 namespace Drupal\migrate\Event;
 
 use Drupal\migrate\Plugin\MigrationInterface;
+use Drupal\migrate\MigrateMessageInterface;
 use Drupal\migrate\Row;
 
 /**
@@ -10,18 +11,27 @@
  */
 class MigratePostRowSaveEvent extends MigratePreRowSaveEvent {
 
+  /**
+   * The row's destination ID.
+   *
+   * @var array|bool
+   */
+  protected $destinationIdValues = [];
+
   /**
    * Constructs a post-save event object.
    *
    * @param \Drupal\migrate\Plugin\MigrationInterface $migration
    *   Migration entity.
+   * @param \Drupal\migrate\MigrateMessageInterface $message
+   *   The message interface.
    * @param \Drupal\migrate\Row $row
    *   Row object.
    * @param array|bool $destination_id_values
    *   Values represent the destination ID.
    */
-  public function __construct(MigrationInterface $migration, Row $row, $destination_id_values) {
-    parent::__construct($migration, $row);
+  public function __construct(MigrationInterface $migration, MigrateMessageInterface $message, Row $row, $destination_id_values) {
+    parent::__construct($migration, $message, $row);
     $this->destinationIdValues = $destination_id_values;
   }
 
diff --git a/core/modules/migrate/src/Event/MigratePreRowSaveEvent.php b/core/modules/migrate/src/Event/MigratePreRowSaveEvent.php
index 059daff1f686..5e563bbd1080 100644
--- a/core/modules/migrate/src/Event/MigratePreRowSaveEvent.php
+++ b/core/modules/migrate/src/Event/MigratePreRowSaveEvent.php
@@ -3,13 +3,13 @@
 namespace Drupal\migrate\Event;
 
 use Drupal\migrate\Plugin\MigrationInterface;
+use Drupal\migrate\MigrateMessageInterface;
 use Drupal\migrate\Row;
-use Symfony\Component\EventDispatcher\Event;
 
 /**
  * Wraps a pre-save event for event listeners.
  */
-class MigratePreRowSaveEvent extends Event {
+class MigratePreRowSaveEvent extends EventBase {
 
   /**
    * Row object.
@@ -18,34 +18,20 @@ class MigratePreRowSaveEvent extends Event {
    */
   protected $row;
 
-  /**
-   * Migration entity.
-   *
-   * @var \Drupal\migrate\Plugin\MigrationInterface
-   */
-  protected $migration;
-
   /**
    * Constructs a pre-save event object.
    *
    * @param \Drupal\migrate\Plugin\MigrationInterface $migration
    *   Migration entity.
+   * @param \Drupal\migrate\MigrateMessageInterface $message
+   *   The current migrate message service.
+   * @param \Drupal\migrate\Row $row
    */
-  public function __construct(MigrationInterface $migration, Row $row) {
-    $this->migration = $migration;
+  public function __construct(MigrationInterface $migration, MigrateMessageInterface $message, Row $row) {
+     parent::__construct($migration, $message);
     $this->row = $row;
   }
 
-  /**
-   * Gets the migration entity.
-   *
-   * @return \Drupal\migrate\Plugin\MigrationInterface
-   *   The migration entity being imported.
-   */
-  public function getMigration() {
-    return $this->migration;
-  }
-
   /**
    * Gets the row object.
    *
diff --git a/core/modules/migrate/src/MigrateExecutable.php b/core/modules/migrate/src/MigrateExecutable.php
index c0b3537ac1e3..bd0468be0bae 100644
--- a/core/modules/migrate/src/MigrateExecutable.php
+++ b/core/modules/migrate/src/MigrateExecutable.php
@@ -177,7 +177,7 @@ public function import() {
         )), 'error');
       return MigrationInterface::RESULT_FAILED;
     }
-    $this->getEventDispatcher()->dispatch(MigrateEvents::PRE_IMPORT, new MigrateImportEvent($this->migration));
+    $this->getEventDispatcher()->dispatch(MigrateEvents::PRE_IMPORT, new MigrateImportEvent($this->migration, $this->message));
 
     // Knock off migration if the requirements haven't been met.
     try {
@@ -229,9 +229,9 @@ public function import() {
 
       if ($save) {
         try {
-          $this->getEventDispatcher()->dispatch(MigrateEvents::PRE_ROW_SAVE, new MigratePreRowSaveEvent($this->migration, $row));
+          $this->getEventDispatcher()->dispatch(MigrateEvents::PRE_ROW_SAVE, new MigratePreRowSaveEvent($this->migration, $this->message, $row));
           $destination_id_values = $destination->import($row, $id_map->lookupDestinationId($this->sourceIdValues));
-          $this->getEventDispatcher()->dispatch(MigrateEvents::POST_ROW_SAVE, new MigratePostRowSaveEvent($this->migration, $row, $destination_id_values));
+          $this->getEventDispatcher()->dispatch(MigrateEvents::POST_ROW_SAVE, new MigratePostRowSaveEvent($this->migration, $this->message, $row, $destination_id_values));
           if ($destination_id_values) {
             // We do not save an idMap entry for config.
             if ($destination_id_values !== TRUE) {
@@ -288,7 +288,7 @@ public function import() {
       }
     }
 
-    $this->getEventDispatcher()->dispatch(MigrateEvents::POST_IMPORT, new MigrateImportEvent($this->migration));
+    $this->getEventDispatcher()->dispatch(MigrateEvents::POST_IMPORT, new MigrateImportEvent($this->migration, $this->message));
     $this->migration->setStatus(MigrationInterface::STATUS_IDLE);
     return $return;
   }
diff --git a/core/modules/migrate/tests/src/Unit/Event/EventBaseTest.php b/core/modules/migrate/tests/src/Unit/Event/EventBaseTest.php
new file mode 100644
index 000000000000..6a52ed6efe3e
--- /dev/null
+++ b/core/modules/migrate/tests/src/Unit/Event/EventBaseTest.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace Drupal\Tests\migrate\Unit\Event;
+
+use Drupal\migrate\Event\EventBase;
+
+/**
+ * @coversDefaultClass \Drupal\migrate\Event\EventBase
+ * @group migrate
+ */
+class EventBaseTest extends \PHPUnit_Framework_TestCase {
+
+  /**
+   * Test getMigration method.
+   *
+   * @covers ::__construct
+   * @covers ::getMigration
+   */
+  public function testGetMigration() {
+    $migration = $this->prophesize('\Drupal\migrate\Plugin\MigrationInterface')->reveal();
+    $message_service = $this->prophesize('\Drupal\migrate\MigrateMessageInterface')->reveal();
+    $row = $this->prophesize('\Drupal\migrate\Row')->reveal();
+    $event = new EventBase($migration, $message_service, $row, [1, 2, 3]);
+    $this->assertSame($migration, $event->getMigration());
+  }
+
+  /**
+   * Test logging a message.
+   *
+   * @covers ::__construct
+   * @covers ::logMessage
+   */
+  public function testLogMessage() {
+    $migration = $this->prophesize('\Drupal\migrate\Plugin\MigrationInterface')->reveal();
+    $message_service = $this->prophesize('\Drupal\migrate\MigrateMessageInterface');
+    $event = new EventBase($migration, $message_service->reveal());
+    // Assert that the intended calls to the services happen.
+    $message_service->display('status message', 'status')->shouldBeCalledTimes(1);
+    $event->logMessage('status message');
+    $message_service->display('warning message', 'warning')->shouldBeCalledTimes(1);
+    $event->logMessage('warning message', 'warning');
+  }
+
+}
diff --git a/core/modules/migrate/tests/src/Unit/Event/MigrateImportEventTest.php b/core/modules/migrate/tests/src/Unit/Event/MigrateImportEventTest.php
new file mode 100644
index 000000000000..480fe85a704b
--- /dev/null
+++ b/core/modules/migrate/tests/src/Unit/Event/MigrateImportEventTest.php
@@ -0,0 +1,43 @@
+<?php
+
+namespace Drupal\Tests\migrate\Unit\Event;
+
+use Drupal\migrate\Event\MigrateImportEvent;
+
+/**
+ * @coversDefaultClass \Drupal\migrate\Event\MigrateImportEvent
+ * @group migrate
+ */
+class MigrateImportEventTest extends \PHPUnit_Framework_TestCase {
+
+  /**
+   * Test getMigration method.
+   *
+   * @covers ::__construct
+   * @covers ::getMigration
+   */
+  public function testGetMigration() {
+    $migration = $this->prophesize('\Drupal\migrate\Plugin\MigrationInterface')->reveal();
+    $message_service = $this->prophesize('\Drupal\migrate\MigrateMessageInterface')->reveal();
+    $event = new MigrateImportEvent($migration, $message_service);
+    $this->assertSame($migration, $event->getMigration());
+  }
+
+  /**
+   * Test logging a message.
+   *
+   * @covers ::__construct
+   * @covers ::logMessage
+   */
+  public function testLogMessage() {
+    $migration = $this->prophesize('\Drupal\migrate\Plugin\MigrationInterface');
+    $message_service = $this->prophesize('\Drupal\migrate\MigrateMessageInterface');
+    $event = new MigrateImportEvent($migration->reveal(), $message_service->reveal());
+    // Assert that the intended calls to the services happen.
+    $message_service->display('status message', 'status')->shouldBeCalledTimes(1);
+    $event->logMessage('status message');
+    $message_service->display('warning message', 'warning')->shouldBeCalledTimes(1);
+    $event->logMessage('warning message', 'warning');
+  }
+
+}
diff --git a/core/modules/migrate/tests/src/Unit/Event/MigratePostRowSaveEventTest.php b/core/modules/migrate/tests/src/Unit/Event/MigratePostRowSaveEventTest.php
new file mode 100644
index 000000000000..f42cb06e9eda
--- /dev/null
+++ b/core/modules/migrate/tests/src/Unit/Event/MigratePostRowSaveEventTest.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace Drupal\Tests\migrate\Unit\Event;
+
+use Drupal\migrate\Event\MigratePostRowSaveEvent;
+
+/**
+ * @coversDefaultClass \Drupal\migrate\Event\MigratePostRowSaveEvent
+ * @group migrate
+ */
+class MigratePostRowSaveEventTest extends EventBaseTest {
+
+  /**
+   * Test getDestinationIdValues method.
+   *
+   * @covers ::__construct
+   * @covers ::getDestinationIdValues
+   */
+  public function testGetDestinationIdValues() {
+    $migration = $this->prophesize('\Drupal\migrate\Plugin\MigrationInterface')->reveal();
+    $message_service = $this->prophesize('\Drupal\migrate\MigrateMessageInterface')->reveal();
+    $row = $this->prophesize('\Drupal\migrate\Row')->reveal();
+    $event = new MigratePostRowSaveEvent($migration, $message_service, $row, [1, 2, 3]);
+    $this->assertSame([1, 2, 3], $event->getDestinationIdValues());
+  }
+
+  /**
+   * Test getRow method.
+   *
+   * @covers ::__construct
+   * @covers ::getRow
+   */
+  public function testGetRow() {
+    $migration = $this->prophesize('\Drupal\migrate\Plugin\MigrationInterface')->reveal();
+    $message_service = $this->prophesize('\Drupal\migrate\MigrateMessageInterface');
+    $row = $this->prophesize('\Drupal\migrate\Row')->reveal();
+    $event = new MigratePostRowSaveEvent($migration, $message_service->reveal(), $row, [1, 2, 3]);
+    $this->assertSame($row, $event->getRow());
+  }
+
+}
diff --git a/core/modules/migrate/tests/src/Unit/Event/MigratePreRowSaveEventTest.php b/core/modules/migrate/tests/src/Unit/Event/MigratePreRowSaveEventTest.php
new file mode 100644
index 000000000000..f15dac1912a2
--- /dev/null
+++ b/core/modules/migrate/tests/src/Unit/Event/MigratePreRowSaveEventTest.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace Drupal\Tests\migrate\Unit\Event;
+
+use Drupal\migrate\Event\MigratePreRowSaveEvent;
+
+/**
+ * @coversDefaultClass \Drupal\migrate\Event\MigratePreRowSaveEvent
+ * @group migrate
+ */
+class MigratePreRowSaveEventTest extends EventBaseTest {
+
+  /**
+   * Test getRow method.
+   *
+   * @covers ::__construct
+   * @covers ::getRow
+   */
+  public function testGetRow() {
+    $migration = $this->prophesize('\Drupal\migrate\Plugin\MigrationInterface')->reveal();
+    $message_service = $this->prophesize('\Drupal\migrate\MigrateMessageInterface')->reveal();
+    $row = $this->prophesize('\Drupal\migrate\Row')->reveal();
+    $event = new MigratePreRowSaveEvent($migration, $message_service, $row);
+    $this->assertSame($row, $event->getRow());
+  }
+
+}
-- 
GitLab