Updated to Drupal 8.5. Core Media not yet in use.
[yaffs-website] / web / core / tests / Drupal / Tests / Core / Test / TestSuiteBaseTest.php
diff --git a/web/core/tests/Drupal/Tests/Core/Test/TestSuiteBaseTest.php b/web/core/tests/Drupal/Tests/Core/Test/TestSuiteBaseTest.php
new file mode 100644 (file)
index 0000000..ede32eb
--- /dev/null
@@ -0,0 +1,154 @@
+<?php
+
+namespace Drupal\Tests\Core\Test;
+
+use Drupal\Tests\TestSuites\TestSuiteBase;
+use org\bovigo\vfs\vfsStream;
+use PHPUnit\Framework\TestCase;
+
+// The test suite class is not part of the autoloader, we need to include it
+// manually.
+require_once __DIR__ . '/../../../../TestSuites/TestSuiteBase.php';
+
+/**
+ * @coversDefaultClass \Drupal\Tests\TestSuites\TestSuiteBase
+ *
+ * @group TestSuite
+ */
+class TestSuiteBaseTest extends TestCase {
+
+  /**
+   * Helper method to set up the file system.
+   *
+   * @return array[]
+   *   A Drupal filesystem suitable for use with vfsStream.
+   */
+  protected function getFilesystem() {
+    return [
+      'core' => [
+        'modules' => [],
+        'profiles' => [],
+        'tests' => [
+          'Drupal' => [
+            'NotUnitTests' => [
+              'CoreNotUnitTest.php' => '<?php',
+            ],
+            'Tests' => [
+              'CoreUnitTest.php' => '<?php',
+              // Ensure that the following files are not found as tests.
+              'Listeners' => [
+                'Listener.php' => '<?php',
+                'Legacy' => [
+                  'Listener.php' => '<?php',
+                ]
+              ]
+            ],
+          ],
+        ],
+      ],
+    ];
+  }
+
+  /**
+   * @return array[]
+   *   Test data for testAddTestsBySuiteNamespaceCore(). An array of arrays:
+   *   - A filesystem array for vfsStream.
+   *   - The sub-namespace of the test suite.
+   *   - The array of tests expected to be discovered.
+   */
+  public function provideCoreTests() {
+    $filesystem = $this->getFilesystem();
+    return [
+      'unit-tests' => [
+        $filesystem,
+        'Unit',
+        [
+          'Drupal\Tests\CoreUnitTest' => 'vfs://root/core/tests/Drupal/Tests/CoreUnitTest.php',
+        ],
+      ],
+      'not-unit-tests' => [
+        $filesystem,
+        'NotUnit',
+        [
+          'Drupal\NotUnitTests\CoreNotUnitTest' => 'vfs://root/core/tests/Drupal/NotUnitTests/CoreNotUnitTest.php',
+        ],
+      ],
+    ];
+  }
+
+  /**
+   * Tests for special case behavior of unit test suite namespaces in core.
+   *
+   * @covers ::addTestsBySuiteNamespace
+   *
+   * @dataProvider provideCoreTests
+   */
+  public function testAddTestsBySuiteNamespaceCore($filesystem, $suite_namespace, $expected_tests) {
+    // Set up the file system.
+    $vfs = vfsStream::setup('root');
+    vfsStream::create($filesystem, $vfs);
+
+    // Make a stub suite base to test.
+    $stub = new StubTestSuiteBase('test_me');
+
+    // Access addTestsBySuiteNamespace().
+    $ref_add_tests = new \ReflectionMethod($stub, 'addTestsBySuiteNamespace');
+    $ref_add_tests->setAccessible(TRUE);
+
+    // Invoke addTestsBySuiteNamespace().
+    $ref_add_tests->invokeArgs($stub, [vfsStream::url('root'), $suite_namespace]);
+
+    // Determine if we loaded the expected test files.
+    $this->assertEquals($expected_tests, $stub->testFiles);
+  }
+
+  /**
+   * Tests the assumption that local time is in 'Australia/Sydney'.
+   */
+  public function testLocalTimeZone() {
+    // The 'Australia/Sydney' time zone is set in core/tests/bootstrap.php
+    $this->assertEquals('Australia/Sydney', date_default_timezone_get());
+  }
+
+}
+
+/**
+ * Stub subclass of TestSuiteBase.
+ *
+ * We use this class to alter the behavior of TestSuiteBase so it can be
+ * testable.
+ */
+class StubTestSuiteBase extends TestSuiteBase {
+
+  /**
+   * Test files discovered by addTestsBySuiteNamespace().
+   *
+   * @var string[]
+   */
+  public $testFiles = [];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function findExtensionDirectories($root) {
+    // We have to stub findExtensionDirectories() because we can't inject a
+    // vfsStream filesystem into drupal_phpunit_find_extension_directories(),
+    // which uses \SplFileInfo->getRealPath(). getRealPath() resolves
+    // stream-based paths to an empty string. See
+    // https://github.com/mikey179/vfsStream/wiki/Known-Issues
+    return [];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function addTestFiles($filenames) {
+    // We stub addTestFiles() because the parent implementation can't deal with
+    // vfsStream-based filesystems due to an error in
+    // stream_resolve_include_path(). See
+    // https://github.com/mikey179/vfsStream/issues/5 Here we just store the
+    // test file being added in $this->testFiles.
+    $this->testFiles = array_merge($this->testFiles, $filenames);
+  }
+
+}