[ 'global' => 'from-config', ], // Define some configuration settings for the options for // the commands my:foo and my:bar. 'command' => [ 'my' => [ // commands.my.options.* apply to all my:* commands. 'options' => [ 'dir' => '/etc/common', 'priority' => 'normal', ], 'foo' => [ // commands.my.foo.options.* apply only to the my:foo command. 'options' => [ 'name' => 'baz', ], ], ], ], ]; $this->config = new Config($data); } public function testInjection() { $command = new MyFooCommand(); $input = new StringInput('my:foo'); list($status, $output) = $this->runCommandViaApplication($command, $input); $expectedOutput = <<< EOT Enter my:foo dir: /etc/common name: baz other: fish EOT; $this->assertEquals(0, $status); $this->assertEquals($expectedOutput, $output); } public function testInjectionWithOverride() { $command = new MyFooCommand(); $input = new StringInput('my:foo --name=Fred'); list($status, $output) = $this->runCommandViaApplication($command, $input); $expectedOutput = <<< EOT Enter my:foo dir: /etc/common name: Fred other: fish EOT; $this->assertEquals(0, $status); $this->assertEquals($expectedOutput, $output); } public function testHelpDefaultInjection() { $command = new MyFooCommand(); $input = new StringInput('help my:foo'); list($status, $output) = $this->runCommandViaApplication($command, $input); $expectedOutput = <<< EOT What is the name of the thing we are naming [default: "baz"] EOT; $this->assertEquals(0, $status); $this->assertContains($expectedOutput, $output); $expectedOutput = <<< EOT A certain global option. [default: "from-config"] EOT; $this->assertContains($expectedOutput, $output); } protected function runCommandViaApplication($command, $input) { $application = new Application('TestApplication', '0.0.0'); $application->getDefinition() ->addOption( new InputOption('--global', null, InputOption::VALUE_REQUIRED, 'A certain global option.', 'hardcoded') ); $output = new BufferedOutput(); $configInjector = new ConfigForCommand($this->config); $configInjector->setApplication($application); $eventDispatcher = new \Symfony\Component\EventDispatcher\EventDispatcher(); $eventDispatcher->addSubscriber($configInjector); $application->setDispatcher($eventDispatcher); $application->setAutoExit(false); $application->add($command); $statusCode = $application->run($input, $output); $commandOutput = trim($output->fetch()); return [$statusCode, $commandOutput]; } }