4315f81b2d1efa8469d502a95d7202cf79dcfe64
[yaffs-website] / web / core / modules / config_translation / tests / src / Unit / ConfigMapperManagerTest.php
1 <?php
2
3 namespace Drupal\Tests\config_translation\Unit;
4
5 use Drupal\config_translation\ConfigMapperManager;
6 use Drupal\Core\Language\Language;
7 use Drupal\Core\Language\LanguageInterface;
8 use Drupal\Core\TypedData\TypedDataInterface;
9 use Drupal\Tests\UnitTestCase;
10 use Drupal\Core\TypedData\DataDefinition;
11
12 /**
13  * Tests the functionality provided by configuration translation mapper manager.
14  *
15  * @group config_translation
16  */
17 class ConfigMapperManagerTest extends UnitTestCase {
18
19   /**
20    * The configuration mapper manager to test.
21    *
22    * @var \Drupal\config_translation\ConfigMapperManager
23    */
24   protected $configMapperManager;
25
26   /**
27    * The typed configuration manager used for testing.
28    *
29    * @var \Drupal\Core\Config\TypedConfigManagerInterface|\PHPUnit_Framework_MockObject_MockObject
30    */
31   protected $typedConfigManager;
32
33   protected function setUp() {
34     $language = new Language(['id' => 'en']);
35     $language_manager = $this->getMock('Drupal\Core\Language\LanguageManagerInterface');
36     $language_manager->expects($this->once())
37       ->method('getCurrentLanguage')
38       ->with(LanguageInterface::TYPE_INTERFACE)
39       ->will($this->returnValue($language));
40
41     $this->typedConfigManager = $this->getMockBuilder('Drupal\Core\Config\TypedConfigManagerInterface')
42       ->getMock();
43
44     $module_handler = $this->getMock('Drupal\Core\Extension\ModuleHandlerInterface');
45     $theme_handler = $this->getMock('Drupal\Core\Extension\ThemeHandlerInterface');
46
47     $this->configMapperManager = new ConfigMapperManager(
48       $this->getMock('Drupal\Core\Cache\CacheBackendInterface'),
49       $language_manager,
50       $module_handler,
51       $this->typedConfigManager,
52       $theme_handler
53     );
54   }
55
56   /**
57    * Tests ConfigMapperManager::hasTranslatable().
58    *
59    * @param \Drupal\Core\TypedData\TypedDataInterface $element
60    *   The schema element to test.
61    * @param bool $expected
62    *   The expected return value of ConfigMapperManager::hasTranslatable().
63    *
64    * @dataProvider providerTestHasTranslatable
65    */
66   public function testHasTranslatable(TypedDataInterface $element, $expected) {
67     $this->typedConfigManager
68       ->expects($this->once())
69       ->method('get')
70       ->with('test')
71       ->will($this->returnValue($element));
72
73     $result = $this->configMapperManager->hasTranslatable('test');
74     $this->assertSame($expected, $result);
75   }
76
77   /**
78    * Provides data for ConfigMapperManager::testHasTranslatable()
79    *
80    * @return array
81    *   An array of arrays, where each inner array contains the schema element
82    *   to test as the first key and the expected result of
83    *   ConfigMapperManager::hasTranslatable() as the second key.
84    */
85   public function providerTestHasTranslatable() {
86     return [
87       [$this->getElement([]), FALSE],
88       [$this->getElement(['aaa' => 'bbb']), FALSE],
89       [$this->getElement(['translatable' => FALSE]), FALSE],
90       [$this->getElement(['translatable' => TRUE]), TRUE],
91       [$this->getNestedElement([$this->getElement([])]), FALSE],
92       [$this->getNestedElement([$this->getElement(['translatable' => TRUE])]), TRUE],
93       [
94         $this->getNestedElement([
95           $this->getElement(['aaa' => 'bbb']),
96           $this->getElement(['ccc' => 'ddd']),
97           $this->getElement(['eee' => 'fff']),
98         ]),
99         FALSE,
100       ],
101       [
102         $this->getNestedElement([
103           $this->getElement(['aaa' => 'bbb']),
104           $this->getElement(['ccc' => 'ddd']),
105           $this->getElement(['translatable' => TRUE]),
106         ]),
107         TRUE,
108       ],
109       [
110         $this->getNestedElement([
111           $this->getElement(['aaa' => 'bbb']),
112           $this->getNestedElement([
113             $this->getElement(['ccc' => 'ddd']),
114             $this->getElement(['eee' => 'fff']),
115           ]),
116           $this->getNestedElement([
117             $this->getElement(['ggg' => 'hhh']),
118             $this->getElement(['iii' => 'jjj']),
119           ]),
120         ]),
121         FALSE,
122       ],
123       [
124         $this->getNestedElement([
125           $this->getElement(['aaa' => 'bbb']),
126           $this->getNestedElement([
127             $this->getElement(['ccc' => 'ddd']),
128             $this->getElement(['eee' => 'fff']),
129           ]),
130           $this->getNestedElement([
131             $this->getElement(['ggg' => 'hhh']),
132             $this->getElement(['translatable' => TRUE]),
133           ]),
134         ]),
135         TRUE,
136       ],
137     ];
138   }
139
140   /**
141    * Returns a mocked schema element.
142    *
143    * @param array $definition
144    *   The definition of the schema element.
145    *
146    * @return \Drupal\Core\Config\Schema\Element
147    *   The mocked schema element.
148    */
149   protected function getElement(array $definition) {
150     $data_definition = new DataDefinition($definition);
151     $element = $this->getMock('Drupal\Core\TypedData\TypedDataInterface');
152     $element->expects($this->any())
153       ->method('getDataDefinition')
154       ->will($this->returnValue($data_definition));
155     return $element;
156   }
157
158   /**
159    * Returns a mocked nested schema element.
160    *
161    * @param array $elements
162    *   An array of simple schema elements.
163    *
164    * @return \Drupal\Core\Config\Schema\Mapping
165    *   A nested schema element, containing the passed-in elements.
166    */
167   protected function getNestedElement(array $elements) {
168     // ConfigMapperManager::findTranslatable() checks for
169     // \Drupal\Core\TypedData\TraversableTypedDataInterface, but mocking that
170     // directly does not work, because we need to implement \IteratorAggregate
171     // in order for getIterator() to be called. Therefore we need to mock
172     // \Drupal\Core\Config\Schema\ArrayElement, but that is abstract, so we
173     // need to mock one of the subclasses of it.
174     $nested_element = $this->getMockBuilder('Drupal\Core\Config\Schema\Mapping')
175       ->disableOriginalConstructor()
176       ->getMock();
177     $nested_element->expects($this->once())
178       ->method('getIterator')
179       ->will($this->returnValue(new \ArrayIterator($elements)));
180     return $nested_element;
181   }
182
183 }