Mercurial > hg > isophonics-drupal-site
comparison core/tests/Drupal/Tests/UnitTestCase.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children | 7a779792577d |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4c8ae668cc8c |
---|---|
1 <?php | |
2 | |
3 namespace Drupal\Tests; | |
4 | |
5 use Drupal\Component\FileCache\FileCacheFactory; | |
6 use Drupal\Component\Utility\Random; | |
7 use Drupal\Core\Cache\CacheTagsInvalidatorInterface; | |
8 use Drupal\Core\DependencyInjection\ContainerBuilder; | |
9 use Drupal\Core\StringTranslation\TranslatableMarkup; | |
10 use Drupal\Core\StringTranslation\PluralTranslatableMarkup; | |
11 use PHPUnit\Framework\TestCase; | |
12 | |
13 /** | |
14 * Provides a base class and helpers for Drupal unit tests. | |
15 * | |
16 * @ingroup testing | |
17 */ | |
18 abstract class UnitTestCase extends TestCase { | |
19 | |
20 /** | |
21 * The random generator. | |
22 * | |
23 * @var \Drupal\Component\Utility\Random | |
24 */ | |
25 protected $randomGenerator; | |
26 | |
27 /** | |
28 * The app root. | |
29 * | |
30 * @var string | |
31 */ | |
32 protected $root; | |
33 | |
34 /** | |
35 * {@inheritdoc} | |
36 */ | |
37 protected function setUp() { | |
38 parent::setUp(); | |
39 // Ensure that an instantiated container in the global state of \Drupal from | |
40 // a previous test does not leak into this test. | |
41 \Drupal::unsetContainer(); | |
42 | |
43 // Ensure that the NullFileCache implementation is used for the FileCache as | |
44 // unit tests should not be relying on caches implicitly. | |
45 FileCacheFactory::setConfiguration([FileCacheFactory::DISABLE_CACHE => TRUE]); | |
46 // Ensure that FileCacheFactory has a prefix. | |
47 FileCacheFactory::setPrefix('prefix'); | |
48 | |
49 $this->root = dirname(dirname(substr(__DIR__, 0, -strlen(__NAMESPACE__)))); | |
50 } | |
51 | |
52 /** | |
53 * Generates a unique random string containing letters and numbers. | |
54 * | |
55 * @param int $length | |
56 * Length of random string to generate. | |
57 * | |
58 * @return string | |
59 * Randomly generated unique string. | |
60 * | |
61 * @see \Drupal\Component\Utility\Random::name() | |
62 */ | |
63 public function randomMachineName($length = 8) { | |
64 return $this->getRandomGenerator()->name($length, TRUE); | |
65 } | |
66 | |
67 /** | |
68 * Gets the random generator for the utility methods. | |
69 * | |
70 * @return \Drupal\Component\Utility\Random | |
71 * The random generator | |
72 */ | |
73 protected function getRandomGenerator() { | |
74 if (!is_object($this->randomGenerator)) { | |
75 $this->randomGenerator = new Random(); | |
76 } | |
77 return $this->randomGenerator; | |
78 } | |
79 | |
80 /** | |
81 * Asserts if two arrays are equal by sorting them first. | |
82 * | |
83 * @param array $expected | |
84 * @param array $actual | |
85 * @param string $message | |
86 */ | |
87 protected function assertArrayEquals(array $expected, array $actual, $message = NULL) { | |
88 ksort($expected); | |
89 ksort($actual); | |
90 $this->assertEquals($expected, $actual, $message); | |
91 } | |
92 | |
93 /** | |
94 * Returns a stub config factory that behaves according to the passed in array. | |
95 * | |
96 * Use this to generate a config factory that will return the desired values | |
97 * for the given config names. | |
98 * | |
99 * @param array $configs | |
100 * An associative array of configuration settings whose keys are configuration | |
101 * object names and whose values are key => value arrays for the configuration | |
102 * object in question. Defaults to an empty array. | |
103 * | |
104 * @return \PHPUnit_Framework_MockObject_MockBuilder | |
105 * A MockBuilder object for the ConfigFactory with the desired return values. | |
106 */ | |
107 public function getConfigFactoryStub(array $configs = []) { | |
108 $config_get_map = []; | |
109 $config_editable_map = []; | |
110 // Construct the desired configuration object stubs, each with its own | |
111 // desired return map. | |
112 foreach ($configs as $config_name => $config_values) { | |
113 $map = []; | |
114 foreach ($config_values as $key => $value) { | |
115 $map[] = [$key, $value]; | |
116 } | |
117 // Also allow to pass in no argument. | |
118 $map[] = ['', $config_values]; | |
119 | |
120 $immutable_config_object = $this->getMockBuilder('Drupal\Core\Config\ImmutableConfig') | |
121 ->disableOriginalConstructor() | |
122 ->getMock(); | |
123 $immutable_config_object->expects($this->any()) | |
124 ->method('get') | |
125 ->will($this->returnValueMap($map)); | |
126 $config_get_map[] = [$config_name, $immutable_config_object]; | |
127 | |
128 $mutable_config_object = $this->getMockBuilder('Drupal\Core\Config\Config') | |
129 ->disableOriginalConstructor() | |
130 ->getMock(); | |
131 $mutable_config_object->expects($this->any()) | |
132 ->method('get') | |
133 ->will($this->returnValueMap($map)); | |
134 $config_editable_map[] = [$config_name, $mutable_config_object]; | |
135 } | |
136 // Construct a config factory with the array of configuration object stubs | |
137 // as its return map. | |
138 $config_factory = $this->getMock('Drupal\Core\Config\ConfigFactoryInterface'); | |
139 $config_factory->expects($this->any()) | |
140 ->method('get') | |
141 ->will($this->returnValueMap($config_get_map)); | |
142 $config_factory->expects($this->any()) | |
143 ->method('getEditable') | |
144 ->will($this->returnValueMap($config_editable_map)); | |
145 return $config_factory; | |
146 } | |
147 | |
148 /** | |
149 * Returns a stub config storage that returns the supplied configuration. | |
150 * | |
151 * @param array $configs | |
152 * An associative array of configuration settings whose keys are | |
153 * configuration object names and whose values are key => value arrays | |
154 * for the configuration object in question. | |
155 * | |
156 * @return \Drupal\Core\Config\StorageInterface | |
157 * A mocked config storage. | |
158 */ | |
159 public function getConfigStorageStub(array $configs) { | |
160 $config_storage = $this->getMock('Drupal\Core\Config\NullStorage'); | |
161 $config_storage->expects($this->any()) | |
162 ->method('listAll') | |
163 ->will($this->returnValue(array_keys($configs))); | |
164 | |
165 foreach ($configs as $name => $config) { | |
166 $config_storage->expects($this->any()) | |
167 ->method('read') | |
168 ->with($this->equalTo($name)) | |
169 ->will($this->returnValue($config)); | |
170 } | |
171 return $config_storage; | |
172 } | |
173 | |
174 /** | |
175 * Mocks a block with a block plugin. | |
176 * | |
177 * @param string $machine_name | |
178 * The machine name of the block plugin. | |
179 * | |
180 * @return \Drupal\block\BlockInterface|\PHPUnit_Framework_MockObject_MockObject | |
181 * The mocked block. | |
182 */ | |
183 protected function getBlockMockWithMachineName($machine_name) { | |
184 $plugin = $this->getMockBuilder('Drupal\Core\Block\BlockBase') | |
185 ->disableOriginalConstructor() | |
186 ->getMock(); | |
187 $plugin->expects($this->any()) | |
188 ->method('getMachineNameSuggestion') | |
189 ->will($this->returnValue($machine_name)); | |
190 | |
191 $block = $this->getMockBuilder('Drupal\block\Entity\Block') | |
192 ->disableOriginalConstructor() | |
193 ->getMock(); | |
194 $block->expects($this->any()) | |
195 ->method('getPlugin') | |
196 ->will($this->returnValue($plugin)); | |
197 return $block; | |
198 } | |
199 | |
200 /** | |
201 * Returns a stub translation manager that just returns the passed string. | |
202 * | |
203 * @return \PHPUnit_Framework_MockObject_MockObject|\Drupal\Core\StringTranslation\TranslationInterface | |
204 * A mock translation object. | |
205 */ | |
206 public function getStringTranslationStub() { | |
207 $translation = $this->getMock('Drupal\Core\StringTranslation\TranslationInterface'); | |
208 $translation->expects($this->any()) | |
209 ->method('translate') | |
210 ->willReturnCallback(function ($string, array $args = [], array $options = []) use ($translation) { | |
211 return new TranslatableMarkup($string, $args, $options, $translation); | |
212 }); | |
213 $translation->expects($this->any()) | |
214 ->method('translateString') | |
215 ->willReturnCallback(function (TranslatableMarkup $wrapper) { | |
216 return $wrapper->getUntranslatedString(); | |
217 }); | |
218 $translation->expects($this->any()) | |
219 ->method('formatPlural') | |
220 ->willReturnCallback(function ($count, $singular, $plural, array $args = [], array $options = []) use ($translation) { | |
221 $wrapper = new PluralTranslatableMarkup($count, $singular, $plural, $args, $options, $translation); | |
222 return $wrapper; | |
223 }); | |
224 return $translation; | |
225 } | |
226 | |
227 /** | |
228 * Sets up a container with a cache tags invalidator. | |
229 * | |
230 * @param \Drupal\Core\Cache\CacheTagsInvalidatorInterface $cache_tags_validator | |
231 * The cache tags invalidator. | |
232 * | |
233 * @return \Symfony\Component\DependencyInjection\ContainerInterface|\PHPUnit_Framework_MockObject_MockObject | |
234 * The container with the cache tags invalidator service. | |
235 */ | |
236 protected function getContainerWithCacheTagsInvalidator(CacheTagsInvalidatorInterface $cache_tags_validator) { | |
237 $container = $this->getMock('Symfony\Component\DependencyInjection\ContainerInterface'); | |
238 $container->expects($this->any()) | |
239 ->method('get') | |
240 ->with('cache_tags.invalidator') | |
241 ->will($this->returnValue($cache_tags_validator)); | |
242 | |
243 \Drupal::setContainer($container); | |
244 return $container; | |
245 } | |
246 | |
247 /** | |
248 * Returns a stub class resolver. | |
249 * | |
250 * @return \Drupal\Core\DependencyInjection\ClassResolverInterface|\PHPUnit_Framework_MockObject_MockObject | |
251 * The class resolver stub. | |
252 */ | |
253 protected function getClassResolverStub() { | |
254 $class_resolver = $this->getMock('Drupal\Core\DependencyInjection\ClassResolverInterface'); | |
255 $class_resolver->expects($this->any()) | |
256 ->method('getInstanceFromDefinition') | |
257 ->will($this->returnCallback(function ($class) { | |
258 if (is_subclass_of($class, 'Drupal\Core\DependencyInjection\ContainerInjectionInterface')) { | |
259 return $class::create(new ContainerBuilder()); | |
260 } | |
261 else { | |
262 return new $class(); | |
263 } | |
264 })); | |
265 return $class_resolver; | |
266 } | |
267 | |
268 } |