308 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			308 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			PHP
		
	
	
| <?php
 | |
| 
 | |
| namespace Consolidation\SiteProcess;
 | |
| 
 | |
| use PHPUnit\Framework\TestCase;
 | |
| use Consolidation\SiteProcess\Util\ArgumentProcessor;
 | |
| use Consolidation\SiteProcess\Util\Escape;
 | |
| use Consolidation\SiteAlias\SiteAlias;
 | |
| 
 | |
| class SiteProcessTest extends TestCase
 | |
| {
 | |
|     /**
 | |
|      * Data provider for testSiteProcess.
 | |
|      */
 | |
|     public function siteProcessTestValues()
 | |
|     {
 | |
|         return [
 | |
|             [
 | |
|                 "ls -al",
 | |
|                 false,
 | |
|                 false,
 | |
|                 [],
 | |
|                 ['ls', '-al'],
 | |
|                 [],
 | |
|                 [],
 | |
|                 NULL,
 | |
|             ],
 | |
| 
 | |
|             [
 | |
|                 "ls -al",
 | |
|                 'src',
 | |
|                 false,
 | |
|                 [],
 | |
|                 ['ls', '-al'],
 | |
|                 [],
 | |
|                 [],
 | |
|                 NULL,
 | |
|             ],
 | |
| 
 | |
|             [
 | |
|                 "ls -al /path1 /path2",
 | |
|                 false,
 | |
|                 false,
 | |
|                 [],
 | |
|                 ['ls', '-al', '/path1', '/path2'],
 | |
|                 [],
 | |
|                 [],
 | |
|                 NULL,
 | |
|             ],
 | |
| 
 | |
|             [
 | |
|                 "ssh -o PasswordAuthentication=no www-admin@server.net 'ls -al'",
 | |
|                 false,
 | |
|                 false,
 | |
|                 ['host' => 'server.net', 'user' => 'www-admin'],
 | |
|                 ['ls', '-al'],
 | |
|                 [],
 | |
|                 [],
 | |
|                 NULL,
 | |
|             ],
 | |
| 
 | |
|             [
 | |
|                 "ssh -o PasswordAuthentication=no www-admin@server.net 'cd /srv/www/docroot && ls -al'",
 | |
|                 false,
 | |
|                 false,
 | |
|                 ['host' => 'server.net', 'user' => 'www-admin', 'root' => '/srv/www/docroot'],
 | |
|                 ['ls', '-al'],
 | |
|                 [],
 | |
|                 [],
 | |
|                 NULL,
 | |
|             ],
 | |
| 
 | |
|             [
 | |
|                 "ssh -o PasswordAuthentication=no www-admin@server.net 'cd src && ls -al'",
 | |
|                 'src',
 | |
|                 false,
 | |
|                 ['host' => 'server.net', 'user' => 'www-admin'],
 | |
|                 ['ls', '-al'],
 | |
|                 [],
 | |
|                 [],
 | |
|                 NULL,
 | |
|             ],
 | |
| 
 | |
|             [
 | |
|                 "ssh -t -o PasswordAuthentication=no www-admin@server.net 'ls -al'",
 | |
|                 false,
 | |
|                 true,
 | |
|                 ['host' => 'server.net', 'user' => 'www-admin'],
 | |
|                 ['ls', '-al'],
 | |
|                 [],
 | |
|                 [],
 | |
|                 NULL,
 | |
|             ],
 | |
| 
 | |
|             [
 | |
|                 "ssh -t -o PasswordAuthentication=no www-admin@server.net 'cd src && ls -al /path1 /path2'",
 | |
|                 'src',
 | |
|                 true,
 | |
|                 ['host' => 'server.net', 'user' => 'www-admin'],
 | |
|                 ['ls', '-al', '/path1', '/path2'],
 | |
|                 [],
 | |
|                 [],
 | |
|                 NULL,
 | |
|             ],
 | |
| 
 | |
|             [
 | |
|                 "ssh -t -o PasswordAuthentication=no www-admin@server.net 'cd src && ls -al /path1 /path2'",
 | |
|                 'src',
 | |
|                 true,
 | |
|                 ['host' => 'server.net', 'user' => 'www-admin'],
 | |
|                 ['ls', '-al', '/path1', '/path2'],
 | |
|                 [],
 | |
|                 [],
 | |
|                 NULL,
 | |
|             ],
 | |
| 
 | |
|             [
 | |
|                 "docker-compose exec --workdir src --user root drupal ls -al /path1 /path2",
 | |
|                 'src',
 | |
|                 true,
 | |
|                 ['docker' => ['service' => 'drupal', 'exec' => ['options' => '--user root']]],
 | |
|                 ['ls', '-al', '/path1', '/path2'],
 | |
|                 [],
 | |
|                 [],
 | |
|                 NULL,
 | |
|             ],
 | |
| 
 | |
|             [
 | |
|                 "docker-compose -p project exec --workdir src --user root drupal ls -al /path1 /path2",
 | |
|                 'src',
 | |
|                 true,
 | |
|                 ['docker' => ['service' => 'drupal', 'project' => 'project', 'exec' => ['options' => '--user root']]],
 | |
|                 ['ls', '-al', '/path1', '/path2'],
 | |
|                 [],
 | |
|                 [],
 | |
|                 NULL,
 | |
|             ],
 | |
| 
 | |
|             [
 | |
|                 "drush status '--fields=root,uri'",
 | |
|                 false,
 | |
|                 false,
 | |
|                 [],
 | |
|                 ['drush', 'status'],
 | |
|                 ['fields' => 'root,uri'],
 | |
|                 [],
 | |
|                 'LINUX',
 | |
|             ],
 | |
| 
 | |
|             [
 | |
|                 'drush status --fields=root,uri',
 | |
|                   false,
 | |
|                   false,
 | |
|                   [],
 | |
|                   ['drush', 'status'],
 | |
|                   ['fields' => 'root,uri'],
 | |
|                   [],
 | |
|                   'WIN',
 | |
|             ],
 | |
| 
 | |
|             [
 | |
|                 "drush rsync a b -- --exclude=vendor",
 | |
|                 false,
 | |
|                 false,
 | |
|                 [],
 | |
|                 ['drush', 'rsync', 'a', 'b',],
 | |
|                 [],
 | |
|                 ['exclude' => 'vendor'],
 | |
|                 NULL,
 | |
|             ],
 | |
| 
 | |
|             [
 | |
|                 "drush rsync a b -- --exclude=vendor --include=vendor/autoload.php",
 | |
|                 false,
 | |
|                 false,
 | |
|                 [],
 | |
|                 ['drush', 'rsync', 'a', 'b', '--', '--include=vendor/autoload.php'],
 | |
|                 [],
 | |
|                 ['exclude' => 'vendor'],
 | |
|                 NULL,
 | |
|             ],
 | |
| 
 | |
|             [
 | |
|                 "env foo=bar baz=zong drush status",
 | |
|                 false,
 | |
|                 false,
 | |
|                 ['env-vars' => ['foo' => 'bar', 'baz' => 'zong']],
 | |
|                 ['drush', 'status'],
 | |
|                 [],
 | |
|                 [],
 | |
|                 NULL,
 | |
|             ],
 | |
|         ];
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Test the SiteProcess class.
 | |
|      *
 | |
|      * @dataProvider siteProcessTestValues
 | |
|      */
 | |
|     public function testSiteProcess(
 | |
|         $expected,
 | |
|         $cd,
 | |
|         $useTty,
 | |
|         $siteAliasData,
 | |
|         $args,
 | |
|         $options,
 | |
|         $optionsPassedAsArgs,
 | |
|         $os)
 | |
|     {
 | |
|         if (Escape::isWindows() != Escape::isWindows($os)) {
 | |
|           $this->markTestSkipped("OS isn't supported");
 | |
|         }
 | |
|         if ($useTty && Escape::isWindows($os)) {
 | |
|           $this->markTestSkipped('Windows doesn\'t have /dev/tty support');
 | |
|         }
 | |
|         $processManager = ProcessManager::createDefault();
 | |
|         $siteAlias = new SiteAlias($siteAliasData, '@alias.dev');
 | |
|         $siteProcess = $processManager->siteProcess($siteAlias, $args, $options, $optionsPassedAsArgs);
 | |
|         $siteProcess->setTty($useTty);
 | |
|         // The transport handles the chdir during processArgs().
 | |
|         $fallback = $siteAlias->hasRoot() ? $siteAlias->root() : null;
 | |
|         $siteProcess->setWorkingDirectory($cd ?: $fallback);
 | |
| 
 | |
|         $actual = $siteProcess->getCommandLine();
 | |
|         $this->assertEquals($expected, $actual);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Data provider for testSiteProcessJson.
 | |
|      */
 | |
|     public function siteProcessJsonTestValues()
 | |
|     {
 | |
|         return [
 | |
|             [
 | |
|                 'Output is empty.',
 | |
|                 '',
 | |
|                 'LINUX',
 | |
|             ],
 | |
|             [
 | |
|                 "Unable to decode output into JSON: Syntax error\n\nNo json data here",
 | |
|                 'No json data here',
 | |
|                 NULL,
 | |
|             ],
 | |
|             [
 | |
|                 '{"foo":"bar"}',
 | |
|                 '{"foo":"bar"}',
 | |
|                 NULL,
 | |
|             ],
 | |
|             [
 | |
|                 '{"foo":"b\'ar"}',
 | |
|                 '{"foo":"b\'ar"}',
 | |
|                 NULL,
 | |
|             ],
 | |
|             [
 | |
|                 '{"foo":"bar"}',
 | |
|                 'Ignored leading data {"foo":"bar"} Ignored trailing data',
 | |
|                 NULL,
 | |
|             ],
 | |
|             [
 | |
|                 '["a","b","c"]',
 | |
|                 '["a", "b", "c"]',
 | |
|                 NULL,
 | |
|             ],
 | |
|             [
 | |
|                 '"string"',
 | |
|                 '"string"',
 | |
|                 NULL,
 | |
|             ],
 | |
|             [
 | |
|                 '[]',
 | |
|                 '[]',
 | |
|                 NULL,
 | |
|             ],
 | |
|         ];
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Test the SiteProcess class.
 | |
|      *
 | |
|      * @dataProvider siteProcessJsonTestValues
 | |
|      */
 | |
|     public function testSiteProcessJson(
 | |
|         $expected,
 | |
|         $data,
 | |
|         $os)
 | |
|     {
 | |
|         if (Escape::isWindows()) {
 | |
|           $this->markTestSkipped("Windows is not working yet. PRs welcome.");
 | |
|         }
 | |
|         $args = ['echo', $data];
 | |
|         $processManager = ProcessManager::createDefault();
 | |
|         $siteAlias = new SiteAlias([], '@alias.dev');
 | |
|         $siteAlias->set('os', $os);
 | |
|         $siteProcess = $processManager->siteProcess($siteAlias, $args);
 | |
|         $siteProcess->mustRun();
 | |
| 
 | |
|         try {
 | |
|             $actual = $siteProcess->getOutputAsJson();
 | |
|             $actual = json_encode($actual, true);
 | |
|         }
 | |
|         catch (\Exception $e) {
 | |
|             $actual = $e->getMessage();
 | |
|         }
 | |
|         $this->assertEquals($expected, $actual);
 | |
|     }
 | |
| }
 |