Issue #2707387 by quietone, Adita, heddn, phenaproxima, chx: D6/7->D8 migration: Menu_links migration is not working because option parameters were not found
parent
50e815dca0
commit
d0d377ccda
|
@ -3,10 +3,10 @@
|
|||
namespace Drupal\migrate\Plugin\migrate\process;
|
||||
|
||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
|
||||
use Drupal\migrate\Plugin\MigrationInterface;
|
||||
use Drupal\Core\Path\PathValidatorInterface;
|
||||
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
|
||||
use Drupal\migrate\MigrateExecutableInterface;
|
||||
use Drupal\migrate\Plugin\MigrationInterface;
|
||||
use Drupal\migrate\ProcessPluginBase;
|
||||
use Drupal\migrate\Row;
|
||||
|
||||
|
@ -55,7 +55,14 @@ class Route extends ProcessPluginBase implements ContainerFactoryPluginInterface
|
|||
* Set the destination route information based on the source link_path.
|
||||
*/
|
||||
public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
|
||||
list($link_path, $options) = $value;
|
||||
if (is_string($value)) {
|
||||
$link_path = $value;
|
||||
$options = [];
|
||||
}
|
||||
else {
|
||||
list($link_path, $options) = $value;
|
||||
}
|
||||
|
||||
$extracted = $this->pathValidator->getUrlIfValidWithoutAccessCheck($link_path);
|
||||
$route = array();
|
||||
|
||||
|
|
|
@ -0,0 +1,278 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\migrate\Kernel\process;
|
||||
|
||||
use Drupal\KernelTests\KernelTestBase;
|
||||
use Drupal\migrate\Plugin\migrate\process\Route;
|
||||
use Drupal\migrate\MigrateExecutableInterface;
|
||||
use Drupal\migrate\Plugin\MigrationInterface;
|
||||
use Drupal\migrate\Row;
|
||||
use Drupal\user\Entity\User;
|
||||
|
||||
/**
|
||||
* Tests the route process plugin.
|
||||
*
|
||||
* @coversDefaultClass \Drupal\migrate\Plugin\migrate\process\Route
|
||||
*
|
||||
* @group migrate
|
||||
*/
|
||||
class RouteTest extends KernelTestBase {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static $modules = ['user', 'system'];
|
||||
|
||||
/**
|
||||
* Tests Route plugin based on providerTestRoute() values.
|
||||
*
|
||||
* @param mixed $value
|
||||
* Input value for the Route process plugin.
|
||||
* @param array $expected
|
||||
* The expected results from the Route transform process.
|
||||
*
|
||||
* @dataProvider providerTestRoute
|
||||
*/
|
||||
public function testRoute($value, $expected) {
|
||||
$actual = $this->doTransform($value);
|
||||
$this->assertSame($expected, $actual);
|
||||
}
|
||||
|
||||
/**
|
||||
* Data provider for testRoute().
|
||||
*
|
||||
* @return array
|
||||
* An array of arrays, where the first element is the input to the Route
|
||||
* process plugin, and the second is the expected results.
|
||||
*/
|
||||
public function providerTestRoute() {
|
||||
// Internal link tests.
|
||||
// Valid link path and options.
|
||||
$values[0] = [
|
||||
'user/login',
|
||||
[
|
||||
'attributes' => [
|
||||
'title' => 'Test menu link 1',
|
||||
],
|
||||
],
|
||||
];
|
||||
$expected[0] = [
|
||||
'route_name' => 'user.login',
|
||||
'route_parameters' => [],
|
||||
'options' => [
|
||||
'query' => [],
|
||||
'attributes' => [
|
||||
'title' => 'Test menu link 1',
|
||||
],
|
||||
],
|
||||
'url' => NULL,
|
||||
];
|
||||
|
||||
// Valid link path and empty options.
|
||||
$values[1] = [
|
||||
'user/login',
|
||||
[],
|
||||
];
|
||||
$expected[1] = [
|
||||
'route_name' => 'user.login',
|
||||
'route_parameters' => [],
|
||||
'options' => [
|
||||
'query' => [],
|
||||
],
|
||||
'url' => NULL,
|
||||
];
|
||||
|
||||
// Valid link path and no options.
|
||||
$values[2] = 'user/login';
|
||||
$expected[2] = [
|
||||
'route_name' => 'user.login',
|
||||
'route_parameters' => [],
|
||||
'options' => [
|
||||
'query' => [],
|
||||
],
|
||||
'url' => NULL,
|
||||
];
|
||||
|
||||
// Invalid link path.
|
||||
$values[3] = 'users';
|
||||
$expected[3] = [];
|
||||
|
||||
// Valid link path with parameter.
|
||||
$values[4] = [
|
||||
'system/timezone/nzdt',
|
||||
[
|
||||
'attributes' => [
|
||||
'title' => 'Show NZDT',
|
||||
],
|
||||
],
|
||||
];
|
||||
$expected[4] = [
|
||||
'route_name' => 'system.timezone',
|
||||
'route_parameters' => [
|
||||
'abbreviation' => 'nzdt',
|
||||
'offset' => -1,
|
||||
'is_daylight_saving_time' => NULL,
|
||||
],
|
||||
'options' => [
|
||||
'query' => [],
|
||||
'attributes' => [
|
||||
'title' => 'Show NZDT',
|
||||
],
|
||||
],
|
||||
'url' => NULL,
|
||||
];
|
||||
|
||||
// External link tests.
|
||||
// Valid external link path and options.
|
||||
$values[5] = [
|
||||
'https://www.drupal.org',
|
||||
[
|
||||
'attributes' => [
|
||||
'title' => 'Drupal',
|
||||
],
|
||||
],
|
||||
];
|
||||
$expected[5] = [
|
||||
'route_name' => NULL,
|
||||
'route_parameters' => [],
|
||||
'options' => [
|
||||
'attributes' => [
|
||||
'title' => 'Drupal',
|
||||
],
|
||||
],
|
||||
'url' => 'https://www.drupal.org',
|
||||
];
|
||||
|
||||
// Valid external link path and options.
|
||||
$values[6] = [
|
||||
'https://www.drupal.org/user/1/edit?pass-reset-token=QgtDKcRV4e4fjg6v2HTa6CbWx-XzMZ5XBZTufinqsM73qIhscIuU_BjZ6J2tv4dQI6N50ZJOag',
|
||||
[
|
||||
'attributes' => [
|
||||
'title' => 'Drupal password reset',
|
||||
],
|
||||
],
|
||||
];
|
||||
$expected[6] = [
|
||||
'route_name' => NULL,
|
||||
'route_parameters' => [],
|
||||
'options' => [
|
||||
'attributes' => [
|
||||
'title' => 'Drupal password reset',
|
||||
],
|
||||
],
|
||||
'url' => 'https://www.drupal.org/user/1/edit?pass-reset-token=QgtDKcRV4e4fjg6v2HTa6CbWx-XzMZ5XBZTufinqsM73qIhscIuU_BjZ6J2tv4dQI6N50ZJOag',
|
||||
];
|
||||
|
||||
return [
|
||||
// Test data for internal paths.
|
||||
// Test with valid link path and options.
|
||||
[$values[0], $expected[0]],
|
||||
// Test with valid link path and empty options.
|
||||
[$values[1], $expected[1]],
|
||||
// Test with valid link path and no options.
|
||||
[$values[2], $expected[2]],
|
||||
// Test with Invalid link path.
|
||||
[$values[3], $expected[3]],
|
||||
// Test with Valid link path with query options and parameters.
|
||||
[$values[4], $expected[4]],
|
||||
|
||||
// Test data for external paths.
|
||||
// Test with external link path and options.
|
||||
[$values[5], $expected[5]],
|
||||
// Test with valid link path and query options.
|
||||
[$values[6], $expected[6]],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests Route plugin based on providerTestRoute() values.
|
||||
*
|
||||
* @param mixed $value
|
||||
* Input value for the Route process plugin.
|
||||
* @param array $expected
|
||||
* The expected results from the Route transform process.
|
||||
*
|
||||
* @dataProvider providerTestRouteWithParamQuery
|
||||
*/
|
||||
public function testRouteWithParamQuery($value, $expected) {
|
||||
$this->installSchema('system', ['sequences']);
|
||||
$this->installEntitySchema('user');
|
||||
$this->installConfig(['user']);
|
||||
|
||||
// Create a user so that user/1/edit is a valid path.
|
||||
$adminUser = User::create([
|
||||
'name' => $this->randomMachineName(),
|
||||
]);
|
||||
$adminUser->save();
|
||||
|
||||
$actual = $this->doTransform($value);
|
||||
$this->assertSame($expected, $actual);
|
||||
}
|
||||
|
||||
/**
|
||||
* Data provider for testRouteWithParamQuery().
|
||||
*
|
||||
* @return array
|
||||
* An array of arrays, where the first element is the input to the Route
|
||||
* process plugin, and the second is the expected results.
|
||||
*/
|
||||
public function providerTestRouteWithParamQuery() {
|
||||
$values = [];
|
||||
$expected = [];
|
||||
// Valid link path with query options and parameters.
|
||||
$values[0] = [
|
||||
'user/1/edit',
|
||||
[
|
||||
'attributes' => [
|
||||
'title' => 'Edit admin',
|
||||
],
|
||||
'query' => [
|
||||
'destination' => '/admin/people',
|
||||
],
|
||||
],
|
||||
];
|
||||
$expected[0] = [
|
||||
'route_name' => 'entity.user.edit_form',
|
||||
'route_parameters' => [
|
||||
'user' => '1',
|
||||
],
|
||||
'options' => [
|
||||
'attributes' => [
|
||||
'title' => 'Edit admin',
|
||||
],
|
||||
'query' => [
|
||||
'destination' => '/admin/people',
|
||||
],
|
||||
],
|
||||
'url' => NULL,
|
||||
];
|
||||
|
||||
return [
|
||||
// Test with valid link path with parameters and options.
|
||||
[$values[0], $expected[0]],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Transforms link path data to a route.
|
||||
*
|
||||
* @param array|string $value
|
||||
* Source link path information.
|
||||
*
|
||||
* @return array $actual
|
||||
* The route information based on the source link_path.
|
||||
*/
|
||||
protected function doTransform($value) {
|
||||
// Rebuild the routes.
|
||||
$this->container->get('router.builder')->rebuild();
|
||||
$pathValidator = $this->container->get('path.validator');
|
||||
$row = new Row();
|
||||
$migration = $this->prophesize(MigrationInterface::class)->reveal();
|
||||
$executable = $this->prophesize(MigrateExecutableInterface::class)->reveal();
|
||||
|
||||
$plugin = new Route([], 'route', [], $migration, $pathValidator);
|
||||
$actual = $plugin->transform($value, $executable, $row, 'destinationproperty');
|
||||
return $actual;
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue