Yaffs site version 1.1
[yaffs-website] / vendor / webflo / drupal-finder / tests / DrupalFinderTest.php
diff --git a/vendor/webflo/drupal-finder/tests/DrupalFinderTest.php b/vendor/webflo/drupal-finder/tests/DrupalFinderTest.php
new file mode 100644 (file)
index 0000000..5ca42f9
--- /dev/null
@@ -0,0 +1,302 @@
+<?php
+
+use org\bovigo\vfs\vfsStream;
+
+class DrupalFinderTest extends PHPUnit_Framework_TestCase
+{
+    /**
+     * @var \DrupalFinder\DrupalFinder
+     */
+    protected $finder;
+
+    protected static $fileStructure = [
+      'autoload.php' => '',
+      'composer.json' => '',
+      'core' => [
+        'includes' => [
+          'common.inc' => '',
+        ],
+        'misc' => [
+          'drupal.js' => '',
+        ],
+        'core.services.yml' => '',
+      ],
+      'modules' => [],
+      'vendor' => [],
+    ];
+
+    /**
+     * @return array
+     */
+    protected function getDrupalComposerStructure()
+    {
+        $fileStructure = [
+          'web' => static::$fileStructure,
+          'composer.json' => json_encode([
+            'require' => [
+              'drupal/core' => '*',
+            ],
+            'extra' => [
+              'installer-paths' => [
+                'web/core' => [
+                  'type:drupal-core',
+                ],
+              ],
+            ],
+          ]),
+          'vendor' => [],
+        ];
+        unset($fileStructure['web']['composer.json']);
+        unset($fileStructure['web']['vendor']);
+
+        return $fileStructure;
+    }
+
+    protected function setUp()
+    {
+        parent::setUp();
+        $this->finder = new \DrupalFinder\DrupalFinder();
+    }
+
+    public function testDrupalDefaultStructure()
+    {
+        $root = vfsStream::setup('root', null, static::$fileStructure);
+
+        $this->assertTrue($this->finder->locateRoot($root->url()));
+        $this->assertSame('vfs://root', $this->finder->getDrupalRoot());
+        $this->assertSame('vfs://root', $this->finder->getComposerRoot());
+        $this->assertSame('vfs://root/vendor', $this->finder->getVendorDir());
+
+        $this->assertTrue($this->finder->locateRoot($root->url() . '/misc'));
+        $this->assertSame('vfs://root', $this->finder->getDrupalRoot());
+        $this->assertSame('vfs://root', $this->finder->getComposerRoot());
+        $this->assertSame('vfs://root/vendor', $this->finder->getVendorDir());
+
+        $root = vfsStream::setup(
+            'root',
+            null,
+            ['project' => static::$fileStructure]
+        );
+        $this->assertFalse(
+            $this->finder->locateRoot($root->url()),
+            'Not in the scope of the project'
+        );
+        $this->assertFalse($this->finder->getDrupalRoot());
+        $this->assertFalse($this->finder->getComposerRoot());
+        $this->assertFalse($this->finder->getVendorDir());
+    }
+
+    public function testDrupalComposerStructure()
+    {
+        $fileStructure = $this->getDrupalComposerStructure();
+        $this->assertComposerStructure($fileStructure);
+    }
+
+    public function testDrupalComposerStructureWithoutRequire()
+    {
+        $fileStructure = [
+          'web' => static::$fileStructure,
+          'composer.json' => json_encode([
+            'extra' => [
+              'installer-paths' => [
+                'web/core' => [
+                  'drupal/core',
+                ],
+              ],
+            ],
+          ]),
+        ];
+        unset($fileStructure['web']['composer.json']);
+        $this->assertComposerStructure($fileStructure);
+    }
+
+    public function testNoDrupalRootWithRealFilesystem()
+    {
+        $root = $this->tempdir(sys_get_temp_dir());
+
+        $this->assertFalse($this->finder->locateRoot($root));
+        $this->assertFalse($this->finder->getDrupalRoot());
+        $this->assertFalse($this->finder->getComposerRoot());
+        $this->assertFalse($this->finder->getVendorDir());
+    }
+
+    public function testDrupalDefaultStructureWithRealFilesystem()
+    {
+        $root = $this->tempdir(sys_get_temp_dir());
+        $this->dumpToFileSystem(static::$fileStructure, $root);
+
+        $this->assertTrue($this->finder->locateRoot($root));
+        $this->assertSame($root, $this->finder->getDrupalRoot());
+        $this->assertSame($root, $this->finder->getComposerRoot());
+        $this->assertSame($root . '/vendor', $this->finder->getVendorDir());
+
+        // Test symlink implementation
+        $symlink = $this->tempdir(sys_get_temp_dir());
+        $this->symlink($root, $symlink . '/foo');
+
+        $this->assertTrue($this->finder->locateRoot($symlink . '/foo'));
+        $this->assertSame($root, $this->finder->getDrupalRoot());
+        $this->assertSame($root, $this->finder->getComposerRoot());
+        $this->assertSame($root . '/vendor', $this->finder->getVendorDir());
+    }
+
+    public function testDrupalComposerStructureWithRealFilesystem()
+    {
+        $root = $this->tempdir(sys_get_temp_dir());
+        $this->dumpToFileSystem($this->getDrupalComposerStructure(), $root);
+
+        $this->assertTrue($this->finder->locateRoot($root));
+        $this->assertSame($root . '/web', $this->finder->getDrupalRoot());
+        $this->assertSame($root, $this->finder->getComposerRoot());
+        $this->assertSame($root . '/vendor', $this->finder->getVendorDir());
+
+        // Test symlink implementation
+        $symlink = $this->tempdir(sys_get_temp_dir());
+        $this->symlink($root, $symlink . '/foo');
+
+        $this->assertTrue($this->finder->locateRoot($symlink . '/foo'));
+        $this->assertSame($root . '/web', $this->finder->getDrupalRoot());
+        $this->assertSame($root, $this->finder->getComposerRoot());
+        $this->assertSame($root . '/vendor', $this->finder->getVendorDir());
+    }
+
+    public function testDrupalWithLinkedModule()
+    {
+        $root = $this->tempdir(sys_get_temp_dir());
+        $this->dumpToFileSystem(static::$fileStructure, $root);
+
+        $module = $this->tempdir(sys_get_temp_dir());
+        $module_link = $root . '/modules/foo';
+        $this->symlink($module, $module_link);
+
+        $this->assertTrue($this->finder->locateRoot($module_link));
+        $this->assertSame($root, realpath($this->finder->getDrupalRoot()));
+        $this->assertSame($root, realpath($this->finder->getComposerRoot()));
+        $this->assertSame($root . '/vendor', realpath($this->finder->getVendorDir()));
+    }
+
+    public function testDrupalWithCustomVendor()
+    {
+        $root = $this->tempdir(sys_get_temp_dir());
+        $fileStructure = static::$fileStructure;
+        $fileStructure['composer.json'] = json_encode([
+            'config' => [
+                'vendor-dir' => 'vendor-foo'
+            ]
+        ], JSON_UNESCAPED_SLASHES);
+        $fileStructure['vendor-foo'] = [];
+        $this->dumpToFileSystem($fileStructure, $root);
+
+        $this->assertTrue($this->finder->locateRoot($root));
+        $this->assertSame($root, realpath($this->finder->getDrupalRoot()));
+        $this->assertSame($root, realpath($this->finder->getComposerRoot()));
+        $this->assertSame($root . '/vendor-foo', realpath($this->finder->getVendorDir()));
+    }
+
+    protected function dumpToFileSystem($fileStructure, $root)
+    {
+        foreach ($fileStructure as $name => $content) {
+            if (is_array($content)) {
+                mkdir($root . '/' . $name);
+                $this->dumpToFileSystem($content, $root . '/' . $name);
+            } else {
+                file_put_contents($root . '/' . $name, $content);
+            }
+        }
+    }
+
+    protected function tempdir($dir, $prefix = '', $mode = 0700)
+    {
+        if (substr($dir, -1) != '/') {
+            $dir .= '/';
+        }
+        do {
+            $path = $dir . $prefix . mt_rand(0, 9999999);
+        } while (!mkdir($path, $mode));
+        register_shutdown_function(
+            ['DrupalFinderTest', 'tempdir_remove'],
+            $path
+        );
+
+        return realpath($path);
+    }
+
+    public static function tempdir_remove($path)
+    {
+        if (is_link($path)) {
+            if (defined('PHP_WINDOWS_VERSION_BUILD')) {
+                rmdir($path);
+            } else {
+                unlink($path);
+            }
+
+            return;
+        }
+
+        foreach (scandir($path) as $child) {
+            if (in_array($child, ['.', '..'])) {
+                continue;
+            }
+            $child = "$path/$child";
+            is_dir($child) ? static::tempdir_remove($child) : unlink($child);
+        }
+        rmdir($path);
+    }
+
+    /**
+     * @param $target
+     * @param $link
+     *
+     * @throws PHPUnit_Framework_SkippedTestError
+     */
+    private function symlink($target, $link)
+    {
+        try {
+            return symlink($target, $link);
+        } catch (Exception $e) {
+            if (defined('PHP_WINDOWS_VERSION_BUILD')
+              && strstr($e->getMessage(), WIN_ERROR_PRIVILEGE_NOT_HELD)
+            ) {
+                $this->markTestSkipped(<<<'MESSAGE'
+No privilege to create symlinks. Run test as Administrator (elevated process).
+MESSAGE
+                );
+            }
+            throw $e;
+        }
+    }
+
+    /**
+     * @param $fileStructure
+     */
+    protected function assertComposerStructure($fileStructure)
+    {
+        $root = vfsStream::setup('root', null, $fileStructure);
+        $this->assertTrue($this->finder->locateRoot($root->url() . '/web'));
+        $this->assertSame('vfs://root/web', $this->finder->getDrupalRoot());
+        $this->assertSame('vfs://root', $this->finder->getComposerRoot());
+        $this->assertSame('vfs://root/vendor', $this->finder->getVendorDir());
+
+        $this->assertTrue($this->finder->locateRoot($root->url() . '/web/misc'));
+        $this->assertSame('vfs://root/web', $this->finder->getDrupalRoot());
+        $this->assertSame('vfs://root', $this->finder->getComposerRoot());
+        $this->assertSame('vfs://root/vendor', $this->finder->getVendorDir());
+
+        $this->assertTrue($this->finder->locateRoot($root->url()));
+        $this->assertSame('vfs://root/web', $this->finder->getDrupalRoot());
+        $this->assertSame('vfs://root', $this->finder->getComposerRoot());
+        $this->assertSame('vfs://root/vendor', $this->finder->getVendorDir());
+
+        $root = vfsStream::setup(
+          'root',
+          null,
+          ['nested_folder' => $fileStructure]
+        );
+        $this->assertFalse($this->finder->locateRoot($root->url()));
+        $this->assertFalse($this->finder->getDrupalRoot());
+        $this->assertFalse($this->finder->getComposerRoot());
+        $this->assertFalse($this->finder->getVendorDir());
+    }
+}
+
+define('WIN_ERROR_PRIVILEGE_NOT_HELD', '1314');