2015-08-17 17:00:26 -07:00
< ? php
namespace Drupal\Tests ;
use Drupal\Component\FileCache\FileCacheFactory ;
use Drupal\Component\Utility\Random ;
use Drupal\Core\Cache\CacheTagsInvalidatorInterface ;
use Drupal\Core\DependencyInjection\ContainerBuilder ;
2015-10-08 11:40:12 -07:00
use Drupal\Core\StringTranslation\TranslatableMarkup ;
use Drupal\Core\StringTranslation\PluralTranslatableMarkup ;
2015-08-17 17:00:26 -07:00
/**
* Provides a base class and helpers for Drupal unit tests .
*
* @ ingroup testing
*/
abstract class UnitTestCase extends \PHPUnit_Framework_TestCase {
/**
* The random generator .
*
* @ var \Drupal\Component\Utility\Random
*/
protected $randomGenerator ;
/**
* The app root .
*
* @ var string
*/
protected $root ;
/**
* { @ inheritdoc }
*/
protected function setUp () {
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.
2016-10-06 15:16:20 -07:00
FileCacheFactory :: setConfiguration ([ FileCacheFactory :: DISABLE_CACHE => TRUE ]);
// Ensure that FileCacheFactory has a prefix.
FileCacheFactory :: setPrefix ( 'prefix' );
2015-08-17 17:00:26 -07:00
$this -> root = dirname ( dirname ( substr ( __DIR__ , 0 , - strlen ( __NAMESPACE__ ))));
}
/**
* 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 ;
}
/**
* Asserts if two arrays are equal by sorting them first .
*
* @ param array $expected
* @ param array $actual
* @ param string $message
*/
protected function assertArrayEquals ( array $expected , array $actual , $message = NULL ) {
ksort ( $expected );
ksort ( $actual );
$this -> assertEquals ( $expected , $actual , $message );
}
/**
* Returns a stub config factory that behaves according to the passed in 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 .
*/
2017-04-13 15:53:35 +01:00
public function getConfigFactoryStub ( array $configs = []) {
$config_get_map = [];
$config_editable_map = [];
2015-08-17 17:00:26 -07:00
// Construct the desired configuration object stubs, each with its own
// desired return map.
foreach ( $configs as $config_name => $config_values ) {
2017-04-13 15:53:35 +01:00
$map = [];
2015-08-17 17:00:26 -07:00
foreach ( $config_values as $key => $value ) {
2017-04-13 15:53:35 +01:00
$map [] = [ $key , $value ];
2015-08-17 17:00:26 -07:00
}
// Also allow to pass in no argument.
2017-04-13 15:53:35 +01:00
$map [] = [ '' , $config_values ];
2015-08-17 17:00:26 -07:00
$immutable_config_object = $this -> getMockBuilder ( 'Drupal\Core\Config\ImmutableConfig' )
-> disableOriginalConstructor ()
-> getMock ();
$immutable_config_object -> expects ( $this -> any ())
-> method ( 'get' )
-> will ( $this -> returnValueMap ( $map ));
2017-04-13 15:53:35 +01:00
$config_get_map [] = [ $config_name , $immutable_config_object ];
2015-08-17 17:00:26 -07:00
$mutable_config_object = $this -> getMockBuilder ( 'Drupal\Core\Config\Config' )
-> disableOriginalConstructor ()
-> getMock ();
$mutable_config_object -> expects ( $this -> any ())
-> method ( 'get' )
-> will ( $this -> returnValueMap ( $map ));
2017-04-13 15:53:35 +01:00
$config_editable_map [] = [ $config_name , $mutable_config_object ];
2015-08-17 17:00:26 -07:00
}
// Construct a config factory with the array of configuration object stubs
// as its return map.
$config_factory = $this -> getMock ( 'Drupal\Core\Config\ConfigFactoryInterface' );
$config_factory -> expects ( $this -> any ())
-> method ( 'get' )
-> will ( $this -> returnValueMap ( $config_get_map ));
$config_factory -> expects ( $this -> any ())
-> method ( 'getEditable' )
-> will ( $this -> returnValueMap ( $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 -> getMock ( 'Drupal\Core\Config\NullStorage' );
$config_storage -> expects ( $this -> any ())
-> method ( 'listAll' )
-> will ( $this -> returnValue ( array_keys ( $configs )));
foreach ( $configs as $name => $config ) {
$config_storage -> expects ( $this -> any ())
-> method ( 'read' )
-> with ( $this -> equalTo ( $name ))
-> will ( $this -> returnValue ( $config ));
}
return $config_storage ;
}
/**
* Mocks a block with a block plugin .
*
* @ param string $machine_name
* The machine name of the block plugin .
*
* @ return \Drupal\block\BlockInterface | \PHPUnit_Framework_MockObject_MockObject
* The mocked block .
*/
protected function getBlockMockWithMachineName ( $machine_name ) {
$plugin = $this -> getMockBuilder ( 'Drupal\Core\Block\BlockBase' )
-> disableOriginalConstructor ()
-> getMock ();
$plugin -> expects ( $this -> any ())
-> method ( 'getMachineNameSuggestion' )
-> will ( $this -> returnValue ( $machine_name ));
$block = $this -> getMockBuilder ( 'Drupal\block\Entity\Block' )
-> disableOriginalConstructor ()
-> getMock ();
$block -> expects ( $this -> any ())
-> method ( 'getPlugin' )
-> will ( $this -> returnValue ( $plugin ));
return $block ;
}
/**
* Returns a stub translation manager that just returns the passed string .
*
2016-09-07 13:26:21 -07:00
* @ return \PHPUnit_Framework_MockObject_MockObject | \Drupal\Core\StringTranslation\TranslationInterface
* A mock translation object .
2015-08-17 17:00:26 -07:00
*/
public function getStringTranslationStub () {
$translation = $this -> getMock ( 'Drupal\Core\StringTranslation\TranslationInterface' );
$translation -> expects ( $this -> any ())
-> method ( 'translate' )
2017-04-13 15:53:35 +01:00
-> willReturnCallback ( function ( $string , array $args = [], array $options = []) use ( $translation ) {
2015-10-08 11:40:12 -07:00
return new TranslatableMarkup ( $string , $args , $options , $translation );
});
$translation -> expects ( $this -> any ())
-> method ( 'translateString' )
-> willReturnCallback ( function ( TranslatableMarkup $wrapper ) {
return $wrapper -> getUntranslatedString ();
});
2015-08-17 17:00:26 -07:00
$translation -> expects ( $this -> any ())
-> method ( 'formatPlural' )
2015-10-08 11:40:12 -07:00
-> willReturnCallback ( function ( $count , $singular , $plural , array $args = [], array $options = []) use ( $translation ) {
$wrapper = new PluralTranslatableMarkup ( $count , $singular , $plural , $args , $options , $translation );
return $wrapper ;
2015-08-17 17:00:26 -07:00
});
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 -> getMock ( 'Symfony\Component\DependencyInjection\ContainerInterface' );
$container -> expects ( $this -> any ())
-> method ( 'get' )
-> with ( 'cache_tags.invalidator' )
-> will ( $this -> returnValue ( $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 -> getMock ( 'Drupal\Core\DependencyInjection\ClassResolverInterface' );
$class_resolver -> expects ( $this -> any ())
-> method ( 'getInstanceFromDefinition' )
-> will ( $this -> returnCallback ( function ( $class ) {
if ( is_subclass_of ( $class , 'Drupal\Core\DependencyInjection\ContainerInjectionInterface' )) {
return $class :: create ( new ContainerBuilder ());
}
else {
return new $class ();
}
}));
return $class_resolver ;
}
}