X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;f=web%2Fcore%2Fmodules%2Fconfig_translation%2Ftests%2Fsrc%2FUnit%2FConfigNamesMapperTest.php;fp=web%2Fcore%2Fmodules%2Fconfig_translation%2Ftests%2Fsrc%2FUnit%2FConfigNamesMapperTest.php;h=e7a06794f8f8b1d597c4b1e8898b6afd1e5881c6;hb=a2bd1bf0c2c1f1a17d188f4dc0726a45494cefae;hp=0000000000000000000000000000000000000000;hpb=57c063afa3f66b07c4bbddc2d6129a96d90f0aad;p=yaffs-website diff --git a/web/core/modules/config_translation/tests/src/Unit/ConfigNamesMapperTest.php b/web/core/modules/config_translation/tests/src/Unit/ConfigNamesMapperTest.php new file mode 100644 index 000000000..e7a06794f --- /dev/null +++ b/web/core/modules/config_translation/tests/src/Unit/ConfigNamesMapperTest.php @@ -0,0 +1,683 @@ +routeProvider = $this->getMock('Drupal\Core\Routing\RouteProviderInterface'); + + $this->pluginDefinition = [ + 'class' => '\Drupal\config_translation\ConfigNamesMapper', + 'base_route_name' => 'system.site_information_settings', + 'title' => 'System information', + 'names' => ['system.site'], + 'weight' => 42, + ]; + + $this->typedConfigManager = $this->getMock('Drupal\Core\Config\TypedConfigManagerInterface'); + + $this->localeConfigManager = $this->getMockBuilder('Drupal\locale\LocaleConfigManager') + ->disableOriginalConstructor() + ->getMock(); + + $this->configMapperManager = $this->getMock('Drupal\config_translation\ConfigMapperManagerInterface'); + + $this->urlGenerator = $this->getMock('Drupal\Core\Routing\UrlGeneratorInterface'); + $container = new ContainerBuilder(); + $container->set('url_generator', $this->urlGenerator); + \Drupal::setContainer($container); + + $this->baseRoute = new Route('/admin/config/system/site-information'); + + $this->routeProvider + ->expects($this->any()) + ->method('getRouteByName') + ->with('system.site_information_settings') + ->will($this->returnValue($this->baseRoute)); + + $this->languageManager = $this->getMock('Drupal\Core\Language\LanguageManagerInterface'); + + $this->configNamesMapper = new TestConfigNamesMapper( + 'system.site_information_settings', + $this->pluginDefinition, + $this->getConfigFactoryStub(), + $this->typedConfigManager, + $this->localeConfigManager, + $this->configMapperManager, + $this->routeProvider, + $this->getStringTranslationStub(), + $this->languageManager + ); + } + + /** + * Tests ConfigNamesMapper::getTitle(). + */ + public function testGetTitle() { + $result = $this->configNamesMapper->getTitle(); + $this->assertSame($this->pluginDefinition['title'], (string) $result); + } + + /** + * Tests ConfigNamesMapper::getBaseRouteName(). + */ + public function testGetBaseRouteName() { + $result = $this->configNamesMapper->getBaseRouteName(); + $this->assertSame($this->pluginDefinition['base_route_name'], $result); + } + + /** + * Tests ConfigNamesMapper::getBaseRouteParameters(). + */ + public function testGetBaseRouteParameters() { + $result = $this->configNamesMapper->getBaseRouteParameters(); + $this->assertSame([], $result); + } + + /** + * Tests ConfigNamesMapper::getBaseRoute(). + */ + public function testGetBaseRoute() { + $result = $this->configNamesMapper->getBaseRoute(); + $this->assertSame($this->baseRoute, $result); + } + + /** + * Tests ConfigNamesMapper::getBasePath(). + */ + public function testGetBasePath() { + $this->urlGenerator->expects($this->once()) + ->method('getPathFromRoute') + ->with('system.site_information_settings', []) + ->willReturn('/admin/config/system/site-information'); + $result = $this->configNamesMapper->getBasePath(); + $this->assertSame('/admin/config/system/site-information', $result); + } + + /** + * Tests ConfigNamesMapper::getOverviewRouteName(). + */ + public function testGetOverviewRouteName() { + $result = $this->configNamesMapper->getOverviewRouteName(); + $expected = 'config_translation.item.overview.' . $this->pluginDefinition['base_route_name']; + $this->assertSame($expected, $result); + } + + /** + * Tests ConfigNamesMapper::getOverviewRouteParameters(). + */ + public function testGetOverviewRouteParameters() { + $result = $this->configNamesMapper->getOverviewRouteParameters(); + $this->assertSame([], $result); + } + + /** + * Tests ConfigNamesMapper::getOverviewRoute(). + */ + public function testGetOverviewRoute() { + $expected = new Route('/admin/config/system/site-information/translate', + [ + '_controller' => '\Drupal\config_translation\Controller\ConfigTranslationController::itemPage', + 'plugin_id' => 'system.site_information_settings', + ], + [ + '_config_translation_overview_access' => 'TRUE', + ] + ); + $result = $this->configNamesMapper->getOverviewRoute(); + $this->assertSame(serialize($expected), serialize($result)); + } + + /** + * Tests ConfigNamesMapper::getOverviewPath(). + */ + public function testGetOverviewPath() { + $this->urlGenerator->expects($this->once()) + ->method('getPathFromRoute') + ->with('config_translation.item.overview.system.site_information_settings', []) + ->willReturn('/admin/config/system/site-information/translate'); + + $result = $this->configNamesMapper->getOverviewPath(); + $this->assertSame('/admin/config/system/site-information/translate', $result); + } + + /** + * Tests ConfigNamesMapper::getAddRouteName(). + */ + public function testGetAddRouteName() { + $result = $this->configNamesMapper->getAddRouteName(); + $expected = 'config_translation.item.add.' . $this->pluginDefinition['base_route_name']; + $this->assertSame($expected, $result); + } + + /** + * Tests ConfigNamesMapper::getAddRouteParameters(). + */ + public function testGetAddRouteParameters() { + $route_match = new RouteMatch('example', new Route('/test/{langcode}'), ['langcode' => 'xx']); + $this->configNamesMapper->populateFromRouteMatch($route_match); + + $expected = ['langcode' => 'xx']; + $result = $this->configNamesMapper->getAddRouteParameters(); + $this->assertSame($expected, $result); + } + + /** + * Tests ConfigNamesMapper::getAddRoute(). + */ + public function testGetAddRoute() { + $expected = new Route('/admin/config/system/site-information/translate/{langcode}/add', + [ + '_form' => '\Drupal\config_translation\Form\ConfigTranslationAddForm', + 'plugin_id' => 'system.site_information_settings', + ], + [ + '_config_translation_form_access' => 'TRUE', + ] + ); + $result = $this->configNamesMapper->getAddRoute(); + $this->assertSame(serialize($expected), serialize($result)); + } + + /** + * Tests ConfigNamesMapper::getEditRouteName(). + */ + public function testGetEditRouteName() { + $result = $this->configNamesMapper->getEditRouteName(); + $expected = 'config_translation.item.edit.' . $this->pluginDefinition['base_route_name']; + $this->assertSame($expected, $result); + } + + /** + * Tests ConfigNamesMapper::getEditRouteParameters(). + */ + public function testGetEditRouteParameters() { + $route_match = new RouteMatch('example', new Route('/test/{langcode}'), ['langcode' => 'xx']); + $this->configNamesMapper->populateFromRouteMatch($route_match); + + $expected = ['langcode' => 'xx']; + $result = $this->configNamesMapper->getEditRouteParameters(); + $this->assertSame($expected, $result); + } + + /** + * Tests ConfigNamesMapper::getEditRoute(). + */ + public function testGetEditRoute() { + $expected = new Route('/admin/config/system/site-information/translate/{langcode}/edit', + [ + '_form' => '\Drupal\config_translation\Form\ConfigTranslationEditForm', + 'plugin_id' => 'system.site_information_settings', + ], + [ + '_config_translation_form_access' => 'TRUE', + ] + ); + $result = $this->configNamesMapper->getEditRoute(); + $this->assertSame(serialize($expected), serialize($result)); + } + + /** + * Tests ConfigNamesMapper::getDeleteRouteName(). + */ + public function testGetDeleteRouteName() { + $result = $this->configNamesMapper->getDeleteRouteName(); + $expected = 'config_translation.item.delete.' . $this->pluginDefinition['base_route_name']; + $this->assertSame($expected, $result); + } + + /** + * Tests ConfigNamesMapper::getDeleteRouteParameters(). + */ + public function testGetDeleteRouteParameters() { + $route_match = new RouteMatch('example', new Route('/test/{langcode}'), ['langcode' => 'xx']); + $this->configNamesMapper->populateFromRouteMatch($route_match); + + $expected = ['langcode' => 'xx']; $result = $this->configNamesMapper->getDeleteRouteParameters(); + $this->assertSame($expected, $result); + } + + /** + * Tests ConfigNamesMapper::getRoute(). + */ + public function testGetDeleteRoute() { + $expected = new Route('/admin/config/system/site-information/translate/{langcode}/delete', + [ + '_form' => '\Drupal\config_translation\Form\ConfigTranslationDeleteForm', + 'plugin_id' => 'system.site_information_settings', + ], + [ + '_config_translation_form_access' => 'TRUE', + ] + ); + $result = $this->configNamesMapper->getDeleteRoute(); + $this->assertSame(serialize($expected), serialize($result)); + } + + /** + * Tests ConfigNamesMapper::getConfigNames(). + */ + public function testGetConfigNames() { + $result = $this->configNamesMapper->getConfigNames(); + $this->assertSame($this->pluginDefinition['names'], $result); + } + + /** + * Tests ConfigNamesMapper::addConfigName(). + */ + public function testAddConfigName() { + $names = $this->configNamesMapper->getConfigNames(); + $this->configNamesMapper->addConfigName('test'); + $names[] = 'test'; + $result = $this->configNamesMapper->getConfigNames(); + $this->assertSame($names, $result); + } + + /** + * Tests ConfigNamesMapper::getWeight(). + */ + public function testGetWeight() { + $result = $this->configNamesMapper->getWeight(); + $this->assertSame($this->pluginDefinition['weight'], $result); + } + + /** + * Tests ConfigNamesMapper::populateFromRouteMatch(). + */ + public function testPopulateFromRouteMatch() { + // Make sure the language code is not set initially. + $this->assertSame(NULL, $this->configNamesMapper->getInternalLangcode()); + + // Test that an empty request does not set the language code. + $route_match = new RouteMatch('example', new Route('/test/{langcode}')); + $this->configNamesMapper->populateFromRouteMatch($route_match); + $this->assertSame(NULL, $this->configNamesMapper->getInternalLangcode()); + + // Test that a request with a 'langcode' attribute sets the language code. + $route_match = new RouteMatch('example', new Route('/test/{langcode}'), ['langcode' => 'xx']); + $this->configNamesMapper->populateFromRouteMatch($route_match); + $this->assertSame('xx', $this->configNamesMapper->getInternalLangcode()); + + // Test that the language code gets unset with the wrong request. + $route_match = new RouteMatch('example', new Route('/test/{langcode}')); + $this->configNamesMapper->populateFromRouteMatch($route_match); + $this->assertSame(NULL, $this->configNamesMapper->getInternalLangcode()); + } + + /** + * Tests ConfigNamesMapper::getTypeLabel(). + */ + public function testGetTypeLabel() { + $result = $this->configNamesMapper->getTypeLabel(); + $this->assertSame($this->pluginDefinition['title'], (string) $result); + } + + /** + * Tests ConfigNamesMapper::getLangcode(). + */ + public function testGetLangcode() { + // Test that the getLangcode() falls back to 'en', if no explicit language + // code is provided. + $config_factory = $this->getConfigFactoryStub([ + 'system.site' => ['key' => 'value'], + ]); + $this->configNamesMapper->setConfigFactory($config_factory); + $result = $this->configNamesMapper->getLangcode(); + $this->assertSame('en', $result); + + // Test that getLangcode picks up the language code provided by the + // configuration. + $config_factory = $this->getConfigFactoryStub([ + 'system.site' => ['langcode' => 'xx'], + ]); + $this->configNamesMapper->setConfigFactory($config_factory); + $result = $this->configNamesMapper->getLangcode(); + $this->assertSame('xx', $result); + + // Test that getLangcode() works for multiple configuration names. + $this->configNamesMapper->addConfigName('system.maintenance'); + $config_factory = $this->getConfigFactoryStub([ + 'system.site' => ['langcode' => 'xx'], + 'system.maintenance' => ['langcode' => 'xx'], + ]); + $this->configNamesMapper->setConfigFactory($config_factory); + $result = $this->configNamesMapper->getLangcode(); + $this->assertSame('xx', $result); + + // Test that getLangcode() throws an exception when different language codes + // are given. + $config_factory = $this->getConfigFactoryStub([ + 'system.site' => ['langcode' => 'xx'], + 'system.maintenance' => ['langcode' => 'yy'], + ]); + $this->configNamesMapper->setConfigFactory($config_factory); + try { + $this->configNamesMapper->getLangcode(); + $this->fail(); + } + catch (\RuntimeException $e) { + } + } + + /** + * Tests ConfigNamesMapper::getConfigData(). + */ + public function testGetConfigData() { + $configs = [ + 'system.site' => [ + 'name' => 'Drupal', + 'slogan' => 'Come for the software, stay for the community!', + ], + 'system.maintenance' => [ + 'enabled' => FALSE, + 'message' => '@site is currently under maintenance.', + ], + 'system.rss' => [ + 'items' => [ + 'limit' => 10, + 'view_mode' => 'rss', + ], + ], + ]; + + $this->configNamesMapper->setConfigNames(array_keys($configs)); + $config_factory = $this->getConfigFactoryStub($configs); + $this->configNamesMapper->setConfigFactory($config_factory); + + $result = $this->configNamesMapper->getConfigData(); + $this->assertSame($configs, $result); + } + + /** + * Tests ConfigNamesMapper::hasSchema(). + * + * @param array $mock_return_values + * An array of values that the mocked locale configuration manager should + * return for hasConfigSchema(). + * @param bool $expected + * The expected return value of ConfigNamesMapper::hasSchema(). + * + * @dataProvider providerTestHasSchema + */ + public function testHasSchema(array $mock_return_values, $expected) { + // As the configuration names are arbitrary, simply use integers. + $config_names = range(1, count($mock_return_values)); + $this->configNamesMapper->setConfigNames($config_names); + + $map = []; + foreach ($config_names as $i => $config_name) { + $map[] = [$config_name, $mock_return_values[$i]]; + } + $this->typedConfigManager + ->expects($this->any()) + ->method('hasConfigSchema') + ->will($this->returnValueMap($map)); + + $result = $this->configNamesMapper->hasSchema(); + $this->assertSame($expected, $result); + } + + /** + * Provides data for ConfigMapperTest::testHasSchema(). + * + * @return array + * An array of arrays, where each inner array has an array of values that + * the mocked locale configuration manager should return for + * hasConfigSchema() as the first value and the expected return value of + * ConfigNamesMapper::hasSchema() as the second value. + */ + public function providerTestHasSchema() { + return [ + [[TRUE], TRUE], + [[FALSE], FALSE], + [[TRUE, TRUE, TRUE], TRUE], + [[TRUE, FALSE, TRUE], FALSE], + ]; + } + + /** + * Tests ConfigNamesMapper::hasTranslatable(). + * + * @param array $mock_return_values + * An array of values that the mocked configuration mapper manager should + * return for hasTranslatable(). + * @param bool $expected + * The expected return value of ConfigNamesMapper::hasTranslatable(). + * + * @dataProvider providerTestHasTranslatable + */ + public function testHasTranslatable(array $mock_return_values, $expected) { + // As the configuration names are arbitrary, simply use integers. + $config_names = range(1, count($mock_return_values)); + $this->configNamesMapper->setConfigNames($config_names); + + $map = []; + foreach ($config_names as $i => $config_name) { + $map[] = isset($mock_return_values[$i]) ? [$config_name, $mock_return_values[$i]] : []; + } + $this->configMapperManager + ->expects($this->any()) + ->method('hasTranslatable') + ->will($this->returnValueMap($map)); + + $result = $this->configNamesMapper->hasTranslatable(); + $this->assertSame($expected, $result); + } + + /** + * Provides data for ConfigNamesMapperTest::testHasTranslatable(). + * + * @return array + * An array of arrays, where each inner array has an array of values that + * the mocked configuration mapper manager should return for + * hasTranslatable() as the first value and the expected return value of + * ConfigNamesMapper::hasTranslatable() as the second value. + */ + public function providerTestHasTranslatable() { + return [ + [[], FALSE], + [[TRUE], TRUE], + [[FALSE], FALSE], + [[TRUE, TRUE, TRUE], TRUE], + [[FALSE, FALSE, FALSE], FALSE], + [[TRUE, FALSE, TRUE], TRUE], + ]; + } + + /** + * Tests ConfigNamesMapper::hasTranslation(). + * + * @param array $mock_return_values + * An array of values that the mocked configuration mapper manager should + * return for hasTranslation(). + * @param bool $expected + * The expected return value of ConfigNamesMapper::hasTranslation(). + * + * @dataProvider providerTestHasTranslation + */ + public function testHasTranslation(array $mock_return_values, $expected) { + $language = new Language(); + + // As the configuration names are arbitrary, simply use integers. + $config_names = range(1, count($mock_return_values)); + $this->configNamesMapper->setConfigNames($config_names); + + $map = []; + foreach ($config_names as $i => $config_name) { + $map[] = [$config_name, $language->getId(), $mock_return_values[$i]]; + } + $this->localeConfigManager + ->expects($this->any()) + ->method('hasTranslation') + ->will($this->returnValueMap($map)); + + $result = $this->configNamesMapper->hasTranslation($language); + $this->assertSame($expected, $result); + } + + /** + * Provides data for for ConfigNamesMapperTest::testHasTranslation(). + * + * @return array + * An array of arrays, where each inner array has an array of values that + * the mocked configuration mapper manager should return for + * hasTranslation() as the first value and the expected return value of + * ConfigNamesMapper::hasTranslation() as the second value. + */ + public function providerTestHasTranslation() { + return [ + [[TRUE], TRUE], + [[FALSE], FALSE], + [[TRUE, TRUE, TRUE], TRUE], + [[FALSE, FALSE, TRUE], TRUE], + [[FALSE, FALSE, FALSE], FALSE], + ]; + } + + /** + * Tests ConfigNamesMapper::getTypeName(). + */ + public function testGetTypeName() { + $result = $this->configNamesMapper->getTypeName(); + $this->assertSame('Settings', (string) $result); + } + + /** + * Tests ConfigNamesMapper::hasTranslation(). + */ + public function testGetOperations() { + $expected = [ + 'translate' => [ + 'title' => 'Translate', + 'url' => Url::fromRoute('config_translation.item.overview.system.site_information_settings'), + ], + ]; + $result = $this->configNamesMapper->getOperations(); + $this->assertEquals($expected, $result); + } + +} + +/** + * Defines a test mapper class. + */ +class TestConfigNamesMapper extends ConfigNamesMapper { + + /** + * Gets the internal language code of this mapper, if any. + * + * This method is not to be confused with + * ConfigMapperInterface::getLangcode(). + * + * @return string|null + * The language code of this mapper if it is set; NULL otherwise. + */ + public function getInternalLangcode() { + return isset($this->langcode) ? $this->langcode : NULL; + } + + /** + * Sets the list of configuration names. + * + * @param array $config_names + */ + public function setConfigNames(array $config_names) { + $this->pluginDefinition['names'] = $config_names; + } + + /** + * Sets the configuration factory. + * + * @var \Drupal\Core\Config\ConfigFactoryInterface $config_factory + * The config factory to set. + */ + public function setConfigFactory(ConfigFactoryInterface $config_factory) { + $this->configFactory = $config_factory; + } + +}