invoke( [...$runner, $command, '--probe', 'two words'], $temporary, $environment ); self::assertSame(37, $code, $command . ': ' . $output); self::assertStringContainsString('compose', $output); self::assertStringContainsString('--probe', $output); self::assertStringContainsString('two words', $output); self::assertStringContainsString(str_replace('\\', '/', $root), str_replace('\\', '/', $output)); } foreach (['migrate', 'seed'] as $command) { [$code, $output] = $this->invoke([...$runner, $command], $temporary, $environment); self::assertSame(37, $code, $command . ': ' . $output); self::assertStringContainsString('compose', $output); self::assertStringContainsString(str_replace('\\', '/', $root), str_replace('\\', '/', $output)); } foreach (['unknown'] as $command) { [$code, $output] = $this->invoke([...$runner, $command], $temporary, $environment); self::assertNotSame(0, $code); self::assertStringNotContainsString('cwd=', $output); } foreach (['-v', '--volumes', '--volumes=true'] as $flag) { [$code, $output] = $this->invoke([...$runner, 'down', $flag], $temporary, $environment); self::assertNotSame(0, $code); self::assertStringNotContainsString('cwd=', $output); } } finally { unlink($fake); rmdir($temporary); } } private function invoke(array $command, string $cwd, array $environment): array { $process = proc_open($command, [1 => ['pipe', 'w'], 2 => ['pipe', 'w']], $pipes, $cwd, $environment); self::assertIsResource($process); $output = stream_get_contents($pipes[1]) . stream_get_contents($pipes[2]); fclose($pipes[1]); fclose($pipes[2]); return [proc_close($process), $output]; } }