Commit 36a43036 authored by catch's avatar catch
Browse files

Issue #3174200 by mondrake, longwave, alexpott: Use PHPUnit-bridge polyfills...

Issue #3174200 by mondrake, longwave, alexpott: Use PHPUnit-bridge polyfills for forward compatibility layer
parent 7bca5f60
......@@ -292,7 +292,7 @@ public function testStyle() {
// Confirm the style directory has been removed.
$directory = 'public://styles/' . $style_name;
$this->assertDirectoryNotExists($directory);
$this->assertDirectoryDoesNotExist($directory);
$this->assertNull(ImageStyle::load($style_name), new FormattableMarkup('Image style %style successfully deleted.', ['%style' => $style->label()]));
......
......@@ -323,7 +323,7 @@ public function doImageStyleUrlAndPathTests($scheme, $clean_url = TRUE, $extra_s
// directories in the file system.
$directory = $scheme . '://styles/' . $this->style->id() . '/' . $scheme . '/' . $this->randomMachineName();
$this->drupalGet(file_create_url($directory . '/' . $this->randomString()));
$this->assertDirectoryNotExists($directory);
$this->assertDirectoryDoesNotExist($directory);
}
}
......@@ -311,7 +311,7 @@ public function testClearDiskCache() {
];
// Check that update directories does not exists.
foreach ($directories as $directory) {
$this->assertDirectoryNotExists($directory);
$this->assertDirectoryDoesNotExist($directory);
}
// Method must not fail if update directories do not exists.
......
......@@ -60,7 +60,7 @@ protected function setUpSite() {
*/
public function testError() {
$this->assertSession()->pageTextContains("An automated attempt to create the directory {$this->configDirectory}/sync failed, possibly due to a permissions problem.");
$this->assertDirectoryNotExists($this->configDirectory . '/sync');
$this->assertDirectoryDoesNotExist($this->configDirectory . '/sync');
}
}
......@@ -64,7 +64,7 @@ public function testFileCheckDirectoryHandling() {
// A directory to operate on.
$default_scheme = 'public';
$directory = $default_scheme . '://' . $this->randomMachineName() . '/' . $this->randomMachineName();
$this->assertDirectoryNotExists($directory);
$this->assertDirectoryDoesNotExist($directory);
// Non-existent directory.
/** @var \Drupal\Core\File\FileSystemInterface $file_system */
......
......@@ -31,7 +31,7 @@ public function testEmptyDirectory() {
// Delete the directory.
$this->assertTrue(\Drupal::service('file_system')->deleteRecursive($directory), 'Function reported success.');
$this->assertDirectoryNotExists($directory);
$this->assertDirectoryDoesNotExist($directory);
}
/**
......@@ -49,7 +49,7 @@ public function testDirectory() {
$this->assertTrue(\Drupal::service('file_system')->deleteRecursive($directory), 'Function reported success.');
$this->assertFileNotExists($filepathA);
$this->assertFileNotExists($filepathB);
$this->assertDirectoryNotExists($directory);
$this->assertDirectoryDoesNotExist($directory);
}
/**
......@@ -68,8 +68,8 @@ public function testSubDirectory() {
$this->assertTrue(\Drupal::service('file_system')->deleteRecursive($directory), 'Function reported success.');
$this->assertFileNotExists($filepathA);
$this->assertFileNotExists($filepathB);
$this->assertDirectoryNotExists($subdirectory);
$this->assertDirectoryNotExists($directory);
$this->assertDirectoryDoesNotExist($subdirectory);
$this->assertDirectoryDoesNotExist($directory);
}
}
......@@ -47,7 +47,7 @@ public function testDoCleanTemporaryDirectories() {
$this->assertEquals(2, $do_cleanup_ref->invoke($cleaner));
$this->assertDirectoryNotExists(vfsStream::url('cleanup_test/sites/simpletest/delete_dir'));
$this->assertDirectoryDoesNotExist(vfsStream::url('cleanup_test/sites/simpletest/delete_dir'));
$this->assertFileNotExists(vfsStream::url('cleanup_test/sites/simpletest/delete_dir/delete.me'));
$this->assertFileNotExists(vfsStream::url('cleanup_test/sites/simpletest/delete_me.too'));
}
......
......@@ -2,6 +2,8 @@
namespace Drupal\TestTools\PhpUnitCompatibility\PhpUnit8;
use Composer\Autoload\ClassLoader;
/**
* Helper class to rewrite PHPUnit's TestCase class.
*
......@@ -21,7 +23,7 @@ private function __construct() {
}
/**
* Mutates the TestCase class from PHPUnit to make it compatible with Drupal.
* Mutates PHPUnit classes to make it compatible with Drupal.
*
* @param \Composer\Autoload\ClassLoader $autoloader
* The autoloader.
......@@ -29,6 +31,44 @@ private function __construct() {
* @throws \ReflectionException
*/
public static function mutateTestBase($autoloader) {
static::alterAssert($autoloader);
static::alterTestCase($autoloader);
}
/**
* Alters the Assert class.
*
* @param \Composer\Autoload\ClassLoader $autoloader
* The autoloader.
*
* @throws \ReflectionException
*/
private static function alterAssert(ClassLoader $autoloader): void {
// If the class exists already there is nothing we can do. Hopefully this
// is happening because this has been called already. The call from
// \Drupal\Core\Test\TestDiscovery::registerTestNamespaces() necessitates
// this protection.
if (class_exists('PHPUnit\Framework\Assert', FALSE)) {
return;
}
// Mutate Assert code to make it forward compatible with different PhpUnit
// versions, by adding Symfony's PHPUnit-bridge PolyfillAssertTrait.
$alteredFile = $autoloader->findFile('PHPUnit\Framework\Assert');
$phpunit_dir = dirname($alteredFile, 3);
$alteredCode = file_get_contents($alteredFile);
$alteredCode = preg_replace('/abstract class Assert[^\{]+\{/', '$0 ' . \PHP_EOL . " use \Symfony\Bridge\PhpUnit\Legacy\PolyfillAssertTrait;" . \PHP_EOL, $alteredCode, 1);
include static::flushAlteredCodeToFile('Assert.php', $alteredCode);
}
/**
* Alters the TestCase class.
*
* @param \Composer\Autoload\ClassLoader $autoloader
* The autoloader.
*
* @throws \ReflectionException
*/
private static function alterTestCase(ClassLoader $autoloader): void {
// If the class exists already there is nothing we can do. Hopefully this
// is happening because this has been called already. The call from
// \Drupal\Core\Test\TestDiscovery::registerTestNamespaces() necessitates
......@@ -36,24 +76,46 @@ public static function mutateTestBase($autoloader) {
if (class_exists('PHPUnit\Framework\TestCase', FALSE)) {
return;
}
// Inspired by Symfony's simple-phpunit remove typehints from TestCase.
// Mutate TestCase code to make it forward compatible with different PhpUnit
// versions, by adding Symfony's PHPUnit-bridge PolyfillTestCaseTrait.
$alteredFile = $autoloader->findFile('PHPUnit\Framework\TestCase');
$phpunit_dir = dirname($alteredFile, 3);
// Mutate TestCase code to make it compatible with Drupal 8 and 9 tests.
$alteredCode = file_get_contents($alteredFile);
$alteredCode = preg_replace('/^ ((?:protected|public)(?: static)? function \w+\(\)): void/m', ' $1', $alteredCode);
$alteredCode = preg_replace('/abstract class TestCase[^\{]+\{/', '$0 ' . \PHP_EOL . " use \Symfony\Bridge\PhpUnit\Legacy\PolyfillTestCaseTrait;" . \PHP_EOL, $alteredCode, 1);
$alteredCode = str_replace("__DIR__ . '/../Util/", "'$phpunit_dir/src/Util/", $alteredCode);
$simpletest_directory = __DIR__ . '/../../../../../../sites/simpletest';
// While Drupal still allows methods in test base classes that inherit from
// TestCase with no void return typehints specified, we also alter TestCase
// to remove the typehints.
// @see https://www.drupal.org/project/drupal/issues/3182103
$alteredCode = preg_replace('/^ ((?:protected|public)(?: static)? function \w+\(\)): void/m', ' $1', $alteredCode);
include static::flushAlteredCodeToFile('TestCase.php', $alteredCode);
}
/**
* Flushes altered class code to file when necessary.
*
* @param string $file_name
* The file name.
* @param string $altered_code
* The altered code.
*
* @return string
* The full path of the file to be included.
*/
private static function flushAlteredCodeToFile(string $file_name, string $altered_code): string {
$directory = __DIR__ . '/../../../../../../sites/simpletest';
$full_path = $directory . '/' . $file_name;
// Only write when necessary.
$filename = $simpletest_directory . '/TestCase.php';
if (!file_exists($filename) || md5_file($filename) !== md5($alteredCode)) {
if (!file_exists($full_path) || md5_file($full_path) !== md5($altered_code)) {
// Create directory when necessary.
if (!file_exists($simpletest_directory)) {
mkdir($simpletest_directory, 0777, TRUE);
if (!file_exists($directory)) {
mkdir($directory, 0777, TRUE);
}
file_put_contents($filename, $alteredCode);
file_put_contents($full_path, $altered_code);
}
include $filename;
return $full_path;
}
}
......@@ -84,7 +84,7 @@ public function testDeleteAll() {
$this->assertTrue($php->deleteAll(), 'Delete all reported success');
$this->assertFalse($php->load($name));
$this->assertDirectoryNotExists($this->directory . '/test');
$this->assertDirectoryDoesNotExist($this->directory . '/test');
// Should still return TRUE if directory has already been deleted.
$this->assertTrue($php->deleteAll(), 'Delete all succeeds with nothing to delete');
......
......@@ -128,7 +128,6 @@ public static function getSkippedDeprecations() {
'assertFileNotExists() is deprecated and will be removed in PHPUnit 10. Refactor your code to use assertFileDoesNotExist() instead.',
'assertRegExp() is deprecated and will be removed in PHPUnit 10. Refactor your code to use assertMatchesRegularExpression() instead.',
'assertNotRegExp() is deprecated and will be removed in PHPUnit 10. Refactor your code to use assertDoesNotMatchRegularExpression() instead.',
'assertDirectoryNotExists() is deprecated and will be removed in PHPUnit 10. Refactor your code to use assertDirectoryDoesNotExist() instead.',
'Support for using expectException() with PHPUnit\\Framework\\Error\\Warning is deprecated and will be removed in PHPUnit 10. Use expectWarning() instead.',
'Support for using expectException() with PHPUnit\\Framework\\Error\\Error is deprecated and will be removed in PHPUnit 10. Use expectError() instead.',
'assertDirectoryNotIsWritable() is deprecated and will be removed in PHPUnit 10. Refactor your code to use assertDirectoryIsNotWritable() instead.',
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment