diff --git a/.travis.yml b/.travis.yml index 7fe808ba1d1..4960bd5ecc4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,15 @@ -sudo: true +# Forces new Travis-CI Infrastructure +sudo: false + language: php +addons: + chrome: stable + apt: + packages: + - xvfb + - fluxbox + env: global: - RUN_PHPCS="no" @@ -13,8 +22,6 @@ matrix: env: RUN_PHPCS="yes" - php: 7.0 sudo: true - addons: - firefox: "47.0.1" - php: 7.1 - php: hhvm sudo: true @@ -33,31 +40,13 @@ matrix: - php: hhvm before_script: -# Forcing localhost in hosts file -- sudo sed -i '1s/^/127.0.0.1 localhost\n/' /etc/hosts -- sudo apt-get update -qq -- sudo apt-get install -y --force-yes apache2 libapache2-mod-fastcgi > /dev/null -- sudo mkdir $(pwd)/.run -- chmod a+x tests/travis-php-fpm.sh -- sudo ./tests/travis-php-fpm.sh $USER $(phpenv version-name) -- sudo a2enmod rewrite actions fastcgi alias -- echo "cgi.fix_pathinfo = 1" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini -- ~/.phpenv/versions/$(phpenv version-name)/sbin/php-fpm -- sudo cp -f tests/travis-ci-apache.conf /etc/apache2/sites-available/default -- sudo sed -e "s?%TRAVIS_BUILD_DIR%?$(pwd)?g" --in-place /etc/apache2/sites-available/default -- sudo sed -e "s?%PHPVERSION%?${TRAVIS_PHP_VERSION:0:1}?g" --in-place /etc/apache2/sites-available/default -- git submodule update --init --recursive -- sudo service apache2 restart -# Xvfb - "export DISPLAY=:99.0" - "sh -e /etc/init.d/xvfb start" - sleep 3 # give xvfb some time to start -# Fluxbox -- sudo apt-get install fluxbox -y --force-yes -- fluxbox & -- sleep 3 # give fluxbox some time to start # Composer - composer install +- fluxbox & +- sleep 3 script: # Build diff --git a/RoboFile.php b/RoboFile.php index b6249ba7783..a5e44d07ec7 100644 --- a/RoboFile.php +++ b/RoboFile.php @@ -1,18 +1,21 @@ configuration = $this->getConfiguration(); - - $this->cmsPath = $this->getCmsPath(); - + $this->configuration = $this->getConfiguration(); + $this->cmsPath = $this->getTestingPath(); $this->executableExtension = $this->getExecutableExtension(); // Set default timezone (so no warnings are generated if it is not set) @@ -77,234 +91,82 @@ public function __construct() /** * Get the executable extension according to Operating System * - * @return void + * @return */ private function getExecutableExtension() { if ($this->isWindows()) { - // Check wehter git.exe or git as command should be used, - // As on window both is possible - if (!$this->_exec('git.exe --version')->getMessage()) - { - return ''; - } - else - { - return '.exe'; - } + return '.exe'; } return ''; } /** - * Executes all the Selenium System Tests in a suite on your machine - * - * @param array $opts Array of configuration options: - * - 'use-htaccess': renames and enable embedded Joomla .htaccess file - * - 'env': set a specific environment to get configuration from - * - * @return mixed - */ - public function runTests($opts = ['use-htaccess' => false, 'env' => 'desktop']) - { - $this->createTestingSite($opts['use-htaccess']); - - $this->getComposer(); - - $this->taskComposerInstall()->run(); - - $this->runSelenium(); - - // Make sure to run the build command to generate AcceptanceTester - $this->_exec($this->isWindows() ? 'vendor\bin\codecept.bat build' : 'php vendor/bin/codecept build'); - - $this->taskCodecept() - ->arg('--steps') - ->arg('--debug') - ->arg('--fail-fast') - ->env($opts['env']) - ->arg('tests/acceptance/install/') - ->run() - ->stopOnFail(); - - $this->taskCodecept() - ->arg('--steps') - ->arg('--debug') - ->arg('--fail-fast') - ->env($opts['env']) - ->arg('tests/acceptance/administrator/') - ->run() - ->stopOnFail(); - - $this->taskCodecept() - ->arg('--steps') - ->arg('--debug') - ->arg('--fail-fast') - ->env($opts['env']) - ->arg('tests/acceptance/frontend/') - ->run() - ->stopOnFail(); - - /* - Uncomment this lines if you need to debug selenium errors - $seleniumErrors = file_get_contents('selenium.log'); - if ($seleniumErrors) { - $this->say('Printing Selenium Log files'); - $this->say('------ selenium.log (start) ---------'); - $this->say($seleniumErrors); - $this->say('------ selenium.log (end) -----------'); - } - */ - } - - /** - * Executes a specific Selenium System Tests in your machine + * Get (optional) configuration from an external file * - * @param string $pathToTestFile Optional name of the test to be run - * @param string $suite Optional name of the suite containing the tests, Acceptance by default. + * @since 3.7.3 * - * @return mixed + * @return \stdClass|null */ - public function runTest($pathToTestFile = null, $suite = 'acceptance') + public function getConfiguration() { - $this->runSelenium(); - - // Make sure to run the build command to generate AcceptanceTester - $this->_exec($this->isWindows() ? 'vendor\bin\codecept.bat build' : 'php vendor/bin/codecept build'); + $configurationFile = __DIR__ . '/RoboFile.ini'; - if (!$pathToTestFile) + if (!file_exists($configurationFile)) { - $this->say('Available tests in the system:'); + $this->say('No local configuration file'); - $iterator = new RecursiveIteratorIterator( - new RecursiveDirectoryIterator( - 'tests/' . $suite, - RecursiveDirectoryIterator::SKIP_DOTS - ), - RecursiveIteratorIterator::SELF_FIRST - ); - - $tests = array(); - - $iterator->rewind(); - $i = 1; - - while ($iterator->valid()) - { - if (strripos($iterator->getSubPathName(), 'cept.php') - || strripos($iterator->getSubPathName(), 'cest.php')) - { - $this->say('[' . $i . '] ' . $iterator->getSubPathName()); - $tests[$i] = $iterator->getSubPathName(); - $i++; - } - - $iterator->next(); - } - - $this->say(''); - $testNumber = $this->ask('Type the number of the test in the list that you want to run...'); - $test = $tests[$testNumber]; + return null; } - $pathToTestFile = 'tests/' . $suite . '/' . $test; - - // Loading the class to display the methods in the class - require 'tests/' . $suite . '/' . $test; - - // Logic to fetch the class name from the file name - $fileName = explode("/", $test); - $className = explode(".", $fileName[1]); - - // If the selected file is cest only than we will give the option to execute individual methods, we don't need this in cept file - $i = 1; + $configuration = parse_ini_file($configurationFile); - if (strripos($className[0], 'cest')) + if ($configuration === false) { - $class_methods = get_class_methods($className[0]); - $this->say('[' . $i . '] ' . 'All'); - $methods[$i] = 'All'; - $i++; - - foreach ($class_methods as $method_name) - { - $reflect = new ReflectionMethod($className[0], $method_name); - - if (!$reflect->isConstructor()) - { - if ($reflect->isPublic()) - { - $this->say('[' . $i . '] ' . $method_name); - $methods[$i] = $method_name; - $i++; - } - } - } - - $this->say(''); - $methodNumber = $this->ask('Please choose the method in the test that you would want to run...'); - $method = $methods[$methodNumber]; - } + $this->say('Local configuration file is empty or wrong (check is it in correct .ini format'); - if (isset($method) && $method != 'All') - { - $pathToTestFile = $pathToTestFile . ':' . $method; + return null; } - $this->taskCodecept() - ->test($pathToTestFile) - ->arg('--steps') - ->arg('--debug') - ->run() - ->stopOnFail(); + return json_decode(json_encode($configuration)); } /** - * Run the specified checker tool. Valid options are phpmd, phpcs, phpcpd + * Get the correct CMS root path * - * @param string $tool The tool + * @since 3.7.3 * - * @return bool + * @return string */ - public function runChecker($tool = null) + private function getTestingPath() { - if ($tool === null) + if (empty($this->configuration->cmsPath)) { - $this->say('You have to specify a tool name as argument. Valid tools are phpmd, phpcs, phpcpd.'); - - return false; + return $this->testsPath . 'joomla'; } - if (!in_array($tool, array('phpmd', 'phpcs', 'phpcpd'))) + if (!file_exists(dirname($this->configuration->cmsPath))) { - $this->say('The tool you required is not known. Valid tools are phpmd, phpcs, phpcpd.'); + $this->say('CMS path written in local configuration does not exists or is not readable'); - return false; + return $this->testsPath . 'joomla'; } - switch ($tool) - { - case 'phpmd': - return $this->runPhpmd(); - - case 'phpcs': - return $this->runPhpcs(); - - case 'phpcpd': - return $this->runPhpcpd(); - } + return $this->configuration->cmsPath; } /** * Creates a testing Joomla site for running the tests (use it before run:test) * - * @param bool $use_htaccess (1/0) Rename and enable embedded Joomla .htaccess file + * @param bool $useHtaccess (1/0) Rename and enable embedded Joomla .htaccess file * - * @return bool + * @since 3.7.3 + * + * @return void */ - public function createTestingSite($use_htaccess = false) + public function createTestingSite($useHtaccess = false) { if (!empty($this->configuration->skipClone)) { @@ -314,11 +176,11 @@ public function createTestingSite($use_htaccess = false) } // Caching cloned installations locally - if (!is_dir('tests/cache') || (time() - filemtime('tests/cache') > 60 * 60 * 24)) + if (!is_dir($this->testsPath . 'cache') || (time() - filemtime($this->testsPath . 'cache') > 60 * 60 * 24)) { - if (file_exists('tests/cache')) + if (file_exists($this->testsPath . 'cache')) { - $this->taskDeleteDir('tests/cache')->run(); + $this->taskDeleteDir($this->testsPath . 'cache')->run(); } $this->_exec($this->buildGitCloneCommand()); @@ -339,248 +201,313 @@ public function createTestingSite($use_htaccess = false) } } - $this->_copyDir('tests/cache', $this->cmsPath); + $exclude = ['tests', 'tests-phpunit', '.run', '.github', '.git', '.drone', 'docs', 'src', 'cache']; + + $this->copyJoomla($this->cmsPath, $exclude); // Optionally change owner to fix permissions issues - if (!empty($this->configuration->localUser) && !$this->isWindows()) + if (!empty($this->configuration->localUser)) { $this->_exec('chown -R ' . $this->configuration->localUser . ' ' . $this->cmsPath); } - // Copy current package - if (!file_exists('dist/pkg-weblinks-current.zip')) - { - $this->build(true); - } - - $this->_copy('dist/pkg-weblinks-current.zip', $this->cmsPath . "/pkg-weblinks-current.zip"); - - $this->say('Joomla CMS site created at ' . $this->cmsPath); + $this->_copy('dist/pkg-weblinks-current.zip', "tests/_data/pkg-weblinks-current.zip"); // Optionally uses Joomla default htaccess file. Used by TravisCI - if ($use_htaccess == true) + if ($useHtaccess == true) { - $this->_copy('./tests/joomla/htaccess.txt', './tests/joomla/.htaccess'); - $this->_exec('sed -e "s,# RewriteBase /,RewriteBase /tests/joomla/,g" -in-place tests/joomla/.htaccess'); + $this->say('Renaming htaccess.txt to .htaccess'); + $this->_copy($this->cmsPath . '/htaccess.txt', $this->cmsPath . '/.htaccess'); + $this->_exec('sed -e "s,# RewriteBase /,RewriteBase /tests/joomla-cms,g" -in-place tests/joomla/.htaccess'); } } /** - * Get (optional) configuration from an external file + * Copy the Joomla installation excluding folders * - * @return \stdClass|null + * @param string $dst Target folder + * @param array $exclude Exclude list of folders + * + * @throws Exception + * + * @since 3.7.3 + * + * @return void */ - public function getConfiguration() + protected function copyJoomla($dst, $exclude = array()) { - $configurationFile = __DIR__ . '/RoboFile.ini'; + $dir = @opendir( "." . '/' . $this->testsPath . 'cache'); - if (!file_exists($configurationFile)) + if (false === $dir) { - $this->say("No local configuration file"); - - return null; + throw new Exception($this, "Cannot open source directory"); } - $configuration = parse_ini_file($configurationFile); + if (!is_dir($dst)) + { + mkdir($dst, 0755, true); + } - if ($configuration === false) + while (false !== ($file = readdir($dir))) { - $this->say('Local configuration file is empty or wrong (check is it in correct .ini format'); + if (in_array($file, $exclude)) + { + continue; + } - return null; + if (($file !== '.') && ($file !== '..')) + { + $srcFile = "." . '/' . $this->testsPath . 'cache/' . $file; + $destFile = $dst . '/' . $file; + + if (is_dir($srcFile)) + { + $this->_copyDir($srcFile, $destFile); + } + else + { + copy($srcFile, $destFile); + } + } } - return json_decode(json_encode($configuration)); + closedir($dir); } /** - * Build correct git clone command according to local configuration and OS + * Downloads Composer * - * @return string + * @since 3.7.3 + * + * @return void */ - private function buildGitCloneCommand() + private function getComposer() { - $branch = empty($this->configuration->branch) ? 'staging' : $this->configuration->branch; - - return "git" . $this->executableExtension . " clone -b $branch --single-branch --depth 1 https://github.com/joomla/joomla-cms.git tests/cache"; + // Make sure we have Composer + if (!file_exists('composer.phar')) + { + $this->_exec('curl -o ' . 'composer.phar --retry 3 --retry-delay 5 -sS https://getcomposer.org/installer | php'); + } } /** - * Check if local OS is Windows + * Runs Selenium Standalone Server. + * + * @since 3.7.3 * - * @return bool + * @return void */ - private function isWindows() + public function runSelenium() { - return strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'; + $this->taskSeleniumStandaloneServer() + ->setBinary('vendor/bin/selenium-server-standalone') + ->setWebdriver($this->getWebDriver()) + ->runSelenium() + ->waitForSelenium() + ->run() + ->stopOnFail(); } /** - * Get the correct CMS root path + * Executes all the Selenium System Tests in a suite on your machine * - * @return string + * @param array $opts Array of configuration options: + * - 'use-htaccess': renames and enable embedded Joomla .htaccess file + * - 'env': set a specific environment to get configuration from + * + * @since 3.7.3 + * + * @return mixed */ - private function getCmsPath() + public function runTests($opts = ['use-htaccess' => false, 'env' => 'desktop']) { - if (empty($this->configuration->cmsPath)) - { - return 'tests/joomla'; - } + $this->say("Running tests"); - if (!file_exists(dirname($this->configuration->cmsPath))) - { - $this->say("Cms path written in local configuration does not exists or is not readable"); + $this->createTestingSite($opts['use-htaccess']); - return 'tests/joomla'; - } + $this->getComposer(); - return $this->configuration->cmsPath; - } + $this->taskComposerInstall('composer')->run(); - /** - * Runs Selenium Standalone Server. - * - * @return void - */ - public function runSelenium() - { - if (!$this->isWindows()) - { - $this->_exec("vendor/bin/selenium-server-standalone " . $this->getWebDriver() . ' >> selenium.log 2>&1 &'); - } - else - { - $this->_exec('START java.exe -jar' . $this->getWebDriver() . - ' vendor\joomla-projects\selenium-server-standalone\bin\selenium-server-standalone.jar '); - } + $this->runSelenium(); + // Make sure to run the build command to generate AcceptanceTester if ($this->isWindows()) { - sleep(3); + $this->_exec('php ' . $this->getWindowsPath('vendor/bin/codecept') . ' build'); + $pathToCodeception = $this->getWindowsPath('vendor/bin/codecept'); } else { - $this->taskWaitForSeleniumStandaloneServer() - ->run() - ->stopOnFail(); + $this->_exec('php ' . 'vendor/bin/codecept build'); + + $pathToCodeception = 'vendor/bin/codecept'; } + + $this->taskCodecept($pathToCodeception) + ->arg('--steps') + ->arg('--debug') + ->arg('--fail-fast') + ->env($opts['env']) + ->arg($this->testsPath . 'acceptance/install/') + ->run() + ->stopOnFail(); + + $this->taskCodecept($pathToCodeception) + ->arg('--steps') + ->arg('--debug') + ->arg('--fail-fast') + ->env($opts['env']) + ->arg($this->testsPath . 'acceptance/administrator/') + ->run() + ->stopOnFail(); + + $this->taskCodecept($pathToCodeception) + ->arg('--steps') + ->arg('--debug') + ->arg('--fail-fast') + ->env($opts['env']) + ->arg($this->testsPath . 'acceptance/frontend/') + ->run() + ->stopOnFail(); } /** - * Downloads Composer + * Executes a specific Selenium System Tests in your machine * - * @return void + * @param string $pathToTestFile Optional name of the test to be run + * @param string $suite Optional name of the suite containing the tests, Acceptance by default. + * + * @since 3.7.3 + * + * @return void */ - private function getComposer() + public function runTest($pathToTestFile = null, $suite = 'acceptance') { - // Make sure we have Composer - if (!file_exists('./composer.phar')) + $this->runSelenium(); + + // Make sure to run the build command to generate AcceptanceTester + $path = 'vendor/bin/codecept'; + $this->_exec('php ' . $this->isWindows() ? $this->getWindowsPath($path) : $path . ' build'); + + if (!$pathToTestFile) { - $insecure = ''; + $this->say('Available tests in the system:'); - if (!empty($this->configuration->insecure)) + $iterator = new RecursiveIteratorIterator( + new RecursiveDirectoryIterator( + $this->testsPath . $suite, + RecursiveDirectoryIterator::SKIP_DOTS + ), + RecursiveIteratorIterator::SELF_FIRST + ); + + $tests = array(); + $i = 1; + + $iterator->rewind(); + + while ($iterator->valid()) { - $insecure = '--insecure'; + if (strripos($iterator->getSubPathName(), 'cept.php') + || strripos($iterator->getSubPathName(), 'cest.php') + || strripos($iterator->getSubPathName(), '.feature') + ) + { + $this->say('[' . $i . '] ' . $iterator->getSubPathName()); + + $tests[$i] = $iterator->getSubPathName(); + $i++; + } + + $iterator->next(); } - $this->_exec('curl ' . $insecure . ' --retry 3 --retry-delay 5 -sS https://getcomposer.org/installer | php'); + $this->say(''); + $testNumber = $this->ask('Type the number of the test in the list that you want to run...'); + $test = $tests[$testNumber]; } - } - /** - * Kills the selenium server running - * - * @param string $host Web host of the remote server. - * @param string $port Server port. - * - * @return void - */ - public function killSelenium($host = 'localhost', $port = '4444') - { - $this->say('Trying to kill the selenium server.'); - $this->_exec("curl http://$host:$port/selenium-server/driver/?cmd=shutDownSeleniumServer"); - } + $pathToTestFile = $this->testsPath . $suite . '/' . $test; - /** - * Run the phpmd tool - * - * @return void - */ - private function runPhpmd() - { - return $this->_exec('phpmd' . $this->extension . ' ' . __DIR__ . '/src xml cleancode,codesize,controversial,design,naming,unusedcode'); - } + // Loading the class to display the methods in the class - /** - * Run the phpcs tool - * - * @return void - */ - private function runPhpcs() - { - $this->_exec('phpcs' . $this->extension . ' ' . __DIR__ . '/src'); - } + // Logic to fetch the class name from the file name + $fileName = explode("/", $test); - /** - * Run the phpcpd tool - * - * @return void - */ - private function runPhpcpd() - { - $this->_exec('phpcpd' . $this->extension . ' ' . __DIR__ . '/src'); - } + // If the selected file is cest only then we will give the option to execute individual methods, we don't need this in cept or feature files + $i = 1; - /** - * Build the joomla extension package - * - * @param array $params Additional params - * - * @return void - */ - public function build($params = ['dev' => false]) - { - if (!file_exists('jorobo.ini')) + if (isset($fileName[1]) && strripos($fileName[1], 'cest')) { - $this->_copy('jorobo.dist.ini', 'jorobo.ini'); + require $this->testsPath . $suite . '/' . $test; + + $className = explode(".", $fileName[1]); + $class_methods = get_class_methods($className[0]); + + $this->say('[' . $i . '] ' . 'All'); + + $methods[$i] = 'All'; + $i++; + + foreach ($class_methods as $method_name) + { + $reflect = new ReflectionMethod($className[0], $method_name); + + if (!$reflect->isConstructor() && $reflect->isPublic()) + { + $this->say('[' . $i . '] ' . $method_name); + + $methods[$i] = $method_name; + + $i++; + } + } + + $this->say(''); + $methodNumber = $this->ask('Please choose the method in the test that you would want to run...'); + $method = $methods[$methodNumber]; + } + + if (isset($method) && $method != 'All') + { + $pathToTestFile = $pathToTestFile . ':' . $method; } - $this->taskBuild($params)->run(); + $testPathCodecept = 'vendor/bin/codecept'; + + $this->taskCodecept($this->isWindows() ? $this->getWindowsPath($testPathCodecept) : $testPathCodecept) + ->test($pathToTestFile) + ->arg('--steps') + ->arg('--debug') + ->run() + ->stopOnFail(); } /** - * Executes all unit tests + * Check if local OS is Windows * - * @return void + * @return bool + * + * @since 3.7.3 */ - public function runUnit() + private function isWindows() { - $this->createTestingSite(); - $this->getComposer(); - $this->taskComposerInstall()->run(); - - // Make sure to run the build command to generate AcceptanceTester - $this->_exec($this->isWindows() ? 'vendor\bin\codecept.bat build' : 'php vendor/bin/codecept build'); - - $this->taskCodecept() - ->suite('unit') - ->run() - ->stopOnFail(); + return strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'; } /** - * Update copyright headers for this project. (Set the text up in the jorobo.ini) + * Return the correct path for Windows (needed by CMD) * - * @return void + * @param string $path Linux path + * + * @return string + * + * @since 3.7.3 */ - public function headers() + private function getWindowsPath($path) { - if (!file_exists('jorobo.ini')) - { - $this->_copy('jorobo.dist.ini', 'jorobo.ini'); - } - - (new \Joomla\Jorobo\Tasks\CopyrightHeader)->run(); + return str_replace('/', DIRECTORY_SEPARATOR, $path); } /** @@ -588,7 +515,7 @@ public function headers() * * @return string the webdriver string to use with selenium * - * @since version + * @since 3.7.3 */ public function getWebdriver() { @@ -626,9 +553,7 @@ public function getWebdriver() } else { - $this->yell( - print_r($codeceptMainConfig) . - 'No driver for your browser. Check your browser in acceptance.suite.yml and the webDrivers in codeception.yml'); + $this->yell('No driver for your browser. Check your browser in acceptance.suite.yml and the webDrivers in codeception.yml'); // We can't do anything without a driver, exit exit(1); @@ -639,12 +564,38 @@ public function getWebdriver() return '-D' . implode('=', $driver); } + /** + * Return the os name + * + * @return string + * + * @since 3.7.3 + */ + private function getOs() + { + $os = php_uname('s'); + + if (strpos(strtolower($os), 'windows') !== false) + { + return 'windows'; + } + + if (strpos(strtolower($os), 'darwin') !== false) + { + return 'mac'; + } + + return 'linux'; + } + /** * Get the suite configuration * - * @param string $suite The suite + * @param string $suite Name of the test suite * - * @return array + * @return array + * + * @since 3.7.3 */ private function getSuiteConfig($suite = 'acceptance') { @@ -657,31 +608,15 @@ private function getSuiteConfig($suite = 'acceptance') } /** - * Return the os name + * Build correct git clone command according to local configuration and OS * * @return string - * - * @since version */ - private function getOs() + private function buildGitCloneCommand() { - $os = php_uname('s'); - - if (strpos(strtolower($os), 'windows') !== false) - { - $os = 'windows'; - } - // Who have thought that Mac is actually Darwin??? - elseif (strpos(strtolower($os), 'darwin') !== false) - { - $os = 'mac'; - } - else - { - $os = 'linux'; - } + $branch = empty($this->configuration->branch) ? 'staging' : $this->configuration->branch; - return $os; + return "git clone -b $branch --single-branch --depth 1 https://github.com/joomla/joomla-cms.git " . $this->testsPath . "cache"; } /** @@ -694,6 +629,18 @@ public function bump() (new \Joomla\Jorobo\Tasks\BumpVersion())->run(); } + /** + * Build the joomla extension package + * + * @param array $params Additional params + * + * @return void + */ + public function build($params = ['dev' => false]) + { + (new \Joomla\Jorobo\Tasks\Build($params))->run(); + } + /** * Map into Joomla installation. * @@ -708,3 +655,4 @@ public function map($target) (new \Joomla\Jorobo\Tasks\Map($target))->run(); } } + diff --git a/codeception.yml b/codeception.yml index 362549c1481..26e4c84e726 100644 --- a/codeception.yml +++ b/codeception.yml @@ -3,11 +3,22 @@ paths: tests: tests log: tests/_output data: tests/_data - helpers: tests/_support + support: tests/_support + envs: tests/_envs settings: bootstrap: _bootstrap.php colors: true memory_limit: 1024M +extensions: + enabled: + - Codeception\Extension\RunFailed +modules: + config: + Db: + dsn: '' + user: '' + password: '' + dump: tests/_data/dump.sql webdrivers: firefox: windows: vendor\joomla-projects\selenium-server-standalone\bin\webdrivers\gecko\geckodriver64.exe diff --git a/composer.json b/composer.json index e3a53fd056b..a7da0cad471 100644 --- a/composer.json +++ b/composer.json @@ -11,13 +11,14 @@ "php": ">=5.3.10" }, "require-dev": { - "codeception/codeception": "^2.2", - "joomla-projects/joomla-browser": "v3.6.5.1", + "codeception/codeception": "~2.3", + "joomla-projects/joomla-browser": "dev-container-test", + "joomla-projects/selenium-server-standalone": "~v3", "consolidation/robo": "^1.0.0", - "joomla-projects/robo": "~0", - "joomla-projects/selenium-server-standalone": "v3.1.0", + "joomla-projects/joomla-testing-robo": "dev-container-test", "fzaninotto/faker": "^1.6", - "joomla-projects/jorobo": "~0.6", - "Behat/Gherkin": "^4.4.1" - } + "joomla-projects/jorobo": "~0.7" + }, + "minimum-stability": "dev", + "prefer-stable": true } diff --git a/composer.lock b/composer.lock index 665b164c060..d35b254ec48 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "b8d54335b03ccb86dc3697d1ce8f11d4", + "content-hash": "adfc380b8f5fa673bec84f5c0de0564c", "packages": [], "packages-dev": [ { @@ -66,30 +66,82 @@ ], "time": "2016-10-30T11:50:56+00:00" }, + { + "name": "cloudinary/cloudinary_php", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/cloudinary/cloudinary_php.git", + "reference": "641b0901ca616c540b773abb802987a502aa8b89" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cloudinary/cloudinary_php/zipball/641b0901ca616c540b773abb802987a502aa8b89", + "reference": "641b0901ca616c540b773abb802987a502aa8b89", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "5.7.*" + }, + "type": "library", + "autoload": { + "classmap": [ + "src" + ], + "files": [ + "src/Helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Cloudinary", + "homepage": "https://github.com/cloudinary/cloudinary_php/graphs/contributors" + } + ], + "description": "Cloudinary PHP SDK", + "homepage": "https://github.com/cloudinary/cloudinary_php", + "keywords": [ + "cdn", + "cloud", + "cloudinary", + "image management", + "sdk" + ], + "time": "2017-05-03T14:29:33+00:00" + }, { "name": "codeception/codeception", - "version": "2.2.11", + "version": "2.3.5", "source": { "type": "git", "url": "https://github.com/Codeception/Codeception.git", - "reference": "a8681b416921ae282ccca2c485d75a3ed6756080" + "reference": "e807cd458eb9f7ae7464f33ad835a2f54aa73194" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Codeception/zipball/a8681b416921ae282ccca2c485d75a3ed6756080", - "reference": "a8681b416921ae282ccca2c485d75a3ed6756080", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/e807cd458eb9f7ae7464f33ad835a2f54aa73194", + "reference": "e807cd458eb9f7ae7464f33ad835a2f54aa73194", "shasum": "" }, "require": { "behat/gherkin": "~4.4.0", "ext-json": "*", "ext-mbstring": "*", - "facebook/webdriver": ">=1.0.1 <2.0", + "facebook/webdriver": ">=1.1.3 <2.0", "guzzlehttp/guzzle": ">=4.1.4 <7.0", "guzzlehttp/psr7": "~1.0", "php": ">=5.4.0 <8.0", "phpunit/php-code-coverage": ">=2.2.4 <6.0", - "phpunit/phpunit": ">4.8.20 <6.0", + "phpunit/phpunit": ">4.8.20 <7.0", "phpunit/phpunit-mock-objects": ">2.3 <5.0", "sebastian/comparator": ">1.1 <3.0", "sebastian/diff": "^1.4", @@ -114,6 +166,7 @@ "php-amqplib/php-amqplib": "~2.4", "predis/predis": "^1.0", "squizlabs/php_codesniffer": "~2.0", + "symfony/process": ">=2.7 <4.0", "vlucas/phpdotenv": "^2.4.0" }, "suggest": { @@ -158,7 +211,7 @@ "functional testing", "unit testing" ], - "time": "2017-05-11T21:07:05+00:00" + "time": "2017-08-10T20:28:02+00:00" }, { "name": "composer/ca-bundle", @@ -221,22 +274,22 @@ }, { "name": "consolidation/annotated-command", - "version": "2.4.8", + "version": "2.4.13", "source": { "type": "git", "url": "https://github.com/consolidation/annotated-command.git", - "reference": "6672ea38212f8bffb71fec7eadc8b3372154b17e" + "reference": "abb685e42c83d0b698b4e22059e5d505588f7d3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/consolidation/annotated-command/zipball/6672ea38212f8bffb71fec7eadc8b3372154b17e", - "reference": "6672ea38212f8bffb71fec7eadc8b3372154b17e", + "url": "https://api.github.com/repos/consolidation/annotated-command/zipball/abb685e42c83d0b698b4e22059e5d505588f7d3c", + "reference": "abb685e42c83d0b698b4e22059e5d505588f7d3c", "shasum": "" }, "require": { - "consolidation/output-formatters": "^3.1.5", + "consolidation/output-formatters": "^3.1.10", "php": ">=5.4.0", - "phpdocumentor/reflection-docblock": "^2.0|^3.0.2", + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", "psr/log": "^1", "symfony/console": "^2.8|~3", "symfony/event-dispatcher": "^2.5|^3", @@ -269,7 +322,56 @@ } ], "description": "Initialize Symfony Console commands from annotated command class methods.", - "time": "2017-04-03T22:37:00+00:00" + "time": "2017-08-28T20:16:37+00:00" + }, + { + "name": "consolidation/config", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/consolidation/config.git", + "reference": "e3c7311f8926488fe2fbce0ec6af56be417da504" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/consolidation/config/zipball/e3c7311f8926488fe2fbce0ec6af56be417da504", + "reference": "e3c7311f8926488fe2fbce0ec6af56be417da504", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^1.1.0", + "grasmash/yaml-expander": "^1.1", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4", + "satooshi/php-coveralls": "^1.0", + "squizlabs/php_codesniffer": "2.*", + "symfony/console": "^2.5|^3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Consolidation\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Greg Anderson", + "email": "greg.1.anderson@greenknowe.org" + } + ], + "description": "Provide configuration services for a commandline tool.", + "time": "2017-07-28T18:05:53+00:00" }, { "name": "consolidation/log", @@ -320,16 +422,16 @@ }, { "name": "consolidation/output-formatters", - "version": "3.1.9", + "version": "3.1.11", "source": { "type": "git", "url": "https://github.com/consolidation/output-formatters.git", - "reference": "2e09069866bae89d3fb545365f997a40745e34d2" + "reference": "3a1160440819269e6d8d9c11db67129384b8fb35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/consolidation/output-formatters/zipball/2e09069866bae89d3fb545365f997a40745e34d2", - "reference": "2e09069866bae89d3fb545365f997a40745e34d2", + "url": "https://api.github.com/repos/consolidation/output-formatters/zipball/3a1160440819269e6d8d9c11db67129384b8fb35", + "reference": "3a1160440819269e6d8d9c11db67129384b8fb35", "shasum": "" }, "require": { @@ -365,24 +467,25 @@ } ], "description": "Format text by applying transformations provided by plug-in formatters.", - "time": "2017-05-08T15:59:33+00:00" + "time": "2017-08-17T22:11:07+00:00" }, { "name": "consolidation/robo", - "version": "1.0.5", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/consolidation/Robo.git", - "reference": "d06450370e8e303ebd1495dfc956f4c6c1b9dd01" + "reference": "46340c0ba2477e6f30a22ebaa072da0ba2b15bb1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/consolidation/Robo/zipball/d06450370e8e303ebd1495dfc956f4c6c1b9dd01", - "reference": "d06450370e8e303ebd1495dfc956f4c6c1b9dd01", + "url": "https://api.github.com/repos/consolidation/Robo/zipball/46340c0ba2477e6f30a22ebaa072da0ba2b15bb1", + "reference": "46340c0ba2477e6f30a22ebaa072da0ba2b15bb1", "shasum": "" }, "require": { "consolidation/annotated-command": "^2.2", + "consolidation/config": "^1.0.1", "consolidation/log": "~1", "consolidation/output-formatters": "^3.1.5", "league/container": "^2.2", @@ -406,11 +509,11 @@ "pear/archive_tar": "^1.4.2", "phpunit/php-code-coverage": "~2|~4", "satooshi/php-coveralls": "~1", - "squizlabs/php_codesniffer": "~2" + "squizlabs/php_codesniffer": "^2.8" }, "suggest": { "henrikbjorn/lurker": "For monitoring filesystem changes in taskWatch", - "natxet/CssMin": "For minifying JS files in taskMinify", + "natxet/CssMin": "For minifying CSS files in taskMinify", "patchwork/jsqueeze": "For minifying JS files in taskMinify", "pear/archive_tar": "Allows tar archives to be created and extracted in taskPack and taskExtract, respectively." }, @@ -420,7 +523,8 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.x-dev" + "dev-master": "1.x-dev", + "dev-state": "1.x-dev" } }, "autoload": { @@ -442,7 +546,7 @@ } ], "description": "Modern task runner", - "time": "2016-11-24T02:07:48+00:00" + "time": "2017-07-28T21:29:52+00:00" }, { "name": "container-interop/container-interop", @@ -475,6 +579,65 @@ "homepage": "https://github.com/container-interop/container-interop", "time": "2017-02-14T19:40:03+00:00" }, + { + "name": "dflydev/dot-access-data", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "3fbd874921ab2c041e899d044585a2ab9795df8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/3fbd874921ab2c041e899d044585a2ab9795df8a", + "reference": "3fbd874921ab2c041e899d044585a2ab9795df8a", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-0": { + "Dflydev\\DotAccessData": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "time": "2017-01-20T21:14:22+00:00" + }, { "name": "doctrine/instantiator", "version": "1.0.5", @@ -583,29 +746,31 @@ }, { "name": "fzaninotto/faker", - "version": "v1.6.0", + "version": "v1.7.1", "source": { "type": "git", "url": "https://github.com/fzaninotto/Faker.git", - "reference": "44f9a286a04b80c76a4e5fb7aad8bb539b920123" + "reference": "d3ed4cc37051c1ca52d22d76b437d14809fc7e0d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/44f9a286a04b80c76a4e5fb7aad8bb539b920123", - "reference": "44f9a286a04b80c76a4e5fb7aad8bb539b920123", + "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/d3ed4cc37051c1ca52d22d76b437d14809fc7e0d", + "reference": "d3ed4cc37051c1ca52d22d76b437d14809fc7e0d", "shasum": "" }, "require": { - "php": "^5.3.3|^7.0" + "php": "^5.3.3 || ^7.0" }, "require-dev": { "ext-intl": "*", - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~1.5" + "phpunit/phpunit": "^4.0 || ^5.0", + "squizlabs/php_codesniffer": "^1.5" }, "type": "library", "extra": { - "branch-alias": [] + "branch-alias": { + "dev-master": "1.8-dev" + } }, "autoload": { "psr-4": { @@ -627,20 +792,160 @@ "faker", "fixtures" ], - "time": "2016-04-29T12:21:54+00:00" + "time": "2017-08-15T16:48:10+00:00" + }, + { + "name": "grasmash/yaml-expander", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/grasmash/yaml-expander.git", + "reference": "720c54b2c99b80d5d696714b6826183d34edce93" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/grasmash/yaml-expander/zipball/720c54b2c99b80d5d696714b6826183d34edce93", + "reference": "720c54b2c99b80d5d696714b6826183d34edce93", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^1.1.0", + "php": ">=5.4", + "symfony/yaml": "^2.8.11|^3" + }, + "require-dev": { + "phpunit/phpunit": "^4.8|^5.5.4", + "satooshi/php-coveralls": "^1.0", + "squizlabs/php_codesniffer": "^2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Grasmash\\YamlExpander\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matthew Grasmick" + } + ], + "description": "Expands internal property references in a yaml file.", + "time": "2017-08-01T16:15:05+00:00" + }, + { + "name": "guzzle/guzzle", + "version": "v3.8.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "4de0618a01b34aa1c8c33a3f13f396dcd3882eba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/4de0618a01b34aa1c8c33a3f13f396dcd3882eba", + "reference": "4de0618a01b34aa1c8c33a3f13f396dcd3882eba", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "php": ">=5.3.3", + "symfony/event-dispatcher": ">=2.1" + }, + "replace": { + "guzzle/batch": "self.version", + "guzzle/cache": "self.version", + "guzzle/common": "self.version", + "guzzle/http": "self.version", + "guzzle/inflection": "self.version", + "guzzle/iterator": "self.version", + "guzzle/log": "self.version", + "guzzle/parser": "self.version", + "guzzle/plugin": "self.version", + "guzzle/plugin-async": "self.version", + "guzzle/plugin-backoff": "self.version", + "guzzle/plugin-cache": "self.version", + "guzzle/plugin-cookie": "self.version", + "guzzle/plugin-curlauth": "self.version", + "guzzle/plugin-error-response": "self.version", + "guzzle/plugin-history": "self.version", + "guzzle/plugin-log": "self.version", + "guzzle/plugin-md5": "self.version", + "guzzle/plugin-mock": "self.version", + "guzzle/plugin-oauth": "self.version", + "guzzle/service": "self.version", + "guzzle/stream": "self.version" + }, + "require-dev": { + "doctrine/cache": "*", + "monolog/monolog": "1.*", + "phpunit/phpunit": "3.7.*", + "psr/log": "1.0.*", + "symfony/class-loader": "*", + "zendframework/zend-cache": "<2.3", + "zendframework/zend-log": "<2.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.8-dev" + } + }, + "autoload": { + "psr-0": { + "Guzzle": "src/", + "Guzzle\\Tests": "tests/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Guzzle Community", + "homepage": "https://github.com/guzzle/guzzle/contributors" + } + ], + "description": "Guzzle is a PHP HTTP client library and framework for building RESTful web service clients", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "abandoned": "guzzlehttp/guzzle", + "time": "2014-01-28T22:29:15+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "6.2.3", + "version": "6.3.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "8d6c6cc55186db87b7dc5009827429ba4e9dc006" + "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/8d6c6cc55186db87b7dc5009827429ba4e9dc006", - "reference": "8d6c6cc55186db87b7dc5009827429ba4e9dc006", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f4db5a78a5ea468d4831de7f0bf9d9415e348699", + "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699", "shasum": "" }, "require": { @@ -650,9 +955,12 @@ }, "require-dev": { "ext-curl": "*", - "phpunit/phpunit": "^4.0", + "phpunit/phpunit": "^4.0 || ^5.0", "psr/log": "^1.0" }, + "suggest": { + "psr/log": "Required for using the Log middleware" + }, "type": "library", "extra": { "branch-alias": { @@ -689,7 +997,7 @@ "rest", "web service" ], - "time": "2017-02-28T22:50:30+00:00" + "time": "2017-06-22T18:50:49+00:00" }, { "name": "guzzlehttp/promises", @@ -851,16 +1159,16 @@ }, { "name": "joomla-projects/joomla-browser", - "version": "v3.6.5.1", + "version": "dev-container-test", "source": { "type": "git", "url": "https://github.com/joomla-projects/joomla-browser.git", - "reference": "833e113544dc05b34ef024b0634f17c69f95be42" + "reference": "4744a89f2f27745024aba4f063e6b99eabf89c7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/joomla-projects/joomla-browser/zipball/833e113544dc05b34ef024b0634f17c69f95be42", - "reference": "833e113544dc05b34ef024b0634f17c69f95be42", + "url": "https://api.github.com/repos/joomla-projects/joomla-browser/zipball/4744a89f2f27745024aba4f063e6b99eabf89c7a", + "reference": "4744a89f2f27745024aba4f063e6b99eabf89c7a", "shasum": "" }, "require": { @@ -868,7 +1176,7 @@ "php": ">=5.5.9" }, "require-dev": { - "joomla-projects/joomla-testing-robo": "~1.0" + "joomla-projects/joomla-testing-robo": "dev-container-test" }, "type": "library", "autoload": { @@ -886,7 +1194,7 @@ "email": "puneet.kala@community.joomla.org" }, { - "name": "Javier Gómez", + "name": "Javier Gomez", "email": "javier.gomez@community.joomla.org" } ], @@ -898,35 +1206,36 @@ "acceptance testing", "joomla" ], - "time": "2017-01-08T06:44:16+00:00" + "time": "2017-08-23T15:19:58+00:00" }, { - "name": "joomla-projects/jorobo", - "version": "0.6.4", + "name": "joomla-projects/joomla-testing", + "version": "dev-container-test", "source": { "type": "git", - "url": "https://github.com/joomla-projects/jorobo.git", - "reference": "119dd2f3e0b741601b37fa452c1d4ddf201c62af" + "url": "https://github.com/joomla-projects/joomla-testing.git", + "reference": "705c7aeed75c181f3b7ad15a7af419173c867923" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/joomla-projects/jorobo/zipball/119dd2f3e0b741601b37fa452c1d4ddf201c62af", - "reference": "119dd2f3e0b741601b37fa452c1d4ddf201c62af", + "url": "https://api.github.com/repos/joomla-projects/joomla-testing/zipball/705c7aeed75c181f3b7ad15a7af419173c867923", + "reference": "705c7aeed75c181f3b7ad15a7af419173c867923", "shasum": "" }, "require": { - "consolidation/robo": "~1", - "joomla/github": "~1.3", "php": ">=5.4.0" }, "require-dev": { - "codeception/aspect-mock": "~0.5", - "codeception/base": "~2.1" + "consolidation/robo": "~1", + "joomla-projects/joomla-testing-robo": "dev-container-test", + "joomla-projects/virtualisation": "dev-container-test", + "symfony/process": "~3", + "symfony/yaml": "^3.2" }, "type": "library", "autoload": { "psr-4": { - "Joomla\\Jorobo\\": "src" + "Joomla\\Testing\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -935,42 +1244,50 @@ ], "authors": [ { - "name": "Yves Hoppe", - "email": "yves@compojoom.com" - }, - { - "name": "Niels Braczek", - "email": "nbraczek@bsds.de" - }, - { - "name": "Niels Nübel", - "email": "niels@niels-nuebel.de" + "name": "Tito Alvarez", + "email": "tito.alvarez@community.joomla.org" } ], - "description": "Tools and Tasks based on Robo.li for Joomla Extension Development and Releases", - "time": "2017-03-15T23:28:44+00:00" + "description": "Joomla automated testing scripts with container capabilities", + "keywords": [ + "containers", + "docker", + "qa", + "robo", + "task", + "tests" + ], + "time": "2017-08-24T14:09:45+00:00" }, { - "name": "joomla-projects/robo", - "version": "0.1.0", + "name": "joomla-projects/joomla-testing-robo", + "version": "dev-container-test", "source": { "type": "git", - "url": "https://github.com/joomla-projects/robo.git", - "reference": "8a9c72f61696a4f288ede8212a0e7c7c47eda360" + "url": "https://github.com/joomla-projects/joomla-testing-robo.git", + "reference": "a94872e62a8759e2987ee4792520d0a77518eaf0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/joomla-projects/robo/zipball/8a9c72f61696a4f288ede8212a0e7c7c47eda360", - "reference": "8a9c72f61696a4f288ede8212a0e7c7c47eda360", + "url": "https://api.github.com/repos/joomla-projects/joomla-testing-robo/zipball/a94872e62a8759e2987ee4792520d0a77518eaf0", + "reference": "a94872e62a8759e2987ee4792520d0a77518eaf0", "shasum": "" }, "require": { - "squizlabs/php_codesniffer": "1.*" + "cloudinary/cloudinary_php": "~1", + "consolidation/robo": "~1", + "joomla-projects/joomla-testing": "dev-container-test", + "knplabs/github-api": "~1", + "php": ">=5.4.0", + "squizlabs/php_codesniffer": "~2" + }, + "replace": { + "joomla-projects/robo": "< 1.0" }, "type": "library", "autoload": { "psr-4": { - "joomla_projects\\robo\\": "src" + "Joomla\\Testing\\Robo\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -979,37 +1296,92 @@ ], "authors": [ { - "name": "Javier", - "email": "javier.gomez@community.joomla.org" + "name": "Tito Alvarez", + "email": "tito.alvarez@community.joomla.org" } ], - "description": "Robo tasks for Joomla Quality Assurance", + "description": "Joomla automated testing swiss knife", "keywords": [ - "BDD", + "qa", "robo", - "task" + "task", + "tests" ], - "abandoned": "joomla-projects/joomla-testing-robo", - "time": "2015-08-07T16:24:43+00:00" + "time": "2017-08-16T20:37:51+00:00" + }, + { + "name": "joomla-projects/jorobo", + "version": "0.7.0", + "source": { + "type": "git", + "url": "https://github.com/joomla-projects/jorobo.git", + "reference": "1386f7712e39f08a3c1722e514eebdd6d0580c62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/joomla-projects/jorobo/zipball/1386f7712e39f08a3c1722e514eebdd6d0580c62", + "reference": "1386f7712e39f08a3c1722e514eebdd6d0580c62", + "shasum": "" + }, + "require": { + "consolidation/robo": "~1", + "joomla/github": "~1.3", + "php": ">=5.4.0" + }, + "require-dev": { + "codeception/aspect-mock": "~0.5", + "codeception/base": "~2.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Joomla\\Jorobo\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0+" + ], + "authors": [ + { + "name": "Yves Hoppe", + "email": "yves@compojoom.com" + }, + { + "name": "Niels Braczek", + "email": "nbraczek@bsds.de" + }, + { + "name": "Niels Nübel", + "email": "niels@niels-nuebel.de" + } + ], + "description": "Tools and Tasks based on Robo.li for Joomla Extension Development and Releases", + "time": "2017-08-24T01:24:32+00:00" }, { "name": "joomla-projects/selenium-server-standalone", - "version": "v3.1.0", + "version": "v3.5.3", "source": { "type": "git", "url": "https://github.com/joomla-projects/selenium-server-standalone.git", - "reference": "cc928a73f0dfb900793dec48b18e08e8dfcbbaa7" + "reference": "9acbd5a0adf6940b78bc72c010b9f1fa6fbce735" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/joomla-projects/selenium-server-standalone/zipball/cc928a73f0dfb900793dec48b18e08e8dfcbbaa7", - "reference": "cc928a73f0dfb900793dec48b18e08e8dfcbbaa7", + "url": "https://api.github.com/repos/joomla-projects/selenium-server-standalone/zipball/9acbd5a0adf6940b78bc72c010b9f1fa6fbce735", + "reference": "9acbd5a0adf6940b78bc72c010b9f1fa6fbce735", "shasum": "" }, "bin": [ "bin/selenium-server-standalone" ], "type": "library", + "autoload": { + "files": [ + "Selenium.php" + ] + }, "notification-url": "https://packagist.org/downloads/", "license": [ "Apache 2.0" @@ -1030,7 +1402,7 @@ "selenium", "testing" ], - "time": "2017-02-21T15:10:31+00:00" + "time": "2017-08-31T21:13:26+00:00" }, { "name": "joomla/compat", @@ -1371,6 +1743,68 @@ ], "time": "2016-12-10T17:09:33+00:00" }, + { + "name": "knplabs/github-api", + "version": "1.7.1", + "source": { + "type": "git", + "url": "https://github.com/KnpLabs/php-github-api.git", + "reference": "98d0bcd2c4c96a40ded9081f8f6289907f73823c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/KnpLabs/php-github-api/zipball/98d0bcd2c4c96a40ded9081f8f6289907f73823c", + "reference": "98d0bcd2c4c96a40ded9081f8f6289907f73823c", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "guzzle/guzzle": "~3.7", + "php": ">=5.3.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.0", + "sllh/php-cs-fixer-styleci-bridge": "~1.3" + }, + "suggest": { + "knplabs/gaufrette": "Needed for optional Gaufrette cache" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Github\\": "lib/Github/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Thibault Duplessis", + "email": "thibault.duplessis@gmail.com", + "homepage": "http://ornicar.github.com" + }, + { + "name": "KnpLabs Team", + "homepage": "http://knplabs.com" + } + ], + "description": "GitHub API v3 client", + "homepage": "https://github.com/KnpLabs/php-github-api", + "keywords": [ + "api", + "gh", + "gist", + "github" + ], + "time": "2016-07-26T08:49:38+00:00" + }, { "name": "league/container", "version": "2.4.1", @@ -1492,22 +1926,22 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "3.1.1", + "version": "3.2.2", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e" + "reference": "4aada1f93c72c35e22fb1383b47fee43b8f1d157" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/8331b5efe816ae05461b7ca1e721c01b46bafb3e", - "reference": "8331b5efe816ae05461b7ca1e721c01b46bafb3e", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/4aada1f93c72c35e22fb1383b47fee43b8f1d157", + "reference": "4aada1f93c72c35e22fb1383b47fee43b8f1d157", "shasum": "" }, "require": { "php": ">=5.5", "phpdocumentor/reflection-common": "^1.0@dev", - "phpdocumentor/type-resolver": "^0.2.0", + "phpdocumentor/type-resolver": "^0.3.0", "webmozart/assert": "^1.0" }, "require-dev": { @@ -1533,24 +1967,24 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2016-09-30T07:12:33+00:00" + "time": "2017-08-08T06:39:58+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "0.2.1", + "version": "0.3.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb" + "reference": "fb3933512008d8162b3cdf9e18dba9309b7c3773" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb", - "reference": "e224fb2ea2fba6d3ad6fdaef91cd09a172155ccb", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/fb3933512008d8162b3cdf9e18dba9309b7c3773", + "reference": "fb3933512008d8162b3cdf9e18dba9309b7c3773", "shasum": "" }, "require": { - "php": ">=5.5", + "php": "^5.5 || ^7.0", "phpdocumentor/reflection-common": "^1.0" }, "require-dev": { @@ -1580,7 +2014,7 @@ "email": "me@mikevanriel.com" } ], - "time": "2016-11-25T06:54:22+00:00" + "time": "2017-06-03T08:32:36+00:00" }, { "name": "phpspec/prophecy", @@ -1895,16 +2329,16 @@ }, { "name": "phpunit/phpunit", - "version": "4.8.35", + "version": "4.8.36", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "791b1a67c25af50e230f841ee7a9c6eba507dc87" + "reference": "46023de9a91eec7dfb06cc56cb4e260017298517" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/791b1a67c25af50e230f841ee7a9c6eba507dc87", - "reference": "791b1a67c25af50e230f841ee7a9c6eba507dc87", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/46023de9a91eec7dfb06cc56cb4e260017298517", + "reference": "46023de9a91eec7dfb06cc56cb4e260017298517", "shasum": "" }, "require": { @@ -1963,7 +2397,7 @@ "testing", "xunit" ], - "time": "2017-02-06T05:18:07+00:00" + "time": "2017-06-21T08:07:12+00:00" }, { "name": "phpunit/phpunit-mock-objects", @@ -2233,23 +2667,23 @@ }, { "name": "sebastian/diff", - "version": "1.4.1", + "version": "1.4.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e" + "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e", - "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4", + "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": "^5.3.3 || ^7.0" }, "require-dev": { - "phpunit/phpunit": "~4.8" + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" }, "type": "library", "extra": { @@ -2281,7 +2715,7 @@ "keywords": [ "diff" ], - "time": "2015-12-08T07:14:41+00:00" + "time": "2017-05-22T07:24:03+00:00" }, { "name": "sebastian/environment", @@ -2541,32 +2975,35 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "1.5.6", + "version": "2.9.1", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "6f3e42d311b882b25b4d409d23a289f4d3b803d5" + "reference": "dcbed1074f8244661eecddfc2a675430d8d33f62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/6f3e42d311b882b25b4d409d23a289f4d3b803d5", - "reference": "6f3e42d311b882b25b4d409d23a289f4d3b803d5", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/dcbed1074f8244661eecddfc2a675430d8d33f62", + "reference": "dcbed1074f8244661eecddfc2a675430d8d33f62", "shasum": "" }, "require": { + "ext-simplexml": "*", "ext-tokenizer": "*", + "ext-xmlwriter": "*", "php": ">=5.1.2" }, - "suggest": { - "phpunit/php-timer": "dev-master" + "require-dev": { + "phpunit/phpunit": "~4.0" }, "bin": [ - "scripts/phpcs" + "scripts/phpcs", + "scripts/phpcbf" ], "type": "library", "extra": { "branch-alias": { - "dev-phpcs-fixer": "2.0.x-dev" + "dev-master": "2.x-dev" } }, "autoload": { @@ -2575,12 +3012,12 @@ "CodeSniffer/CLI.php", "CodeSniffer/Exception.php", "CodeSniffer/File.php", + "CodeSniffer/Fixer.php", "CodeSniffer/Report.php", "CodeSniffer/Reporting.php", "CodeSniffer/Sniff.php", "CodeSniffer/Tokens.php", "CodeSniffer/Reports/", - "CodeSniffer/CommentParser/", "CodeSniffer/Tokenizers/", "CodeSniffer/DocGenerators/", "CodeSniffer/Standards/AbstractPatternSniff.php", @@ -2606,13 +3043,13 @@ "role": "lead" } ], - "description": "PHP_CodeSniffer tokenises PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", "homepage": "http://www.squizlabs.com/php-codesniffer", "keywords": [ "phpcs", "standards" ], - "time": "2014-12-04T22:32:15+00:00" + "time": "2017-05-22T02:43:20+00:00" }, { "name": "stecman/symfony-console-completion", @@ -2661,20 +3098,20 @@ }, { "name": "symfony/browser-kit", - "version": "v3.2.8", + "version": "v3.3.8", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "9fab1ab6f77b77f3df5fc5250fc6956811699b57" + "reference": "aee7120b058c268363e606ff5fe8271da849a1b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/9fab1ab6f77b77f3df5fc5250fc6956811699b57", - "reference": "9fab1ab6f77b77f3df5fc5250fc6956811699b57", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/aee7120b058c268363e606ff5fe8271da849a1b5", + "reference": "aee7120b058c268363e606ff5fe8271da849a1b5", "shasum": "" }, "require": { - "php": ">=5.5.9", + "php": "^5.5.9|>=7.0.8", "symfony/dom-crawler": "~2.8|~3.0" }, "require-dev": { @@ -2687,7 +3124,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-master": "3.3-dev" } }, "autoload": { @@ -2714,29 +3151,34 @@ ], "description": "Symfony BrowserKit Component", "homepage": "https://symfony.com", - "time": "2017-04-12T14:13:17+00:00" + "time": "2017-07-29T21:54:42+00:00" }, { "name": "symfony/console", - "version": "v3.2.8", + "version": "v3.3.8", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "a7a17e0c6c3c4d70a211f80782e4b90ddadeaa38" + "reference": "d6596cb5022b6a0bd940eae54a1de78646a5fda6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/a7a17e0c6c3c4d70a211f80782e4b90ddadeaa38", - "reference": "a7a17e0c6c3c4d70a211f80782e4b90ddadeaa38", + "url": "https://api.github.com/repos/symfony/console/zipball/d6596cb5022b6a0bd940eae54a1de78646a5fda6", + "reference": "d6596cb5022b6a0bd940eae54a1de78646a5fda6", "shasum": "" }, "require": { - "php": ">=5.5.9", + "php": "^5.5.9|>=7.0.8", "symfony/debug": "~2.8|~3.0", "symfony/polyfill-mbstring": "~1.0" }, + "conflict": { + "symfony/dependency-injection": "<3.3" + }, "require-dev": { "psr/log": "~1.0", + "symfony/config": "~3.3", + "symfony/dependency-injection": "~3.3", "symfony/event-dispatcher": "~2.8|~3.0", "symfony/filesystem": "~2.8|~3.0", "symfony/process": "~2.8|~3.0" @@ -2750,7 +3192,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-master": "3.3-dev" } }, "autoload": { @@ -2777,29 +3219,29 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2017-04-26T01:39:17+00:00" + "time": "2017-08-27T14:52:21+00:00" }, { "name": "symfony/css-selector", - "version": "v3.2.8", + "version": "v3.3.8", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "02983c144038e697c959e6b06ef6666de759ccbc" + "reference": "c5f5263ed231f164c58368efbce959137c7d9488" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/02983c144038e697c959e6b06ef6666de759ccbc", - "reference": "02983c144038e697c959e6b06ef6666de759ccbc", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/c5f5263ed231f164c58368efbce959137c7d9488", + "reference": "c5f5263ed231f164c58368efbce959137c7d9488", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": "^5.5.9|>=7.0.8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-master": "3.3-dev" } }, "autoload": { @@ -2830,37 +3272,36 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2017-05-01T14:55:58+00:00" + "time": "2017-07-29T21:54:42+00:00" }, { "name": "symfony/debug", - "version": "v3.2.8", + "version": "v3.3.8", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "fd6eeee656a5a7b384d56f1072243fe1c0e81686" + "reference": "084d804fe35808eb2ef596ec83d85d9768aa6c9d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/fd6eeee656a5a7b384d56f1072243fe1c0e81686", - "reference": "fd6eeee656a5a7b384d56f1072243fe1c0e81686", + "url": "https://api.github.com/repos/symfony/debug/zipball/084d804fe35808eb2ef596ec83d85d9768aa6c9d", + "reference": "084d804fe35808eb2ef596ec83d85d9768aa6c9d", "shasum": "" }, "require": { - "php": ">=5.5.9", + "php": "^5.5.9|>=7.0.8", "psr/log": "~1.0" }, "conflict": { "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" }, "require-dev": { - "symfony/class-loader": "~2.8|~3.0", "symfony/http-kernel": "~2.8|~3.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-master": "3.3-dev" } }, "autoload": { @@ -2887,24 +3328,24 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2017-04-19T20:17:50+00:00" + "time": "2017-08-27T14:52:21+00:00" }, { "name": "symfony/dom-crawler", - "version": "v3.2.8", + "version": "v3.3.8", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "f1ad34e8af09ed17570e027cf0c58a12eddec286" + "reference": "d15dfaf71b65bf3affb80900470caf4451a8217e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/f1ad34e8af09ed17570e027cf0c58a12eddec286", - "reference": "f1ad34e8af09ed17570e027cf0c58a12eddec286", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/d15dfaf71b65bf3affb80900470caf4451a8217e", + "reference": "d15dfaf71b65bf3affb80900470caf4451a8217e", "shasum": "" }, "require": { - "php": ">=5.5.9", + "php": "^5.5.9|>=7.0.8", "symfony/polyfill-mbstring": "~1.0" }, "require-dev": { @@ -2916,7 +3357,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-master": "3.3-dev" } }, "autoload": { @@ -2943,29 +3384,32 @@ ], "description": "Symfony DomCrawler Component", "homepage": "https://symfony.com", - "time": "2017-04-12T14:13:17+00:00" + "time": "2017-08-15T13:31:09+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v3.2.8", + "version": "v3.3.8", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "b8a401f733b43251e1d088c589368b2a94155e40" + "reference": "54ca9520a00386f83bca145819ad3b619aaa2485" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/b8a401f733b43251e1d088c589368b2a94155e40", - "reference": "b8a401f733b43251e1d088c589368b2a94155e40", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/54ca9520a00386f83bca145819ad3b619aaa2485", + "reference": "54ca9520a00386f83bca145819ad3b619aaa2485", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": "^5.5.9|>=7.0.8" + }, + "conflict": { + "symfony/dependency-injection": "<3.3" }, "require-dev": { "psr/log": "~1.0", "symfony/config": "~2.8|~3.0", - "symfony/dependency-injection": "~2.8|~3.0", + "symfony/dependency-injection": "~3.3", "symfony/expression-language": "~2.8|~3.0", "symfony/stopwatch": "~2.8|~3.0" }, @@ -2976,7 +3420,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-master": "3.3-dev" } }, "autoload": { @@ -3003,29 +3447,29 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2017-05-01T14:58:48+00:00" + "time": "2017-07-29T21:54:42+00:00" }, { "name": "symfony/filesystem", - "version": "v3.2.8", + "version": "v3.3.8", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "040651db13cf061827a460cc10f6e36a445c45b4" + "reference": "b32a0e5f928d0fa3d1dd03c78d020777e50c10cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/040651db13cf061827a460cc10f6e36a445c45b4", - "reference": "040651db13cf061827a460cc10f6e36a445c45b4", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/b32a0e5f928d0fa3d1dd03c78d020777e50c10cb", + "reference": "b32a0e5f928d0fa3d1dd03c78d020777e50c10cb", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": "^5.5.9|>=7.0.8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-master": "3.3-dev" } }, "autoload": { @@ -3052,29 +3496,29 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2017-04-12T14:13:17+00:00" + "time": "2017-07-29T21:54:42+00:00" }, { "name": "symfony/finder", - "version": "v3.2.8", + "version": "v3.3.8", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "9cf076f8f492f4b1ffac40aae9c2d287b4ca6930" + "reference": "b2260dbc80f3c4198f903215f91a1ac7fe9fe09e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/9cf076f8f492f4b1ffac40aae9c2d287b4ca6930", - "reference": "9cf076f8f492f4b1ffac40aae9c2d287b4ca6930", + "url": "https://api.github.com/repos/symfony/finder/zipball/b2260dbc80f3c4198f903215f91a1ac7fe9fe09e", + "reference": "b2260dbc80f3c4198f903215f91a1ac7fe9fe09e", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": "^5.5.9|>=7.0.8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-master": "3.3-dev" } }, "autoload": { @@ -3101,20 +3545,20 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2017-04-12T14:13:17+00:00" + "time": "2017-07-29T21:54:42+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.3.0", + "version": "v1.5.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4" + "reference": "7c8fae0ac1d216eb54349e6a8baa57d515fe8803" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/e79d363049d1c2128f133a2667e4f4190904f7f4", - "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7c8fae0ac1d216eb54349e6a8baa57d515fe8803", + "reference": "7c8fae0ac1d216eb54349e6a8baa57d515fe8803", "shasum": "" }, "require": { @@ -3126,7 +3570,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3-dev" + "dev-master": "1.5-dev" } }, "autoload": { @@ -3160,20 +3604,20 @@ "portable", "shim" ], - "time": "2016-11-14T01:06:16+00:00" + "time": "2017-06-14T15:44:48+00:00" }, { "name": "symfony/polyfill-php55", - "version": "v1.3.0", + "version": "v1.5.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php55.git", - "reference": "03e3f0350bca2220e3623a0e340eef194405fc67" + "reference": "29b1381d66f16e0581aab0b9f678ccf073288f68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php55/zipball/03e3f0350bca2220e3623a0e340eef194405fc67", - "reference": "03e3f0350bca2220e3623a0e340eef194405fc67", + "url": "https://api.github.com/repos/symfony/polyfill-php55/zipball/29b1381d66f16e0581aab0b9f678ccf073288f68", + "reference": "29b1381d66f16e0581aab0b9f678ccf073288f68", "shasum": "" }, "require": { @@ -3183,7 +3627,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3-dev" + "dev-master": "1.5-dev" } }, "autoload": { @@ -3216,29 +3660,29 @@ "portable", "shim" ], - "time": "2016-11-14T01:06:16+00:00" + "time": "2017-06-14T15:44:48+00:00" }, { "name": "symfony/process", - "version": "v3.2.8", + "version": "v3.3.8", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "999c2cf5061e627e6cd551dc9ebf90dd1d11d9f0" + "reference": "b7666e9b438027a1ea0e1ee813ec5042d5d7f6f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/999c2cf5061e627e6cd551dc9ebf90dd1d11d9f0", - "reference": "999c2cf5061e627e6cd551dc9ebf90dd1d11d9f0", + "url": "https://api.github.com/repos/symfony/process/zipball/b7666e9b438027a1ea0e1ee813ec5042d5d7f6f0", + "reference": "b7666e9b438027a1ea0e1ee813ec5042d5d7f6f0", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": "^5.5.9|>=7.0.8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-master": "3.3-dev" } }, "autoload": { @@ -3265,24 +3709,24 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2017-04-12T14:13:17+00:00" + "time": "2017-07-29T21:54:42+00:00" }, { "name": "symfony/yaml", - "version": "v3.2.8", + "version": "v3.3.8", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "acec26fcf7f3031e094e910b94b002fa53d4e4d6" + "reference": "1d8c2a99c80862bdc3af94c1781bf70f86bccac0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/acec26fcf7f3031e094e910b94b002fa53d4e4d6", - "reference": "acec26fcf7f3031e094e910b94b002fa53d4e4d6", + "url": "https://api.github.com/repos/symfony/yaml/zipball/1d8c2a99c80862bdc3af94c1781bf70f86bccac0", + "reference": "1d8c2a99c80862bdc3af94c1781bf70f86bccac0", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": "^5.5.9|>=7.0.8" }, "require-dev": { "symfony/console": "~2.8|~3.0" @@ -3293,7 +3737,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-master": "3.3-dev" } }, "autoload": { @@ -3320,7 +3764,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2017-05-01T14:55:58+00:00" + "time": "2017-07-29T21:54:42+00:00" }, { "name": "webmozart/assert", @@ -3374,9 +3818,12 @@ } ], "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, + "minimum-stability": "dev", + "stability-flags": { + "joomla-projects/joomla-browser": 20, + "joomla-projects/joomla-testing-robo": 20 + }, + "prefer-stable": true, "prefer-lowest": false, "platform": { "php": ">=5.3.10" diff --git a/src/administrator/manifests/packages/weblinks/script.php b/src/administrator/manifests/packages/weblinks/script.php index cfb312bbc08..e9a81790e20 100644 --- a/src/administrator/manifests/packages/weblinks/script.php +++ b/src/administrator/manifests/packages/weblinks/script.php @@ -19,8 +19,6 @@ class Pkg_WeblinksInstallerScript extends JInstallerScript /** * Extension script constructor. * - * @return void - * * @since __DEPLOY_VERSION__ */ public function __construct() diff --git a/src/plugins/system/weblinks/weblinks.php b/src/plugins/system/weblinks/weblinks.php index 27e5da4a3ca..ef3f33ab3b9 100644 --- a/src/plugins/system/weblinks/weblinks.php +++ b/src/plugins/system/weblinks/weblinks.php @@ -38,7 +38,7 @@ class PlgSystemWeblinks extends JPlugin /** * Method to add statistics information to Administrator control panel. * - * @param string $extension The extension requesting information. + * @param string $extension The extension requesting information. * * @return array containing statistical information. * diff --git a/tests/_bootstrap.php b/tests/_bootstrap.php index 243f9c85bc6..074505f2795 100644 --- a/tests/_bootstrap.php +++ b/tests/_bootstrap.php @@ -1,2 +1,3 @@ prefix = (isset($this->config['prefix'])) ? $this->config['prefix'] : ''; + + return parent::_initialize(); + } + + /** + * Inserts an SQL record into a database. This record will be + * erased after the test. + * + * @param string $table Table + * @param array $data Data + * + * @return integer The last insert id + * + * @since 3.7.3 + */ + public function haveInDatabase($table, array $data) + { + $table = $this->addPrefix($table); + + return parent::haveInDatabase($table, $data); + } + + /** + * Find an entry in the database + * + * @param string $table Table + * @param array $criteria Criteria + * + * @return mixed|false + * + * @since 3.7.3 + */ + public function findInDatabase($table, $criteria = []) + { + $table = $this->addPrefix($table); + + return parent::seeInDatabase($table, $criteria); + } + + /** + * Don't see in database + * + * @param string $table Table + * @param array $criteria Criteria + * + * @return mixed|false + * + * @since 3.7.3 + */ + public function dontSeeInDatabase($table, $criteria = []) + { + $table = $this->addPrefix($table); + + return parent::dontSeeInDatabase($table, $criteria); + } + + /** + * Grab an entry from the database + * + * @param string $table Table + * @param string $column Column + * @param array $criteria Criteria + * + * @return mixed + * + * @since 3.7.3 + */ + public function grabFromDatabase($table, $column, $criteria = null) + { + $table = $this->addPrefix($table); + + return parent::grabFromDatabase($table, $column, $criteria); + } + + /** + * Asserts that the given number of records were found in the database. + * + * @param int $expectedNumber Expected number + * @param string $table Table name + * @param array $criteria Search criteria [Optional] + * + * @return mixed|bool + * + * @since 3.7.3 + */ + public function seeNumRecords($expectedNumber, $table, array $criteria = []) + { + $table = $this->addPrefix($table); + + return parent::seeNumRecords($expectedNumber, $table, $criteria); + } + + /** + * Returns the number of rows in a database + * + * @param string $table Table name + * @param array $criteria Search criteria [Optional] + * + * @return int + * + * @since 3.7.3 + */ + public function grabNumRecords($table, array $criteria = []) + { + $table = $this->addPrefix($table); + + return parent::grabNumRecords($table, $criteria); + } + + /** + * Add the table prefix + * + * @param $table string Table without prefix + * + * @return string + * + * @since 3.7.3 + */ + protected function addPrefix($table) + { + return $this->prefix . $table; + } +} diff --git a/tests/_support/Helper/Unit.php b/tests/_support/Helper/Unit.php new file mode 100644 index 00000000000..89f9f1bda06 --- /dev/null +++ b/tests/_support/Helper/Unit.php @@ -0,0 +1,23 @@ + 'system-message-container']; + + /** + * The element id which contains page title in administrator header. + * + * @var array + * @since 3.7.3 + */ + public static $pageTitle = ['class' => 'page-title']; + + /** + * Locator for page title + * + * @var array + * @since 3.7.3 + */ + public static $title = ['id' => 'jform_title']; + + /** + * Locator for search input field + * + * @var array + * @since 3.7.3 + */ + public static $filterSearch = ['id' => 'filter_search']; + + /** + * Locator for status filter under search tool + * + * @var array + * @since 3.7.3 + */ + public static $filterPublished = 'filter_published'; + + /** + * Locator for search button icon + * + * @var array + * @since 3.7.3 + */ + public static $iconSearch = ['class' => 'icon-search']; + + /** + * Locator for the Tabs in Edit View + * + * @var array + * @since 3.7.3 + */ + public static $tabsLocator = ['xpath' => "//ul[@id='myTabTabs']/li/a"]; + + /** + * Locator for the Check All checkbox + * + * @var array + * @since 3.7.3 + */ + public static $checkAll = ['xpath' => "//thead//input[@name='checkall-toggle' or @name='toggle']"]; + + /** + * Method to search using given keyword + * + * @param string $keyword The keyword to search + * + * @since 3.7.3 + * + * @return void + */ + public function search($keyword) + { + $I = $this; + + $I->amGoingTo('search for "' . $keyword . '"'); + $I->fillField(static::$filterSearch, $keyword); + $I->click(static::$iconSearch); + } + + /** + * Method to search user with username + * + * @param string $keyword The username of user + * + * @since 3.7.3 + * + * @return void Checkbox for given username will be checked. + */ + public function haveItemUsingSearch($keyword) + { + $I = $this; + + $I->amOnPage(static::$url); + $I->search($keyword); + $I->checkAllResults(); + $I->wait(1); + } + + /** + * Method is used to see system message after waiting for page title. + * + * @param string $title The webpage title + * @param string $message The unpublish successful message + * + * @since 3.7.3 + * + * @return void + */ + public function seeSystemMessage($title, $message) + { + $I = $this; + + $I->waitForPageTitle($title); + $I->see($message, self::$systemMessageContainer); + } + + /** + * Method is to Wait for page title until default timeout. + * + * @param string $title Page Title text + * + * @since 3.7.3 + * + * @return void + */ + public function waitForPageTitle($title) + { + $I = $this; + $I->waitForText($title, TIMEOUT, self::$pageTitle); + } + + /** + * Function to select Toolbar buttons in Joomla! Admin Toolbar Panel + * + * @param string $button The full name of the button + * + * @since 3.7.3 + * + * @return void + */ + public function clickToolbarButton($button) + { + $I = $this; + $input = strtolower($button); + + $suiteConfiguration = $I->getSuiteConfiguration(); + $screenWidth = explode("x", $suiteConfiguration['modules']['config']['JoomlaBrowser']['window_size']); + + if ($screenWidth[0] <= 480) + { + $I->click('Toolbar'); + } + + switch ($input) + { + case "new": + $I->click(['xpath' => "//div[@id='toolbar-new']//button"]); + break; + case "edit": + $I->click(['xpath' => "//div[@id='toolbar-edit']//button"]); + break; + case "publish": + $I->click(['xpath' => "//div[@id='toolbar-publish']//button"]); + break; + case "unpublish": + $I->click(['xpath' => "//div[@id='toolbar-unpublish']//button"]); + break; + case "archive": + $I->click(['xpath' => "//div[@id='toolbar-archive']//button"]); + break; + case "check-in": + $I->click(['xpath' => "//div[@id='toolbar-checkin']//button"]); + break; + case "batch": + $I->click(['xpath' => "//div[@id='toolbar-batch']//button"]); + break; + case "rebuild": + $I->click(['xpath' => "//div[@id='toolbar-refresh']//button"]); + break; + case "trash": + $I->click(['xpath' => "//div[@id='toolbar-trash']//button"]); + break; + case "save": + $I->click(['xpath' => "//div[@id='toolbar-apply']//button"]); + break; + case "save & close": + $I->click(['xpath' => "//div[@id='toolbar-save']//button"]); + break; + case "save & new": + $I->click(['xpath' => "//div[@id='toolbar-save-new']//button"]); + break; + case "cancel": + $I->click(['xpath' => "//div[@id='toolbar-cancel']//button"]); + break; + case "options": + $I->click(['xpath' => "//div[@id='toolbar-options']//button"]); + break; + case "empty trash": + case "delete": + $I->click(['xpath' => "//div[@id='toolbar-delete']//button"]); + break; + case "unblock": + $I->click(['xpath' => "//div[@id='toolbar-unblock']//button"]); + break; + case "featured": + $I->click(['xpath' => "//div[@id='toolbar-featured']//button"]); + break; + } + } + + /** + * Function to select all the item in the Search results in Administrator List + * + * Note: We recommend use of checkAllResults function only after searchForItem to be sure you are selecting only the desired result set + * + * @since 3.7.3 + * + * @return void + */ + public function checkAllResults() + { + $I = $this; + + $I->comment("Selecting Checkall button"); + $I->click(self::$checkAll); + } + + /** + * Selects an option in a Chosen Selector based on its id + * + * @param string $selectId The id of the