setName('generate:test')
->setDescription('Adds a test to an existing plugin')
->addOption('pluginname', null, InputOption::VALUE_REQUIRED, 'The name of an existing plugin')
->addOption('testname', null, InputOption::VALUE_REQUIRED, 'The name of the test to create')
->addOption('testtype', null, InputOption::VALUE_REQUIRED, 'Whether you want to create a "unit", "integration", "system", or "ui" test');
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$pluginName = $this->getPluginName($input, $output);
$testType = $this->getTestType($input, $output);
$testName = $this->getTestName($input, $output, $testType);
$exampleFolder = PIWIK_INCLUDE_PATH . '/plugins/ExamplePlugin';
$replace = array(
'ExamplePlugin' => $pluginName,
'SimpleTest' => $testName,
'SimpleSystemTest' => $testName,
'SimpleUITest_spec.js' => $testName . '_spec.js',
'SimpleUITest' => $testName,
);
$whitelistFiles = $this->getTestFilesWhitelist($testType);
$this->copyTemplateToPlugin($exampleFolder, $pluginName, $replace, $whitelistFiles);
$messages = array(
sprintf('Test %s for plugin %s generated.', $testName, $pluginName),
);
if (strtolower($testType) === 'ui') {
$messages[] = 'To run this test execute the command: ';
$messages[] = '' . sprintf('./console tests:run-ui %s', $testName) . '';
} else {
$messages[] = 'To run all your plugin tests, execute the command: ';
$messages[] = '' . sprintf('./console tests:run %s', $pluginName) . '';
$messages[] = 'To run only this test: ';
$messages[] = '' . sprintf('./console tests:run %s', $testName) . '';
}
$messages[] = 'Enjoy!';
$this->writeSuccessMessage($output, $messages);
}
/**
* @param InputInterface $input
* @param OutputInterface $output
* @return string
* @throws \RuntimeException
*/
private function getTestName(InputInterface $input, OutputInterface $output, $testType)
{
$testname = $input->getOption('testname');
$validate = function ($testname) {
if (empty($testname)) {
throw new \InvalidArgumentException('You have to enter a valid test name ');
}
return $testname;
};
if (empty($testname)) {
$dialog = $this->getHelperSet()->get('dialog');
$testname = $dialog->askAndValidate($output, 'Enter the name of the test: ', $validate);
} else {
$validate($testname);
}
if (strtolower($testType) !== 'ui' && !Common::stringEndsWith(strtolower($testname), 'test')) {
$testname = $testname . 'Test';
}
$testname = ucfirst($testname);
return $testname;
}
/**
* @param InputInterface $input
* @param OutputInterface $output
* @return array
* @throws \RuntimeException
*/
protected function getPluginName(InputInterface $input, OutputInterface $output)
{
$pluginNames = $this->getPluginNames();
$invalidName = 'You have to enter the name of an existing plugin';
return $this->askPluginNameAndValidate($input, $output, $pluginNames, $invalidName);
}
public function getValidTypes()
{
return array('unit', 'integration', 'system', 'ui');
}
/**
* @param InputInterface $input
* @param OutputInterface $output
* @return string Unit, Integration, System
*/
private function getTestType(InputInterface $input, OutputInterface $output)
{
$testtype = $input->getOption('testtype');
$self = $this;
$validate = function ($testtype) use ($self) {
if (empty($testtype) || !in_array($testtype, $self->getValidTypes())) {
throw new \InvalidArgumentException('You have to enter a valid test type: ' . implode(" or ", $self->getValidTypes()));
}
return $testtype;
};
if (empty($testtype)) {
$dialog = $this->getHelperSet()->get('dialog');
$testtype = $dialog->askAndValidate($output, 'Enter the type of the test to generate ('. implode(", ", $this->getValidTypes()).'): ', $validate, false, null, $this->getValidTypes());
} else {
$validate($testtype);
}
$testtype = ucfirst($testtype);
return $testtype;
}
/**
* @return array
*/
protected function getTestFilesWhitelist($testType)
{
if ('Ui' == $testType) {
return array(
'/tests',
'/tests/UI',
'/tests/UI/.gitignore',
'/tests/UI/expected-ui-screenshots',
'/tests/UI/expected-ui-screenshots/.gitkeep',
'/tests/UI/SimpleUITest_spec.js',
);
}
if ('System' == $testType) {
return array(
'/.gitignore',
'/tests',
'/tests/System',
'/tests/System/SimpleSystemTest.php',
'/tests/System/expected',
'/tests/System/expected/test___API.get_day.xml',
'/tests/System/expected/test___Goals.getItemsSku_day.xml',
'/tests/System/processed',
'/tests/System/processed/.gitignore',
'/tests/Fixtures',
'/tests/Fixtures/SimpleFixtureTrackFewVisits.php'
);
}
if ('Integration' == $testType) {
return array(
'/tests',
'/tests/Integration',
'/tests/Integration/SimpleTest.php'
);
}
return array(
'/tests',
'/tests/Unit',
'/tests/Unit/SimpleTest.php'
);
}
}