Further Drupal 8.6.4 changes. Some core files were not committed before a commit...
[yaffs-website] / web / core / modules / migrate / tests / src / Kernel / MigrateEventsTest.php
1 <?php
2
3 namespace Drupal\Tests\migrate\Kernel;
4
5 use Drupal\migrate\Event\MigrateImportEvent;
6 use Drupal\migrate\Event\MigrateMapDeleteEvent;
7 use Drupal\migrate\Event\MigrateMapSaveEvent;
8 use Drupal\migrate\Event\MigratePostRowSaveEvent;
9 use Drupal\migrate\Event\MigratePreRowSaveEvent;
10 use Drupal\migrate\Event\MigrateEvents;
11 use Drupal\migrate\MigrateExecutable;
12 use Drupal\KernelTests\KernelTestBase;
13
14 /**
15  * Tests events fired on migrations.
16  *
17  * @group migrate
18  */
19 class MigrateEventsTest extends KernelTestBase {
20
21   /**
22    * State service for recording information received by event listeners.
23    *
24    * @var \Drupal\Core\State\State
25    */
26   protected $state;
27
28   /**
29    * Modules to enable.
30    *
31    * @var array
32    */
33   public static $modules = ['migrate', 'migrate_events_test'];
34
35   /**
36    * {@inheritdoc}
37    */
38   protected function setUp() {
39     parent::setUp();
40     $this->state = \Drupal::state();
41     \Drupal::service('event_dispatcher')->addListener(MigrateEvents::MAP_SAVE,
42       [$this, 'mapSaveEventRecorder']);
43     \Drupal::service('event_dispatcher')->addListener(MigrateEvents::MAP_DELETE,
44       [$this, 'mapDeleteEventRecorder']);
45     \Drupal::service('event_dispatcher')->addListener(MigrateEvents::PRE_IMPORT,
46       [$this, 'preImportEventRecorder']);
47     \Drupal::service('event_dispatcher')->addListener(MigrateEvents::POST_IMPORT,
48       [$this, 'postImportEventRecorder']);
49     \Drupal::service('event_dispatcher')->addListener(MigrateEvents::PRE_ROW_SAVE,
50       [$this, 'preRowSaveEventRecorder']);
51     \Drupal::service('event_dispatcher')->addListener(MigrateEvents::POST_ROW_SAVE,
52       [$this, 'postRowSaveEventRecorder']);
53   }
54
55   /**
56    * Tests migration events.
57    */
58   public function testMigrateEvents() {
59     // Run a simple little migration, which should trigger one of each event
60     // other than map_delete.
61     $definition = [
62       'migration_tags' => ['Event test'],
63       'source' => [
64         'plugin' => 'embedded_data',
65         'data_rows' => [
66           ['data' => 'dummy value'],
67         ],
68         'ids' => [
69           'data' => ['type' => 'string'],
70         ],
71       ],
72       'process' => ['value' => 'data'],
73       'destination' => ['plugin' => 'dummy'],
74     ];
75
76     $migration = \Drupal::service('plugin.manager.migration')->createStubMigration($definition);
77
78     $executable = new MigrateExecutable($migration);
79     // As the import runs, events will be dispatched, recording the received
80     // information in state.
81     $executable->import();
82
83     // Validate from the recorded state that the events were received.
84     $event = $this->state->get('migrate_events_test.pre_import_event', []);
85     $this->assertIdentical($event['event_name'], MigrateEvents::PRE_IMPORT);
86     $this->assertIdentical($event['migration']->id(), $migration->id());
87
88     $event = $this->state->get('migrate_events_test.post_import_event', []);
89     $this->assertIdentical($event['event_name'], MigrateEvents::POST_IMPORT);
90     $this->assertIdentical($event['migration']->id(), $migration->id());
91
92     $event = $this->state->get('migrate_events_test.map_save_event', []);
93     $this->assertIdentical($event['event_name'], MigrateEvents::MAP_SAVE);
94     // Validating the last row processed.
95     $this->assertIdentical($event['fields']['sourceid1'], 'dummy value');
96     $this->assertIdentical($event['fields']['destid1'], 'dummy value');
97     $this->assertIdentical($event['fields']['source_row_status'], 0);
98
99     $event = $this->state->get('migrate_events_test.map_delete_event', []);
100     $this->assertIdentical($event, []);
101
102     $event = $this->state->get('migrate_events_test.pre_row_save_event', []);
103     $this->assertIdentical($event['event_name'], MigrateEvents::PRE_ROW_SAVE);
104     $this->assertIdentical($event['migration']->id(), $migration->id());
105     // Validating the last row processed.
106     $this->assertIdentical($event['row']->getSourceProperty('data'), 'dummy value');
107
108     $event = $this->state->get('migrate_events_test.post_row_save_event', []);
109     $this->assertIdentical($event['event_name'], MigrateEvents::POST_ROW_SAVE);
110     $this->assertIdentical($event['migration']->id(), $migration->id());
111     // Validating the last row processed.
112     $this->assertIdentical($event['row']->getSourceProperty('data'), 'dummy value');
113     $this->assertIdentical($event['destination_id_values']['value'], 'dummy value');
114
115     // Generate a map delete event.
116     $migration->getIdMap()->delete(['data' => 'dummy value']);
117     $event = $this->state->get('migrate_events_test.map_delete_event', []);
118     $this->assertIdentical($event['event_name'], MigrateEvents::MAP_DELETE);
119     $this->assertIdentical($event['source_id'], ['data' => 'dummy value']);
120   }
121
122   /**
123    * Reacts to map save event.
124    *
125    * @param \Drupal\Migrate\Event\MigrateMapSaveEvent $event
126    *   The migration event.
127    * @param string $name
128    *   The event name.
129    */
130   public function mapSaveEventRecorder(MigrateMapSaveEvent $event, $name) {
131     $this->state->set('migrate_events_test.map_save_event', [
132       'event_name' => $name,
133       'map' => $event->getMap(),
134       'fields' => $event->getFields(),
135     ]);
136   }
137
138   /**
139    * Reacts to map delete event.
140    *
141    * @param \Drupal\Migrate\Event\MigrateMapDeleteEvent $event
142    *   The migration event.
143    * @param string $name
144    *   The event name.
145    */
146   public function mapDeleteEventRecorder(MigrateMapDeleteEvent $event, $name) {
147     $this->state->set('migrate_events_test.map_delete_event', [
148       'event_name' => $name,
149       'map' => $event->getMap(),
150       'source_id' => $event->getSourceId(),
151     ]);
152   }
153
154   /**
155    * Reacts to pre-import event.
156    *
157    * @param \Drupal\Migrate\Event\MigrateImportEvent $event
158    *   The migration event.
159    * @param string $name
160    *   The event name.
161    */
162   public function preImportEventRecorder(MigrateImportEvent $event, $name) {
163     $this->state->set('migrate_events_test.pre_import_event', [
164       'event_name' => $name,
165       'migration' => $event->getMigration(),
166     ]);
167   }
168
169   /**
170    * Reacts to post-import event.
171    *
172    * @param \Drupal\Migrate\Event\MigrateImportEvent $event
173    *   The migration event.
174    * @param string $name
175    *   The event name.
176    */
177   public function postImportEventRecorder(MigrateImportEvent $event, $name) {
178     $this->state->set('migrate_events_test.post_import_event', [
179       'event_name' => $name,
180       'migration' => $event->getMigration(),
181     ]);
182   }
183
184   /**
185    * Reacts to pre-row-save event.
186    *
187    * @param \Drupal\Migrate\Event\MigratePreRowSaveEvent $event
188    *   The migration event.
189    * @param string $name
190    *   The event name.
191    */
192   public function preRowSaveEventRecorder(MigratePreRowSaveEvent $event, $name) {
193     $this->state->set('migrate_events_test.pre_row_save_event', [
194       'event_name' => $name,
195       'migration' => $event->getMigration(),
196       'row' => $event->getRow(),
197     ]);
198   }
199
200   /**
201    * Reacts to post-row-save event.
202    *
203    * @param \Drupal\Migrate\Event\MigratePostRowSaveEvent $event
204    *   The migration event.
205    * @param string $name
206    *   The event name.
207    */
208   public function postRowSaveEventRecorder(MigratePostRowSaveEvent $event, $name) {
209     $this->state->set('migrate_events_test.post_row_save_event', [
210       'event_name' => $name,
211       'migration' => $event->getMigration(),
212       'row' => $event->getRow(),
213       'destination_id_values' => $event->getDestinationIdValues(),
214     ]);
215   }
216
217 }