Chris@0: 'test', Chris@0: ]; Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: protected function setUp() { Chris@0: parent::setUp(); Chris@0: $this->migration = $this->getMigration(); Chris@0: $this->message = $this->getMock('Drupal\migrate\MigrateMessageInterface'); Chris@0: $event_dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface'); Chris@0: $this->executable = new TestMigrateExecutable($this->migration, $this->message, $event_dispatcher); Chris@0: $this->executable->setStringTranslation($this->getStringTranslationStub()); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests an import with an incomplete rewinding. Chris@0: */ Chris@0: public function testImportWithFailingRewind() { Chris@0: $exception_message = $this->getRandomGenerator()->string(); Chris@0: $source = $this->getMock('Drupal\migrate\Plugin\MigrateSourceInterface'); Chris@0: $source->expects($this->once()) Chris@0: ->method('rewind') Chris@0: ->will($this->throwException(new \Exception($exception_message))); Chris@0: Chris@0: $this->migration->expects($this->any()) Chris@0: ->method('getSourcePlugin') Chris@0: ->will($this->returnValue($source)); Chris@0: Chris@0: // Ensure that a message with the proper message was added. Chris@0: $this->message->expects($this->once()) Chris@0: ->method('display') Chris@0: ->with("Migration failed with source plugin exception: " . Html::escape($exception_message)); Chris@0: Chris@0: $result = $this->executable->import(); Chris@0: $this->assertEquals(MigrationInterface::RESULT_FAILED, $result); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests the import method with a valid row. Chris@0: */ Chris@0: public function testImportWithValidRow() { Chris@0: $source = $this->getMockSource(); Chris@0: Chris@0: $row = $this->getMockBuilder('Drupal\migrate\Row') Chris@0: ->disableOriginalConstructor() Chris@0: ->getMock(); Chris@0: Chris@0: $row->expects($this->once()) Chris@0: ->method('getSourceIdValues') Chris@0: ->will($this->returnValue(['id' => 'test'])); Chris@0: Chris@0: $this->idMap->expects($this->once()) Chris@17: ->method('lookupDestinationIds') Chris@0: ->with(['id' => 'test']) Chris@17: ->will($this->returnValue([['test']])); Chris@0: Chris@0: $source->expects($this->once()) Chris@0: ->method('current') Chris@0: ->will($this->returnValue($row)); Chris@0: Chris@0: $this->executable->setSource($source); Chris@0: Chris@0: $this->migration->expects($this->once()) Chris@0: ->method('getProcessPlugins') Chris@0: ->will($this->returnValue([])); Chris@0: Chris@0: $destination = $this->getMock('Drupal\migrate\Plugin\MigrateDestinationInterface'); Chris@0: $destination->expects($this->once()) Chris@0: ->method('import') Chris@0: ->with($row, ['test']) Chris@0: ->will($this->returnValue(['id' => 'test'])); Chris@0: Chris@0: $this->migration Chris@0: ->method('getDestinationPlugin') Chris@0: ->willReturn($destination); Chris@0: Chris@0: $this->assertSame(MigrationInterface::RESULT_COMPLETED, $this->executable->import()); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests the import method with a valid row. Chris@0: */ Chris@0: public function testImportWithValidRowWithoutDestinationId() { Chris@0: $source = $this->getMockSource(); Chris@0: Chris@0: $row = $this->getMockBuilder('Drupal\migrate\Row') Chris@0: ->disableOriginalConstructor() Chris@0: ->getMock(); Chris@0: Chris@0: $row->expects($this->once()) Chris@0: ->method('getSourceIdValues') Chris@0: ->will($this->returnValue(['id' => 'test'])); Chris@0: Chris@0: $this->idMap->expects($this->once()) Chris@17: ->method('lookupDestinationIds') Chris@0: ->with(['id' => 'test']) Chris@17: ->will($this->returnValue([['test']])); Chris@0: Chris@0: $source->expects($this->once()) Chris@0: ->method('current') Chris@0: ->will($this->returnValue($row)); Chris@0: Chris@0: $this->executable->setSource($source); Chris@0: Chris@0: $this->migration->expects($this->once()) Chris@0: ->method('getProcessPlugins') Chris@0: ->will($this->returnValue([])); Chris@0: Chris@0: $destination = $this->getMock('Drupal\migrate\Plugin\MigrateDestinationInterface'); Chris@0: $destination->expects($this->once()) Chris@0: ->method('import') Chris@0: ->with($row, ['test']) Chris@0: ->will($this->returnValue(TRUE)); Chris@0: Chris@0: $this->migration Chris@0: ->method('getDestinationPlugin') Chris@0: ->willReturn($destination); Chris@0: Chris@0: $this->idMap->expects($this->never()) Chris@0: ->method('saveIdMapping'); Chris@0: Chris@0: $this->assertSame(MigrationInterface::RESULT_COMPLETED, $this->executable->import()); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests the import method with a valid row. Chris@0: */ Chris@0: public function testImportWithValidRowNoDestinationValues() { Chris@0: $source = $this->getMockSource(); Chris@0: Chris@0: $row = $this->getMockBuilder('Drupal\migrate\Row') Chris@0: ->disableOriginalConstructor() Chris@0: ->getMock(); Chris@0: Chris@0: $row->expects($this->once()) Chris@0: ->method('getSourceIdValues') Chris@0: ->will($this->returnValue(['id' => 'test'])); Chris@0: Chris@0: $source->expects($this->once()) Chris@0: ->method('current') Chris@0: ->will($this->returnValue($row)); Chris@0: Chris@0: $this->executable->setSource($source); Chris@0: Chris@0: $this->migration->expects($this->once()) Chris@0: ->method('getProcessPlugins') Chris@0: ->will($this->returnValue([])); Chris@0: Chris@0: $destination = $this->getMock('Drupal\migrate\Plugin\MigrateDestinationInterface'); Chris@0: $destination->expects($this->once()) Chris@0: ->method('import') Chris@0: ->with($row, ['test']) Chris@0: ->will($this->returnValue([])); Chris@0: Chris@0: $this->migration Chris@0: ->method('getDestinationPlugin') Chris@0: ->willReturn($destination); Chris@0: Chris@0: $this->idMap->expects($this->once()) Chris@0: ->method('saveIdMapping') Chris@0: ->with($row, [], MigrateIdMapInterface::STATUS_FAILED, NULL); Chris@0: Chris@0: $this->idMap->expects($this->once()) Chris@0: ->method('messageCount') Chris@0: ->will($this->returnValue(0)); Chris@0: Chris@0: $this->idMap->expects($this->once()) Chris@0: ->method('saveMessage'); Chris@0: Chris@0: $this->idMap->expects($this->once()) Chris@17: ->method('lookupDestinationIds') Chris@0: ->with(['id' => 'test']) Chris@17: ->will($this->returnValue([['test']])); Chris@0: Chris@0: $this->message->expects($this->once()) Chris@0: ->method('display') Chris@0: ->with('New object was not saved, no error provided'); Chris@0: Chris@0: $this->assertSame(MigrationInterface::RESULT_COMPLETED, $this->executable->import()); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests the import method with a thrown MigrateException. Chris@0: * Chris@0: * The MigrationException in this case is being thrown from the destination. Chris@0: */ Chris@0: public function testImportWithValidRowWithDestinationMigrateException() { Chris@0: $exception_message = $this->getRandomGenerator()->string(); Chris@0: $source = $this->getMockSource(); Chris@0: Chris@0: $row = $this->getMockBuilder('Drupal\migrate\Row') Chris@0: ->disableOriginalConstructor() Chris@0: ->getMock(); Chris@0: Chris@0: $row->expects($this->once()) Chris@0: ->method('getSourceIdValues') Chris@0: ->will($this->returnValue(['id' => 'test'])); Chris@0: Chris@0: $source->expects($this->once()) Chris@0: ->method('current') Chris@0: ->will($this->returnValue($row)); Chris@0: Chris@0: $this->executable->setSource($source); Chris@0: Chris@0: $this->migration->expects($this->once()) Chris@0: ->method('getProcessPlugins') Chris@0: ->will($this->returnValue([])); Chris@0: Chris@0: $destination = $this->getMock('Drupal\migrate\Plugin\MigrateDestinationInterface'); Chris@0: $destination->expects($this->once()) Chris@0: ->method('import') Chris@0: ->with($row, ['test']) Chris@0: ->will($this->throwException(new MigrateException($exception_message))); Chris@0: Chris@0: $this->migration Chris@0: ->method('getDestinationPlugin') Chris@0: ->willReturn($destination); Chris@0: Chris@0: $this->idMap->expects($this->once()) Chris@0: ->method('saveIdMapping') Chris@0: ->with($row, [], MigrateIdMapInterface::STATUS_FAILED, NULL); Chris@0: Chris@0: $this->idMap->expects($this->once()) Chris@0: ->method('saveMessage'); Chris@0: Chris@0: $this->idMap->expects($this->once()) Chris@17: ->method('lookupDestinationIds') Chris@0: ->with(['id' => 'test']) Chris@17: ->will($this->returnValue([['test']])); Chris@0: Chris@0: $this->assertSame(MigrationInterface::RESULT_COMPLETED, $this->executable->import()); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests the import method with a thrown MigrateException. Chris@0: * Chris@0: * The MigrationException in this case is being thrown from a process plugin. Chris@0: */ Chris@0: public function testImportWithValidRowWithProcesMigrateException() { Chris@0: $exception_message = $this->getRandomGenerator()->string(); Chris@0: $source = $this->getMockSource(); Chris@0: Chris@0: $row = $this->getMockBuilder('Drupal\migrate\Row') Chris@0: ->disableOriginalConstructor() Chris@0: ->getMock(); Chris@0: Chris@0: $row->expects($this->once()) Chris@0: ->method('getSourceIdValues') Chris@0: ->willReturn(['id' => 'test']); Chris@0: Chris@0: $source->expects($this->once()) Chris@0: ->method('current') Chris@0: ->willReturn($row); Chris@0: Chris@0: $this->executable->setSource($source); Chris@0: Chris@0: $this->migration->expects($this->once()) Chris@0: ->method('getProcessPlugins') Chris@0: ->willThrowException(new MigrateException($exception_message)); Chris@0: Chris@0: $destination = $this->getMock('Drupal\migrate\Plugin\MigrateDestinationInterface'); Chris@0: $destination->expects($this->never()) Chris@0: ->method('import'); Chris@0: Chris@0: $this->migration Chris@0: ->method('getDestinationPlugin') Chris@0: ->willReturn($destination); Chris@0: Chris@0: $this->idMap->expects($this->once()) Chris@0: ->method('saveIdMapping') Chris@0: ->with($row, [], MigrateIdMapInterface::STATUS_FAILED, NULL); Chris@0: Chris@0: $this->idMap->expects($this->once()) Chris@0: ->method('saveMessage'); Chris@0: Chris@0: $this->idMap->expects($this->never()) Chris@17: ->method('lookupDestinationIds'); Chris@0: Chris@0: $this->assertSame(MigrationInterface::RESULT_COMPLETED, $this->executable->import()); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests the import method with a regular Exception being thrown. Chris@0: */ Chris@0: public function testImportWithValidRowWithException() { Chris@0: $exception_message = $this->getRandomGenerator()->string(); Chris@0: $source = $this->getMockSource(); Chris@0: Chris@0: $row = $this->getMockBuilder('Drupal\migrate\Row') Chris@0: ->disableOriginalConstructor() Chris@0: ->getMock(); Chris@0: Chris@0: $row->expects($this->once()) Chris@0: ->method('getSourceIdValues') Chris@0: ->will($this->returnValue(['id' => 'test'])); Chris@0: Chris@0: $source->expects($this->once()) Chris@0: ->method('current') Chris@0: ->will($this->returnValue($row)); Chris@0: Chris@0: $this->executable->setSource($source); Chris@0: Chris@0: $this->migration->expects($this->once()) Chris@0: ->method('getProcessPlugins') Chris@0: ->will($this->returnValue([])); Chris@0: Chris@0: $destination = $this->getMock('Drupal\migrate\Plugin\MigrateDestinationInterface'); Chris@0: $destination->expects($this->once()) Chris@0: ->method('import') Chris@0: ->with($row, ['test']) Chris@0: ->will($this->throwException(new \Exception($exception_message))); Chris@0: Chris@0: $this->migration Chris@0: ->method('getDestinationPlugin') Chris@0: ->willReturn($destination); Chris@0: Chris@0: $this->idMap->expects($this->once()) Chris@0: ->method('saveIdMapping') Chris@0: ->with($row, [], MigrateIdMapInterface::STATUS_FAILED, NULL); Chris@0: Chris@0: $this->idMap->expects($this->once()) Chris@0: ->method('saveMessage'); Chris@0: Chris@0: $this->idMap->expects($this->once()) Chris@17: ->method('lookupDestinationIds') Chris@0: ->with(['id' => 'test']) Chris@17: ->will($this->returnValue([['test']])); Chris@0: Chris@0: $this->message->expects($this->once()) Chris@0: ->method('display') Chris@0: ->with($exception_message); Chris@0: Chris@0: $this->assertSame(MigrationInterface::RESULT_COMPLETED, $this->executable->import()); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests the processRow method. Chris@0: */ Chris@0: public function testProcessRow() { Chris@0: $expected = [ Chris@0: 'test' => 'test destination', Chris@17: 'test1' => 'test1 destination', Chris@0: ]; Chris@0: foreach ($expected as $key => $value) { Chris@0: $plugins[$key][0] = $this->getMock('Drupal\migrate\Plugin\MigrateProcessInterface'); Chris@0: $plugins[$key][0]->expects($this->once()) Chris@0: ->method('getPluginDefinition') Chris@0: ->will($this->returnValue([])); Chris@0: $plugins[$key][0]->expects($this->once()) Chris@0: ->method('transform') Chris@0: ->will($this->returnValue($value)); Chris@0: } Chris@0: $this->migration->expects($this->once()) Chris@0: ->method('getProcessPlugins') Chris@0: ->with(NULL) Chris@0: ->will($this->returnValue($plugins)); Chris@0: $row = new Row(); Chris@0: $this->executable->processRow($row); Chris@0: foreach ($expected as $key => $value) { Chris@0: $this->assertSame($row->getDestinationProperty($key), $value); Chris@0: } Chris@0: $this->assertSame(count($row->getDestination()), count($expected)); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests the processRow method with an empty pipeline. Chris@0: */ Chris@0: public function testProcessRowEmptyPipeline() { Chris@0: $this->migration->expects($this->once()) Chris@0: ->method('getProcessPlugins') Chris@0: ->with(NULL) Chris@0: ->will($this->returnValue(['test' => []])); Chris@0: $row = new Row(); Chris@0: $this->executable->processRow($row); Chris@0: $this->assertSame($row->getDestination(), []); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests the processRow pipeline exception. Chris@0: */ Chris@0: public function testProcessRowPipelineException() { Chris@0: $row = new Row(); Chris@0: $plugin = $this->prophesize(MigrateProcessInterface::class); Chris@0: $plugin->getPluginDefinition()->willReturn(['handle_multiples' => FALSE]); Chris@0: $plugin->transform(NULL, $this->executable, $row, 'destination_id') Chris@0: ->willReturn('transform_return_string'); Chris@0: $plugin->multiple()->willReturn(TRUE); Chris@0: $plugin->getPluginId()->willReturn('plugin_id'); Chris@0: $plugin = $plugin->reveal(); Chris@0: $plugins['destination_id'] = [$plugin, $plugin]; Chris@0: $this->migration->method('getProcessPlugins')->willReturn($plugins); Chris@0: Chris@0: $this->setExpectedException(MigrateException::class, 'Pipeline failed at plugin_id plugin for destination destination_id: transform_return_string received instead of an array,'); Chris@0: $this->executable->processRow($row); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests the processRow method. Chris@0: */ Chris@0: public function testProcessRowEmptyDestination() { Chris@0: $expected = [ Chris@0: 'test' => 'test destination', Chris@0: 'test1' => 'test1 destination', Chris@0: 'test2' => NULL, Chris@0: ]; Chris@0: $row = new Row(); Chris@0: $plugins = []; Chris@0: foreach ($expected as $key => $value) { Chris@0: $plugin = $this->prophesize(MigrateProcessInterface::class); Chris@0: $plugin->getPluginDefinition()->willReturn([]); Chris@0: $plugin->transform(NULL, $this->executable, $row, $key)->willReturn($value); Chris@0: $plugin->multiple()->willReturn(TRUE); Chris@0: $plugins[$key][0] = $plugin->reveal(); Chris@0: } Chris@0: $this->migration->method('getProcessPlugins')->willReturn($plugins); Chris@0: $this->executable->processRow($row); Chris@0: foreach ($expected as $key => $value) { Chris@0: $this->assertSame($value, $row->getDestinationProperty($key)); Chris@0: } Chris@0: $this->assertCount(2, $row->getDestination()); Chris@0: $this->assertSame(['test2'], $row->getEmptyDestinationProperties()); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Returns a mock migration source instance. Chris@0: * Chris@0: * @return \Drupal\migrate\Plugin\MigrateSourceInterface|\PHPUnit_Framework_MockObject_MockObject Chris@0: * The mocked migration source. Chris@0: */ Chris@0: protected function getMockSource() { Chris@0: $iterator = $this->getMock('\Iterator'); Chris@0: Chris@0: $class = 'Drupal\migrate\Plugin\migrate\source\SourcePluginBase'; Chris@0: $source = $this->getMockBuilder($class) Chris@0: ->disableOriginalConstructor() Chris@0: ->setMethods(get_class_methods($class)) Chris@0: ->getMockForAbstractClass(); Chris@0: $source->expects($this->once()) Chris@0: ->method('rewind') Chris@0: ->will($this->returnValue(TRUE)); Chris@0: $source->expects($this->any()) Chris@0: ->method('initializeIterator') Chris@0: ->will($this->returnValue([])); Chris@0: $source->expects($this->any()) Chris@0: ->method('valid') Chris@0: ->will($this->onConsecutiveCalls(TRUE, FALSE)); Chris@0: Chris@0: return $source; Chris@0: } Chris@0: Chris@0: }