forked from a64f7bb4-7358-4778-9fbe-3b882c34cc1d/v1
263 lines
8.8 KiB
PHP
263 lines
8.8 KiB
PHP
<?php
|
|
|
|
namespace Drupal\Tests;
|
|
|
|
use Drupal\Component\FileCache\FileCacheFactory;
|
|
use Drupal\Component\Utility\NestedArray;
|
|
use Drupal\Component\Utility\Random;
|
|
use Drupal\Core\Cache\CacheTagsInvalidatorInterface;
|
|
use Drupal\Core\DependencyInjection\ContainerBuilder;
|
|
use Drupal\Core\StringTranslation\TranslatableMarkup;
|
|
use Drupal\Core\StringTranslation\PluralTranslatableMarkup;
|
|
use Drupal\Tests\Traits\PhpUnitWarnings;
|
|
use Drupal\TestTools\TestVarDumper;
|
|
use PHPUnit\Framework\TestCase;
|
|
use Prophecy\PhpUnit\ProphecyTrait;
|
|
use Symfony\Component\VarDumper\VarDumper;
|
|
use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait;
|
|
|
|
/**
|
|
* Provides a base class and helpers for Drupal unit tests.
|
|
*
|
|
* Using Symfony's dump() function() in Unit tests will produce output on the
|
|
* command line.
|
|
*
|
|
* @ingroup testing
|
|
*/
|
|
abstract class UnitTestCase extends TestCase {
|
|
|
|
use PhpUnitWarnings;
|
|
use PhpUnitCompatibilityTrait;
|
|
use ProphecyTrait;
|
|
use ExpectDeprecationTrait;
|
|
|
|
/**
|
|
* The random generator.
|
|
*
|
|
* @var \Drupal\Component\Utility\Random
|
|
*/
|
|
protected $randomGenerator;
|
|
|
|
/**
|
|
* The app root.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $root;
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public static function setUpBeforeClass(): void {
|
|
parent::setUpBeforeClass();
|
|
VarDumper::setHandler(TestVarDumper::class . '::cliHandler');
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
protected function setUp(): void {
|
|
parent::setUp();
|
|
// Ensure that an instantiated container in the global state of \Drupal from
|
|
// a previous test does not leak into this test.
|
|
\Drupal::unsetContainer();
|
|
|
|
// Ensure that the NullFileCache implementation is used for the FileCache as
|
|
// unit tests should not be relying on caches implicitly.
|
|
FileCacheFactory::setConfiguration([FileCacheFactory::DISABLE_CACHE => TRUE]);
|
|
// Ensure that FileCacheFactory has a prefix.
|
|
FileCacheFactory::setPrefix('prefix');
|
|
|
|
$this->root = dirname(substr(__DIR__, 0, -strlen(__NAMESPACE__)), 2);
|
|
}
|
|
|
|
/**
|
|
* Generates a unique random string containing letters and numbers.
|
|
*
|
|
* @param int $length
|
|
* Length of random string to generate.
|
|
*
|
|
* @return string
|
|
* Randomly generated unique string.
|
|
*
|
|
* @see \Drupal\Component\Utility\Random::name()
|
|
*/
|
|
public function randomMachineName($length = 8) {
|
|
return $this->getRandomGenerator()->name($length, TRUE);
|
|
}
|
|
|
|
/**
|
|
* Gets the random generator for the utility methods.
|
|
*
|
|
* @return \Drupal\Component\Utility\Random
|
|
* The random generator
|
|
*/
|
|
protected function getRandomGenerator() {
|
|
if (!is_object($this->randomGenerator)) {
|
|
$this->randomGenerator = new Random();
|
|
}
|
|
return $this->randomGenerator;
|
|
}
|
|
|
|
/**
|
|
* Returns a stub config factory that behaves according to the passed array.
|
|
*
|
|
* Use this to generate a config factory that will return the desired values
|
|
* for the given config names.
|
|
*
|
|
* @param array $configs
|
|
* An associative array of configuration settings whose keys are
|
|
* configuration object names and whose values are key => value arrays for
|
|
* the configuration object in question. Defaults to an empty array.
|
|
*
|
|
* @return \PHPUnit\Framework\MockObject\MockBuilder
|
|
* A MockBuilder object for the ConfigFactory with the desired return
|
|
* values.
|
|
*/
|
|
public function getConfigFactoryStub(array $configs = []) {
|
|
$config_get_map = [];
|
|
$config_editable_map = [];
|
|
// Construct the desired configuration object stubs, each with its own
|
|
// desired return map.
|
|
foreach ($configs as $config_name => $config_values) {
|
|
// Define a closure over the $config_values, which will be used as a
|
|
// returnCallback below. This function will mimic
|
|
// \Drupal\Core\Config\Config::get and allow using dotted keys.
|
|
$config_get = function ($key = '') use ($config_values) {
|
|
// Allow to pass in no argument.
|
|
if (empty($key)) {
|
|
return $config_values;
|
|
}
|
|
// See if we have the key as is.
|
|
if (isset($config_values[$key])) {
|
|
return $config_values[$key];
|
|
}
|
|
$parts = explode('.', $key);
|
|
$value = NestedArray::getValue($config_values, $parts, $key_exists);
|
|
return $key_exists ? $value : NULL;
|
|
};
|
|
|
|
$immutable_config_object = $this->getMockBuilder('Drupal\Core\Config\ImmutableConfig')
|
|
->disableOriginalConstructor()
|
|
->getMock();
|
|
$immutable_config_object->expects($this->any())
|
|
->method('get')
|
|
->willReturnCallback($config_get);
|
|
$config_get_map[] = [$config_name, $immutable_config_object];
|
|
|
|
$mutable_config_object = $this->getMockBuilder('Drupal\Core\Config\Config')
|
|
->disableOriginalConstructor()
|
|
->getMock();
|
|
$mutable_config_object->expects($this->any())
|
|
->method('get')
|
|
->willReturnCallback($config_get);
|
|
$config_editable_map[] = [$config_name, $mutable_config_object];
|
|
}
|
|
// Construct a config factory with the array of configuration object stubs
|
|
// as its return map.
|
|
$config_factory = $this->createMock('Drupal\Core\Config\ConfigFactoryInterface');
|
|
$config_factory->expects($this->any())
|
|
->method('get')
|
|
->willReturnMap($config_get_map);
|
|
$config_factory->expects($this->any())
|
|
->method('getEditable')
|
|
->willReturnMap($config_editable_map);
|
|
return $config_factory;
|
|
}
|
|
|
|
/**
|
|
* Returns a stub config storage that returns the supplied configuration.
|
|
*
|
|
* @param array $configs
|
|
* An associative array of configuration settings whose keys are
|
|
* configuration object names and whose values are key => value arrays
|
|
* for the configuration object in question.
|
|
*
|
|
* @return \Drupal\Core\Config\StorageInterface
|
|
* A mocked config storage.
|
|
*/
|
|
public function getConfigStorageStub(array $configs) {
|
|
$config_storage = $this->createMock('Drupal\Core\Config\NullStorage');
|
|
$config_storage->expects($this->any())
|
|
->method('listAll')
|
|
->willReturn(array_keys($configs));
|
|
|
|
foreach ($configs as $name => $config) {
|
|
$config_storage->expects($this->any())
|
|
->method('read')
|
|
->with($this->equalTo($name))
|
|
->willReturn($config);
|
|
}
|
|
return $config_storage;
|
|
}
|
|
|
|
/**
|
|
* Returns a stub translation manager that just returns the passed string.
|
|
*
|
|
* @return \PHPUnit\Framework\MockObject\MockObject|\Drupal\Core\StringTranslation\TranslationInterface
|
|
* A mock translation object.
|
|
*/
|
|
public function getStringTranslationStub() {
|
|
$translation = $this->createMock('Drupal\Core\StringTranslation\TranslationInterface');
|
|
$translation->expects($this->any())
|
|
->method('translate')
|
|
->willReturnCallback(function ($string, array $args = [], array $options = []) use ($translation) {
|
|
return new TranslatableMarkup($string, $args, $options, $translation);
|
|
});
|
|
$translation->expects($this->any())
|
|
->method('translateString')
|
|
->willReturnCallback(function (TranslatableMarkup $wrapper) {
|
|
return $wrapper->getUntranslatedString();
|
|
});
|
|
$translation->expects($this->any())
|
|
->method('formatPlural')
|
|
->willReturnCallback(function ($count, $singular, $plural, array $args = [], array $options = []) use ($translation) {
|
|
$wrapper = new PluralTranslatableMarkup($count, $singular, $plural, $args, $options, $translation);
|
|
return $wrapper;
|
|
});
|
|
return $translation;
|
|
}
|
|
|
|
/**
|
|
* Sets up a container with a cache tags invalidator.
|
|
*
|
|
* @param \Drupal\Core\Cache\CacheTagsInvalidatorInterface $cache_tags_validator
|
|
* The cache tags invalidator.
|
|
*
|
|
* @return \Symfony\Component\DependencyInjection\ContainerInterface|\PHPUnit\Framework\MockObject\MockObject
|
|
* The container with the cache tags invalidator service.
|
|
*/
|
|
protected function getContainerWithCacheTagsInvalidator(CacheTagsInvalidatorInterface $cache_tags_validator) {
|
|
$container = $this->createMock('Symfony\Component\DependencyInjection\ContainerInterface');
|
|
$container->expects($this->any())
|
|
->method('get')
|
|
->with('cache_tags.invalidator')
|
|
->willReturn($cache_tags_validator);
|
|
|
|
\Drupal::setContainer($container);
|
|
return $container;
|
|
}
|
|
|
|
/**
|
|
* Returns a stub class resolver.
|
|
*
|
|
* @return \Drupal\Core\DependencyInjection\ClassResolverInterface|\PHPUnit\Framework\MockObject\MockObject
|
|
* The class resolver stub.
|
|
*/
|
|
protected function getClassResolverStub() {
|
|
$class_resolver = $this->createMock('Drupal\Core\DependencyInjection\ClassResolverInterface');
|
|
$class_resolver->expects($this->any())
|
|
->method('getInstanceFromDefinition')
|
|
->willReturnCallback(function ($class) {
|
|
if (is_subclass_of($class, 'Drupal\Core\DependencyInjection\ContainerInjectionInterface')) {
|
|
return $class::create(new ContainerBuilder());
|
|
}
|
|
else {
|
|
return new $class();
|
|
}
|
|
});
|
|
return $class_resolver;
|
|
}
|
|
|
|
}
|