From 88cd0faeb379a9c8b39396078dadd1d5e06f86c2 Mon Sep 17 00:00:00 2001 From: Lukasz Bajsarowicz Date: Tue, 23 Jun 2020 17:47:13 +0200 Subject: [PATCH 01/31] #389 Fix invalid bahaviour of MAGENTO_BACKEND_BASE_URL (#547) * #389 Fix invalid bahaviour of MAGENTO_BACKEND_BASE_URL * #389 Fix issue related to http (URL) provided to `amOnPage` --- .../Resources/PageReplacementTest.txt | 4 +- .../Persist/Curl/AbstractExecutor.php | 4 +- .../Persist/Curl/AdminExecutor.php | 14 ++---- .../Module/MagentoWebDriver.php | 3 +- .../Module/MagentoWebDriverDoctor.php | 8 +-- .../Provider/UrlProvider.php | 49 +++++++++++++++++++ .../Test/Objects/ActionObject.php | 11 ++++- .../Util/TestGenerator.php | 35 ++++++++++--- 8 files changed, 98 insertions(+), 30 deletions(-) create mode 100644 src/Magento/FunctionalTestingFramework/Provider/UrlProvider.php diff --git a/dev/tests/verification/Resources/PageReplacementTest.txt b/dev/tests/verification/Resources/PageReplacementTest.txt index cda119999..6f75ee096 100644 --- a/dev/tests/verification/Resources/PageReplacementTest.txt +++ b/dev/tests/verification/Resources/PageReplacementTest.txt @@ -35,8 +35,8 @@ class PageReplacementTestCest $I->amOnPage("/John/StringLiteral2.html"); // stepKey: twoParamPageStringData $I->amOnPage("/John/" . $I->retrieveEntityField('datakey', 'firstname', 'test') . ".html"); // stepKey: twoParamPageDataPersist $I->amOnPage("/" . $I->retrieveEntityField('datakey', 'firstname', 'test') . "/StringLiteral2.html"); // stepKey: twoParamPagePersistString - $I->amOnPage("/" . getenv("MAGENTO_BACKEND_NAME") . "/backend"); // stepKey: onAdminPage - $I->amOnPage("/" . getenv("MAGENTO_BACKEND_NAME") . "/StringLiteral/page.html"); // stepKey: oneParamAdminPageString + $I->amOnPage((getenv("MAGENTO_BACKEND_BASE_URL") ? rtrim(getenv("MAGENTO_BACKEND_BASE_URL"), "/") : "") . "/" . getenv("MAGENTO_BACKEND_NAME") . "/backend"); // stepKey: onAdminPage + $I->amOnPage((getenv("MAGENTO_BACKEND_BASE_URL") ? rtrim(getenv("MAGENTO_BACKEND_BASE_URL"), "/") : "") . "/" . getenv("MAGENTO_BACKEND_NAME") . "/StringLiteral/page.html"); // stepKey: oneParamAdminPageString $I->amOnUrl("http://myFullUrl.com/"); // stepKey: onExternalPage } } diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/AbstractExecutor.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/AbstractExecutor.php index e27da3718..c1f03ad35 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/AbstractExecutor.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/AbstractExecutor.php @@ -7,7 +7,7 @@ namespace Magento\FunctionalTestingFramework\DataGenerator\Persist\Curl; use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; -use Magento\FunctionalTestingFramework\Util\Path\UrlFormatter; +use Magento\FunctionalTestingFramework\Provider\UrlProvider; use Magento\FunctionalTestingFramework\Util\Protocol\CurlInterface; /** @@ -29,6 +29,6 @@ abstract class AbstractExecutor implements CurlInterface */ public function getBaseUrl(): string { - return UrlFormatter::format(getenv('MAGENTO_BASE_URL')); + return UrlProvider::getBaseUrl(); } } diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/AdminExecutor.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/AdminExecutor.php index 86b3b742f..5f2c6f365 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/AdminExecutor.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/Curl/AdminExecutor.php @@ -6,7 +6,8 @@ namespace Magento\FunctionalTestingFramework\DataGenerator\Persist\Curl; -use Magento\FunctionalTestingFramework\Util\Path\UrlFormatter; +use Magento\FunctionalTestingFramework\Page\Objects\PageObject; +use Magento\FunctionalTestingFramework\Provider\UrlProvider; use Magento\FunctionalTestingFramework\Util\Protocol\CurlInterface; use Magento\FunctionalTestingFramework\Util\Protocol\CurlTransport; use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; @@ -64,16 +65,7 @@ public function __construct($removeBackend) */ public function getBaseUrl(): string { - $backendHost = getenv('MAGENTO_BACKEND_BASE_URL') - ? - UrlFormatter::format(getenv('MAGENTO_BACKEND_BASE_URL')) - : - parent::getBaseUrl(); - return empty(getenv('MAGENTO_BACKEND_NAME')) - ? - $backendHost - : - $backendHost . getenv('MAGENTO_BACKEND_NAME') . '/'; + return UrlProvider::getBaseUrl(PageObject::ADMIN_AREA); } /** diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php index 26c66acd1..6f45ae253 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -856,7 +856,8 @@ public function saveScreenshot() */ public function amOnPage($page) { - parent::amOnPage($page); + (0 === strpos($page, 'http')) ? parent::amOnUrl($page) : parent::amOnPage($page); + $this->waitForPageLoad(); } diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriverDoctor.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriverDoctor.php index 1407c957b..5fcbe649b 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriverDoctor.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriverDoctor.php @@ -7,6 +7,8 @@ namespace Magento\FunctionalTestingFramework\Module; use Magento\FunctionalTestingFramework\Exceptions\TestFrameworkException; +use Magento\FunctionalTestingFramework\Page\Objects\PageObject; +use Magento\FunctionalTestingFramework\Provider\UrlProvider; use Facebook\WebDriver\Remote\RemoteWebDriver; /** @@ -47,16 +49,14 @@ public function _initialize() } try { - $adminUrl = rtrim(getenv('MAGENTO_BACKEND_BASE_URL'), '/') - ?: rtrim(getenv('MAGENTO_BASE_URL'), '/') - . '/' . getenv('MAGENTO_BACKEND_NAME') . '/admin'; + $adminUrl = UrlProvider::getBaseUrl(PageObject::ADMIN_AREA); $this->loadPageAtUrl($adminUrl); } catch (\Exception $e) { $context[self::EXCEPTION_CONTEXT_ADMIN] = $e->getMessage(); } try { - $storeUrl = getenv('MAGENTO_BASE_URL'); + $storeUrl = UrlProvider::getBaseUrl(); $this->loadPageAtUrl($storeUrl); } catch (\Exception $e) { $context[self::EXCEPTION_CONTEXT_STOREFRONT] = $e->getMessage(); diff --git a/src/Magento/FunctionalTestingFramework/Provider/UrlProvider.php b/src/Magento/FunctionalTestingFramework/Provider/UrlProvider.php new file mode 100644 index 000000000..d6e3ca57b --- /dev/null +++ b/src/Magento/FunctionalTestingFramework/Provider/UrlProvider.php @@ -0,0 +1,49 @@ +getArea() == PageObject::ADMIN_AREA) { - $resolvedReplacement = "/{{_ENV.MAGENTO_BACKEND_NAME}}/" . $resolvedReplacement; + + if (get_class($object) === PageObject::class && $object->getArea() === PageObject::ADMIN_AREA) { + $urlSegments = [ + '{{_ENV.MAGENTO_BACKEND_BASE_URL}}', + '{{_ENV.MAGENTO_BACKEND_NAME}}', + $resolvedReplacement + ]; + + $resolvedReplacement = implode('/', $urlSegments); } return $resolvedReplacement; } diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 2e7d265fa..dafbdaf7e 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -1942,20 +1942,23 @@ private function resolveRuntimeReference($args, $regex, $func) $newArgs = []; foreach ($args as $key => $arg) { + $newArgs[$key] = $arg; + preg_match_all($regex, $arg, $matches); if (!empty($matches[0])) { - $fullMatch = $matches[0][0]; - $refVariable = $matches[1][0]; - unset($matches); - $replacement = "{$func}(\"{$refVariable}\")"; + foreach ($matches[0] as $matchKey => $fullMatch) { + $refVariable = $matches[1][$matchKey]; + + $replacement = $this->getReplacement($func, $refVariable); + + $outputArg = $this->processQuoteBreaks($fullMatch, $newArgs[$key], $replacement); + $newArgs[$key] = $outputArg; + } - $outputArg = $this->processQuoteBreaks($fullMatch, $arg, $replacement); - $newArgs[$key] = $outputArg; + unset($matches); continue; } - $newArgs[$key] = $arg; } - // override passed in args for use later. return $newArgs; } @@ -2202,4 +2205,20 @@ private function hasDecimalPoint(string $outStr) { return strpos($outStr, localeconv()['decimal_point']) !== false; } + + /** + * Supports fallback for BACKEND URL + * + * @param string $func + * @param string $refVariable + * @return string + */ + private function getReplacement($func, $refVariable): string + { + if ($refVariable === 'MAGENTO_BACKEND_BASE_URL') { + return "({$func}(\"{$refVariable}\") ? rtrim({$func}(\"{$refVariable}\"), \"/\") : \"\")"; + } + + return "{$func}(\"{$refVariable}\")"; + } } From 3343a82b84e5b25d30e6e39fb3d1aa0d8dc70634 Mon Sep 17 00:00:00 2001 From: Soumya Unnikrishnan Date: Tue, 23 Jun 2020 12:12:15 -0500 Subject: [PATCH 02/31] MQE-2199: CHANGELOG.MD and Composer version bump MFTF 2.6.5 --- CHANGELOG.md | 7 ++++++- composer.json | 2 +- composer.lock | 5 +++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f6ed24d38..8d60b031c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ Magento Functional Testing Framework Changelog ================================================ -2.6.3 +2.6.5 +----- +### GitHub Issues/Pull requests: +* [#547](https://github.com/magento/magento2-functional-testing-framework/pull/547) -- Fix invalid behavior of MAGENTO_BACKEND_BASE_URL + +2.6.4 ----- ### Fixes diff --git a/composer.json b/composer.json index 3b517567d..f524d490a 100755 --- a/composer.json +++ b/composer.json @@ -2,7 +2,7 @@ "name": "magento/magento2-functional-testing-framework", "description": "Magento2 Functional Testing Framework", "type": "library", - "version": "2.6.4", + "version": "2.6.5", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 7eb7a0d88..bd5589957 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "551059dcd56ad85b0ff76545e0ec6834", + "content-hash": "ea2dd6e8618464ca19eba7ae2d03af52", "packages": [ { "name": "allure-framework/allure-codeception", @@ -6362,5 +6362,6 @@ "ext-json": "*", "ext-openssl": "*" }, - "platform-dev": [] + "platform-dev": [], + "plugin-api-version": "1.1.0" } From 3269a3b16ea5bcb6405f26e461c85c5a0b6ed417 Mon Sep 17 00:00:00 2001 From: Donald Booth Date: Mon, 2 Nov 2020 16:44:03 -0500 Subject: [PATCH 03/31] Fixing link that will break soon --- docs/getting-started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting-started.md b/docs/getting-started.md index 4cf13d7a7..a51f2f4d2 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -350,7 +350,7 @@ allure serve dev/tests/_output/allure-results/ [install Allure]: https://github.com/allure-framework/allure2#download [java]: http://www.oracle.com/technetwork/java/javase/downloads/index.html [mftf tests]: introduction.html#mftf-tests -[php]: https://devdocs.magento.com/guides/v2.3/install-gde/system-requirements-tech.html#php +[php]: https://devdocs.magento.com/guides/v2.3/install-gde/system-requirements.html [PhpStorm]: https://www.jetbrains.com/phpstorm/ [selenium server]: https://www.seleniumhq.org/download/ [Set up a standalone MFTF]: #set-up-a-standalone-mftf From a31dbfcb244d062005acc7ddab0860bac264cfd6 Mon Sep 17 00:00:00 2001 From: Soumya Unnikrishnan Date: Fri, 18 Dec 2020 12:21:20 -0600 Subject: [PATCH 04/31] MQE-2429: [GitHub Issue # 810] MFTF 2.x incompatibility with PHP XDebug 3 CHANGELOG.md and composer.json updates for 2.6.6 --- composer.json | 2 +- composer.lock | 88 ++++++++++++++++++- dev/tests/functional/standalone_bootstrap.php | 4 +- .../Config/MftfApplicationConfig.php | 2 +- .../FunctionalTestingFramework/_bootstrap.php | 4 +- 5 files changed, 95 insertions(+), 5 deletions(-) diff --git a/composer.json b/composer.json index f524d490a..71f9e56b2 100755 --- a/composer.json +++ b/composer.json @@ -2,7 +2,7 @@ "name": "magento/magento2-functional-testing-framework", "description": "Magento2 Functional Testing Framework", "type": "library", - "version": "2.6.5", + "version": "2.6.6", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index bd5589957..e6b4ce940 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ea2dd6e8618464ca19eba7ae2d03af52", + "content-hash": "0b45f63b7323275eebe229b595638d6a", "packages": [ { "name": "allure-framework/allure-codeception", @@ -809,6 +809,12 @@ "Xdebug", "performance" ], + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + } + ], "time": "2020-03-01T12:26:26+00:00" }, { @@ -1257,6 +1263,7 @@ } ], "description": "JSONPath implementation for parsing, searching and flattening arrays", + "abandoned": "softcreatr/jsonpath", "time": "2019-07-15T17:23:22+00:00" }, { @@ -1307,6 +1314,7 @@ "faker", "fixtures" ], + "abandoned": true, "time": "2019-12-12T13:22:17+00:00" }, { @@ -2827,6 +2835,7 @@ "keywords": [ "tokenizer" ], + "abandoned": true, "time": "2019-09-17T06:23:10+00:00" }, { @@ -4638,6 +4647,20 @@ "polyfill", "portable" ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-02-27T09:26:54+00:00" }, { @@ -4700,6 +4723,20 @@ "portable", "shim" ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-03-09T19:04:49+00:00" }, { @@ -4759,6 +4796,20 @@ "portable", "shim" ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-03-09T19:04:49+00:00" }, { @@ -4814,6 +4865,20 @@ "portable", "shim" ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-02-27T09:26:54+00:00" }, { @@ -4872,6 +4937,20 @@ "portable", "shim" ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-02-27T09:26:54+00:00" }, { @@ -5440,6 +5519,12 @@ } ], "description": "Library for accessing git", + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/gitonomy/gitlib", + "type": "tidelift" + } + ], "time": "2020-03-23T12:43:44+00:00" }, { @@ -6019,6 +6104,7 @@ ], "description": "FinderFacade is a convenience wrapper for Symfony's Finder component.", "homepage": "https://github.com/sebastianbergmann/finder-facade", + "abandoned": true, "time": "2020-01-16T08:08:45+00:00" }, { diff --git a/dev/tests/functional/standalone_bootstrap.php b/dev/tests/functional/standalone_bootstrap.php index 486c7566b..e6fffa871 100755 --- a/dev/tests/functional/standalone_bootstrap.php +++ b/dev/tests/functional/standalone_bootstrap.php @@ -72,5 +72,7 @@ // add the debug flag here $debug_mode = $_ENV['MFTF_DEBUG'] ?? false; if (!(bool)$debug_mode && extension_loaded('xdebug')) { - xdebug_disable(); + if (function_exists('xdebug_disable')) { + xdebug_disable(); + } } diff --git a/src/Magento/FunctionalTestingFramework/Config/MftfApplicationConfig.php b/src/Magento/FunctionalTestingFramework/Config/MftfApplicationConfig.php index 4b215cb4f..4139f9cae 100644 --- a/src/Magento/FunctionalTestingFramework/Config/MftfApplicationConfig.php +++ b/src/Magento/FunctionalTestingFramework/Config/MftfApplicationConfig.php @@ -194,7 +194,7 @@ public function verboseEnabled() */ public function getDebugLevel() { - return $this->debugLevel ?? getenv('MFTF_DEBUG'); + return $this->debugLevel; } /** diff --git a/src/Magento/FunctionalTestingFramework/_bootstrap.php b/src/Magento/FunctionalTestingFramework/_bootstrap.php index a5ce1f931..8e937ce86 100644 --- a/src/Magento/FunctionalTestingFramework/_bootstrap.php +++ b/src/Magento/FunctionalTestingFramework/_bootstrap.php @@ -75,5 +75,7 @@ // add the debug flag here $debugMode = $_ENV['MFTF_DEBUG'] ?? false; if (!(bool)$debugMode && extension_loaded('xdebug')) { - xdebug_disable(); + if (function_exists('xdebug_disable')) { + xdebug_disable(); + } } From dd4dd922fb3e484981bddef0b58afa08ea5bebbf Mon Sep 17 00:00:00 2001 From: Soumya Unnikrishnan Date: Fri, 18 Dec 2020 12:21:43 -0600 Subject: [PATCH 05/31] MQE-2431: [2.6.6 - Release] Checklist Removed travis.yml and added github workflow main.yml Changelog updates --- .github/workflows/main.yml | 114 +++++++++++++++++++++++++++++++++++++ .travis.yml | 14 ----- CHANGELOG.md | 10 ++++ 3 files changed, 124 insertions(+), 14 deletions(-) create mode 100644 .github/workflows/main.yml delete mode 100644 .travis.yml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 000000000..3d04d6011 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,114 @@ +# Copyright © Magento, Inc. All rights reserved. +# See COPYING.txt for license details. + +name: CI + +on: [pull_request] + +jobs: + unit-tests: + name: Unit Tests + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php-versions: ['7.1', '7.2', '7.3'] + steps: + - uses: actions/checkout@v2 + + - name: Setup PHP + uses: shivammathur/setup-php@master + with: + php-version: ${{ matrix.php-versions }} + extensions: curl, dom, intl, json, openssl + + - name: Cache Composer packages + id: composer-cache + uses: actions/cache@v2 + with: + path: vendor + key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }} + restore-keys: | + ${{ runner.os }}-php- + + - name: Install dependencies + if: steps.composer-cache.outputs.cache-hit != 'true' + run: composer install --prefer-dist --no-progress --no-suggest + + - name: Run tests + run: vendor/bin/phpunit --configuration dev/tests/phpunit.xml --testsuite unit --coverage-clover clover.xml + + - name: Monitor coverage + if: github.event_name == 'pull_request' + uses: slavcodev/coverage-monitor-action@1.1.0 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + clover_file: "clover.xml" + threshold_alert: 10 + threshold_warning: 20 + + verification-tests: + name: Verification Tests + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php-versions: ['7.1', '7.2', '7.3'] + steps: + - uses: actions/checkout@v2 + + - name: Setup PHP + uses: shivammathur/setup-php@master + with: + php-version: ${{ matrix.php-versions }} + extensions: curl, dom, intl, json, openssl + + - name: Cache Composer packages + id: composer-cache + uses: actions/cache@v2 + with: + path: vendor + key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }} + restore-keys: | + ${{ runner.os }}-php- + + - name: Install dependencies + if: steps.composer-cache.outputs.cache-hit != 'true' + run: composer install --prefer-dist --no-progress --no-suggest + + - name: Run tests + run: vendor/bin/phpunit --configuration dev/tests/phpunit.xml --testsuite verification + + static-tests: + name: Static Tests + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php-versions: ['7.1', '7.2', '7.3'] + steps: + - uses: actions/checkout@v2 + + - name: Setup PHP + uses: shivammathur/setup-php@master + with: + php-version: ${{ matrix.php-versions }} + extensions: curl, dom, intl, json, openssl + + - name: Cache Composer packages + id: composer-cache + uses: actions/cache@v2 + with: + path: vendor + key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }} + restore-keys: | + ${{ runner.os }}-php- + + - name: Install dependencies + if: steps.composer-cache.outputs.cache-hit != 'true' + run: composer install --prefer-dist --no-progress --no-suggest + + - name: Run tests + run: bin/static-checks + + diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index f807d7415..000000000 --- a/.travis.yml +++ /dev/null @@ -1,14 +0,0 @@ -language: php -php: - - 7.1 - - 7.2 - - 7.3 -install: composer install --no-interaction --prefer-source -env: - matrix: - - VERIFICATION_TOOL=phpunit-checks - - VERIFICATION_TOOL=static-checks -script: - - bin/$VERIFICATION_TOOL -after_success: - - travis_retry php vendor/bin/coveralls diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d60b031c..60e0214d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,17 @@ Magento Functional Testing Framework Changelog ================================================ +2.6.6 +--------- + +* Traceability + * Removed `travis.yml` and replaced with `.github/workflows/main.yml` + +### Fixes +* Fixed issue that causes Magento bin/magento to fail when xdebug 3 is used. [GitHub Issue #808](https://github.com/magento/magento2-functional-testing-framework/issues/808) + 2.6.5 ----- + ### GitHub Issues/Pull requests: * [#547](https://github.com/magento/magento2-functional-testing-framework/pull/547) -- Fix invalid behavior of MAGENTO_BACKEND_BASE_URL From 2e939b8e1129cb07abdd1afc4bdc0e3e6dd4bc3a Mon Sep 17 00:00:00 2001 From: Soumya Unnikrishnan Date: Mon, 21 Dec 2020 10:31:09 -0600 Subject: [PATCH 06/31] MQE-2429: [GitHub Issue # 810] MFTF 2.x incompatibility with PHP XDebug 3 --- .github/workflows/main.yml | 2 ++ dev/tests/functional/standalone_bootstrap.php | 8 -------- src/Magento/FunctionalTestingFramework/_bootstrap.php | 8 -------- 3 files changed, 2 insertions(+), 16 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3d04d6011..0ab243d13 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -94,6 +94,8 @@ jobs: with: php-version: ${{ matrix.php-versions }} extensions: curl, dom, intl, json, openssl + coverage: none + if: ${{ matrix.php-versions >= 7.2 }} - name: Cache Composer packages id: composer-cache diff --git a/dev/tests/functional/standalone_bootstrap.php b/dev/tests/functional/standalone_bootstrap.php index e6fffa871..1e30473cd 100755 --- a/dev/tests/functional/standalone_bootstrap.php +++ b/dev/tests/functional/standalone_bootstrap.php @@ -68,11 +68,3 @@ $RELATIVE_TESTS_MODULE_PATH = '/tests/functional/tests/MFTF'; defined('TESTS_MODULE_PATH') || define('TESTS_MODULE_PATH', realpath(TESTS_BP . $RELATIVE_TESTS_MODULE_PATH)); - -// add the debug flag here -$debug_mode = $_ENV['MFTF_DEBUG'] ?? false; -if (!(bool)$debug_mode && extension_loaded('xdebug')) { - if (function_exists('xdebug_disable')) { - xdebug_disable(); - } -} diff --git a/src/Magento/FunctionalTestingFramework/_bootstrap.php b/src/Magento/FunctionalTestingFramework/_bootstrap.php index 8e937ce86..ab5c3f6e2 100644 --- a/src/Magento/FunctionalTestingFramework/_bootstrap.php +++ b/src/Magento/FunctionalTestingFramework/_bootstrap.php @@ -71,11 +71,3 @@ 'TESTS_MODULE_PATH', realpath(TESTS_BP . $RELATIVE_TESTS_MODULE_PATH) ); - -// add the debug flag here -$debugMode = $_ENV['MFTF_DEBUG'] ?? false; -if (!(bool)$debugMode && extension_loaded('xdebug')) { - if (function_exists('xdebug_disable')) { - xdebug_disable(); - } -} From c3f910e0a45c347d4b97ed3c02aa5e5b92ee6d28 Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Mon, 21 Dec 2020 11:48:01 -0600 Subject: [PATCH 07/31] MQE-2429: [GitHub Issue # 810] MFTF 2.x incompatibility with PHP XDebug - enable Functional Tests build - fixes magento/magento2-functional-testing-framework#810 --- .github/workflows/main.yml | 36 ++++++++++++++++++++++++++++++++++++ bin/functional | 11 +++++++++++ 2 files changed, 47 insertions(+) create mode 100755 bin/functional diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0ab243d13..eaa72e8c5 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -113,4 +113,40 @@ jobs: - name: Run tests run: bin/static-checks + functional-tests: + name: Functional Tests + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php-versions: ['7.1', '7.2', '7.3'] + + services: + chrome: + image: selenium/standalone-chrome:3.141.59-zirconium + ports: + - 4444:4444 + steps: + - uses: actions/checkout@v2 + + - name: Setup PHP + uses: shivammathur/setup-php@master + with: + php-version: ${{ matrix.php-versions }} + extensions: curl, dom, intl, json, openssl + - name: Cache Composer packages + id: composer-cache + uses: actions/cache@v2 + with: + path: vendor + key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }} + restore-keys: | + ${{ runner.os }}-php- + + - name: Install dependencies + if: steps.composer-cache.outputs.cache-hit != 'true' + run: composer install --prefer-dist --no-progress --no-suggest + + - name: Run tests + run: bin/functional diff --git a/bin/functional b/bin/functional new file mode 100755 index 000000000..01efbda9f --- /dev/null +++ b/bin/functional @@ -0,0 +1,11 @@ +# Copyright © Magento, Inc. All rights reserved. +# See COPYING.txt for license details. + +set -e + +echo "===============================" +echo " EXECUTE Functional Tests " +echo "===============================" +bin/mftf build:project +bin/mftf run:test DeprecatedDevDocsTest -f +bin/mftf run:test DevDocsTest -f From 9a6218d9cb87871f750b6e8bb5bb43ab9b33ee09 Mon Sep 17 00:00:00 2001 From: Ji Lu Date: Tue, 2 Feb 2021 13:55:12 -0600 Subject: [PATCH 08/31] MQE-2487: PHPUnit 9 upgrade in MFTF 2.x --- .github/workflows/main.yml | 12 +- composer.json | 29 +- composer.lock | 2066 +++++++++-------- dev/tests/phpunit.xml | 2 +- .../Allure/AllureHelperTest.php | 2 +- .../Composer/ComposerInstallTest.php | 2 +- .../Composer/ComposerPackageTest.php | 2 +- .../Config/Reader/FilesystemTest.php | 4 +- .../Console/BaseGenerateCommandTest.php | 2 +- .../Handlers/PersistedObjectHandlerTest.php | 6 +- .../Objects/EntityDataObjectTest.php | 4 +- .../OperationDataArrayResolverTest.php | 4 +- .../Util/DataExtensionUtilTest.php | 2 +- .../Page/Objects/ElementObjectTest.php | 4 +- .../Suite/Handlers/SuiteObjectHandlerTest.php | 2 +- .../Suite/SuiteGeneratorTest.php | 10 +- .../Test/Config/ActionGroupDomTest.php | 2 +- .../Test/Config/DomTest.php | 4 +- .../Test/Handlers/TestObjectHandlerTest.php | 2 +- .../Test/Objects/ActionGroupObjectTest.php | 8 +- .../Test/Objects/ActionObjectTest.php | 4 +- .../ActionGroupAnnotationExtractorTest.php | 4 +- .../Util/ActionGroupObjectExtractorTest.php | 4 +- .../Test/Util/ActionMergeUtilTest.php | 4 +- .../Test/Util/ActionObjectExtractorTest.php | 4 +- .../Test/Util/AnnotationExtractorTest.php | 4 +- .../Test/Util/ObjectExtensionUtilTest.php | 4 +- .../Util/ModuleResolverTest.php | 7 +- .../Util/TestGeneratorTest.php | 12 +- dev/tests/unit/Util/MagentoTestCase.php | 4 +- .../Tests/SchemaValidationTest.php | 2 +- .../Tests/SuiteGenerationTest.php | 8 +- .../Module/MagentoWebDriver.php | 29 +- 33 files changed, 1258 insertions(+), 1001 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index eaa72e8c5..ab768ddc5 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['7.1', '7.2', '7.3'] + php-versions: ['7.3'] steps: - uses: actions/checkout@v2 @@ -53,7 +53,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['7.1', '7.2', '7.3'] + php-versions: ['7.3'] steps: - uses: actions/checkout@v2 @@ -85,7 +85,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['7.1', '7.2', '7.3'] + php-versions: ['7.3'] steps: - uses: actions/checkout@v2 @@ -94,8 +94,6 @@ jobs: with: php-version: ${{ matrix.php-versions }} extensions: curl, dom, intl, json, openssl - coverage: none - if: ${{ matrix.php-versions >= 7.2 }} - name: Cache Composer packages id: composer-cache @@ -119,7 +117,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['7.1', '7.2', '7.3'] + php-versions: ['7.3'] services: chrome: @@ -150,3 +148,5 @@ jobs: - name: Run tests run: bin/functional + + diff --git a/composer.json b/composer.json index 71f9e56b2..3d72bcb42 100755 --- a/composer.json +++ b/composer.json @@ -9,14 +9,17 @@ "sort-packages": true }, "require": { - "php": "~7.1.0||~7.2.0||~7.3.0", + "php": "~7.3.0", "ext-curl": "*", "ext-dom": "*", "ext-json": "*", "ext-openssl": "*", - "allure-framework/allure-codeception": "~1.3.0", + "allure-framework/allure-codeception": "~1.4.0", "aws/aws-sdk-php": "^3.132", - "codeception/codeception": "~2.4.5", + "codeception/codeception": "~4.1.4", + "codeception/module-asserts": "^1.1", + "codeception/module-sequence": "^1.0", + "codeception/module-webdriver": "^1.0", "composer/composer": "^1.6", "csharpru/vault-php": "~3.5.3", "csharpru/vault-php-guzzle6-transport": "^2.0", @@ -26,24 +29,24 @@ "mustache/mustache": "~2.5", "php-webdriver/webdriver": "^1.8.0", "symfony/console": "^4.4", - "symfony/finder": "^4.4", - "symfony/http-foundation": "^4.4", - "symfony/mime": "^4.4", + "symfony/finder": "^4.4||^5.0", + "symfony/http-foundation": "^4.4||^5.0", + "symfony/mime": "^4.4||^5.0", "symfony/process": "^4.4", "vlucas/phpdotenv": "^2.4" }, "require-dev": { - "squizlabs/php_codesniffer": "~3.2", - "sebastian/phpcpd": "~3.0 || ~4.0", "brainmaestro/composer-git-hooks": "^2.3.1", - "doctrine/cache": "<1.7.0", - "codeception/aspect-mock": "^3.0", - "goaop/framework": "2.2.0", "codacy/coverage": "^1.4", + "codeception/aspect-mock": "^3.0", + "doctrine/cache": "<1.7.0", + "goaop/framework": "~2.3.4", + "php-coveralls/php-coveralls": "^1.0", "phpmd/phpmd": "^2.6.0", - "phpunit/phpunit": "~6.5.0 || ~7.0.0", + "phpunit/phpunit": "^9.0", "rregeer/phpunit-coverage-check": "^0.1.4", - "php-coveralls/php-coveralls": "^1.0", + "sebastian/phpcpd": "~6.0.0", + "squizlabs/php_codesniffer": "~3.5.4", "symfony/stopwatch": "~3.4.6" }, "suggest": { diff --git a/composer.lock b/composer.lock index e6b4ce940..f68427e19 100644 --- a/composer.lock +++ b/composer.lock @@ -4,26 +4,26 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "0b45f63b7323275eebe229b595638d6a", + "content-hash": "16231ee8eb05c3ec6b54ac51fe72ecec", "packages": [ { "name": "allure-framework/allure-codeception", - "version": "1.3.0", + "version": "1.4.5", "source": { "type": "git", "url": "https://github.com/allure-framework/allure-codeception.git", - "reference": "9d31d781b3622b028f1f6210bc76ba88438bd518" + "reference": "ac3d471902d2903856bbd0a95e7546788319ed22" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/allure-framework/allure-codeception/zipball/9d31d781b3622b028f1f6210bc76ba88438bd518", - "reference": "9d31d781b3622b028f1f6210bc76ba88438bd518", + "url": "https://api.github.com/repos/allure-framework/allure-codeception/zipball/ac3d471902d2903856bbd0a95e7546788319ed22", + "reference": "ac3d471902d2903856bbd0a95e7546788319ed22", "shasum": "" }, "require": { - "allure-framework/allure-php-api": "~1.1.0", - "codeception/codeception": "~2.1", - "php": ">=5.4.0", + "allure-framework/allure-php-api": "~1.2.1", + "codeception/codeception": "^2.3|^3.0|^4.0", + "php": ">=5.6", "symfony/filesystem": ">=2.6", "symfony/finder": ">=2.6" }, @@ -55,26 +55,26 @@ "steps", "testing" ], - "time": "2018-12-18T19:47:23+00:00" + "time": "2020-11-26T11:41:53+00:00" }, { "name": "allure-framework/allure-php-api", - "version": "1.1.8", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/allure-framework/allure-php-commons.git", - "reference": "5ae2deac1c7e1b992cfa572167370de45bdd346d" + "reference": "13ef45d83ce4f5ef70499ff87ed0c3d1c192ab80" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/allure-framework/allure-php-commons/zipball/5ae2deac1c7e1b992cfa572167370de45bdd346d", - "reference": "5ae2deac1c7e1b992cfa572167370de45bdd346d", + "url": "https://api.github.com/repos/allure-framework/allure-php-commons/zipball/13ef45d83ce4f5ef70499ff87ed0c3d1c192ab80", + "reference": "13ef45d83ce4f5ef70499ff87ed0c3d1c192ab80", "shasum": "" }, "require": { "jms/serializer": "^0.16 || ^1.0", "php": ">=5.4.0", - "ramsey/uuid": "^3.0", + "ramsey/uuid": "^3.0 || ^4.0", "symfony/http-foundation": "^2.0 || ^3.0 || ^4.0 || ^5.0" }, "require-dev": { @@ -108,7 +108,7 @@ "php", "report" ], - "time": "2020-03-13T10:47:35+00:00" + "time": "2020-11-26T09:20:44+00:00" }, { "name": "aws/aws-sdk-php", @@ -196,23 +196,23 @@ }, { "name": "behat/gherkin", - "version": "v4.6.2", + "version": "v4.7.1", "source": { "type": "git", "url": "https://github.com/Behat/Gherkin.git", - "reference": "51ac4500c4dc30cbaaabcd2f25694299df666a31" + "reference": "987bcdc3d29ba433e6bd4b1db4ae59737ba3dacd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Behat/Gherkin/zipball/51ac4500c4dc30cbaaabcd2f25694299df666a31", - "reference": "51ac4500c4dc30cbaaabcd2f25694299df666a31", + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/987bcdc3d29ba433e6bd4b1db4ae59737ba3dacd", + "reference": "987bcdc3d29ba433e6bd4b1db4ae59737ba3dacd", "shasum": "" }, "require": { - "php": ">=5.3.1" + "php": ">=5.6" }, "require-dev": { - "phpunit/phpunit": "~4.5|~5", + "phpunit/phpunit": "~5.7|~6|~7", "symfony/phpunit-bridge": "~2.7|~3|~4", "symfony/yaml": "~2.3|~3|~4" }, @@ -241,7 +241,7 @@ "homepage": "http://everzet.com" } ], - "description": "Gherkin DSL parser for PHP 5.3", + "description": "Gherkin DSL parser for PHP", "homepage": "http://behat.org/", "keywords": [ "BDD", @@ -251,7 +251,53 @@ "gherkin", "parser" ], - "time": "2020-03-17T14:03:26+00:00" + "time": "2021-01-26T16:24:32+00:00" + }, + { + "name": "brick/math", + "version": "0.9.2", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "dff976c2f3487d42c1db75a3b180e2b9f0e72ce0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/dff976c2f3487d42c1db75a3b180e2b9f0e72ce0", + "reference": "dff976c2f3487d42c1db75a3b180e2b9f0e72ce0", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.0", + "vimeo/psalm": "4.3.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "brick", + "math" + ], + "time": "2021-01-20T22:51:39+00:00" }, { "name": "cache/cache", @@ -348,57 +394,51 @@ }, { "name": "codeception/codeception", - "version": "2.4.5", + "version": "4.1.17", "source": { "type": "git", "url": "https://github.com/Codeception/Codeception.git", - "reference": "5fee32d5c82791548931cbc34806b4de6aa1abfc" + "reference": "c153b1ab289b3e3109e685379aa8847c54ac2b68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Codeception/zipball/5fee32d5c82791548931cbc34806b4de6aa1abfc", - "reference": "5fee32d5c82791548931cbc34806b4de6aa1abfc", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/c153b1ab289b3e3109e685379aa8847c54ac2b68", + "reference": "c153b1ab289b3e3109e685379aa8847c54ac2b68", "shasum": "" }, "require": { "behat/gherkin": "^4.4.0", - "codeception/phpunit-wrapper": "^6.0.9|^7.0.6", - "codeception/stub": "^2.0", + "codeception/lib-asserts": "^1.0", + "codeception/phpunit-wrapper": ">6.0.15 <6.1.0 | ^6.6.1 | ^7.7.1 | ^8.1.1 | ^9.0", + "codeception/stub": "^2.0 | ^3.0", + "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", - "facebook/webdriver": ">=1.1.3 <2.0", - "guzzlehttp/guzzle": ">=4.1.4 <7.0", - "guzzlehttp/psr7": "~1.0", - "php": ">=5.6.0 <8.0", - "symfony/browser-kit": ">=2.7 <5.0", - "symfony/console": ">=2.7 <5.0", - "symfony/css-selector": ">=2.7 <5.0", - "symfony/dom-crawler": ">=2.7 <5.0", - "symfony/event-dispatcher": ">=2.7 <5.0", - "symfony/finder": ">=2.7 <5.0", - "symfony/yaml": ">=2.7 <5.0" + "guzzlehttp/psr7": "~1.4", + "php": ">=5.6.0 <9.0", + "symfony/console": ">=2.7 <6.0", + "symfony/css-selector": ">=2.7 <6.0", + "symfony/event-dispatcher": ">=2.7 <6.0", + "symfony/finder": ">=2.7 <6.0", + "symfony/yaml": ">=2.7 <6.0" }, "require-dev": { + "codeception/module-asserts": "*@dev", + "codeception/module-cli": "*@dev", + "codeception/module-db": "*@dev", + "codeception/module-filesystem": "*@dev", + "codeception/module-phpbrowser": "*@dev", "codeception/specify": "~0.3", - "facebook/graph-sdk": "~5.3", - "flow/jsonpath": "~0.2", + "codeception/util-universalframework": "*@dev", "monolog/monolog": "~1.8", - "pda/pheanstalk": "~3.0", - "php-amqplib/php-amqplib": "~2.4", - "predis/predis": "^1.0", "squizlabs/php_codesniffer": "~2.0", - "symfony/process": ">=2.7 <5.0", - "vlucas/phpdotenv": "^2.4.0" + "symfony/process": ">=2.7 <6.0", + "vlucas/phpdotenv": "^2.0 | ^3.0 | ^4.0 | ^5.0" }, "suggest": { - "aws/aws-sdk-php": "For using AWS Auth in REST module and Queue module", - "codeception/phpbuiltinserver": "Start and stop PHP built-in web server for your tests", "codeception/specify": "BDD-style code blocks", "codeception/verify": "BDD-style assertions", - "flow/jsonpath": "For using JSONPath in REST module", - "league/factory-muffin": "For DataFactory module", - "league/factory-muffin-faker": "For Faker support in DataFactory module", - "phpseclib/phpseclib": "for SFTP option in FTP Module", + "hoa/console": "For interactive console functionality", "stecman/symfony-console-completion": "For BASH autocompletion", "symfony/phpunit-bridge": "For phpunit-bridge support" }, @@ -411,7 +451,7 @@ }, "autoload": { "psr-4": { - "Codeception\\": "src\\Codeception", + "Codeception\\": "src/Codeception", "Codeception\\Extension\\": "ext" } }, @@ -435,36 +475,230 @@ "functional testing", "unit testing" ], - "time": "2018-08-01T07:21:49+00:00" + "time": "2021-02-01T07:30:47+00:00" + }, + { + "name": "codeception/lib-asserts", + "version": "1.13.2", + "source": { + "type": "git", + "url": "https://github.com/Codeception/lib-asserts.git", + "reference": "184231d5eab66bc69afd6b9429344d80c67a33b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/lib-asserts/zipball/184231d5eab66bc69afd6b9429344d80c67a33b6", + "reference": "184231d5eab66bc69afd6b9429344d80c67a33b6", + "shasum": "" + }, + "require": { + "codeception/phpunit-wrapper": ">6.0.15 <6.1.0 | ^6.6.1 | ^7.7.1 | ^8.0.3 | ^9.0", + "ext-dom": "*", + "php": ">=5.6.0 <9.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert@mail.ua", + "homepage": "http://codegyre.com" + }, + { + "name": "Gintautas Miselis" + }, + { + "name": "Gustavo Nieves", + "homepage": "https://medium.com/@ganieves" + } + ], + "description": "Assertion methods used by Codeception core and Asserts module", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception" + ], + "time": "2020-10-21T16:26:20+00:00" + }, + { + "name": "codeception/module-asserts", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-asserts.git", + "reference": "59374f2fef0cabb9e8ddb53277e85cdca74328de" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-asserts/zipball/59374f2fef0cabb9e8ddb53277e85cdca74328de", + "reference": "59374f2fef0cabb9e8ddb53277e85cdca74328de", + "shasum": "" + }, + "require": { + "codeception/codeception": "*@dev", + "codeception/lib-asserts": "^1.13.1", + "php": ">=5.6.0 <9.0" + }, + "conflict": { + "codeception/codeception": "<4.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + }, + { + "name": "Gintautas Miselis" + }, + { + "name": "Gustavo Nieves", + "homepage": "https://medium.com/@ganieves" + } + ], + "description": "Codeception module containing various assertions", + "homepage": "https://codeception.com/", + "keywords": [ + "assertions", + "asserts", + "codeception" + ], + "time": "2020-10-21T16:48:15+00:00" + }, + { + "name": "codeception/module-sequence", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-sequence.git", + "reference": "b75be26681ae90824cde8f8df785981f293667e1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-sequence/zipball/b75be26681ae90824cde8f8df785981f293667e1", + "reference": "b75be26681ae90824cde8f8df785981f293667e1", + "shasum": "" + }, + "require": { + "codeception/codeception": "^4.0", + "php": ">=5.6.0 <9.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + } + ], + "description": "Sequence module for Codeception", + "homepage": "http://codeception.com/", + "keywords": [ + "codeception" + ], + "time": "2020-10-31T18:36:26+00:00" + }, + { + "name": "codeception/module-webdriver", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-webdriver.git", + "reference": "63ea08880a44df809bdfbca08597e1b68cee9f87" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-webdriver/zipball/63ea08880a44df809bdfbca08597e1b68cee9f87", + "reference": "63ea08880a44df809bdfbca08597e1b68cee9f87", + "shasum": "" + }, + "require": { + "codeception/codeception": "^4.0", + "php": ">=5.6.0 <9.0", + "php-webdriver/webdriver": "^1.8.0" + }, + "suggest": { + "codeception/phpbuiltinserver": "Start and stop PHP built-in web server for your tests" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + }, + { + "name": "Gintautas Miselis" + }, + { + "name": "Zaahid Bateson" + } + ], + "description": "WebDriver module for Codeception", + "homepage": "http://codeception.com/", + "keywords": [ + "acceptance-testing", + "browser-testing", + "codeception" + ], + "time": "2021-01-17T19:23:20+00:00" }, { "name": "codeception/phpunit-wrapper", - "version": "7.0.6", + "version": "9.0.6", "source": { "type": "git", "url": "https://github.com/Codeception/phpunit-wrapper.git", - "reference": "e8528cb777cf5a5ccea1cf57a3522b142625d1b5" + "reference": "b0c06abb3181eedca690170f7ed0fd26a70bfacc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/phpunit-wrapper/zipball/e8528cb777cf5a5ccea1cf57a3522b142625d1b5", - "reference": "e8528cb777cf5a5ccea1cf57a3522b142625d1b5", + "url": "https://api.github.com/repos/Codeception/phpunit-wrapper/zipball/b0c06abb3181eedca690170f7ed0fd26a70bfacc", + "reference": "b0c06abb3181eedca690170f7ed0fd26a70bfacc", "shasum": "" }, "require": { - "phpunit/php-code-coverage": "^6.0", - "phpunit/phpunit": "^7.0", - "sebastian/comparator": "^2.0", - "sebastian/diff": "^3.0" + "php": ">=7.2", + "phpunit/phpunit": "^9.0" }, "require-dev": { "codeception/specify": "*", - "vlucas/phpdotenv": "^2.4" + "consolidation/robo": "^3.0.0-alpha3", + "vlucas/phpdotenv": "^3.0" }, "type": "library", "autoload": { "psr-4": { - "Codeception\\PHPUnit\\": "src\\" + "Codeception\\PHPUnit\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -475,27 +709,30 @@ { "name": "Davert", "email": "davert.php@resend.cc" + }, + { + "name": "Naktibalda" } ], "description": "PHPUnit classes used by Codeception", - "time": "2018-03-31T18:49:51+00:00" + "time": "2020-12-28T13:59:47+00:00" }, { "name": "codeception/stub", - "version": "2.0.4", + "version": "3.7.0", "source": { "type": "git", "url": "https://github.com/Codeception/Stub.git", - "reference": "f50bc271f392a2836ff80690ce0c058efe1ae03e" + "reference": "468dd5fe659f131fc997f5196aad87512f9b1304" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeception/Stub/zipball/f50bc271f392a2836ff80690ce0c058efe1ae03e", - "reference": "f50bc271f392a2836ff80690ce0c058efe1ae03e", + "url": "https://api.github.com/repos/Codeception/Stub/zipball/468dd5fe659f131fc997f5196aad87512f9b1304", + "reference": "468dd5fe659f131fc997f5196aad87512f9b1304", "shasum": "" }, "require": { - "phpunit/phpunit": ">=4.8 <8.0" + "phpunit/phpunit": "^8.4 | ^9.0" }, "type": "library", "autoload": { @@ -508,7 +745,7 @@ "MIT" ], "description": "Flexible Stub wrapper for PHPUnit's Mock Builder", - "time": "2018-07-26T11:55:37+00:00" + "time": "2020-07-03T15:54:43+00:00" }, { "name": "composer/ca-bundle", @@ -809,12 +1046,6 @@ "Xdebug", "performance" ], - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - } - ], "time": "2020-03-01T12:26:26+00:00" }, { @@ -905,30 +1136,33 @@ }, { "name": "doctrine/annotations", - "version": "v1.8.0", + "version": "1.11.1", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "904dca4eb10715b92569fbcd79e201d5c349b6bc" + "reference": "ce77a7ba1770462cd705a91a151b6c3746f9c6ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/904dca4eb10715b92569fbcd79e201d5c349b6bc", - "reference": "904dca4eb10715b92569fbcd79e201d5c349b6bc", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/ce77a7ba1770462cd705a91a151b6c3746f9c6ad", + "reference": "ce77a7ba1770462cd705a91a151b6c3746f9c6ad", "shasum": "" }, "require": { "doctrine/lexer": "1.*", - "php": "^7.1" + "ext-tokenizer": "*", + "php": "^7.1 || ^8.0" }, "require-dev": { "doctrine/cache": "1.*", - "phpunit/phpunit": "^7.5" + "doctrine/coding-standard": "^6.0 || ^8.1", + "phpstan/phpstan": "^0.12.20", + "phpunit/phpunit": "^7.5 || ^9.1.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.7.x-dev" + "dev-master": "1.11.x-dev" } }, "autoload": { @@ -963,13 +1197,13 @@ } ], "description": "Docblock Annotations Parser", - "homepage": "http://www.doctrine-project.org", + "homepage": "https://www.doctrine-project.org/projects/annotations.html", "keywords": [ "annotations", "docblock", "parser" ], - "time": "2019-10-01T18:55:10+00:00" + "time": "2020-10-26T10:28:16+00:00" }, { "name": "doctrine/cache", @@ -1110,36 +1344,31 @@ }, { "name": "doctrine/instantiator", - "version": "1.3.0", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "ae466f726242e637cebdd526a7d991b9433bacf1" + "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/ae466f726242e637cebdd526a7d991b9433bacf1", - "reference": "ae466f726242e637cebdd526a7d991b9433bacf1", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", + "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", "shasum": "" }, "require": { - "php": "^7.1" + "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^6.0", + "doctrine/coding-standard": "^8.0", "ext-pdo": "*", "ext-phar": "*", - "phpbench/phpbench": "^0.13", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-shim": "^0.11", - "phpunit/phpunit": "^7.0" + "phpbench/phpbench": "^0.13 || 1.0.0-alpha2", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" @@ -1153,7 +1382,7 @@ { "name": "Marco Pivetta", "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" + "homepage": "https://ocramius.github.io/" } ], "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", @@ -1162,32 +1391,34 @@ "constructor", "instantiate" ], - "time": "2019-10-21T16:45:58+00:00" + "time": "2020-11-10T18:47:58+00:00" }, { "name": "doctrine/lexer", - "version": "1.0.2", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "1febd6c3ef84253d7c815bed85fc622ad207a9f8" + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/1febd6c3ef84253d7c815bed85fc622ad207a9f8", - "reference": "1febd6c3ef84253d7c815bed85fc622ad207a9f8", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", "shasum": "" }, "require": { - "php": ">=5.3.2" + "php": "^7.2 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^4.5" + "doctrine/coding-standard": "^6.0", + "phpstan/phpstan": "^0.11.8", + "phpunit/phpunit": "^8.2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.2.x-dev" } }, "autoload": { @@ -1200,14 +1431,14 @@ "MIT" ], "authors": [ - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, { "name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com" }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, { "name": "Johannes Schmitt", "email": "schmittjoh@gmail.com" @@ -1222,7 +1453,7 @@ "parser", "php" ], - "time": "2019-06-08T11:03:04+00:00" + "time": "2020-05-25T17:44:05+00:00" }, { "name": "flow/jsonpath", @@ -1319,23 +1550,24 @@ }, { "name": "guzzlehttp/guzzle", - "version": "6.5.2", + "version": "6.5.3", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "43ece0e75098b7ecd8d13918293029e555a50f82" + "reference": "aab4ebd862aa7d04f01a4b51849d657db56d882e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/43ece0e75098b7ecd8d13918293029e555a50f82", - "reference": "43ece0e75098b7ecd8d13918293029e555a50f82", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/aab4ebd862aa7d04f01a4b51849d657db56d882e", + "reference": "aab4ebd862aa7d04f01a4b51849d657db56d882e", "shasum": "" }, "require": { "ext-json": "*", "guzzlehttp/promises": "^1.0", "guzzlehttp/psr7": "^1.6.1", - "php": ">=5.5" + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.11" }, "require-dev": { "ext-curl": "*", @@ -1343,7 +1575,6 @@ "psr/log": "^1.1" }, "suggest": { - "ext-intl": "Required for Internationalized Domain Name (IDN) support", "psr/log": "Required for using the Log middleware" }, "type": "library", @@ -1382,27 +1613,27 @@ "rest", "web service" ], - "time": "2019-12-23T11:57:10+00:00" + "time": "2020-04-18T10:38:46+00:00" }, { "name": "guzzlehttp/promises", - "version": "v1.3.1", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" + "reference": "60d379c243457e073cff02bc323a2a86cb355631" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "url": "https://api.github.com/repos/guzzle/promises/zipball/60d379c243457e073cff02bc323a2a86cb355631", + "reference": "60d379c243457e073cff02bc323a2a86cb355631", "shasum": "" }, "require": { - "php": ">=5.5.0" + "php": ">=5.5" }, "require-dev": { - "phpunit/phpunit": "^4.0" + "symfony/phpunit-bridge": "^4.4 || ^5.1" }, "type": "library", "extra": { @@ -1433,20 +1664,20 @@ "keywords": [ "promise" ], - "time": "2016-12-20T10:07:11+00:00" + "time": "2020-09-30T07:37:28+00:00" }, { "name": "guzzlehttp/psr7", - "version": "1.6.1", + "version": "1.7.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "239400de7a173fe9901b9ac7c06497751f00727a" + "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", - "reference": "239400de7a173fe9901b9ac7c06497751f00727a", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/53330f47520498c0ae1f61f7e2c90f55690c06a3", + "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3", "shasum": "" }, "require": { @@ -1459,15 +1690,15 @@ }, "require-dev": { "ext-zlib": "*", - "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10" }, "suggest": { - "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.6-dev" + "dev-master": "1.7-dev" } }, "autoload": { @@ -1504,7 +1735,7 @@ "uri", "url" ], - "time": "2019-07-01T23:21:34+00:00" + "time": "2020-09-30T07:37:11+00:00" }, { "name": "jms/metadata", @@ -2013,20 +2244,20 @@ }, { "name": "myclabs/deep-copy", - "version": "1.9.5", + "version": "1.10.2", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef" + "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/b2c28789e80a97badd14145fda39b545d83ca3ef", - "reference": "b2c28789e80a97badd14145fda39b545d83ca3ef", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220", + "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220", "shasum": "" }, "require": { - "php": "^7.1" + "php": "^7.1 || ^8.0" }, "replace": { "myclabs/deep-copy": "self.version" @@ -2057,71 +2288,26 @@ "object", "object graph" ], - "time": "2020-01-17T21:11:47+00:00" - }, - { - "name": "paragonie/random_compat", - "version": "v9.99.99", - "source": { - "type": "git", - "url": "https://github.com/paragonie/random_compat.git", - "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", - "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", - "shasum": "" - }, - "require": { - "php": "^7" - }, - "require-dev": { - "phpunit/phpunit": "4.*|5.*", - "vimeo/psalm": "^1" - }, - "suggest": { - "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." - }, - "type": "library", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com", - "homepage": "https://paragonie.com" - } - ], - "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", - "keywords": [ - "csprng", - "polyfill", - "pseudorandom", - "random" - ], - "time": "2018-07-02T15:55:56+00:00" + "time": "2020-11-13T09:40:50+00:00" }, { "name": "phar-io/manifest", - "version": "1.0.1", + "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", - "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0" + "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/2df402786ab5368a0169091f61a7c1e0eb6852d0", - "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", + "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", "shasum": "" }, "require": { "ext-dom": "*", "ext-phar": "*", - "phar-io/version": "^1.0.1", + "phar-io/version": "^2.0", "php": "^5.6 || ^7.0" }, "type": "library", @@ -2157,20 +2343,20 @@ } ], "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "time": "2017-03-05T18:14:27+00:00" + "time": "2018-07-08T19:23:20+00:00" }, { "name": "phar-io/version", - "version": "1.0.1", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/phar-io/version.git", - "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df" + "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/a70c0ced4be299a63d32fa96d9281d03e94041df", - "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df", + "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", + "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", "shasum": "" }, "require": { @@ -2204,7 +2390,7 @@ } ], "description": "Library for handling version information and constraints", - "time": "2017-03-05T17:38:23+00:00" + "time": "2018-07-08T19:19:57+00:00" }, { "name": "php-webdriver/webdriver", @@ -2321,28 +2507,25 @@ }, { "name": "phpdocumentor/reflection-common", - "version": "2.0.0", + "version": "2.2.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a" + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/63a995caa1ca9e5590304cd845c15ad6d482a62a", - "reference": "63a995caa1ca9e5590304cd845c15ad6d482a62a", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", "shasum": "" }, "require": { - "php": ">=7.1" - }, - "require-dev": { - "phpunit/phpunit": "~6" + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.x-dev" + "dev-2.x": "2.x-dev" } }, "autoload": { @@ -2369,45 +2552,41 @@ "reflection", "static analysis" ], - "time": "2018-08-07T13:53:10+00:00" + "time": "2020-06-27T09:03:43+00:00" }, { "name": "phpdocumentor/reflection-docblock", - "version": "4.3.4", + "version": "5.2.2", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "da3fd972d6bafd628114f7e7e036f45944b62e9c" + "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/da3fd972d6bafd628114f7e7e036f45944b62e9c", - "reference": "da3fd972d6bafd628114f7e7e036f45944b62e9c", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556", + "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556", "shasum": "" }, "require": { - "php": "^7.0", - "phpdocumentor/reflection-common": "^1.0.0 || ^2.0.0", - "phpdocumentor/type-resolver": "~0.4 || ^1.0.0", - "webmozart/assert": "^1.0" + "ext-filter": "*", + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.3", + "webmozart/assert": "^1.9.1" }, "require-dev": { - "doctrine/instantiator": "^1.0.5", - "mockery/mockery": "^1.0", - "phpdocumentor/type-resolver": "0.4.*", - "phpunit/phpunit": "^6.4" + "mockery/mockery": "~1.3.2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.x-dev" + "dev-master": "5.x-dev" } }, "autoload": { "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src/" - ] + "phpDocumentor\\Reflection\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -2418,38 +2597,40 @@ { "name": "Mike van Riel", "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "account@ijaap.nl" } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2019-12-28T18:55:12+00:00" + "time": "2020-09-03T19:13:55+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "1.0.1", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9" + "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/2e32a6d48972b2c1976ed5d8967145b6cec4a4a9", - "reference": "2e32a6d48972b2c1976ed5d8967145b6cec4a4a9", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", + "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", "shasum": "" }, "require": { - "php": "^7.1", + "php": "^7.2 || ^8.0", "phpdocumentor/reflection-common": "^2.0" }, "require-dev": { - "ext-tokenizer": "^7.1", - "mockery/mockery": "~1", - "phpunit/phpunit": "^7.0" + "ext-tokenizer": "*" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.x-dev" + "dev-1.x": "1.x-dev" } }, "autoload": { @@ -2468,28 +2649,28 @@ } ], "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "time": "2019-08-22T18:11:29+00:00" + "time": "2020-09-17T18:55:26+00:00" }, { "name": "phpoption/phpoption", - "version": "1.7.3", + "version": "1.7.5", "source": { "type": "git", "url": "https://github.com/schmittjoh/php-option.git", - "reference": "4acfd6a4b33a509d8c88f50e5222f734b6aeebae" + "reference": "994ecccd8f3283ecf5ac33254543eb0ac946d525" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/4acfd6a4b33a509d8c88f50e5222f734b6aeebae", - "reference": "4acfd6a4b33a509d8c88f50e5222f734b6aeebae", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/994ecccd8f3283ecf5ac33254543eb0ac946d525", + "reference": "994ecccd8f3283ecf5ac33254543eb0ac946d525", "shasum": "" }, "require": { "php": "^5.5.9 || ^7.0 || ^8.0" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.3", - "phpunit/phpunit": "^4.8.35 || ^5.0 || ^6.0 || ^7.0" + "bamarni/composer-bin-plugin": "^1.4.1", + "phpunit/phpunit": "^4.8.35 || ^5.7.27 || ^6.5.6 || ^7.0 || ^8.0 || ^9.0" }, "type": "library", "extra": { @@ -2523,37 +2704,37 @@ "php", "type" ], - "time": "2020-03-21T18:07:53+00:00" + "time": "2020-07-20T17:29:33+00:00" }, { "name": "phpspec/prophecy", - "version": "v1.10.3", + "version": "1.12.2", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "451c3cd1418cf640de218914901e51b064abb093" + "reference": "245710e971a030f42e08f4912863805570f23d39" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093", - "reference": "451c3cd1418cf640de218914901e51b064abb093", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/245710e971a030f42e08f4912863805570f23d39", + "reference": "245710e971a030f42e08f4912863805570f23d39", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.0.2", - "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0", - "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0", - "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0" + "doctrine/instantiator": "^1.2", + "php": "^7.2 || ~8.0, <8.1", + "phpdocumentor/reflection-docblock": "^5.2", + "sebastian/comparator": "^3.0 || ^4.0", + "sebastian/recursion-context": "^3.0 || ^4.0" }, "require-dev": { - "phpspec/phpspec": "^2.5 || ^3.2", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" + "phpspec/phpspec": "^6.0", + "phpunit/phpunit": "^8.0 || ^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.10.x-dev" + "dev-master": "1.11.x-dev" } }, "autoload": { @@ -2586,44 +2767,45 @@ "spy", "stub" ], - "time": "2020-03-05T15:02:03+00:00" + "time": "2020-12-19T10:15:11+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "6.0.5", + "version": "8.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "4cab20a326d14de7575a8e235c70d879b569a57a" + "reference": "ca6647ffddd2add025ab3f21644a441d7c146cdc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/4cab20a326d14de7575a8e235c70d879b569a57a", - "reference": "4cab20a326d14de7575a8e235c70d879b569a57a", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ca6647ffddd2add025ab3f21644a441d7c146cdc", + "reference": "ca6647ffddd2add025ab3f21644a441d7c146cdc", "shasum": "" }, "require": { "ext-dom": "*", "ext-xmlwriter": "*", - "php": "^7.1", - "phpunit/php-file-iterator": "^1.4.2", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-token-stream": "^3.0", - "sebastian/code-unit-reverse-lookup": "^1.0.1", - "sebastian/environment": "^3.1", - "sebastian/version": "^2.0.1", - "theseer/tokenizer": "^1.1" + "php": "^7.3", + "phpunit/php-file-iterator": "^3.0", + "phpunit/php-text-template": "^2.0", + "phpunit/php-token-stream": "^4.0", + "sebastian/code-unit-reverse-lookup": "^2.0", + "sebastian/environment": "^5.0", + "sebastian/version": "^3.0", + "theseer/tokenizer": "^1.1.3" }, "require-dev": { - "phpunit/phpunit": "^7.0" + "phpunit/phpunit": "^9.0" }, "suggest": { - "ext-xdebug": "^2.6.0" + "ext-pcov": "*", + "ext-xdebug": "*" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "6.0-dev" + "dev-master": "8.0-dev" } }, "autoload": { @@ -2649,29 +2831,32 @@ "testing", "xunit" ], - "time": "2018-05-28T11:49:20+00:00" + "time": "2020-05-23T08:02:54+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "1.4.5", + "version": "3.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4" + "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4", - "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/aa4be8575f26070b100fccb67faabb28f21f66f8", + "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4.x-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -2686,7 +2871,7 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", + "email": "sebastian@phpunit.de", "role": "lead" } ], @@ -2696,26 +2881,38 @@ "filesystem", "iterator" ], - "time": "2017-11-27T13:52:08+00:00" + "time": "2020-09-28T05:57:25+00:00" }, { - "name": "phpunit/php-text-template", - "version": "1.2.1", + "name": "phpunit/php-invoker", + "version": "3.1.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, "autoload": { "classmap": [ "src/" @@ -2732,37 +2929,37 @@ "role": "lead" } ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", "keywords": [ - "template" + "process" ], - "time": "2015-06-21T13:50:34+00:00" + "time": "2020-09-28T05:58:55+00:00" }, { - "name": "phpunit/php-timer", - "version": "2.1.2", + "name": "phpunit/php-text-template", + "version": "2.0.4", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "1038454804406b0b5f5f520358e78c1c2f71501e" + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e", - "reference": "1038454804406b0b5f5f520358e78c1c2f71501e", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", "shasum": "" }, "require": { - "php": "^7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^7.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -2781,38 +2978,37 @@ "role": "lead" } ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", "keywords": [ - "timer" + "template" ], - "time": "2019-06-07T04:22:29+00:00" + "time": "2020-10-26T05:33:50+00:00" }, { - "name": "phpunit/php-token-stream", - "version": "3.1.1", + "name": "phpunit/php-timer", + "version": "5.0.3", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff" + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff", - "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", "shasum": "" }, "require": { - "ext-tokenizer": "*", - "php": "^7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^7.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -2827,70 +3023,42 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" + "email": "sebastian@phpunit.de", + "role": "lead" } ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", "keywords": [ - "tokenizer" + "timer" ], - "abandoned": true, - "time": "2019-09-17T06:23:10+00:00" + "time": "2020-10-26T13:16:10+00:00" }, { - "name": "phpunit/phpunit", - "version": "7.0.3", + "name": "phpunit/php-token-stream", + "version": "4.0.4", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "536f4d853c12d8189963435088e8ff7c0daeab2e" + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "a853a0e183b9db7eed023d7933a858fa1c8d25a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/536f4d853c12d8189963435088e8ff7c0daeab2e", - "reference": "536f4d853c12d8189963435088e8ff7c0daeab2e", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/a853a0e183b9db7eed023d7933a858fa1c8d25a3", + "reference": "a853a0e183b9db7eed023d7933a858fa1c8d25a3", "shasum": "" }, "require": { - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "myclabs/deep-copy": "^1.6.1", - "phar-io/manifest": "^1.0.1", - "phar-io/version": "^1.0", - "php": "^7.1", - "phpspec/prophecy": "^1.7", - "phpunit/php-code-coverage": "^6.0.1", - "phpunit/php-file-iterator": "^1.4.3", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-timer": "^2.0", - "phpunit/phpunit-mock-objects": "^6.0", - "sebastian/comparator": "^2.1", - "sebastian/diff": "^3.0", - "sebastian/environment": "^3.1", - "sebastian/exporter": "^3.1", - "sebastian/global-state": "^2.0", - "sebastian/object-enumerator": "^3.0.3", - "sebastian/resource-operations": "^1.0", - "sebastian/version": "^2.0.1" + "ext-tokenizer": "*", + "php": "^7.3 || ^8.0" }, "require-dev": { - "ext-pdo": "*" - }, - "suggest": { - "ext-xdebug": "*", - "phpunit/php-invoker": "^2.0" + "phpunit/phpunit": "^9.0" }, - "bin": [ - "phpunit" - ], "type": "library", "extra": { "branch-alias": { - "dev-master": "7.0-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -2905,54 +3073,83 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" + "email": "sebastian@phpunit.de" } ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", "keywords": [ - "phpunit", - "testing", - "xunit" + "tokenizer" ], - "time": "2018-03-26T07:36:48+00:00" + "abandoned": true, + "time": "2020-08-04T08:28:15+00:00" }, { - "name": "phpunit/phpunit-mock-objects", - "version": "6.1.2", + "name": "phpunit/phpunit", + "version": "9.2.6", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "f9756fd4f43f014cb2dca98deeaaa8ce5500a36e" + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "1c6a9e4312e209e659f1fce3ce88dd197c2448f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/f9756fd4f43f014cb2dca98deeaaa8ce5500a36e", - "reference": "f9756fd4f43f014cb2dca98deeaaa8ce5500a36e", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1c6a9e4312e209e659f1fce3ce88dd197c2448f6", + "reference": "1c6a9e4312e209e659f1fce3ce88dd197c2448f6", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.0.5", - "php": "^7.1", - "phpunit/php-text-template": "^1.2.1", - "sebastian/exporter": "^3.1" + "doctrine/instantiator": "^1.3.1", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.9.5", + "phar-io/manifest": "^1.0.3", + "phar-io/version": "^2.0.1", + "php": "^7.3", + "phpspec/prophecy": "^1.10.3", + "phpunit/php-code-coverage": "^8.0.2", + "phpunit/php-file-iterator": "^3.0.3", + "phpunit/php-invoker": "^3.0.2", + "phpunit/php-text-template": "^2.0.2", + "phpunit/php-timer": "^5.0.1", + "sebastian/code-unit": "^1.0.5", + "sebastian/comparator": "^4.0.3", + "sebastian/diff": "^4.0.1", + "sebastian/environment": "^5.1.2", + "sebastian/exporter": "^4.0.2", + "sebastian/global-state": "^4.0", + "sebastian/object-enumerator": "^4.0.2", + "sebastian/resource-operations": "^3.0.2", + "sebastian/type": "^2.1.1", + "sebastian/version": "^3.0.1" }, "require-dev": { - "phpunit/phpunit": "^7.0" + "ext-pdo": "*", + "phpspec/prophecy-phpunit": "^2.0" }, "suggest": { - "ext-soap": "*" + "ext-soap": "*", + "ext-xdebug": "*" }, + "bin": [ + "phpunit" + ], "type": "library", "extra": { "branch-alias": { - "dev-master": "6.1-dev" + "dev-master": "9.2-dev" } }, "autoload": { "classmap": [ "src/" + ], + "files": [ + "src/Framework/Assert/Functions.php" ] }, "notification-url": "https://packagist.org/downloads/", @@ -2966,14 +3163,14 @@ "role": "lead" } ], - "description": "Mock Object library for PHPUnit", - "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", "keywords": [ - "mock", + "phpunit", + "testing", "xunit" ], - "abandoned": true, - "time": "2018-05-29T13:54:20+00:00" + "time": "2020-07-13T17:55:55+00:00" }, { "name": "psr/cache", @@ -3255,55 +3452,127 @@ "description": "A polyfill for getallheaders.", "time": "2019-03-08T08:55:37+00:00" }, + { + "name": "ramsey/collection", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "28a5c4ab2f5111db6a60b2b4ec84057e0f43b9c1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/28a5c4ab2f5111db6a60b2b4ec84057e0f43b9c1", + "reference": "28a5c4ab2f5111db6a60b2b4ec84057e0f43b9c1", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8" + }, + "require-dev": { + "captainhook/captainhook": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "ergebnis/composer-normalize": "^2.6", + "fakerphp/faker": "^1.5", + "hamcrest/hamcrest-php": "^2", + "jangregor/phpstan-prophecy": "^0.8", + "mockery/mockery": "^1.3", + "phpstan/extension-installer": "^1", + "phpstan/phpstan": "^0.12.32", + "phpstan/phpstan-mockery": "^0.12.5", + "phpstan/phpstan-phpunit": "^0.12.11", + "phpunit/phpunit": "^8.5 || ^9", + "psy/psysh": "^0.10.4", + "slevomat/coding-standard": "^6.3", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP 7.2+ library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "time": "2021-01-21T17:40:04+00:00" + }, { "name": "ramsey/uuid", - "version": "3.9.3", + "version": "4.1.1", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "7e1633a6964b48589b142d60542f9ed31bd37a92" + "reference": "cd4032040a750077205918c86049aa0f43d22947" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/7e1633a6964b48589b142d60542f9ed31bd37a92", - "reference": "7e1633a6964b48589b142d60542f9ed31bd37a92", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/cd4032040a750077205918c86049aa0f43d22947", + "reference": "cd4032040a750077205918c86049aa0f43d22947", "shasum": "" }, "require": { + "brick/math": "^0.8 || ^0.9", "ext-json": "*", - "paragonie/random_compat": "^1 | ^2 | 9.99.99", - "php": "^5.4 | ^7 | ^8", + "php": "^7.2 || ^8", + "ramsey/collection": "^1.0", "symfony/polyfill-ctype": "^1.8" }, "replace": { "rhumsaa/uuid": "self.version" }, "require-dev": { - "codeception/aspect-mock": "^1 | ^2", - "doctrine/annotations": "^1.2", - "goaop/framework": "1.0.0-alpha.2 | ^1 | ^2.1", - "jakub-onderka/php-parallel-lint": "^1", - "mockery/mockery": "^0.9.11 | ^1", + "codeception/aspect-mock": "^3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7.0", + "doctrine/annotations": "^1.8", + "goaop/framework": "^2", + "mockery/mockery": "^1.3", "moontoast/math": "^1.1", "paragonie/random-lib": "^2", - "php-mock/php-mock-phpunit": "^0.3 | ^1.1", - "phpunit/phpunit": "^4.8 | ^5.4 | ^6.5", - "squizlabs/php_codesniffer": "^3.5" + "php-mock/php-mock-mockery": "^1.3", + "php-mock/php-mock-phpunit": "^2.5", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^0.17.1", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-mockery": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^8.5", + "psy/psysh": "^0.10.0", + "slevomat/coding-standard": "^6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "3.9.4" }, "suggest": { - "ext-ctype": "Provides support for PHP Ctype functions", - "ext-libsodium": "Provides the PECL libsodium extension for use with the SodiumRandomGenerator", - "ext-openssl": "Provides the OpenSSL extension for use with the OpenSslGenerator", - "ext-uuid": "Provides the PECL UUID extension for use with the PeclUuidTimeGenerator and PeclUuidRandomGenerator", - "moontoast/math": "Provides support for converting UUID to 128-bit integer (in string form).", + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-ctype": "Enables faster processing of character classification using ctype functions.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", - "ramsey/uuid-console": "A console application for generating UUIDs with ramsey/uuid", "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.x-dev" + "dev-master": "4.x-dev" } }, "autoload": { @@ -3318,54 +3587,85 @@ "license": [ "MIT" ], - "authors": [ - { - "name": "Ben Ramsey", - "email": "ben@benramsey.com", - "homepage": "https://benramsey.com" - }, - { - "name": "Marijn Huizendveld", - "email": "marijn.huizendveld@gmail.com" - }, - { - "name": "Thibaud Fabre", - "email": "thibaud@aztech.io" - } - ], - "description": "Formerly rhumsaa/uuid. A PHP 5.4+ library for generating RFC 4122 version 1, 3, 4, and 5 universally unique identifiers (UUID).", + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", "homepage": "https://github.com/ramsey/uuid", "keywords": [ "guid", "identifier", "uuid" ], - "time": "2020-02-21T04:36:14+00:00" + "time": "2020-08-18T17:17:46+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "time": "2020-10-26T13:08:54+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", - "version": "1.0.1", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -3385,34 +3685,34 @@ ], "description": "Looks up which function or method a line of code belongs to", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "time": "2017-03-04T06:30:41+00:00" + "time": "2020-09-28T05:30:19+00:00" }, { "name": "sebastian/comparator", - "version": "2.1.3", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9" + "reference": "55f4261989e546dc112258c7a75935a81a7ce382" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/34369daee48eafb2651bea869b4b15d75ccc35f9", - "reference": "34369daee48eafb2651bea869b4b15d75ccc35f9", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", + "reference": "55f4261989e546dc112258c7a75935a81a7ce382", "shasum": "" }, "require": { - "php": "^7.0", - "sebastian/diff": "^2.0 || ^3.0", - "sebastian/exporter": "^3.1" + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" }, "require-dev": { - "phpunit/phpunit": "^6.4" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -3425,6 +3725,10 @@ "BSD-3-Clause" ], "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" @@ -3436,10 +3740,6 @@ { "name": "Bernhard Schussek", "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" } ], "description": "Provides the functionality to compare PHP values for equality", @@ -3449,33 +3749,33 @@ "compare", "equality" ], - "time": "2018-02-01T13:46:46+00:00" + "time": "2020-10-26T15:49:45+00:00" }, { "name": "sebastian/diff", - "version": "3.0.2", + "version": "4.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", - "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", "shasum": "" }, "require": { - "php": "^7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^7.5 || ^8.0", - "symfony/process": "^2 || ^3.3 || ^4" + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -3488,13 +3788,13 @@ "BSD-3-Clause" ], "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" } ], "description": "Diff implementation", @@ -3505,32 +3805,35 @@ "unidiff", "unified diff" ], - "time": "2019-02-04T06:01:07+00:00" + "time": "2020-10-26T13:10:38+00:00" }, { "name": "sebastian/environment", - "version": "3.1.0", + "version": "5.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5" + "reference": "388b6ced16caa751030f6a69e588299fa09200ac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/cd0871b3975fb7fc44d11314fd1ee20925fce4f5", - "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac", + "reference": "388b6ced16caa751030f6a69e588299fa09200ac", "shasum": "" }, "require": { - "php": "^7.0" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^6.1" + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-posix": "*" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1.x-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -3555,34 +3858,34 @@ "environment", "hhvm" ], - "time": "2017-07-01T08:51:00+00:00" + "time": "2020-09-28T05:52:38+00:00" }, { "name": "sebastian/exporter", - "version": "3.1.2", + "version": "4.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e" + "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e", - "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/d89cc98761b8cb5a1a235a6b703ae50d34080e65", + "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65", "shasum": "" }, "require": { - "php": "^7.0", - "sebastian/recursion-context": "^3.0" + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" }, "require-dev": { "ext-mbstring": "*", - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -3622,27 +3925,30 @@ "export", "exporter" ], - "time": "2019-09-14T09:02:43+00:00" + "time": "2020-09-28T05:24:23+00:00" }, { "name": "sebastian/global-state", - "version": "2.0.0", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" + "reference": "bdb1e7c79e592b8c82cb1699be3c8743119b8a72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", - "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bdb1e7c79e592b8c82cb1699be3c8743119b8a72", + "reference": "bdb1e7c79e592b8c82cb1699be3c8743119b8a72", "shasum": "" }, "require": { - "php": "^7.0" + "php": "^7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "ext-dom": "*", + "phpunit/phpunit": "^9.0" }, "suggest": { "ext-uopz": "*" @@ -3650,7 +3956,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -3673,34 +3979,34 @@ "keywords": [ "global state" ], - "time": "2017-04-27T15:39:26+00:00" + "time": "2020-02-07T06:11:37+00:00" }, { "name": "sebastian/object-enumerator", - "version": "3.0.3", + "version": "4.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", "shasum": "" }, "require": { - "php": "^7.0", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -3720,32 +4026,32 @@ ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "time": "2017-08-03T12:35:26+00:00" + "time": "2020-10-26T13:12:34+00:00" }, { "name": "sebastian/object-reflector", - "version": "1.1.1", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "773f97c67f28de00d397be301821b06708fca0be" + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", - "reference": "773f97c67f28de00d397be301821b06708fca0be", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", "shasum": "" }, "require": { - "php": "^7.0" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -3765,32 +4071,32 @@ ], "description": "Allows reflection of object attributes, including inherited and non-public ones", "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "time": "2017-03-29T09:07:27+00:00" + "time": "2020-10-26T13:14:26+00:00" }, { "name": "sebastian/recursion-context", - "version": "3.0.0", + "version": "4.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" + "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", + "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", "shasum": "" }, "require": { - "php": "^7.0" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -3803,14 +4109,14 @@ "BSD-3-Clause" ], "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, { "name": "Adam Harvey", "email": "aharvey@php.net" @@ -3818,29 +4124,32 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2017-03-03T06:23:57+00:00" + "time": "2020-10-26T13:17:30+00:00" }, { "name": "sebastian/resource-operations", - "version": "1.0.0", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", - "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", "shasum": "" }, "require": { - "php": ">=5.6.0" + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -3860,29 +4169,75 @@ ], "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "time": "2015-07-28T20:34:47+00:00" + "time": "2020-09-28T06:45:17+00:00" + }, + { + "name": "sebastian/type", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/81cd61ab7bbf2de744aba0ea61fae32f721df3d2", + "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "time": "2020-10-26T13:18:59+00:00" }, { "name": "sebastian/version", - "version": "2.0.1", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + "reference": "c6c1022351a901512170118436c764e473f6de8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", "shasum": "" }, "require": { - "php": ">=5.6" + "php": ">=7.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -3903,7 +4258,7 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", - "time": "2016-10-03T07:35:21+00:00" + "time": "2020-09-28T06:39:44+00:00" }, { "name": "seld/jsonlint", @@ -3955,89 +4310,32 @@ "time": "2019-10-24T14:27:39+00:00" }, { - "name": "seld/phar-utils", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "8800503d56b9867d43d9c303b9cbcc26016e82f0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/8800503d56b9867d43d9c303b9cbcc26016e82f0", - "reference": "8800503d56b9867d43d9c303b9cbcc26016e82f0", - "shasum": "" - }, - "require": { - "php": ">=5.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Seld\\PharUtils\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" - } - ], - "description": "PHAR file format utilities, for when PHP phars you up", - "keywords": [ - "phar" - ], - "time": "2020-02-14T15:25:33+00:00" - }, - { - "name": "symfony/browser-kit", - "version": "v4.4.6", + "name": "seld/phar-utils", + "version": "1.1.0", "source": { "type": "git", - "url": "https://github.com/symfony/browser-kit.git", - "reference": "4e9a171559f5a9018c90ba9e85b4084d4e045186" + "url": "https://github.com/Seldaek/phar-utils.git", + "reference": "8800503d56b9867d43d9c303b9cbcc26016e82f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/4e9a171559f5a9018c90ba9e85b4084d4e045186", - "reference": "4e9a171559f5a9018c90ba9e85b4084d4e045186", + "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/8800503d56b9867d43d9c303b9cbcc26016e82f0", + "reference": "8800503d56b9867d43d9c303b9cbcc26016e82f0", "shasum": "" }, "require": { - "php": "^7.1.3", - "symfony/dom-crawler": "^3.4|^4.0|^5.0" - }, - "require-dev": { - "symfony/css-selector": "^3.4|^4.0|^5.0", - "symfony/http-client": "^4.3|^5.0", - "symfony/mime": "^4.3|^5.0", - "symfony/process": "^3.4|^4.0|^5.0" - }, - "suggest": { - "symfony/process": "" + "php": ">=5.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.4-dev" + "dev-master": "1.x-dev" } }, "autoload": { "psr-4": { - "Symfony\\Component\\BrowserKit\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Seld\\PharUtils\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -4045,17 +4343,15 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" } ], - "description": "Symfony BrowserKit Component", - "homepage": "https://symfony.com", - "time": "2020-03-15T10:05:03+00:00" + "description": "PHAR file format utilities, for when PHP phars you up", + "keywords": [ + "phar" + ], + "time": "2020-02-14T15:25:33+00:00" }, { "name": "symfony/console", @@ -4135,27 +4431,22 @@ }, { "name": "symfony/css-selector", - "version": "v4.4.6", + "version": "v5.2.2", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "402251c6fd69806a70a2b0e1426d16f8487f0f9a" + "reference": "f65f217b3314504a1ec99c2d6ef69016bb13490f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/402251c6fd69806a70a2b0e1426d16f8487f0f9a", - "reference": "402251c6fd69806a70a2b0e1426d16f8487f0f9a", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/f65f217b3314504a1ec99c2d6ef69016bb13490f", + "reference": "f65f217b3314504a1ec99c2d6ef69016bb13490f", "shasum": "" }, "require": { - "php": "^7.1.3" + "php": ">=7.2.5" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\CssSelector\\": "" @@ -4182,51 +4473,40 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony CssSelector Component", + "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", - "time": "2020-03-16T08:56:54+00:00" + "time": "2021-01-27T10:01:46+00:00" }, { - "name": "symfony/dom-crawler", - "version": "v4.4.6", + "name": "symfony/deprecation-contracts", + "version": "v2.2.0", "source": { "type": "git", - "url": "https://github.com/symfony/dom-crawler.git", - "reference": "7e7c7957f6d53757d36b61a1f7408ef0b6683040" + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/7e7c7957f6d53757d36b61a1f7408ef0b6683040", - "reference": "7e7c7957f6d53757d36b61a1f7408ef0b6683040", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5fa56b4074d1ae755beb55617ddafe6f5d78f665", + "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665", "shasum": "" }, "require": { - "php": "^7.1.3", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "masterminds/html5": "<2.6" - }, - "require-dev": { - "masterminds/html5": "^2.6", - "symfony/css-selector": "^3.4|^4.0|^5.0" - }, - "suggest": { - "symfony/css-selector": "" + "php": ">=7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.4-dev" + "dev-master": "2.2-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { - "psr-4": { - "Symfony\\Component\\DomCrawler\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "files": [ + "function.php" ] }, "notification-url": "https://packagist.org/downloads/", @@ -4235,34 +4515,34 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony DomCrawler Component", + "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", - "time": "2020-03-16T11:24:17+00:00" + "time": "2020-09-07T11:33:47+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v4.4.6", + "version": "v4.4.19", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "cf57788d1ca64ee7e689698dc0295d25c9fe3780" + "reference": "c352647244bd376bf7d31efbd5401f13f50dad0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/cf57788d1ca64ee7e689698dc0295d25c9fe3780", - "reference": "cf57788d1ca64ee7e689698dc0295d25c9fe3780", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/c352647244bd376bf7d31efbd5401f13f50dad0c", + "reference": "c352647244bd376bf7d31efbd5401f13f50dad0c", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.1.3", "symfony/event-dispatcher-contracts": "^1.1" }, "conflict": { @@ -4276,6 +4556,7 @@ "psr/log": "~1.0", "symfony/config": "^3.4|^4.0|^5.0", "symfony/dependency-injection": "^3.4|^4.0|^5.0", + "symfony/error-handler": "~3.4|~4.4", "symfony/expression-language": "^3.4|^4.0|^5.0", "symfony/http-foundation": "^3.4|^4.0|^5.0", "symfony/service-contracts": "^1.1|^2", @@ -4286,11 +4567,6 @@ "symfony/http-kernel": "" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\EventDispatcher\\": "" @@ -4313,26 +4589,26 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony EventDispatcher Component", + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", - "time": "2020-03-16T11:24:17+00:00" + "time": "2021-01-27T09:09:26+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v1.1.7", + "version": "v1.1.9", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "c43ab685673fb6c8d84220c77897b1d6cdbe1d18" + "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/c43ab685673fb6c8d84220c77897b1d6cdbe1d18", - "reference": "c43ab685673fb6c8d84220c77897b1d6cdbe1d18", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/84e23fdcd2517bf37aecbd16967e83f0caee25a7", + "reference": "84e23fdcd2517bf37aecbd16967e83f0caee25a7", "shasum": "" }, "require": { - "php": "^7.1.3" + "php": ">=7.1.3" }, "suggest": { "psr/event-dispatcher": "", @@ -4342,6 +4618,10 @@ "extra": { "branch-alias": { "dev-master": "1.1-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -4373,32 +4653,27 @@ "interoperability", "standards" ], - "time": "2019-09-17T09:54:03+00:00" + "time": "2020-07-06T13:19:58+00:00" }, { "name": "symfony/filesystem", - "version": "v4.4.6", + "version": "v5.2.2", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "6d4fdf28187250f671c1edc9cf921ebfb7fe3809" + "reference": "262d033b57c73e8b59cd6e68a45c528318b15038" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/6d4fdf28187250f671c1edc9cf921ebfb7fe3809", - "reference": "6d4fdf28187250f671c1edc9cf921ebfb7fe3809", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/262d033b57c73e8b59cd6e68a45c528318b15038", + "reference": "262d033b57c73e8b59cd6e68a45c528318b15038", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.2.5", "symfony/polyfill-ctype": "~1.8" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Filesystem\\": "" @@ -4421,33 +4696,28 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Filesystem Component", + "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", - "time": "2020-03-16T08:56:54+00:00" + "time": "2021-01-27T10:01:46+00:00" }, { "name": "symfony/finder", - "version": "v4.4.6", + "version": "v5.2.2", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "ea69c129aed9fdeca781d4b77eb20b62cf5d5357" + "reference": "196f45723b5e618bf0e23b97e96d11652696ea9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/ea69c129aed9fdeca781d4b77eb20b62cf5d5357", - "reference": "ea69c129aed9fdeca781d4b77eb20b62cf5d5357", + "url": "https://api.github.com/repos/symfony/finder/zipball/196f45723b5e618bf0e23b97e96d11652696ea9e", + "reference": "196f45723b5e618bf0e23b97e96d11652696ea9e", "shasum": "" }, "require": { - "php": "^7.1.3" + "php": ">=7.2.5" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Finder\\": "" @@ -4470,39 +4740,40 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Finder Component", + "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", - "time": "2020-02-14T07:42:58+00:00" + "time": "2021-01-27T10:01:46+00:00" }, { "name": "symfony/http-foundation", - "version": "v4.4.6", + "version": "v5.2.2", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "0a3b7711229f816a06fac805f4ed4a8f4641c719" + "reference": "16dfa5acf8103f0394d447f8eea3ea49f9e50855" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/0a3b7711229f816a06fac805f4ed4a8f4641c719", - "reference": "0a3b7711229f816a06fac805f4ed4a8f4641c719", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/16dfa5acf8103f0394d447f8eea3ea49f9e50855", + "reference": "16dfa5acf8103f0394d447f8eea3ea49f9e50855", "shasum": "" }, "require": { - "php": "^7.1.3", - "symfony/mime": "^4.3|^5.0", - "symfony/polyfill-mbstring": "~1.1" + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.15" }, "require-dev": { "predis/predis": "~1.0", - "symfony/expression-language": "^3.4|^4.0|^5.0" + "symfony/cache": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0" }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } + "suggest": { + "symfony/mime": "To use the file extension guesser" }, + "type": "library", "autoload": { "psr-4": { "Symfony\\Component\\HttpFoundation\\": "" @@ -4525,42 +4796,45 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony HttpFoundation Component", + "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", - "time": "2020-03-23T12:37:11+00:00" + "time": "2021-01-27T11:19:04+00:00" }, { "name": "symfony/mime", - "version": "v4.4.6", + "version": "v5.2.2", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "f6be9d809d805ab5bdb12f2d5843ba2c78533c7e" + "reference": "37bade585ea100d235c031b258eff93b5b6bb9a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/f6be9d809d805ab5bdb12f2d5843ba2c78533c7e", - "reference": "f6be9d809d805ab5bdb12f2d5843ba2c78533c7e", + "url": "https://api.github.com/repos/symfony/mime/zipball/37bade585ea100d235c031b258eff93b5b6bb9a9", + "reference": "37bade585ea100d235c031b258eff93b5b6bb9a9", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-mbstring": "^1.0" + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.15" }, "conflict": { + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", "symfony/mailer": "<4.4" }, "require-dev": { "egulias/email-validator": "^2.1.10", - "symfony/dependency-injection": "^3.4|^4.1|^5.0" + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/property-access": "^4.4|^5.1", + "symfony/property-info": "^4.4|^5.1", + "symfony/serializer": "^5.2" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Mime\\": "" @@ -4583,30 +4857,30 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "A library to manipulate MIME messages", + "description": "Allows manipulating MIME messages", "homepage": "https://symfony.com", "keywords": [ "mime", "mime-type" ], - "time": "2020-03-16T11:24:17+00:00" + "time": "2021-01-25T14:08:25+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.15.0", + "version": "v1.22.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "4719fa9c18b0464d399f1a63bf624b42b6fa8d14" + "reference": "c6c942b1ac76c82448322025e084cadc56048b4e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/4719fa9c18b0464d399f1a63bf624b42b6fa8d14", - "reference": "4719fa9c18b0464d399f1a63bf624b42b6fa8d14", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/c6c942b1ac76c82448322025e084cadc56048b4e", + "reference": "c6c942b1ac76c82448322025e084cadc56048b4e", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.1" }, "suggest": { "ext-ctype": "For best performance" @@ -4614,7 +4888,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.15-dev" + "dev-main": "1.22-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -4647,21 +4925,7 @@ "polyfill", "portable" ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-02-27T09:26:54+00:00" + "time": "2021-01-07T16:49:33+00:00" }, { "name": "symfony/polyfill-intl-idn", @@ -4723,38 +4987,24 @@ "portable", "shim" ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], "time": "2020-03-09T19:04:49+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.15.0", + "version": "v1.22.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac" + "reference": "f377a3dd1fde44d37b9831d68dc8dea3ffd28e13" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/81ffd3a9c6d707be22e3012b827de1c9775fc5ac", - "reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/f377a3dd1fde44d37b9831d68dc8dea3ffd28e13", + "reference": "f377a3dd1fde44d37b9831d68dc8dea3ffd28e13", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.1" }, "suggest": { "ext-mbstring": "For best performance" @@ -4762,7 +5012,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.15-dev" + "dev-main": "1.22-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -4796,21 +5050,7 @@ "portable", "shim" ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2020-03-09T19:04:49+00:00" + "time": "2021-01-07T16:49:33+00:00" }, { "name": "symfony/polyfill-php72", @@ -4865,20 +5105,6 @@ "portable", "shim" ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], "time": "2020-02-27T09:26:54+00:00" }, { @@ -4937,21 +5163,73 @@ "portable", "shim" ], - "funding": [ + "time": "2020-02-27T09:26:54+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.22.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dc3063ba22c2a1fd2f45ed856374d79114998f91", + "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.22-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" }, { - "url": "https://github.com/fabpot", - "type": "github" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" } ], - "time": "2020-02-27T09:26:54+00:00" + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2021-01-07T16:49:33+00:00" }, { "name": "symfony/process", @@ -5062,20 +5340,20 @@ }, { "name": "symfony/yaml", - "version": "v4.4.6", + "version": "v4.4.19", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "43d7a46b1f80b4fd2ecfac4a9a4cc1f22d029fbb" + "reference": "17ed9f14c1aa05b1a5cf2e2c5ef2d0be28058ef9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/43d7a46b1f80b4fd2ecfac4a9a4cc1f22d029fbb", - "reference": "43d7a46b1f80b4fd2ecfac4a9a4cc1f22d029fbb", + "url": "https://api.github.com/repos/symfony/yaml/zipball/17ed9f14c1aa05b1a5cf2e2c5ef2d0be28058ef9", + "reference": "17ed9f14c1aa05b1a5cf2e2c5ef2d0be28058ef9", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.1.3", "symfony/polyfill-ctype": "~1.8" }, "conflict": { @@ -5088,11 +5366,6 @@ "symfony/console": "For validating YAML files using the lint command" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Yaml\\": "" @@ -5115,29 +5388,29 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Yaml Component", + "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", - "time": "2020-03-16T08:56:54+00:00" + "time": "2021-01-27T09:09:26+00:00" }, { "name": "theseer/tokenizer", - "version": "1.1.3", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9" + "reference": "75a63c33a8577608444246075ea0af0d052e452a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/11336f6f84e16a720dae9d8e6ed5019efa85a0f9", - "reference": "11336f6f84e16a720dae9d8e6ed5019efa85a0f9", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", + "reference": "75a63c33a8577608444246075ea0af0d052e452a", "shasum": "" }, "require": { "ext-dom": "*", "ext-tokenizer": "*", "ext-xmlwriter": "*", - "php": "^7.0" + "php": "^7.2 || ^8.0" }, "type": "library", "autoload": { @@ -5157,7 +5430,7 @@ } ], "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "time": "2019-06-13T22:48:21+00:00" + "time": "2020-07-12T23:59:07+00:00" }, { "name": "vlucas/phpdotenv", @@ -5212,24 +5485,25 @@ }, { "name": "webmozart/assert", - "version": "1.7.0", + "version": "1.9.1", "source": { "type": "git", - "url": "https://github.com/webmozart/assert.git", - "reference": "aed98a490f9a8f78468232db345ab9cf606cf598" + "url": "https://github.com/webmozarts/assert.git", + "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/aed98a490f9a8f78468232db345ab9cf606cf598", - "reference": "aed98a490f9a8f78468232db345ab9cf606cf598", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", + "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0", + "php": "^5.3.3 || ^7.0 || ^8.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "vimeo/psalm": "<3.6.0" + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<3.9.1" }, "require-dev": { "phpunit/phpunit": "^4.8.36 || ^7.5.13" @@ -5256,7 +5530,7 @@ "check", "validate" ], - "time": "2020-02-14T12:15:55+00:00" + "time": "2020-07-08T17:02:28+00:00" }, { "name": "weew/helpers-array", @@ -5519,34 +5793,29 @@ } ], "description": "Library for accessing git", - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/gitonomy/gitlib", - "type": "tidelift" - } - ], "time": "2020-03-23T12:43:44+00:00" }, { "name": "goaop/framework", - "version": "2.2.0", + "version": "2.3.4", "source": { "type": "git", "url": "https://github.com/goaop/framework.git", - "reference": "152abbffffcba72d2d159b892deb40b0829d0f28" + "reference": "f980f249c55637acba0d5fdcfd2b5182c419f3d1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/goaop/framework/zipball/152abbffffcba72d2d159b892deb40b0829d0f28", - "reference": "152abbffffcba72d2d159b892deb40b0829d0f28", + "url": "https://api.github.com/repos/goaop/framework/zipball/f980f249c55637acba0d5fdcfd2b5182c419f3d1", + "reference": "f980f249c55637acba0d5fdcfd2b5182c419f3d1", "shasum": "" }, "require": { "doctrine/annotations": "^1.2.3", "doctrine/cache": "^1.5", - "goaop/parser-reflection": "~1.4", + "goaop/parser-reflection": "~2.0", "jakubledl/dissect": "~1.0", - "php": ">=5.6.0" + "php": "~7.0", + "symfony/finder": "^3.4|^4.2|^5.0" }, "require-dev": { "adlawson/vfs": "^0.12", @@ -5554,7 +5823,8 @@ "phpunit/phpunit": "^5.7", "symfony/console": "^2.7|^3.0", "symfony/filesystem": "^3.3", - "symfony/process": "^3.3" + "symfony/process": "^3.3", + "webmozart/glob": "^4.1" }, "suggest": { "symfony/console": "Enables the usage of the command-line tool." @@ -5591,25 +5861,25 @@ "library", "php" ], - "time": "2018-01-05T23:07:51+00:00" + "time": "2020-04-06T09:46:21+00:00" }, { "name": "goaop/parser-reflection", - "version": "1.4.1", + "version": "2.1.3", "source": { "type": "git", "url": "https://github.com/goaop/parser-reflection.git", - "reference": "d9c1dcc7ce4a5284fe3530e011faf9c9c10e1166" + "reference": "2e837e150e15d38f7004b0dbcd0af4abe034c9e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/goaop/parser-reflection/zipball/d9c1dcc7ce4a5284fe3530e011faf9c9c10e1166", - "reference": "d9c1dcc7ce4a5284fe3530e011faf9c9c10e1166", + "url": "https://api.github.com/repos/goaop/parser-reflection/zipball/2e837e150e15d38f7004b0dbcd0af4abe034c9e2", + "reference": "2e837e150e15d38f7004b0dbcd0af4abe034c9e2", "shasum": "" }, "require": { - "nikic/php-parser": "^1.2|^2.0|^3.0", - "php": ">=5.6.0" + "nikic/php-parser": "^4.0 <4.7.0", + "php": ">=7.1" }, "require-dev": { "phpunit/phpunit": "~4.0" @@ -5617,7 +5887,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.x-dev" + "dev-master": "3.x-dev" } }, "autoload": { @@ -5642,7 +5912,7 @@ } ], "description": "Provides reflection information, based on raw source", - "time": "2018-03-19T15:57:41+00:00" + "time": "2020-08-13T21:02:42+00:00" }, { "name": "guzzle/guzzle", @@ -5794,24 +6064,25 @@ }, { "name": "nikic/php-parser", - "version": "v3.1.5", + "version": "v4.6.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "bb87e28e7d7b8d9a7fda231d37457c9210faf6ce" + "reference": "c346bbfafe2ff60680258b631afb730d186ed864" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/bb87e28e7d7b8d9a7fda231d37457c9210faf6ce", - "reference": "bb87e28e7d7b8d9a7fda231d37457c9210faf6ce", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/c346bbfafe2ff60680258b631afb730d186ed864", + "reference": "c346bbfafe2ff60680258b631afb730d186ed864", "shasum": "" }, "require": { "ext-tokenizer": "*", - "php": ">=5.5" + "php": ">=7.0" }, "require-dev": { - "phpunit/phpunit": "~4.0|~5.0" + "ircmaxell/php-yacc": "0.0.5", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0" }, "bin": [ "bin/php-parse" @@ -5819,7 +6090,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "4.3-dev" } }, "autoload": { @@ -5841,7 +6112,7 @@ "parser", "php" ], - "time": "2018-02-28T20:30:58+00:00" + "time": "2020-07-02T17:12:47+00:00" }, { "name": "pdepend/pdepend", @@ -6064,27 +6335,30 @@ "time": "2018-07-29T13:27:58+00:00" }, { - "name": "sebastian/finder-facade", - "version": "1.2.3", + "name": "sebastian/cli-parser", + "version": "1.0.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/finder-facade.git", - "reference": "167c45d131f7fc3d159f56f191a0a22228765e16" + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/finder-facade/zipball/167c45d131f7fc3d159f56f191a0a22228765e16", - "reference": "167c45d131f7fc3d159f56f191a0a22228765e16", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", "shasum": "" }, "require": { - "php": "^7.1", - "symfony/finder": "^2.3|^3.0|^4.0|^5.0", - "theseer/fdomdocument": "^1.6" + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { - "branch-alias": [] + "branch-alias": { + "dev-master": "1.0-dev" + } }, "autoload": { "classmap": [ @@ -6102,32 +6376,31 @@ "role": "lead" } ], - "description": "FinderFacade is a convenience wrapper for Symfony's Finder component.", - "homepage": "https://github.com/sebastianbergmann/finder-facade", - "abandoned": true, - "time": "2020-01-16T08:08:45+00:00" + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "time": "2020-09-28T06:08:49+00:00" }, { "name": "sebastian/phpcpd", - "version": "4.1.0", + "version": "6.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpcpd.git", - "reference": "0d9afa762f2400de077b2192f4a9d127de0bb78e" + "reference": "f3683aa0db2e8e09287c2bb33a595b2873ea9176" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpcpd/zipball/0d9afa762f2400de077b2192f4a9d127de0bb78e", - "reference": "0d9afa762f2400de077b2192f4a9d127de0bb78e", + "url": "https://api.github.com/repos/sebastianbergmann/phpcpd/zipball/f3683aa0db2e8e09287c2bb33a595b2873ea9176", + "reference": "f3683aa0db2e8e09287c2bb33a595b2873ea9176", "shasum": "" }, "require": { "ext-dom": "*", - "php": "^7.1", - "phpunit/php-timer": "^2.0", - "sebastian/finder-facade": "^1.1", - "sebastian/version": "^1.0|^2.0", - "symfony/console": "^2.7|^3.0|^4.0" + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0", + "phpunit/php-timer": "^5.0", + "sebastian/cli-parser": "^1.0", + "sebastian/version": "^3.0" }, "bin": [ "phpcpd" @@ -6135,7 +6408,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "6.0-dev" } }, "autoload": { @@ -6156,7 +6429,7 @@ ], "description": "Copy/Paste Detector (CPD) for PHP code.", "homepage": "https://github.com/sebastianbergmann/phpcpd", - "time": "2018-09-17T17:17:27+00:00" + "time": "2020-12-07T05:39:23+00:00" }, { "name": "squizlabs/php_codesniffer", @@ -6394,46 +6667,6 @@ "description": "Symfony Stopwatch Component", "homepage": "https://symfony.com", "time": "2020-01-01T11:03:25+00:00" - }, - { - "name": "theseer/fdomdocument", - "version": "1.6.6", - "source": { - "type": "git", - "url": "https://github.com/theseer/fDOMDocument.git", - "reference": "6e8203e40a32a9c770bcb62fe37e68b948da6dca" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/fDOMDocument/zipball/6e8203e40a32a9c770bcb62fe37e68b948da6dca", - "reference": "6e8203e40a32a9c770bcb62fe37e68b948da6dca", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "lib-libxml": "*", - "php": ">=5.3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "lead" - } - ], - "description": "The classes contained within this repository extend the standard DOM to use exceptions at all occasions of errors instead of PHP warnings or notices. They also add various custom methods and shortcuts for convenience and to simplify the usage of DOM.", - "homepage": "https://github.com/theseer/fDOMDocument", - "time": "2017-06-30T11:53:12+00:00" } ], "aliases": [], @@ -6442,12 +6675,11 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": "~7.1.0||~7.2.0||~7.3.0", + "php": "~7.3.0", "ext-curl": "*", "ext-dom": "*", "ext-json": "*", "ext-openssl": "*" }, - "platform-dev": [], - "plugin-api-version": "1.1.0" + "platform-dev": [] } diff --git a/dev/tests/phpunit.xml b/dev/tests/phpunit.xml index 9648ab3fd..1014ec7c3 100644 --- a/dev/tests/phpunit.xml +++ b/dev/tests/phpunit.xml @@ -7,7 +7,7 @@ diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Allure/AllureHelperTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Allure/AllureHelperTest.php index b7eafaead..f0041e074 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Allure/AllureHelperTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Allure/AllureHelperTest.php @@ -22,7 +22,7 @@ class AllureHelperTest extends TestCase /** * Clear Allure Lifecycle */ - public function tearDown() + public function tearDown(): void { Allure::setDefaultLifecycle(); AspectMock::clean(); diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Composer/ComposerInstallTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Composer/ComposerInstallTest.php index e4977184f..445e615a9 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Composer/ComposerInstallTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Composer/ComposerInstallTest.php @@ -18,7 +18,7 @@ class ComposerInstallTest extends MagentoTestCase */ private $composer; - public function setUp() + public function setUp(): void { $composerJson = dirname(__DIR__) . DIRECTORY_SEPARATOR . 'Composer' . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'dir1' . DIRECTORY_SEPARATOR . 'dir2' . DIRECTORY_SEPARATOR . 'composer.json'; diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Composer/ComposerPackageTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Composer/ComposerPackageTest.php index 4802f0c33..dfe691651 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Composer/ComposerPackageTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Composer/ComposerPackageTest.php @@ -19,7 +19,7 @@ class ComposerPackageTest extends MagentoTestCase */ private $composer; - public function setUp() + public function setUp(): void { $composerJson = dirname(__DIR__) . DIRECTORY_SEPARATOR . 'Composer' . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'dir1' . DIRECTORY_SEPARATOR . 'dir2' . DIRECTORY_SEPARATOR . 'composer.json'; diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Config/Reader/FilesystemTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Config/Reader/FilesystemTest.php index b59858e7f..e12ccbe5c 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Config/Reader/FilesystemTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Config/Reader/FilesystemTest.php @@ -19,7 +19,7 @@ class FilesystemTest extends TestCase * Before test functionality * @return void */ - public function setUp() + public function setUp(): void { TestLoggingUtil::getInstance()->setMockLoggingUtil(); } @@ -100,7 +100,7 @@ public function createPseudoFileSystem($fileList) * After class functionality * @return void */ - public static function tearDownAfterClass() + public static function tearDownAfterClass(): void { TestLoggingUtil::getInstance()->clearMockLoggingUtil(); parent::tearDownAfterClass(); diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Console/BaseGenerateCommandTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Console/BaseGenerateCommandTest.php index 234f677e8..c57dfe471 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Console/BaseGenerateCommandTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Console/BaseGenerateCommandTest.php @@ -15,7 +15,7 @@ class BaseGenerateCommandTest extends TestCase { - public function tearDown() + public function tearDown(): void { AspectMock::clean(); } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/PersistedObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/PersistedObjectHandlerTest.php index 592b87f4e..0e3367a70 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/PersistedObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/PersistedObjectHandlerTest.php @@ -27,7 +27,7 @@ class PersistedObjectHandlerTest extends MagentoTestCase * Before test functionality * @return void */ - public function setUp() + public function setUp(): void { TestLoggingUtil::getInstance()->setMockLoggingUtil(); } @@ -510,7 +510,7 @@ public function mockCurlHandler($response) ]); } - public function tearDown() + public function tearDown(): void { // Clear out Singleton between tests $property = new \ReflectionProperty(PersistedObjectHandler::class, "INSTANCE"); @@ -524,7 +524,7 @@ public function tearDown() * After class functionality * @return void */ - public static function tearDownAfterClass() + public static function tearDownAfterClass(): void { TestLoggingUtil::getInstance()->clearMockLoggingUtil(); parent::tearDownAfterClass(); diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Objects/EntityDataObjectTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Objects/EntityDataObjectTest.php index 802a6c108..ef7dfac9b 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Objects/EntityDataObjectTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Objects/EntityDataObjectTest.php @@ -40,7 +40,7 @@ class EntityDataObjectTest extends MagentoTestCase * Before test functionality * @return void */ - public function setUp() + public function setUp(): void { TestLoggingUtil::getInstance()->setMockLoggingUtil(); } @@ -141,7 +141,7 @@ public function testGetCamelCaseKeys() * After class functionality * @return void */ - public static function tearDownAfterClass() + public static function tearDownAfterClass(): void { TestLoggingUtil::getInstance()->clearMockLoggingUtil(); } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Persist/OperationDataArrayResolverTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Persist/OperationDataArrayResolverTest.php index fb6dcd865..1e77c8158 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Persist/OperationDataArrayResolverTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Persist/OperationDataArrayResolverTest.php @@ -41,7 +41,7 @@ class OperationDataArrayResolverTest extends MagentoTestCase * Before test functionality * @return void */ - public function setUp() + public function setUp(): void { TestLoggingUtil::getInstance()->setMockLoggingUtil(); } @@ -481,7 +481,7 @@ public function testNestedMetadataArrayOfDiverseObjects() * After class functionality * @return void */ - public static function tearDownAfterClass() + public static function tearDownAfterClass(): void { TestLoggingUtil::getInstance()->clearMockLoggingUtil(); } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Util/DataExtensionUtilTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Util/DataExtensionUtilTest.php index e72c15b31..b921229e0 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Util/DataExtensionUtilTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Util/DataExtensionUtilTest.php @@ -22,7 +22,7 @@ class EntityDataExtensionTest extends MagentoTestCase * Before method functionality * @return void */ - protected function setUp() + protected function setUp(): void { AspectMock::clean(); } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Page/Objects/ElementObjectTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Page/Objects/ElementObjectTest.php index d585f4085..02fb0f465 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Page/Objects/ElementObjectTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Page/Objects/ElementObjectTest.php @@ -32,7 +32,7 @@ public function testTimeoutNotNull() $element = new ElementObject('name', 'type', 'selector', null, '15', false); $timeout = $element->getTimeout(); $this->assertEquals(15, $timeout); - $this->assertInternalType('int', $timeout); + $this->assertIsInt($timeout); } /** @@ -43,7 +43,7 @@ public function testTimeoutCastFromString() $element = new ElementObject('name', 'type', 'selector', null, 'helloString', true); $timeout = $element->getTimeout(); $this->assertEquals(0, $timeout); - $this->assertInternalType('int', $timeout); + $this->assertIsInt($timeout); } /** diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Suite/Handlers/SuiteObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Suite/Handlers/SuiteObjectHandlerTest.php index e45127f4c..c065b1fbf 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Suite/Handlers/SuiteObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Suite/Handlers/SuiteObjectHandlerTest.php @@ -19,7 +19,7 @@ class SuiteObjectHandlerTest extends MagentoTestCase { - public function setUp() + public function setUp(): void { $resolverMock = new MockModuleResolverBuilder(); $resolverMock->setup(); diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Suite/SuiteGeneratorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Suite/SuiteGeneratorTest.php index 842be4f88..d3bf71f5f 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Suite/SuiteGeneratorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Suite/SuiteGeneratorTest.php @@ -29,7 +29,7 @@ class SuiteGeneratorTest extends MagentoTestCase /** * Setup entry append and clear for Suite Generator */ - public static function setUpBeforeClass() + public static function setUpBeforeClass(): void { AspectMock::double(SuiteGenerator::class, [ 'clearPreviousSessionConfigEntries' => null, @@ -41,7 +41,7 @@ public static function setUpBeforeClass() * Before test functionality * @return void */ - public function setUp() + public function setUp(): void { TestLoggingUtil::getInstance()->setMockLoggingUtil(); $resolverMock = new MockModuleResolverBuilder(); @@ -181,7 +181,7 @@ public function testInvalidSuiteTestPair() // Set up Expected Exception $this->expectException(TestReferenceException::class); - $this->expectExceptionMessageRegExp('(Suite: "Suite2" Tests: "Test1")'); + $this->expectExceptionMessageMatches('(Suite: "Suite2" Tests: "Test1")'); // parse and generate suite object with mocked data and manifest $mockSuiteGenerator = SuiteGenerator::getInstance(); @@ -205,7 +205,7 @@ public function testNonExistentSuiteTestPair() // Set up Expected Exception $this->expectException(TestReferenceException::class); - $this->expectExceptionMessageRegExp('#Suite3 is not defined#'); + $this->expectExceptionMessageMatches('#Suite3 is not defined#'); // parse and generate suite object with mocked data and manifest $mockSuiteGenerator = SuiteGenerator::getInstance(); @@ -274,7 +274,7 @@ private function setMockTestAndSuiteParserOutput($testData, $suiteData) /** * clean up function runs after all tests */ - public static function tearDownAfterClass() + public static function tearDownAfterClass(): void { TestLoggingUtil::getInstance()->clearMockLoggingUtil(); parent::tearDownAfterClass(); diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Config/ActionGroupDomTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Config/ActionGroupDomTest.php index 6a0c926be..767d06628 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Config/ActionGroupDomTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Config/ActionGroupDomTest.php @@ -65,7 +65,7 @@ public function testActionGroupDomDuplicateActionGroupsValidation() $exceptionCollector = new ExceptionCollector(); new ActionGroupDom($sampleXml, 'dupeNameActionGroup.xml', $exceptionCollector); $this->expectException(\Exception::class); - $this->expectExceptionMessageRegExp("/name: actionGroupName is used more than once./"); + $this->expectExceptionMessageMatches("/name: actionGroupName is used more than once./"); $exceptionCollector->throwException(); } } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Config/DomTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Config/DomTest.php index e00926978..719c629d4 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Config/DomTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Config/DomTest.php @@ -28,7 +28,7 @@ public function testTestStepKeyDuplicateValidation() new ActionGroupDom($sampleXml, 'dupeStepKeyTest.xml', $exceptionCollector); $this->expectException(\Exception::class); - $this->expectExceptionMessageRegExp("/stepKey: key1 is used more than once. \(Parent: testName\)/"); + $this->expectExceptionMessageMatches("/stepKey: key1 is used more than once. \(Parent: testName\)/"); $exceptionCollector->throwException(); } @@ -49,7 +49,7 @@ public function testTestNameDuplicateValidation() $exceptionCollector = new ExceptionCollector(); new ActionGroupDom($sampleXml, 'dupeTestsTest.xml', $exceptionCollector); $this->expectException(\Exception::class); - $this->expectExceptionMessageRegExp("/name: testName is used more than once./"); + $this->expectExceptionMessageMatches("/name: testName is used more than once./"); $exceptionCollector->throwException(); } } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/TestObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/TestObjectHandlerTest.php index a4504ab07..7dededc1a 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/TestObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Handlers/TestObjectHandlerTest.php @@ -283,7 +283,7 @@ private function setMockParserOutput($data) * * @return void */ - public function tearDown() + public function tearDown(): void { AspectMock::clean(); } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionGroupObjectTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionGroupObjectTest.php index 796e8a28b..db32de3b7 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionGroupObjectTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionGroupObjectTest.php @@ -28,7 +28,7 @@ class ActionGroupObjectTest extends MagentoTestCase * Before test functionality * @return void */ - public function setUp() + public function setUp(): void { TestLoggingUtil::getInstance()->setMockLoggingUtil(); } @@ -243,7 +243,7 @@ public function testExceptionOnMissingActions() ->build(); $this->expectException(TestReferenceException::class); - $this->expectExceptionMessageRegExp('/Arguments missed .* for actionGroup/'); + $this->expectExceptionMessageMatches('/Arguments missed .* for actionGroup/'); $actionGroupUnderTest->getSteps(['arg2' => 'data1'], self::ACTION_GROUP_MERGE_KEY); } @@ -257,7 +257,7 @@ public function testExceptionOnMissingArguments() ->build(); $this->expectException(TestReferenceException::class); - $this->expectExceptionMessageRegExp('/Arguments missed .* for actionGroup/'); + $this->expectExceptionMessageMatches('/Arguments missed .* for actionGroup/'); $actionGroupUnderTest->getSteps(null, self::ACTION_GROUP_MERGE_KEY); } @@ -355,7 +355,7 @@ private function assertOnMergeKeyAndActionValue($actions, $expectedValue, $expec * After class functionality * @return void */ - public static function tearDownAfterClass() + public static function tearDownAfterClass(): void { TestLoggingUtil::getInstance()->clearMockLoggingUtil(); } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionObjectTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionObjectTest.php index 511c9748f..db0c60bb1 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionObjectTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionObjectTest.php @@ -28,7 +28,7 @@ class ActionObjectTest extends MagentoTestCase * Before test functionality * @return void */ - public function setUp() + public function setUp(): void { TestLoggingUtil::getInstance()->setMockLoggingUtil(); } @@ -404,7 +404,7 @@ private function mockDataHandlerWithData($dataObject) * After class functionality * @return void */ - public static function tearDownAfterClass() + public static function tearDownAfterClass(): void { TestLoggingUtil::getInstance()->clearMockLoggingUtil(); } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionGroupAnnotationExtractorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionGroupAnnotationExtractorTest.php index af39298b1..4c1aefbd8 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionGroupAnnotationExtractorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionGroupAnnotationExtractorTest.php @@ -16,7 +16,7 @@ class ActionGroupAnnotationExtractorTest extends TestCase * Before test functionality * @return void */ - public function setUp() + public function setUp(): void { TestLoggingUtil::getInstance()->setMockLoggingUtil(); } @@ -91,7 +91,7 @@ public function testActionGroupMissingAnnotationsNoWarning() * After class functionality * @return void */ - public static function tearDownAfterClass() + public static function tearDownAfterClass(): void { TestLoggingUtil::getInstance()->clearMockLoggingUtil(); } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionGroupObjectExtractorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionGroupObjectExtractorTest.php index 47b797c1c..2d399cfb1 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionGroupObjectExtractorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionGroupObjectExtractorTest.php @@ -17,7 +17,7 @@ class ActionGroupObjectExtractorTest extends MagentoTestCase /** * Setup method */ - public function setUp() + public function setUp(): void { $this->testActionGroupObjectExtractor = new ActionGroupObjectExtractor(); TestLoggingUtil::getInstance()->setMockLoggingUtil(); @@ -63,7 +63,7 @@ private function createBasicActionObjectArray( /** * clean up function runs after all tests */ - public static function tearDownAfterClass() + public static function tearDownAfterClass(): void { TestLoggingUtil::getInstance()->clearMockLoggingUtil(); } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionMergeUtilTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionMergeUtilTest.php index 7917d663b..7996837ff 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionMergeUtilTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionMergeUtilTest.php @@ -23,7 +23,7 @@ class ActionMergeUtilTest extends MagentoTestCase * Before test functionality * @return void */ - public function setUp() + public function setUp(): void { TestLoggingUtil::getInstance()->setMockLoggingUtil(); } @@ -292,7 +292,7 @@ public function testInvalidSecretFunctions() * After class functionality * @return void */ - public static function tearDownAfterClass() + public static function tearDownAfterClass(): void { TestLoggingUtil::getInstance()->clearMockLoggingUtil(); } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionObjectExtractorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionObjectExtractorTest.php index f584adea9..5f30f8422 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionObjectExtractorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionObjectExtractorTest.php @@ -18,7 +18,7 @@ class ActionObjectExtractorTest extends MagentoTestCase /** * Setup method */ - public function setUp() + public function setUp(): void { $this->testActionObjectExtractor = new ActionObjectExtractor(); TestLoggingUtil::getInstance()->setMockLoggingUtil(); @@ -130,7 +130,7 @@ private function createBasicActionObjectArray($stepKey = 'testAction1', $before /** * clean up function runs after all tests */ - public static function tearDownAfterClass() + public static function tearDownAfterClass(): void { TestLoggingUtil::getInstance()->clearMockLoggingUtil(); } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/AnnotationExtractorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/AnnotationExtractorTest.php index fb93cbb88..bfb108ce8 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/AnnotationExtractorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/AnnotationExtractorTest.php @@ -19,7 +19,7 @@ class AnnotationExtractorTest extends TestCase * Before test functionality * @return void */ - public function setUp() + public function setUp(): void { TestLoggingUtil::getInstance()->setMockLoggingUtil(); } @@ -209,7 +209,7 @@ public function testTestCaseIdUniqueness() * After class functionality * @return void */ - public static function tearDownAfterClass() + public static function tearDownAfterClass(): void { TestLoggingUtil::getInstance()->clearMockLoggingUtil(); } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ObjectExtensionUtilTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ObjectExtensionUtilTest.php index 9982b8040..4b9830a59 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ObjectExtensionUtilTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ObjectExtensionUtilTest.php @@ -28,7 +28,7 @@ class ObjectExtensionUtilTest extends TestCase * Before test functionality * @return void */ - public function setUp() + public function setUp(): void { TestLoggingUtil::getInstance()->setMockLoggingUtil(); $resolverMock = new MockModuleResolverBuilder(); @@ -39,7 +39,7 @@ public function setUp() * After class functionality * @return void */ - public static function tearDownAfterClass() + public static function tearDownAfterClass(): void { TestLoggingUtil::getInstance()->clearMockLoggingUtil(); } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php index 07e1ee7fa..2bb1f3b74 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ModuleResolverTest.php @@ -25,7 +25,7 @@ class ModuleResolverTest extends MagentoTestCase * Before test functionality * @return void */ - public function setUp() + public function setUp(): void { TestLoggingUtil::getInstance()->setMockLoggingUtil(); } @@ -34,7 +34,7 @@ public function setUp() * After class functionality * @return void */ - public static function tearDownAfterClass() + public static function tearDownAfterClass(): void { TestLoggingUtil::getInstance()->clearMockLoggingUtil(); } @@ -57,7 +57,6 @@ public function testGetModulePathsAlreadySet() */ public function testGetModulePathsAggregate() { - $this->mockForceGenerate(false); $this->setMockResolverClass( false, @@ -874,7 +873,7 @@ private function mockForceGenerate($forceGenerate) * After method functionality * @return void */ - protected function tearDown() + protected function tearDown(): void { // re set env if (!isset($_ENV['MAGENTO_ADMIN_USERNAME'])) { diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php index e11b0f9b2..9eefbd94a 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php @@ -23,7 +23,7 @@ class TestGeneratorTest extends MagentoTestCase * * @return void */ - public function tearDown() + public function tearDown(): void { AspectMock::clean(); } @@ -70,8 +70,8 @@ public function testSkippedNoGeneration() $testGeneratorObject = TestGenerator::getInstance("", ["sampleTest" => $testObject]); $output = $testGeneratorObject->assembleTestPhp($testObject); - $this->assertContains('This test is skipped', $output); - $this->assertNotContains($actionInput, $output); + $this->assertStringContainsString('This test is skipped', $output); + $this->assertStringNotContainsString($actionInput, $output); } /** @@ -106,9 +106,9 @@ public function testAllowSkipped() $testGeneratorObject = TestGenerator::getInstance("", ["sampleTest" => $testObject]); $output = $testGeneratorObject->assembleTestPhp($testObject); - $this->assertNotContains('This test is skipped', $output); - $this->assertContains($actionInput, $output); - $this->assertContains($beforeActionInput, $output); + $this->assertStringNotContainsString('This test is skipped', $output); + $this->assertStringContainsString($actionInput, $output); + $this->assertStringContainsString($beforeActionInput, $output); } /** diff --git a/dev/tests/unit/Util/MagentoTestCase.php b/dev/tests/unit/Util/MagentoTestCase.php index 6a4e5d35b..9d3a0a6f4 100644 --- a/dev/tests/unit/Util/MagentoTestCase.php +++ b/dev/tests/unit/Util/MagentoTestCase.php @@ -14,7 +14,7 @@ */ class MagentoTestCase extends TestCase { - public static function setUpBeforeClass() + public static function setUpBeforeClass(): void { if (!self::fileExists(DOCS_OUTPUT_DIR)) { mkdir(DOCS_OUTPUT_DIR, 0755, true); @@ -26,7 +26,7 @@ public static function setUpBeforeClass() * Teardown for removing AspectMock Double References * @return void */ - public static function tearDownAfterClass() + public static function tearDownAfterClass(): void { AspectMock::clean(); array_map('unlink', glob(DOCS_OUTPUT_DIR . DIRECTORY_SEPARATOR . "*")); diff --git a/dev/tests/verification/Tests/SchemaValidationTest.php b/dev/tests/verification/Tests/SchemaValidationTest.php index 92442bd37..c6187974c 100644 --- a/dev/tests/verification/Tests/SchemaValidationTest.php +++ b/dev/tests/verification/Tests/SchemaValidationTest.php @@ -35,7 +35,7 @@ public function testInvalidTestSchema() * After method functionality * @return void */ - protected function tearDown() + protected function tearDown(): void { AspectMock::clean(); } diff --git a/dev/tests/verification/Tests/SuiteGenerationTest.php b/dev/tests/verification/Tests/SuiteGenerationTest.php index 485ef6411..926287aad 100644 --- a/dev/tests/verification/Tests/SuiteGenerationTest.php +++ b/dev/tests/verification/Tests/SuiteGenerationTest.php @@ -39,7 +39,7 @@ class SuiteGenerationTest extends MftfTestCase /** * Set up config.yml for testing */ - public static function setUpBeforeClass() + public static function setUpBeforeClass(): void { // destroy _generated if it exists if (file_exists(self::GENERATE_RESULT_DIR)) { @@ -47,7 +47,7 @@ public static function setUpBeforeClass() } } - public function setUp() + public function setUp(): void { // copy config yml file to test dir $fileSystem = new \Symfony\Component\Filesystem\Filesystem(); @@ -392,7 +392,7 @@ public function testSuiteCommentsGeneration() * revert any changes made to config.yml * remove _generated directory */ - public function tearDown() + public function tearDown(): void { DirSetupUtil::rmdirRecursive(self::GENERATE_RESULT_DIR); @@ -406,7 +406,7 @@ public function tearDown() /** * Remove yml if created during tests and did not exist before */ - public static function tearDownAfterClass() + public static function tearDownAfterClass(): void { TestLoggingUtil::getInstance()->clearMockLoggingUtil(); } diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php index 6f45ae253..76fa6913f 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -6,6 +6,7 @@ namespace Magento\FunctionalTestingFramework\Module; +use Codeception\Lib\Actor\Shared\Pause; use Codeception\Module\WebDriver; use Codeception\Test\Descriptor; use Codeception\TestInterface; @@ -52,6 +53,7 @@ class MagentoWebDriver extends WebDriver { use AttachmentSupport; + use Pause; const MAGENTO_CRON_INTERVAL = 60; const MAGENTO_CRON_COMMAND = 'cron:run'; @@ -256,7 +258,7 @@ public function dontSeeInCurrentUrl($needle) $actualUrl = $this->webDriver->getCurrentURL(); $comparison = "Expected: $needle\nActual: $actualUrl"; AllureHelper::addAttachmentToCurrentStep($comparison, 'Comparison'); - $this->assertNotContains($needle, $actualUrl); + $this->assertStringNotContainsString($needle, $actualUrl); } /** @@ -325,7 +327,7 @@ public function seeInCurrentUrl($needle) $actualUrl = $this->webDriver->getCurrentURL(); $comparison = "Expected: $needle\nActual: $actualUrl"; AllureHelper::addAttachmentToCurrentStep($comparison, 'Comparison'); - $this->assertContains($needle, $actualUrl); + $this->assertStringContainsString($needle, $actualUrl); } /** @@ -708,7 +710,7 @@ public function assertElementContainsAttribute($selector, $attribute, $value) // When an "attribute" is blank or null it returns "true" so we assert that "true" is present. $this->assertEquals($attributes, 'true'); } else { - $this->assertContains($value, $attributes); + $this->assertStringContainsString($value, $attributes); } } @@ -1093,4 +1095,25 @@ private function executeCronjobs($cronGroups, $timeout, $arguments): string return sprintf('%s (wait: %ss, execution: %ss)', $cronResult, $waitFor, round($timeEnd - $timeStart, 2)); } + + /** + * Switch to another frame on the page by name, ID, CSS or XPath. + * + * @param string|null $locator + * @return void + * @throws \Exception + */ + public function switchToIFrame($locator = null) + { + try { + parent::switchToIFrame($locator); + } catch (\Exception $e) { + $els = $this->_findElements("#$locator"); + if (!count($els)) { + $this->debug('Failed to find locator by ID: ' . $e->getMessage()); + throw new \Exception("IFrame with $locator was not found."); + } + $this->webDriver->switchTo()->frame($els[0]); + } + } } From 21c6bf95097396992c1acacd825de739b55c2e2e Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Thu, 4 Feb 2021 09:48:22 -0600 Subject: [PATCH 09/31] Add PHP 7.4 --- .github/workflows/main.yml | 8 +- composer.json | 2 +- composer.lock | 1277 +++++++++++++---- .../Console/BuildProjectCommand.php | 2 +- .../Console/RunManifestCommand.php | 2 +- .../Console/RunTestCommand.php | 2 +- .../Console/RunTestGroupCommand.php | 2 +- .../Helper/MagentoFakerData.php | 2 + .../Module/MagentoWebDriver.php | 2 + 9 files changed, 1033 insertions(+), 266 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ab768ddc5..b0db760f8 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,7 +12,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['7.3'] + php-versions: ['7.3', '7.4'] steps: - uses: actions/checkout@v2 @@ -53,7 +53,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['7.3'] + php-versions: ['7.3', '7.4'] steps: - uses: actions/checkout@v2 @@ -85,7 +85,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['7.3'] + php-versions: ['7.3', '7.4'] steps: - uses: actions/checkout@v2 @@ -117,7 +117,7 @@ jobs: strategy: fail-fast: false matrix: - php-versions: ['7.3'] + php-versions: ['7.3', '7.4'] services: chrome: diff --git a/composer.json b/composer.json index 3d72bcb42..fcf7350bb 100755 --- a/composer.json +++ b/composer.json @@ -9,7 +9,7 @@ "sort-packages": true }, "require": { - "php": "~7.3.0", + "php": "^7.3", "ext-curl": "*", "ext-dom": "*", "ext-json": "*", diff --git a/composer.lock b/composer.lock index f68427e19..130b4fb23 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "16231ee8eb05c3ec6b54ac51fe72ecec", + "content-hash": "64777caafb3e49509f5b3ea84bcde5f0", "packages": [ { "name": "allure-framework/allure-codeception", @@ -112,16 +112,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.133.46", + "version": "3.173.2", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "98d359e61b365f3040ca61c66ae8883334cf5d74" + "reference": "1ab4f565744aea8e9560ee8aaffb19b87238c7d5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/98d359e61b365f3040ca61c66ae8883334cf5d74", - "reference": "98d359e61b365f3040ca61c66ae8883334cf5d74", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/1ab4f565744aea8e9560ee8aaffb19b87238c7d5", + "reference": "1ab4f565744aea8e9560ee8aaffb19b87238c7d5", "shasum": "" }, "require": { @@ -144,6 +144,7 @@ "ext-pcntl": "*", "ext-sockets": "*", "nette/neon": "^2.3", + "paragonie/random_compat": ">= 2", "phpunit/phpunit": "^4.8.35|^5.4.3", "psr/cache": "^1.0", "psr/simple-cache": "^1.0", @@ -192,29 +193,30 @@ "s3", "sdk" ], - "time": "2020-03-27T18:15:32+00:00" + "time": "2021-02-03T21:12:51+00:00" }, { "name": "behat/gherkin", - "version": "v4.7.1", + "version": "v4.8.0", "source": { "type": "git", "url": "https://github.com/Behat/Gherkin.git", - "reference": "987bcdc3d29ba433e6bd4b1db4ae59737ba3dacd" + "reference": "2391482cd003dfdc36b679b27e9f5326bd656acd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Behat/Gherkin/zipball/987bcdc3d29ba433e6bd4b1db4ae59737ba3dacd", - "reference": "987bcdc3d29ba433e6bd4b1db4ae59737ba3dacd", + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/2391482cd003dfdc36b679b27e9f5326bd656acd", + "reference": "2391482cd003dfdc36b679b27e9f5326bd656acd", "shasum": "" }, "require": { - "php": ">=5.6" + "php": "~7.2|~8.0" }, "require-dev": { - "phpunit/phpunit": "~5.7|~6|~7", - "symfony/phpunit-bridge": "~2.7|~3|~4", - "symfony/yaml": "~2.3|~3|~4" + "cucumber/cucumber": "dev-gherkin-16.0.0", + "phpunit/phpunit": "~8|~9", + "symfony/phpunit-bridge": "~3|~4|~5", + "symfony/yaml": "~3|~4|~5" }, "suggest": { "symfony/yaml": "If you want to parse features, represented in YAML files" @@ -251,7 +253,7 @@ "gherkin", "parser" ], - "time": "2021-01-26T16:24:32+00:00" + "time": "2021-02-04T12:44:21+00:00" }, { "name": "brick/math", @@ -297,6 +299,12 @@ "brick", "math" ], + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/brick/math", + "type": "tidelift" + } + ], "time": "2021-01-20T22:51:39+00:00" }, { @@ -475,6 +483,12 @@ "functional testing", "unit testing" ], + "funding": [ + { + "url": "https://opencollective.com/codeception", + "type": "open_collective" + } + ], "time": "2021-02-01T07:30:47+00:00" }, { @@ -749,16 +763,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.2.6", + "version": "1.2.9", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "47fe531de31fca4a1b997f87308e7d7804348f7e" + "reference": "78a0e288fdcebf92aa2318a8d3656168da6ac1a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/47fe531de31fca4a1b997f87308e7d7804348f7e", - "reference": "47fe531de31fca4a1b997f87308e7d7804348f7e", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/78a0e288fdcebf92aa2318a8d3656168da6ac1a5", + "reference": "78a0e288fdcebf92aa2318a8d3656168da6ac1a5", "shasum": "" }, "require": { @@ -767,14 +781,15 @@ "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8", + "phpstan/phpstan": "^0.12.55", "psr/log": "^1.0", + "symfony/phpunit-bridge": "^4.2 || ^5", "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.x-dev" + "dev-main": "1.x-dev" } }, "autoload": { @@ -801,20 +816,34 @@ "ssl", "tls" ], - "time": "2020-01-13T10:02:55+00:00" + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2021-01-12T12:10:35+00:00" }, { "name": "composer/composer", - "version": "1.10.1", + "version": "1.10.20", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "b912a45da3e2b22f5cb5a23e441b697a295ba011" + "reference": "e55d297525f0ecc805c813a0f63a40114fd670f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/b912a45da3e2b22f5cb5a23e441b697a295ba011", - "reference": "b912a45da3e2b22f5cb5a23e441b697a295ba011", + "url": "https://api.github.com/repos/composer/composer/zipball/e55d297525f0ecc805c813a0f63a40114fd670f6", + "reference": "e55d297525f0ecc805c813a0f63a40114fd670f6", "shasum": "" }, "require": { @@ -822,8 +851,8 @@ "composer/semver": "^1.0", "composer/spdx-licenses": "^1.2", "composer/xdebug-handler": "^1.1", - "justinrainbow/json-schema": "^3.0 || ^4.0 || ^5.0", - "php": "^5.3.2 || ^7.0", + "justinrainbow/json-schema": "^5.2.10", + "php": "^5.3.2 || ^7.0 || ^8.0", "psr/log": "^1.0", "seld/jsonlint": "^1.4", "seld/phar-utils": "^1.0", @@ -837,7 +866,7 @@ }, "require-dev": { "phpspec/prophecy": "^1.10", - "symfony/phpunit-bridge": "^3.4" + "symfony/phpunit-bridge": "^4.2" }, "suggest": { "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", @@ -881,24 +910,38 @@ "dependency", "package" ], - "time": "2020-03-13T19:34:27+00:00" + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2021-01-27T14:41:06+00:00" }, { "name": "composer/semver", - "version": "1.5.1", + "version": "1.7.2", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "c6bea70230ef4dd483e6bbcab6005f682ed3a8de" + "reference": "647490bbcaf7fc4891c58f47b825eb99d19c377a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/c6bea70230ef4dd483e6bbcab6005f682ed3a8de", - "reference": "c6bea70230ef4dd483e6bbcab6005f682ed3a8de", + "url": "https://api.github.com/repos/composer/semver/zipball/647490bbcaf7fc4891c58f47b825eb99d19c377a", + "reference": "647490bbcaf7fc4891c58f47b825eb99d19c377a", "shasum": "" }, "require": { - "php": "^5.3.2 || ^7.0" + "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { "phpunit/phpunit": "^4.5 || ^5.0.5" @@ -942,20 +985,34 @@ "validation", "versioning" ], - "time": "2020-01-13T12:06:48+00:00" + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2020-12-03T15:47:16+00:00" }, { "name": "composer/spdx-licenses", - "version": "1.5.3", + "version": "1.5.5", "source": { "type": "git", "url": "https://github.com/composer/spdx-licenses.git", - "reference": "0c3e51e1880ca149682332770e25977c70cf9dae" + "reference": "de30328a7af8680efdc03e396aad24befd513200" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/0c3e51e1880ca149682332770e25977c70cf9dae", - "reference": "0c3e51e1880ca149682332770e25977c70cf9dae", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/de30328a7af8680efdc03e396aad24befd513200", + "reference": "de30328a7af8680efdc03e396aad24befd513200", "shasum": "" }, "require": { @@ -967,7 +1024,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.x-dev" + "dev-main": "1.x-dev" } }, "autoload": { @@ -1002,20 +1059,34 @@ "spdx", "validator" ], - "time": "2020-02-14T07:44:31+00:00" + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2020-12-03T16:04:16+00:00" }, { "name": "composer/xdebug-handler", - "version": "1.4.1", + "version": "1.4.5", "source": { "type": "git", "url": "https://github.com/composer/xdebug-handler.git", - "reference": "1ab9842d69e64fb3a01be6b656501032d1b78cb7" + "reference": "f28d44c286812c714741478d968104c5e604a1d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/1ab9842d69e64fb3a01be6b656501032d1b78cb7", - "reference": "1ab9842d69e64fb3a01be6b656501032d1b78cb7", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/f28d44c286812c714741478d968104c5e604a1d4", + "reference": "f28d44c286812c714741478d968104c5e604a1d4", "shasum": "" }, "require": { @@ -1046,7 +1117,21 @@ "Xdebug", "performance" ], - "time": "2020-03-01T12:26:26+00:00" + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2020-11-13T08:04:11+00:00" }, { "name": "csharpru/vault-php", @@ -1391,6 +1476,20 @@ "constructor", "instantiate" ], + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], "time": "2020-11-10T18:47:58+00:00" }, { @@ -1453,6 +1552,20 @@ "parser", "php" ], + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], "time": "2020-05-25T17:44:05+00:00" }, { @@ -1499,16 +1612,16 @@ }, { "name": "fzaninotto/faker", - "version": "v1.9.1", + "version": "v1.9.2", "source": { "type": "git", "url": "https://github.com/fzaninotto/Faker.git", - "reference": "fc10d778e4b84d5bd315dad194661e091d307c6f" + "reference": "848d8125239d7dbf8ab25cb7f054f1a630e68c2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/fc10d778e4b84d5bd315dad194661e091d307c6f", - "reference": "fc10d778e4b84d5bd315dad194661e091d307c6f", + "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/848d8125239d7dbf8ab25cb7f054f1a630e68c2e", + "reference": "848d8125239d7dbf8ab25cb7f054f1a630e68c2e", "shasum": "" }, "require": { @@ -1546,20 +1659,20 @@ "fixtures" ], "abandoned": true, - "time": "2019-12-12T13:22:17+00:00" + "time": "2020-12-11T09:56:16+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "6.5.3", + "version": "6.5.5", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "aab4ebd862aa7d04f01a4b51849d657db56d882e" + "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/aab4ebd862aa7d04f01a4b51849d657db56d882e", - "reference": "aab4ebd862aa7d04f01a4b51849d657db56d882e", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", + "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", "shasum": "" }, "require": { @@ -1567,7 +1680,7 @@ "guzzlehttp/promises": "^1.0", "guzzlehttp/psr7": "^1.6.1", "php": ">=5.5", - "symfony/polyfill-intl-idn": "^1.11" + "symfony/polyfill-intl-idn": "^1.17.0" }, "require-dev": { "ext-curl": "*", @@ -1613,7 +1726,7 @@ "rest", "web service" ], - "time": "2020-04-18T10:38:46+00:00" + "time": "2020-06-16T21:01:06+00:00" }, { "name": "guzzlehttp/promises", @@ -1913,16 +2026,16 @@ }, { "name": "justinrainbow/json-schema", - "version": "5.2.9", + "version": "5.2.10", "source": { "type": "git", "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "44c6787311242a979fa15c704327c20e7221a0e4" + "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/44c6787311242a979fa15c704327c20e7221a0e4", - "reference": "44c6787311242a979fa15c704327c20e7221a0e4", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", + "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b", "shasum": "" }, "require": { @@ -1975,32 +2088,33 @@ "json", "schema" ], - "time": "2019-09-25T14:49:45+00:00" + "time": "2020-05-27T16:41:55+00:00" }, { "name": "league/flysystem", - "version": "1.0.66", + "version": "1.1.3", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "021569195e15f8209b1c4bebb78bd66aa4f08c21" + "reference": "9be3b16c877d477357c015cec057548cf9b2a14a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/021569195e15f8209b1c4bebb78bd66aa4f08c21", - "reference": "021569195e15f8209b1c4bebb78bd66aa4f08c21", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/9be3b16c877d477357c015cec057548cf9b2a14a", + "reference": "9be3b16c877d477357c015cec057548cf9b2a14a", "shasum": "" }, "require": { "ext-fileinfo": "*", - "php": ">=5.5.9" + "league/mime-type-detection": "^1.3", + "php": "^7.2.5 || ^8.0" }, "conflict": { "league/flysystem-sftp": "<1.0.6" }, "require-dev": { - "phpspec/phpspec": "^3.4", - "phpunit/phpunit": "^5.7.26" + "phpspec/prophecy": "^1.11.1", + "phpunit/phpunit": "^8.5.8" }, "suggest": { "ext-fileinfo": "Required for MimeType", @@ -2059,20 +2173,78 @@ "sftp", "storage" ], - "time": "2020-03-17T18:58:12+00:00" + "funding": [ + { + "url": "https://offset.earth/frankdejonge", + "type": "other" + } + ], + "time": "2020-08-23T07:39:11+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.7.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3", + "reference": "3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.18", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2021-01-18T20:58:21+00:00" }, { "name": "monolog/monolog", - "version": "1.25.3", + "version": "1.26.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "fa82921994db851a8becaf3787a9e73c5976b6f1" + "reference": "2209ddd84e7ef1256b7af205d0717fb62cfc9c33" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fa82921994db851a8becaf3787a9e73c5976b6f1", - "reference": "fa82921994db851a8becaf3787a9e73c5976b6f1", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/2209ddd84e7ef1256b7af205d0717fb62cfc9c33", + "reference": "2209ddd84e7ef1256b7af205d0717fb62cfc9c33", "shasum": "" }, "require": { @@ -2086,11 +2258,10 @@ "aws/aws-sdk-php": "^2.4.9 || ^3.0", "doctrine/couchdb": "~1.0@dev", "graylog2/gelf-php": "~1.0", - "jakub-onderka/php-parallel-lint": "0.9", "php-amqplib/php-amqplib": "~2.4", "php-console/php-console": "^3.1.3", + "phpstan/phpstan": "^0.12.59", "phpunit/phpunit": "~4.5", - "phpunit/phpunit-mock-objects": "2.3.0", "ruflin/elastica": ">=0.90 <3.0", "sentry/sentry": "^0.13", "swiftmailer/swiftmailer": "^5.3|^6.0" @@ -2109,11 +2280,6 @@ "sentry/sentry": "Allow sending log messages to a Sentry server" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, "autoload": { "psr-4": { "Monolog\\": "src/Monolog" @@ -2137,29 +2303,39 @@ "logging", "psr-3" ], - "time": "2019-12-20T14:15:16+00:00" + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2020-12-14T12:56:38+00:00" }, { "name": "mtdowling/jmespath.php", - "version": "2.5.0", + "version": "2.6.0", "source": { "type": "git", "url": "https://github.com/jmespath/jmespath.php.git", - "reference": "52168cb9472de06979613d365c7f1ab8798be895" + "reference": "42dae2cbd13154083ca6d70099692fef8ca84bfb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/52168cb9472de06979613d365c7f1ab8798be895", - "reference": "52168cb9472de06979613d365c7f1ab8798be895", + "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/42dae2cbd13154083ca6d70099692fef8ca84bfb", + "reference": "42dae2cbd13154083ca6d70099692fef8ca84bfb", "shasum": "" }, "require": { - "php": ">=5.4.0", - "symfony/polyfill-mbstring": "^1.4" + "php": "^5.4 || ^7.0 || ^8.0", + "symfony/polyfill-mbstring": "^1.17" }, "require-dev": { - "composer/xdebug-handler": "^1.2", - "phpunit/phpunit": "^4.8.36|^7.5.15" + "composer/xdebug-handler": "^1.4", + "phpunit/phpunit": "^4.8.36 || ^7.5.15" }, "bin": [ "bin/jp.php" @@ -2167,7 +2343,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.5-dev" + "dev-master": "2.6-dev" } }, "autoload": { @@ -2194,7 +2370,7 @@ "json", "jsonpath" ], - "time": "2019-12-30T18:03:34+00:00" + "time": "2020-07-31T21:01:56+00:00" }, { "name": "mustache/mustache", @@ -2288,6 +2464,12 @@ "object", "object graph" ], + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], "time": "2020-11-13T09:40:50+00:00" }, { @@ -2704,6 +2886,16 @@ "php", "type" ], + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], "time": "2020-07-20T17:29:33+00:00" }, { @@ -2831,6 +3023,12 @@ "testing", "xunit" ], + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-05-23T08:02:54+00:00" }, { @@ -2881,6 +3079,12 @@ "filesystem", "iterator" ], + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-09-28T05:57:25+00:00" }, { @@ -2934,6 +3138,12 @@ "keywords": [ "process" ], + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-09-28T05:58:55+00:00" }, { @@ -2983,6 +3193,12 @@ "keywords": [ "template" ], + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-10-26T05:33:50+00:00" }, { @@ -3032,6 +3248,12 @@ "keywords": [ "timer" ], + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-10-26T13:16:10+00:00" }, { @@ -3081,6 +3303,12 @@ "keywords": [ "tokenizer" ], + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "abandoned": true, "time": "2020-08-04T08:28:15+00:00" }, @@ -3170,6 +3398,16 @@ "testing", "xunit" ], + "funding": [ + { + "url": "https://phpunit.de/donate.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-07-13T17:55:55+00:00" }, { @@ -3513,6 +3751,16 @@ "queue", "set" ], + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" + } + ], "time": "2021-01-21T17:40:04+00:00" }, { @@ -3594,6 +3842,12 @@ "identifier", "uuid" ], + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + } + ], "time": "2020-08-18T17:17:46+00:00" }, { @@ -3640,6 +3894,12 @@ ], "description": "Collection of value objects that represent the PHP code units", "homepage": "https://github.com/sebastianbergmann/code-unit", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-10-26T13:08:54+00:00" }, { @@ -3685,6 +3945,12 @@ ], "description": "Looks up which function or method a line of code belongs to", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-09-28T05:30:19+00:00" }, { @@ -3749,6 +4015,12 @@ "compare", "equality" ], + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-10-26T15:49:45+00:00" }, { @@ -3805,6 +4077,12 @@ "unidiff", "unified diff" ], + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-10-26T13:10:38+00:00" }, { @@ -3858,6 +4136,12 @@ "environment", "hhvm" ], + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-09-28T05:52:38+00:00" }, { @@ -3925,6 +4209,12 @@ "export", "exporter" ], + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-09-28T05:24:23+00:00" }, { @@ -4026,6 +4316,12 @@ ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-10-26T13:12:34+00:00" }, { @@ -4071,6 +4367,12 @@ ], "description": "Allows reflection of object attributes, including inherited and non-public ones", "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-10-26T13:14:26+00:00" }, { @@ -4124,6 +4426,12 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-10-26T13:17:30+00:00" }, { @@ -4169,6 +4477,12 @@ ], "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-09-28T06:45:17+00:00" }, { @@ -4215,6 +4529,12 @@ ], "description": "Collection of value objects that represent the types of the PHP type system", "homepage": "https://github.com/sebastianbergmann/type", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-10-26T13:18:59+00:00" }, { @@ -4258,24 +4578,30 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-09-28T06:39:44+00:00" }, { "name": "seld/jsonlint", - "version": "1.7.2", + "version": "1.8.3", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "e2e5d290e4d2a4f0eb449f510071392e00e10d19" + "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/e2e5d290e4d2a4f0eb449f510071392e00e10d19", - "reference": "e2e5d290e4d2a4f0eb449f510071392e00e10d19", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9ad6ce79c342fbd44df10ea95511a1b24dee5b57", + "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57", "shasum": "" }, "require": { - "php": "^5.3 || ^7.0" + "php": "^5.3 || ^7.0 || ^8.0" }, "require-dev": { "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" @@ -4307,20 +4633,30 @@ "parser", "validator" ], - "time": "2019-10-24T14:27:39+00:00" + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", + "type": "tidelift" + } + ], + "time": "2020-11-11T09:19:24+00:00" }, { "name": "seld/phar-utils", - "version": "1.1.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "8800503d56b9867d43d9c303b9cbcc26016e82f0" + "reference": "8674b1d84ffb47cc59a101f5d5a3b61e87d23796" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/8800503d56b9867d43d9c303b9cbcc26016e82f0", - "reference": "8800503d56b9867d43d9c303b9cbcc26016e82f0", + "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/8674b1d84ffb47cc59a101f5d5a3b61e87d23796", + "reference": "8674b1d84ffb47cc59a101f5d5a3b61e87d23796", "shasum": "" }, "require": { @@ -4351,26 +4687,27 @@ "keywords": [ "phar" ], - "time": "2020-02-14T15:25:33+00:00" + "time": "2020-07-07T18:42:57+00:00" }, { "name": "symfony/console", - "version": "v4.4.6", + "version": "v4.4.19", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "20bc0c1068565103075359f5ce9e0639b36f92d1" + "reference": "24026c44fc37099fa145707fecd43672831b837a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/20bc0c1068565103075359f5ce9e0639b36f92d1", - "reference": "20bc0c1068565103075359f5ce9e0639b36f92d1", + "url": "https://api.github.com/repos/symfony/console/zipball/24026c44fc37099fa145707fecd43672831b837a", + "reference": "24026c44fc37099fa145707fecd43672831b837a", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.1.3", "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.15", "symfony/service-contracts": "^1.1|^2" }, "conflict": { @@ -4398,11 +4735,6 @@ "symfony/process": "" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Console\\": "" @@ -4425,13 +4757,27 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Console Component", + "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", - "time": "2020-03-16T08:56:54+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-27T09:09:26+00:00" }, { "name": "symfony/css-selector", - "version": "v5.2.2", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", @@ -4475,6 +4821,20 @@ ], "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-01-27T10:01:46+00:00" }, { @@ -4525,6 +4885,20 @@ ], "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-09-07T11:33:47+00:00" }, { @@ -4591,6 +4965,20 @@ ], "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-01-27T09:09:26+00:00" }, { @@ -4653,11 +5041,25 @@ "interoperability", "standards" ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-07-06T13:19:58+00:00" }, { "name": "symfony/filesystem", - "version": "v5.2.2", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", @@ -4698,20 +5100,34 @@ ], "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-01-27T10:01:46+00:00" }, { "name": "symfony/finder", - "version": "v5.2.2", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "196f45723b5e618bf0e23b97e96d11652696ea9e" + "reference": "4adc8d172d602008c204c2e16956f99257248e03" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/196f45723b5e618bf0e23b97e96d11652696ea9e", - "reference": "196f45723b5e618bf0e23b97e96d11652696ea9e", + "url": "https://api.github.com/repos/symfony/finder/zipball/4adc8d172d602008c204c2e16956f99257248e03", + "reference": "4adc8d172d602008c204c2e16956f99257248e03", "shasum": "" }, "require": { @@ -4742,20 +5158,34 @@ ], "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", - "time": "2021-01-27T10:01:46+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-28T22:06:19+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.2.2", + "version": "v5.2.3", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "16dfa5acf8103f0394d447f8eea3ea49f9e50855" + "reference": "20c554c0f03f7cde5ce230ed248470cccbc34c36" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/16dfa5acf8103f0394d447f8eea3ea49f9e50855", - "reference": "16dfa5acf8103f0394d447f8eea3ea49f9e50855", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/20c554c0f03f7cde5ce230ed248470cccbc34c36", + "reference": "20c554c0f03f7cde5ce230ed248470cccbc34c36", "shasum": "" }, "require": { @@ -4798,20 +5228,34 @@ ], "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", - "time": "2021-01-27T11:19:04+00:00" - }, - { - "name": "symfony/mime", - "version": "v5.2.2", - "source": { - "type": "git", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-03T04:42:09+00:00" + }, + { + "name": "symfony/mime", + "version": "v5.2.3", + "source": { + "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "37bade585ea100d235c031b258eff93b5b6bb9a9" + "reference": "7dee6a43493f39b51ff6c5bb2bd576fe40a76c86" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/37bade585ea100d235c031b258eff93b5b6bb9a9", - "reference": "37bade585ea100d235c031b258eff93b5b6bb9a9", + "url": "https://api.github.com/repos/symfony/mime/zipball/7dee6a43493f39b51ff6c5bb2bd576fe40a76c86", + "reference": "7dee6a43493f39b51ff6c5bb2bd576fe40a76c86", "shasum": "" }, "require": { @@ -4863,7 +5307,21 @@ "mime", "mime-type" ], - "time": "2021-01-25T14:08:25+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-02T06:10:15+00:00" }, { "name": "symfony/polyfill-ctype", @@ -4925,25 +5383,39 @@ "polyfill", "portable" ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-01-07T16:49:33+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.15.0", + "version": "v1.22.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf" + "reference": "0eb8293dbbcd6ef6bf81404c9ce7d95bcdf34f44" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf", - "reference": "47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/0eb8293dbbcd6ef6bf81404c9ce7d95bcdf34f44", + "reference": "0eb8293dbbcd6ef6bf81404c9ce7d95bcdf34f44", "shasum": "" }, "require": { - "php": ">=5.3.3", - "symfony/polyfill-mbstring": "^1.3", + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", "symfony/polyfill-php72": "^1.10" }, "suggest": { @@ -4952,7 +5424,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.15-dev" + "dev-main": "1.22-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -4972,6 +5448,10 @@ "name": "Laurent Bassin", "email": "laurent@bassin.info" }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" @@ -4987,7 +5467,102 @@ "portable", "shim" ], - "time": "2020-03-09T19:04:49+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-07T16:49:33+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.22.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "6e971c891537eb617a00bb07a43d182a6915faba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/6e971c891537eb617a00bb07a43d182a6915faba", + "reference": "6e971c891537eb617a00bb07a43d182a6915faba", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.22-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-07T17:09:11+00:00" }, { "name": "symfony/polyfill-mbstring", @@ -5050,29 +5625,47 @@ "portable", "shim" ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-01-07T16:49:33+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.15.0", + "version": "v1.22.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "37b0976c78b94856543260ce09b460a7bc852747" + "reference": "cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/37b0976c78b94856543260ce09b460a7bc852747", - "reference": "37b0976c78b94856543260ce09b460a7bc852747", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9", + "reference": "cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.15-dev" + "dev-main": "1.22-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -5105,29 +5698,47 @@ "portable", "shim" ], - "time": "2020-02-27T09:26:54+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-07T16:49:33+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.15.0", + "version": "v1.22.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "0f27e9f464ea3da33cbe7ca3bdf4eb66def9d0f7" + "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f27e9f464ea3da33cbe7ca3bdf4eb66def9d0f7", - "reference": "0f27e9f464ea3da33cbe7ca3bdf4eb66def9d0f7", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", + "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.15-dev" + "dev-main": "1.22-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" } }, "autoload": { @@ -5163,7 +5774,21 @@ "portable", "shim" ], - "time": "2020-02-27T09:26:54+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-07T16:49:33+00:00" }, { "name": "symfony/polyfill-php80", @@ -5229,31 +5854,40 @@ "portable", "shim" ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-01-07T16:49:33+00:00" }, { "name": "symfony/process", - "version": "v4.4.6", + "version": "v4.4.19", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "b9863d0f7b684d7c4c13e665325b5ff047de0aee" + "reference": "7e950b6366d4da90292c2e7fa820b3c1842b965a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/b9863d0f7b684d7c4c13e665325b5ff047de0aee", - "reference": "b9863d0f7b684d7c4c13e665325b5ff047de0aee", + "url": "https://api.github.com/repos/symfony/process/zipball/7e950b6366d4da90292c2e7fa820b3c1842b965a", + "reference": "7e950b6366d4da90292c2e7fa820b3c1842b965a", "shasum": "" }, "require": { - "php": "^7.1.3" + "php": ">=7.1.3" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Process\\": "" @@ -5276,26 +5910,40 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Process Component", + "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", - "time": "2020-03-23T12:37:11+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-27T09:09:26+00:00" }, { "name": "symfony/service-contracts", - "version": "v1.1.8", + "version": "v2.2.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "ffc7f5692092df31515df2a5ecf3b7302b3ddacf" + "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/ffc7f5692092df31515df2a5ecf3b7302b3ddacf", - "reference": "ffc7f5692092df31515df2a5ecf3b7302b3ddacf", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1", + "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.2.5", "psr/container": "^1.0" }, "suggest": { @@ -5304,7 +5952,11 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1-dev" + "dev-master": "2.2-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" } }, "autoload": { @@ -5336,7 +5988,21 @@ "interoperability", "standards" ], - "time": "2019-10-14T12:27:06+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-09-07T11:33:47+00:00" }, { "name": "symfony/yaml", @@ -5390,6 +6056,20 @@ ], "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-01-27T09:09:26+00:00" }, { @@ -5430,28 +6110,40 @@ } ], "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], "time": "2020-07-12T23:59:07+00:00" }, { "name": "vlucas/phpdotenv", - "version": "v2.6.1", + "version": "v2.6.7", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "2a7dcf7e3e02dc5e701004e51a6f304b713107d5" + "reference": "b786088918a884258c9e3e27405c6a4cf2ee246e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/2a7dcf7e3e02dc5e701004e51a6f304b713107d5", - "reference": "2a7dcf7e3e02dc5e701004e51a6f304b713107d5", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/b786088918a884258c9e3e27405c6a4cf2ee246e", + "reference": "b786088918a884258c9e3e27405c6a4cf2ee246e", "shasum": "" }, "require": { - "php": ">=5.3.9", - "symfony/polyfill-ctype": "^1.9" + "php": "^5.3.9 || ^7.0 || ^8.0", + "symfony/polyfill-ctype": "^1.17" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.0" + "ext-filter": "*", + "ext-pcre": "*", + "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator.", + "ext-pcre": "Required to use most of the library." }, "type": "library", "extra": { @@ -5469,10 +6161,15 @@ "BSD-3-Clause" ], "authors": [ + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "homepage": "https://gjcampbell.co.uk/" + }, { "name": "Vance Lucas", "email": "vance@vancelucas.com", - "homepage": "http://www.vancelucas.com" + "homepage": "https://vancelucas.com/" } ], "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", @@ -5481,7 +6178,17 @@ "env", "environment" ], - "time": "2019-01-29T11:11:52+00:00" + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2021-01-20T14:39:13+00:00" }, { "name": "webmozart/assert", @@ -5573,16 +6280,16 @@ "packages-dev": [ { "name": "brainmaestro/composer-git-hooks", - "version": "v2.8.3", + "version": "v2.8.4", "source": { "type": "git", "url": "https://github.com/BrainMaestro/composer-git-hooks.git", - "reference": "97888dd34e900931117747cd34a42fdfcf271142" + "reference": "06f8cc6eb5771791c5b50356c033523e7fa69587" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/BrainMaestro/composer-git-hooks/zipball/97888dd34e900931117747cd34a42fdfcf271142", - "reference": "97888dd34e900931117747cd34a42fdfcf271142", + "url": "https://api.github.com/repos/BrainMaestro/composer-git-hooks/zipball/06f8cc6eb5771791c5b50356c033523e7fa69587", + "reference": "06f8cc6eb5771791c5b50356c033523e7fa69587", "shasum": "" }, "require": { @@ -5638,7 +6345,7 @@ "composer", "git" ], - "time": "2019-12-09T09:49:20+00:00" + "time": "2021-01-26T14:47:34+00:00" }, { "name": "codacy/coverage", @@ -5733,26 +6440,27 @@ }, { "name": "gitonomy/gitlib", - "version": "v1.2.1", + "version": "v1.2.3", "source": { "type": "git", "url": "https://github.com/gitonomy/gitlib.git", - "reference": "718ca021c67f3ea8f6a5fa5d231ec49675068868" + "reference": "d22f212b97fdb631ac73dfae65c194dc4cb0d227" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/gitonomy/gitlib/zipball/718ca021c67f3ea8f6a5fa5d231ec49675068868", - "reference": "718ca021c67f3ea8f6a5fa5d231ec49675068868", + "url": "https://api.github.com/repos/gitonomy/gitlib/zipball/d22f212b97fdb631ac73dfae65c194dc4cb0d227", + "reference": "d22f212b97fdb631ac73dfae65c194dc4cb0d227", "shasum": "" }, "require": { "ext-pcre": "*", - "php": "^5.6 || ^7.0", + "php": "^5.6 || ^7.0 || ^8.0", "symfony/polyfill-mbstring": "^1.7", - "symfony/process": "^3.4|^4.0|^5.0" + "symfony/process": "^3.4 || ^4.0 || ^5.0" }, "require-dev": { - "phpunit/phpunit": "^5.7|^6.5|^7.0", + "ext-fileinfo": "*", + "phpunit/phpunit": "^5.7 || ^6.5 || ^7.0 || ^8.0 || ^9.0", "psr/log": "^1.0" }, "suggest": { @@ -5760,11 +6468,6 @@ "psr/log": "Required to use loggers for reporting of execution" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2-dev" - } - }, "autoload": { "psr-4": { "Gitonomy\\Git\\": "src/Gitonomy/Git/" @@ -5793,7 +6496,13 @@ } ], "description": "Library for accessing git", - "time": "2020-03-23T12:43:44+00:00" + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/gitonomy/gitlib", + "type": "tidelift" + } + ], + "time": "2020-12-29T16:48:45+00:00" }, { "name": "goaop/framework", @@ -6116,16 +6825,16 @@ }, { "name": "pdepend/pdepend", - "version": "2.7.1", + "version": "2.8.0", "source": { "type": "git", "url": "https://github.com/pdepend/pdepend.git", - "reference": "daba1cf0a6edaf172fa02a17807ae29f4c1c7471" + "reference": "c64472f8e76ca858c79ad9a4cf1e2734b3f8cc38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pdepend/pdepend/zipball/daba1cf0a6edaf172fa02a17807ae29f4c1c7471", - "reference": "daba1cf0a6edaf172fa02a17807ae29f4c1c7471", + "url": "https://api.github.com/repos/pdepend/pdepend/zipball/c64472f8e76ca858c79ad9a4cf1e2734b3f8cc38", + "reference": "c64472f8e76ca858c79ad9a4cf1e2734b3f8cc38", "shasum": "" }, "require": { @@ -6159,7 +6868,13 @@ "BSD-3-Clause" ], "description": "Official version of pdepend to be handled with Composer", - "time": "2020-02-08T12:06:13+00:00" + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/pdepend/pdepend", + "type": "tidelift" + } + ], + "time": "2020-06-20T10:53:13+00:00" }, { "name": "php-coveralls/php-coveralls", @@ -6224,16 +6939,16 @@ }, { "name": "phpmd/phpmd", - "version": "2.8.2", + "version": "2.9.1", "source": { "type": "git", "url": "https://github.com/phpmd/phpmd.git", - "reference": "714629ed782537f638fe23c4346637659b779a77" + "reference": "ce10831d4ddc2686c1348a98069771dd314534a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpmd/phpmd/zipball/714629ed782537f638fe23c4346637659b779a77", - "reference": "714629ed782537f638fe23c4346637659b779a77", + "url": "https://api.github.com/repos/phpmd/phpmd/zipball/ce10831d4ddc2686c1348a98069771dd314534a8", + "reference": "ce10831d4ddc2686c1348a98069771dd314534a8", "shasum": "" }, "require": { @@ -6244,6 +6959,8 @@ }, "require-dev": { "easy-doc/easy-doc": "0.0.0 || ^1.3.2", + "ext-json": "*", + "ext-simplexml": "*", "gregwar/rst": "^1.0", "mikey179/vfsstream": "^1.6.4", "phpunit/phpunit": "^4.8.36 || ^5.7.27", @@ -6290,7 +7007,13 @@ "phpmd", "pmd" ], - "time": "2020-02-16T20:15:50+00:00" + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/phpmd/phpmd", + "type": "tidelift" + } + ], + "time": "2020-09-23T22:06:32+00:00" }, { "name": "rregeer/phpunit-coverage-check", @@ -6378,6 +7101,12 @@ ], "description": "Library for parsing CLI options", "homepage": "https://github.com/sebastianbergmann/cli-parser", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-09-28T06:08:49+00:00" }, { @@ -6429,20 +7158,26 @@ ], "description": "Copy/Paste Detector (CPD) for PHP code.", "homepage": "https://github.com/sebastianbergmann/phpcpd", + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-12-07T05:39:23+00:00" }, { "name": "squizlabs/php_codesniffer", - "version": "3.5.4", + "version": "3.5.8", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "dceec07328401de6211037abbb18bda423677e26" + "reference": "9d583721a7157ee997f235f327de038e7ea6dac4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/dceec07328401de6211037abbb18bda423677e26", - "reference": "dceec07328401de6211037abbb18bda423677e26", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/9d583721a7157ee997f235f327de038e7ea6dac4", + "reference": "9d583721a7157ee997f235f327de038e7ea6dac4", "shasum": "" }, "require": { @@ -6480,24 +7215,24 @@ "phpcs", "standards" ], - "time": "2020-01-30T22:20:29+00:00" + "time": "2020-10-23T02:01:07+00:00" }, { "name": "symfony/config", - "version": "v4.4.6", + "version": "v4.4.19", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "235e5afffd3a1a1b0dd0221973cbf670bc3be1d4" + "reference": "2c4c7827a7e143f5cf375666641b0f448eab8802" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/235e5afffd3a1a1b0dd0221973cbf670bc3be1d4", - "reference": "235e5afffd3a1a1b0dd0221973cbf670bc3be1d4", + "url": "https://api.github.com/repos/symfony/config/zipball/2c4c7827a7e143f5cf375666641b0f448eab8802", + "reference": "2c4c7827a7e143f5cf375666641b0f448eab8802", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.1.3", "symfony/filesystem": "^3.4|^4.0|^5.0", "symfony/polyfill-ctype": "~1.8" }, @@ -6515,11 +7250,6 @@ "symfony/yaml": "To use the yaml reference dumper" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Config\\": "" @@ -6542,26 +7272,40 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Config Component", + "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", - "time": "2020-03-16T11:24:17+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-27T09:09:26+00:00" }, { "name": "symfony/dependency-injection", - "version": "v4.4.6", + "version": "v4.4.19", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "b4242fc7f18c8bf5427f84d5afe2131c9b323a04" + "reference": "2468b95d869c872c6fb1b93b395a7fcd5331f2b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/b4242fc7f18c8bf5427f84d5afe2131c9b323a04", - "reference": "b4242fc7f18c8bf5427f84d5afe2131c9b323a04", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/2468b95d869c872c6fb1b93b395a7fcd5331f2b9", + "reference": "2468b95d869c872c6fb1b93b395a7fcd5331f2b9", "shasum": "" }, "require": { - "php": "^7.1.3", + "php": ">=7.1.3", "psr/container": "^1.0", "symfony/service-contracts": "^1.1.6|^2" }, @@ -6588,11 +7332,6 @@ "symfony/yaml": "" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\DependencyInjection\\": "" @@ -6615,33 +7354,42 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony DependencyInjection Component", + "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", - "time": "2020-03-18T07:51:32+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-01-27T09:09:26+00:00" }, { "name": "symfony/stopwatch", - "version": "v3.4.38", + "version": "v3.4.47", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "e2d954156d4817c9a5c79f519a71516693a4a9c8" + "reference": "298b81faad4ce60e94466226b2abbb8c9bca7462" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/e2d954156d4817c9a5c79f519a71516693a4a9c8", - "reference": "e2d954156d4817c9a5c79f519a71516693a4a9c8", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/298b81faad4ce60e94466226b2abbb8c9bca7462", + "reference": "298b81faad4ce60e94466226b2abbb8c9bca7462", "shasum": "" }, "require": { "php": "^5.5.9|>=7.0.8" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.4-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\Stopwatch\\": "" @@ -6666,7 +7414,21 @@ ], "description": "Symfony Stopwatch Component", "homepage": "https://symfony.com", - "time": "2020-01-01T11:03:25+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-24T10:57:07+00:00" } ], "aliases": [], @@ -6675,11 +7437,12 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": "~7.3.0", + "php": "^7.3", "ext-curl": "*", "ext-dom": "*", "ext-json": "*", "ext-openssl": "*" }, - "platform-dev": [] + "platform-dev": [], + "plugin-api-version": "1.1.0" } diff --git a/src/Magento/FunctionalTestingFramework/Console/BuildProjectCommand.php b/src/Magento/FunctionalTestingFramework/Console/BuildProjectCommand.php index 02dfcda82..4d2964ff1 100644 --- a/src/Magento/FunctionalTestingFramework/Console/BuildProjectCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/BuildProjectCommand.php @@ -67,7 +67,7 @@ protected function configure() * @param OutputInterface $output * @return void * @throws \Exception - * @SuppressWarnings(PHPMD.UnusedLocalVariable) + * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ protected function execute(InputInterface $input, OutputInterface $output) { diff --git a/src/Magento/FunctionalTestingFramework/Console/RunManifestCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunManifestCommand.php index 37a90bb77..415b7bcdd 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunManifestCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunManifestCommand.php @@ -104,7 +104,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int * @param OutputInterface $output * @return void * - * @SuppressWarnings(PHPMD.UnusedLocalVariable) Need this because of the unused $type variable in the closure + * @SuppressWarnings(PHPMD.UnusedFormalParameter) Need this because of the unused $type variable in the closure */ private function runManifestLine(string $manifestLine, OutputInterface $output) { diff --git a/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php index 08b84d6a1..7b0550de3 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunTestCommand.php @@ -168,7 +168,7 @@ private function runTestsInSuite(array $suitesConfig, OutputInterface $output) * @param OutputInterface $output * @return integer * - * @SuppressWarnings(PHPMD.UnusedLocalVariable) + * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ private function executeTestCommand(string $command, OutputInterface $output) { diff --git a/src/Magento/FunctionalTestingFramework/Console/RunTestGroupCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunTestGroupCommand.php index be6236c73..ef3b3cc1a 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunTestGroupCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunTestGroupCommand.php @@ -51,7 +51,7 @@ protected function configure() * @return integer * @throws \Exception * - * @SuppressWarnings(PHPMD.UnusedLocalVariable) + * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ protected function execute(InputInterface $input, OutputInterface $output): int { diff --git a/src/Magento/FunctionalTestingFramework/Helper/MagentoFakerData.php b/src/Magento/FunctionalTestingFramework/Helper/MagentoFakerData.php index 9c28a3531..1d099214c 100644 --- a/src/Magento/FunctionalTestingFramework/Helper/MagentoFakerData.php +++ b/src/Magento/FunctionalTestingFramework/Helper/MagentoFakerData.php @@ -98,6 +98,8 @@ public function getProductData() * Get Content Page Data. * * @return array + * + * @SuppressWarnings(PHPMD.UnusedLocalVariable) */ public function getContentPage() { diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php index 76fa6913f..fd1d1eebb 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -459,7 +459,9 @@ public function waitForLoadingMaskToDisappear($timeout = null) public function formatMoney(float $money, $locale = 'en_US.UTF-8') { $this->mSetLocale(LC_MONETARY, $locale); + // @codingStandardsIgnoreStart $money = money_format('%.2n', $money); + // @codingStandardsIgnoreEnd $this->mResetLocale(); $prefix = substr($money, 0, 1); $number = substr($money, 1); From 4640c03111b7e68617dbccf1050f5780a2532ec5 Mon Sep 17 00:00:00 2001 From: Ji Lu Date: Thu, 4 Feb 2021 17:40:31 -0600 Subject: [PATCH 10/31] MQE-2493: Update assert implementation in mftf 2.x to work with phpunit 9 --- .../verification/Resources/AssertTest.txt | 26 ++-- .../TestModule/Test/AssertTest.xml | 11 +- .../Util/TestGenerator.php | 147 ++++++++++++++++-- 3 files changed, 156 insertions(+), 28 deletions(-) diff --git a/dev/tests/verification/Resources/AssertTest.txt b/dev/tests/verification/Resources/AssertTest.txt index c0cf932ae..aa5619ede 100644 --- a/dev/tests/verification/Resources/AssertTest.txt +++ b/dev/tests/verification/Resources/AssertTest.txt @@ -45,6 +45,7 @@ class AssertTestCest $I->assertArrayNotHasKey("kiwi", ['orange' => 2, 'apple' => 1], "pass"); // stepKey: assertArrayNotHasKey $I->assertArraySubset([1, 2], [1, 2, 3, 5], "pass"); // stepKey: assertArraySubset $I->assertContains("ab", ['item1' => 'a', 'item2' => 'ab'], "pass"); // stepKey: assertContains + $I->assertStringContainsString("ab", "abcde", "pass"); // stepKey: assertStringContainsString $I->assertCount(2, ['a', 'b'], "pass"); // stepKey: assertCount $I->assertEmpty([], "pass"); // stepKey: assertEmpty $I->assertEquals($text, "Copyright © 2013-2017 Magento, Inc. All rights reserved.", "pass"); // stepKey: assertEquals1 @@ -56,17 +57,17 @@ class AssertTestCest $I->assertGreaterOrEquals(2, 5, "pass"); // stepKey: assertGreaterOrEquals $I->assertGreaterThan(2, 5, "pass"); // stepKey: assertGreaterthan $I->assertGreaterThanOrEqual(2, 5, "pass"); // stepKey: assertGreaterThanOrEqual - $I->assertInternalType("string", "xyz", "pass"); // stepKey: assertInternalType1 - $I->assertInternalType("int", 21, "pass"); // stepKey: assertInternalType2 - $I->assertInternalType("string", $text, "pass"); // stepKey: assertInternalType3 + $I->assertIsString("xyz", "pass"); // stepKey: assertInternalType1 + $I->assertIsInt(21, "pass"); // stepKey: assertInternalType2 + $I->assertIsString($text, "pass"); // stepKey: assertInternalType3 $I->assertLessOrEquals(5, 2, "pass"); // stepKey: assertLessOrEquals $I->assertLessThan(5, 2, "pass"); // stepKey: assertLessThan $I->assertLessThanOrEqual(5, 2, "pass"); // stepKey: assertLessThanOrEquals - $I->assertNotContains("bc", ['item1' => 'a', 'item2' => 'ab'], "pass"); // stepKey: assertNotContains1 - $I->assertNotContains("bc", $text, "pass"); // stepKey: assertNotContains2 + $I->assertNotContains("bc", ['item1' => 'a', 'item2' => 'ab'], "pass"); // stepKey: assertNotContains + $I->assertStringNotContainsString("bc", $text, "pass"); // stepKey: assertStringNotContainsString $I->assertNotEmpty([1, 2], "pass"); // stepKey: assertNotEmpty1 $I->assertNotEmpty($text, "pass"); // stepKey: assertNotEmpty2 - $I->assertNotEquals(2, 5, "pass", 0); // stepKey: assertNotEquals + $I->assertNotEqualsWithDelta(2, 5, 0, "pass"); // stepKey: assertNotEquals $I->assertNotNull("abc", "pass"); // stepKey: assertNotNull1 $I->assertNotNull($text, "pass"); // stepKey: assertNotNull2 $I->assertNotRegExp("/foo/", "bar", "pass"); // stepKey: assertNotRegExp @@ -81,7 +82,8 @@ class AssertTestCest $I->assertArrayHasKey("apple", ['orange' => 2, 'apple' => 1], "pass"); // stepKey: assertArrayHasKeyBackwardCompatible $I->assertArrayNotHasKey("kiwi", ['orange' => 2, 'apple' => 1], "pass"); // stepKey: assertArrayNotHasKeyBackwardCompatible $I->assertArraySubset([1, 2], [1, 2, 3, 5], "pass"); // stepKey: assertArraySubsetBackwardCompatible - $I->assertContains("ab", ['item1' => 'a', 'item2' => 'ab'], "pass"); // stepKey: assertContainsBackwardCompatible + $I->assertContains("ab", ['item1' => 'a', 'item2' => 'ab'], "pass"); // stepKey: assertContains1BackwardCompatible + $I->assertStringContainsString("ab", "abcde", "pass"); // stepKey: assertContains2BackwardCompatible $I->assertCount(2, ['a', 'b'], "pass"); // stepKey: assertCountBackwardCompatible $I->assertEmpty([], "pass"); // stepKey: assertEmptyBackwardCompatible $I->assertEquals($text, "Copyright © 2013-2017 Magento, Inc. All rights reserved.", "pass"); // stepKey: assertEquals1BackwardCompatible @@ -92,17 +94,17 @@ class AssertTestCest $I->assertGreaterOrEquals(2, 5, "pass"); // stepKey: assertGreaterOrEqualsBackwardCompatible $I->assertGreaterThan(2, 5, "pass"); // stepKey: assertGreaterThanBackwardCompatible $I->assertGreaterThanOrEqual(2, 5, "pass"); // stepKey: assertGreaterThanOrEqualBackwardCompatible - $I->assertInternalType("string", "xyz", "pass"); // stepKey: assertInternalType1BackwardCompatible - $I->assertInternalType("int", 21, "pass"); // stepKey: assertInternalType2BackwardCompatible - $I->assertInternalType("string", $text, "pass"); // stepKey: assertInternalType3BackwardCompatible + $I->assertIsString("xyz", "pass"); // stepKey: assertInternalType1BackwardCompatible + $I->assertIsInt(21, "pass"); // stepKey: assertInternalType2BackwardCompatible + $I->assertIsString($text, "pass"); // stepKey: assertInternalType3BackwardCompatible $I->assertLessOrEquals(5, 2, "pass"); // stepKey: assertLessOrEqualBackwardCompatibles $I->assertLessThan(5, 2, "pass"); // stepKey: assertLessThanBackwardCompatible $I->assertLessThanOrEqual(5, 2, "pass"); // stepKey: assertLessThanOrEqualBackwardCompatible $I->assertNotContains("bc", ['item1' => 'a', 'item2' => 'ab'], "pass"); // stepKey: assertNotContains1BackwardCompatible - $I->assertNotContains("bc", $text, "pass"); // stepKey: assertNotContains2BackwardCompatible + $I->assertStringNotContainsString("bc", $text, "pass"); // stepKey: assertNotContains2BackwardCompatible $I->assertNotEmpty([1, 2], "pass"); // stepKey: assertNotEmpty1BackwardCompatible $I->assertNotEmpty($text, "pass"); // stepKey: assertNotEmpty2BackwardCompatible - $I->assertNotEquals(2, 5, "pass", 0); // stepKey: assertNotEqualsBackwardCompatible + $I->assertNotEqualsWithDelta(2, 5, 0, "pass"); // stepKey: assertNotEqualsBackwardCompatible $I->assertNotNull("abc", "pass"); // stepKey: assertNotNull1BackwardCompatible $I->assertNotNull($text, "pass"); // stepKey: assertNotNull2BackwardCompatible $I->assertNotRegExp("/foo/", "bar", "pass"); // stepKey: assertNotRegExpBackwardCompatible diff --git a/dev/tests/verification/TestModule/Test/AssertTest.xml b/dev/tests/verification/TestModule/Test/AssertTest.xml index 8cdc724cc..e0ba88c5d 100644 --- a/dev/tests/verification/TestModule/Test/AssertTest.xml +++ b/dev/tests/verification/TestModule/Test/AssertTest.xml @@ -39,6 +39,10 @@ ab ['item1' => 'a', 'item2' => 'ab'] + + ab + abcde + 2 ['a', 'b'] @@ -103,11 +107,11 @@ 5 2 - + bc ['item1' => 'a', 'item2' => 'ab'] - + bc text @@ -160,7 +164,8 @@ - + + diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index dafbdaf7e..3d0b70440 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -62,6 +62,23 @@ class TestGenerator const MFTF_3_O_0_DEPRECATION_MESSAGE = ' is DEPRECATED and will be removed in MFTF 3.0.0.'; + /** + * PHPUnit 9 Assert Equal Types + */ + const ASSERT_EQUAL_TYPES = [ + 'array', + 'bool', + 'float', + 'int', + 'numeric', + 'object', + 'resource', + 'string', + 'scalar', + 'callable', + 'iterable', + ]; + /** * Actor name for AcceptanceTest * @@ -1011,6 +1028,7 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato break; case "selectOption": case "unselectOption": + case "seeNumberOfElements": $testSteps .= $this->wrapFunctionCall( $actor, $actionObject, @@ -1190,15 +1208,6 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato case "seeOptionIsSelected": $testSteps .= $this->wrapFunctionCall($actor, $actionObject, $selector, $input); break; - case "seeNumberOfElements": - $testSteps .= $this->wrapFunctionCall( - $actor, - $actionObject, - $selector, - $input, - $parameterArray - ); - break; case "seeInPageSource": case "dontSeeInPageSource": case "seeInSource": @@ -1219,14 +1228,67 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato ); break; case "assertEquals": + if (isset($assertDelta)) { + $replaceType = 'assertEqualsWithDelta'; + call_user_func(\Closure::bind( + function () use ($actionObject, $replaceType) { + $actionObject->type = $replaceType; + }, + null, + $actionObject + )); + $testSteps .= $this->wrapFunctionCall( + $actor, + $actionObject, + $assertExpected, + $assertActual, + $assertDelta, + $assertMessage + ); + } else { + $testSteps .= $this->wrapFunctionCall( + $actor, + $actionObject, + $assertExpected, + $assertActual, + $assertMessage + ); + } + break; + case "assertNotEquals": + if (isset($assertDelta)) { + $replaceType = 'assertNotEqualsWithDelta'; + call_user_func(\Closure::bind( + function () use ($actionObject, $replaceType) { + $actionObject->type = $replaceType; + }, + null, + $actionObject + )); + $testSteps .= $this->wrapFunctionCall( + $actor, + $actionObject, + $assertExpected, + $assertActual, + $assertDelta, + $assertMessage + ); + } else { + $testSteps .= $this->wrapFunctionCall( + $actor, + $actionObject, + $assertExpected, + $assertActual, + $assertMessage + ); + } + break; case "assertGreaterOrEquals": case "assertGreaterThan": case "assertGreaterThanOrEqual": - case "assertInternalType": case "assertLessOrEquals": case "assertLessThan": case "assertLessThanOrEqual": - case "assertNotEquals": case "assertInstanceOf": case "assertNotInstanceOf": case "assertNotRegExp": @@ -1238,8 +1300,6 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato case "assertArrayHasKey": case "assertArrayNotHasKey": case "assertCount": - case "assertContains": - case "assertNotContains": case "expectException": $testSteps .= $this->wrapFunctionCall( $actor, @@ -1250,6 +1310,67 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato $assertDelta ); break; + case "assertContains": + if ((substr(trim($assertActual), 0, 1) !== '[') + || (substr(trim($assertActual), -1, 1) !== ']')) { + $replaceType = 'assertStringContainsString'; + call_user_func(\Closure::bind( + function () use ($actionObject, $replaceType) { + $actionObject->type = $replaceType; + }, + null, + $actionObject + )); + } + $testSteps .= $this->wrapFunctionCall( + $actor, + $actionObject, + $assertExpected, + $assertActual, + $assertMessage + ); + break; + case "assertNotContains": + if ((substr(trim($assertActual), 0, 1) !== '[') + || (substr(trim($assertActual), -1, 1) !== ']')) { + $replaceType = 'assertStringNotContainsString'; + call_user_func(\Closure::bind( + function () use ($actionObject, $replaceType) { + $actionObject->type = $replaceType; + }, + null, + $actionObject + )); + } + $testSteps .= $this->wrapFunctionCall( + $actor, + $actionObject, + $assertExpected, + $assertActual, + $assertMessage + ); + break; + case "assertInternalType": + foreach (self::ASSERT_EQUAL_TYPES as $type) { + if (stristr($assertExpected, $type) !== false) { + $replaceType = 'assertIs' . ucfirst($type); + call_user_func(\Closure::bind( + function () use ($actionObject, $replaceType) { + $actionObject->type = $replaceType; + }, + null, + $actionObject + )); + break; + } + } + $testSteps .= $this->wrapFunctionCall( + $actor, + $actionObject, + $assertActual, + $assertMessage + ); + break; case "assertElementContainsAttribute": // If a blank string or null is passed in we need to pass a blank string to the function. if (empty($assertExpected)) { From f80e2db7078f957c042ca94ad18323eb687bc287 Mon Sep 17 00:00:00 2001 From: Ji Lu Date: Mon, 8 Feb 2021 12:15:41 -0600 Subject: [PATCH 11/31] MQE-2494: Missing steps in Allure logs for certain test failures --- .../Util/Sorter/ParallelGroupSorterTest.php | 4 +- .../Tests/SuiteGenerationTest.php | 8 +- .../Allure/Adapter/MagentoAllureAdapter.php | 94 ++++++++++++++++++- .../Console/RunTestFailedCommand.php | 23 ++++- .../Module/MagentoWebDriver.php | 3 +- .../Util/Sorter/ParallelGroupSorter.php | 6 +- 6 files changed, 120 insertions(+), 18 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php index 997bf0c3e..48966fbaa 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/Sorter/ParallelGroupSorterTest.php @@ -101,8 +101,8 @@ public function testSortWithSuites() $this->assertCount(5, $actualResult); $expectedResults = [ - 1 => ['mockSuite1_0'], - 2 => ['mockSuite1_1'], + 1 => ['mockSuite1_0_G'], + 2 => ['mockSuite1_1_G'], 3 => ['test3'], 4 => ['test2','test5', 'test4'], 5 => ['test1'], diff --git a/dev/tests/verification/Tests/SuiteGenerationTest.php b/dev/tests/verification/Tests/SuiteGenerationTest.php index 926287aad..4a8371692 100644 --- a/dev/tests/verification/Tests/SuiteGenerationTest.php +++ b/dev/tests/verification/Tests/SuiteGenerationTest.php @@ -118,10 +118,10 @@ public function testSuiteGenerationParallel() $groupName = 'functionalSuite1'; $expectedGroups = [ - 'functionalSuite1_0', - 'functionalSuite1_1', - 'functionalSuite1_2', - 'functionalSuite1_3' + 'functionalSuite1_0_G', + 'functionalSuite1_1_G', + 'functionalSuite1_2_G', + 'functionalSuite1_3_G' ]; $expectedContents = [ diff --git a/src/Magento/FunctionalTestingFramework/Allure/Adapter/MagentoAllureAdapter.php b/src/Magento/FunctionalTestingFramework/Allure/Adapter/MagentoAllureAdapter.php index e9e1c344c..7d7a7bd44 100644 --- a/src/Magento/FunctionalTestingFramework/Allure/Adapter/MagentoAllureAdapter.php +++ b/src/Magento/FunctionalTestingFramework/Allure/Adapter/MagentoAllureAdapter.php @@ -5,13 +5,18 @@ */ namespace Magento\FunctionalTestingFramework\Allure\Adapter; +use Codeception\Codecept; +use Codeception\Test\Cest; use Codeception\Step\Comment; use Magento\FunctionalTestingFramework\Suite\Handlers\SuiteObjectHandler; use Magento\FunctionalTestingFramework\Test\Objects\ActionGroupObject; use Magento\FunctionalTestingFramework\Test\Objects\ActionObject; use Magento\FunctionalTestingFramework\Util\TestGenerator; +use Yandex\Allure\Adapter\Model\Failure; +use Yandex\Allure\Adapter\Model\Provider; use Yandex\Allure\Adapter\Model\Status; use Yandex\Allure\Adapter\Model\Step; +use Yandex\Allure\Adapter\Allure; use Yandex\Allure\Codeception\AllureCodeception; use Yandex\Allure\Adapter\Event\StepStartedEvent; use Yandex\Allure\Adapter\Event\StepFinishedEvent; @@ -19,9 +24,11 @@ use Yandex\Allure\Adapter\Event\TestCaseFailedEvent; use Yandex\Allure\Adapter\Event\TestCaseFinishedEvent; use Yandex\Allure\Adapter\Event\TestCaseBrokenEvent; +use Yandex\Allure\Adapter\Event\AddAttachmentEvent; use Codeception\Event\FailEvent; use Codeception\Event\SuiteEvent; use Codeception\Event\StepEvent; +use Codeception\Event\TestEvent; /** * Class MagentoAllureAdapter @@ -114,6 +121,7 @@ private function sanitizeGroupName($group) // if we can't find this group in the generated suites we have to assume that the group was split for generation $groupNameSplit = explode("_", $group); array_pop($groupNameSplit); + array_pop($groupNameSplit); $originalName = implode("_", $groupNameSplit); // confirm our original name is one of the existing suite names otherwise just return the original group name @@ -245,11 +253,17 @@ public function testError(FailEvent $failEvent) /** * Override of parent method, polls stepStorage for testcase and formats it according to actionGroup nesting. - * + * @param TestEvent $testEvent + * @throws \Yandex\Allure\Adapter\AllureException * @return void */ - public function testEnd() + public function testEnd(TestEvent $testEvent) { + $test = $this->getLifecycle()->getTestCaseStorage()->get(); + // update testClass label to consolidate re-try reporting + $this->formatAllureTestClassName($test); + // Peek top of testCaseStorage to check of failure + $testFailed = $test->getFailure(); // Pops top of stepStorage, need to add it back in after processing $rootStep = $this->getLifecycle()->getStepStorage()->pollLast(); $formattedSteps = []; @@ -257,6 +271,7 @@ public function testEnd() $actionGroupStepKey = null; foreach ($rootStep->getSteps() as $step) { + $this->removeAttachments($step, $testFailed); $stepKey = str_replace($actionGroupStepKey, '', $step->getName()); if ($stepKey !== '[]' && $stepKey !== null) { $step->setName($stepKey); @@ -309,9 +324,28 @@ function () use ($rootStep, $formattedSteps) { $this->getLifecycle()->getStepStorage()->put($rootStep); + $this->addAttachmentEvent($testEvent); + $this->getLifecycle()->fire(new TestCaseFinishedEvent()); } + /** + * Fire add attachment event + * @param TestEvent $testEvent + * @throws \Yandex\Allure\Adapter\AllureException + * @return void + */ + private function addAttachmentEvent(TestEvent $testEvent) + { + // attachments supported since Codeception 3.0 + if (version_compare(Codecept::VERSION, '3.0.0') > -1 && $testEvent->getTest() instanceof Cest) { + $artifacts = $testEvent->getTest()->getMetadata()->getReports(); + foreach ($artifacts as $name => $artifact) { + Allure::lifecycle()->fire(new AddAttachmentEvent($artifact, $name, null)); + } + } + } + /** * Reads action group stepKey from step. * @@ -354,4 +388,60 @@ private function retrieveStepKey($stepLine) return $stepKey; } + + /** + * Removes attachments from step depending on MFTF configuration + * @param Step $step + * @param Failure $testFailed + * @return void + */ + private function removeAttachments($step, $testFailed) + { + //Remove Attachments if verbose flag is not true AND test did not fail + if (getenv('VERBOSE_ARTIFACTS') !== "true" && $testFailed === null) { + foreach ($step->getAttachments() as $index => $attachment) { + $step->removeAttachment($index); + unlink(Provider::getOutputDirectory() . DIRECTORY_SEPARATOR . $attachment->getSource()); + } + } + } + + /** + * Format testClass label to consolidate re-try reporting for groups split for parallel execution + * @param TestCase $test + * @return void + */ + private function formatAllureTestClassName($test) + { + if ($this->getGroup() !== null) { + foreach ($test->getLabels() as $name => $label) { + if ($label->getName() == 'testClass') { + $originalTestClass = $this->sanitizeTestClassLabel($label->getValue()); + call_user_func(\Closure::bind( + function () use ($label, $originalTestClass) { + $label->value = $originalTestClass; + }, + null, + $label + )); + break; + } + } + } + } + + /** + * Function which sanitizes testClass label for split group runs + * @param string $testClass + * @return string + */ + private function sanitizeTestClassLabel($testClass) + { + $originalTestClass = $testClass; + $originalGroupName = $this->sanitizeGroupName($this->getGroup()); + if ($originalGroupName !== $this->getGroup()) { + $originalTestClass = str_replace($this->getGroup(), $originalGroupName, $testClass); + } + return $originalTestClass; + } } diff --git a/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php b/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php index 1909c7e0b..7f912755b 100644 --- a/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/RunTestFailedCommand.php @@ -168,11 +168,7 @@ private function getFailedTestList() if ($suiteName == self::DEFAULT_TEST_GROUP) { array_push($failedTestDetails['tests'], $testName); } else { - // Trim potential suite_parallel_0 to suite_parallel - $suiteNameArray = explode("_", $suiteName); - if (is_numeric(array_pop($suiteNameArray))) { - $suiteName = implode("_", $suiteNameArray); - } + $suiteName = $this->sanitizeSuiteName($suiteName); $failedTestDetails['suites'] = array_merge_recursive( $failedTestDetails['suites'], [$suiteName => [$testName]] @@ -194,6 +190,23 @@ private function getFailedTestList() return $testConfigurationJson; } + /** + * Trim potential suite_parallel_0_G to suite_parallel + * + * @param string $suiteName + * @return string + */ + private function sanitizeSuiteName($suiteName) + { + $suiteNameArray = explode("_", $suiteName); + if (array_pop($suiteNameArray) == 'G') { + if (is_numeric(array_pop($suiteNameArray))) { + $suiteName = implode("_", $suiteNameArray); + } + } + return $suiteName; + } + /** * Returns an array of run commands read from the manifest file created post generation * diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php index fd1d1eebb..f1c49c94d 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -860,8 +860,7 @@ public function saveScreenshot() */ public function amOnPage($page) { - (0 === strpos($page, 'http')) ? parent::amOnUrl($page) : parent::amOnPage($page); - + parent::amOnPage($page); $this->waitForPageLoad(); } diff --git a/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php b/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php index 8f4cac8a2..fa30837cb 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php +++ b/src/Magento/FunctionalTestingFramework/Util/Sorter/ParallelGroupSorter.php @@ -232,7 +232,7 @@ private function getSuiteToSize($suiteNamesToTests) * * E.g. * Input {suitename = 'sample', tests = ['test1' => 100,'test2' => 150, 'test3' => 300], linelimit = 275} - * Result { ['sample_01' => ['test3' => 300], 'sample_02' => ['test2' => 150, 'test1' => 100]] } + * Result { ['sample_01_G' => ['test3' => 300], 'sample_02_G' => ['test2' => 150, 'test1' => 100]] } * * @param string $suiteName * @param array $tests @@ -252,8 +252,8 @@ private function splitTestSuite($suiteName, $tests, $maxTime) } $group = $this->createTestGroup($maxTime, $test, $size, $availableTests); - $splitSuites["{$suiteName}_${splitCount}"] = $group; - $this->addSuiteToConfig($suiteName, "{$suiteName}_${splitCount}", $group); + $splitSuites["{$suiteName}_${splitCount}_G"] = $group; + $this->addSuiteToConfig($suiteName, "{$suiteName}_${splitCount}_G", $group); $availableTests = array_diff_key($availableTests, $group); $splitCount++; From 0bef7842bef8fc6eaf9a1923458629aaca957ebc Mon Sep 17 00:00:00 2001 From: Ji Lu Date: Tue, 9 Feb 2021 12:44:24 -0600 Subject: [PATCH 12/31] MQE-2494: Missing steps in Allure logs for certain test failures --- .../verification/Resources/AssertTest.txt | 16 ++++--- .../Resources/BasicFunctionalTest.txt | 2 +- .../TestModule/Test/AssertTest.xml | 37 +++++++++------- docs/test/assertions.md | 20 +-------- etc/di.xml | 2 +- .../Allure/Adapter/MagentoAllureAdapter.php | 26 +---------- .../Test/etc/Actions/assertActions.xsd | 21 +-------- .../Util/TestGenerator.php | 44 ++++++++++++------- 8 files changed, 68 insertions(+), 100 deletions(-) diff --git a/dev/tests/verification/Resources/AssertTest.txt b/dev/tests/verification/Resources/AssertTest.txt index aa5619ede..c030353c1 100644 --- a/dev/tests/verification/Resources/AssertTest.txt +++ b/dev/tests/verification/Resources/AssertTest.txt @@ -43,9 +43,10 @@ class AssertTestCest $I->comment("asserts without variable replacement"); $I->assertArrayHasKey("apple", ['orange' => 2, 'apple' => 1], "pass"); // stepKey: assertArrayHasKey $I->assertArrayNotHasKey("kiwi", ['orange' => 2, 'apple' => 1], "pass"); // stepKey: assertArrayNotHasKey - $I->assertArraySubset([1, 2], [1, 2, 3, 5], "pass"); // stepKey: assertArraySubset $I->assertContains("ab", ['item1' => 'a', 'item2' => 'ab'], "pass"); // stepKey: assertContains $I->assertStringContainsString("ab", "abcde", "pass"); // stepKey: assertStringContainsString + $I->assertStringContainsString("ab", $var, "pass"); // stepKey: assertStringContainsStringVar + $I->assertContains("ab", $var, "pass"); // stepKey: assertContainsVar $I->assertCount(2, ['a', 'b'], "pass"); // stepKey: assertCount $I->assertEmpty([], "pass"); // stepKey: assertEmpty $I->assertEquals($text, "Copyright © 2013-2017 Magento, Inc. All rights reserved.", "pass"); // stepKey: assertEquals1 @@ -64,7 +65,9 @@ class AssertTestCest $I->assertLessThan(5, 2, "pass"); // stepKey: assertLessThan $I->assertLessThanOrEqual(5, 2, "pass"); // stepKey: assertLessThanOrEquals $I->assertNotContains("bc", ['item1' => 'a', 'item2' => 'ab'], "pass"); // stepKey: assertNotContains - $I->assertStringNotContainsString("bc", $text, "pass"); // stepKey: assertStringNotContainsString + $I->assertStringNotContainsString("bc", "text", "pass"); // stepKey: assertStringNotContainsString + $I->assertNotContains("bc", $arrayVar, "pass"); // stepKey: assertNotContainsVar + $I->assertStringNotContainsString("bc", $var, "pass"); // stepKey: assertStringNotContainsStringVar $I->assertNotEmpty([1, 2], "pass"); // stepKey: assertNotEmpty1 $I->assertNotEmpty($text, "pass"); // stepKey: assertNotEmpty2 $I->assertNotEqualsWithDelta(2, 5, 0, "pass"); // stepKey: assertNotEquals @@ -81,9 +84,10 @@ class AssertTestCest $I->comment("asserts backward compatible"); $I->assertArrayHasKey("apple", ['orange' => 2, 'apple' => 1], "pass"); // stepKey: assertArrayHasKeyBackwardCompatible $I->assertArrayNotHasKey("kiwi", ['orange' => 2, 'apple' => 1], "pass"); // stepKey: assertArrayNotHasKeyBackwardCompatible - $I->assertArraySubset([1, 2], [1, 2, 3, 5], "pass"); // stepKey: assertArraySubsetBackwardCompatible $I->assertContains("ab", ['item1' => 'a', 'item2' => 'ab'], "pass"); // stepKey: assertContains1BackwardCompatible $I->assertStringContainsString("ab", "abcde", "pass"); // stepKey: assertContains2BackwardCompatible + $I->assertStringContainsString("ab", $var, "pass"); // stepKey: assertContains3BackwardCompatible + $I->assertContains("ab", $arrayVar, "pass"); // stepKey: assertContains4BackwardCompatible $I->assertCount(2, ['a', 'b'], "pass"); // stepKey: assertCountBackwardCompatible $I->assertEmpty([], "pass"); // stepKey: assertEmptyBackwardCompatible $I->assertEquals($text, "Copyright © 2013-2017 Magento, Inc. All rights reserved.", "pass"); // stepKey: assertEquals1BackwardCompatible @@ -101,7 +105,9 @@ class AssertTestCest $I->assertLessThan(5, 2, "pass"); // stepKey: assertLessThanBackwardCompatible $I->assertLessThanOrEqual(5, 2, "pass"); // stepKey: assertLessThanOrEqualBackwardCompatible $I->assertNotContains("bc", ['item1' => 'a', 'item2' => 'ab'], "pass"); // stepKey: assertNotContains1BackwardCompatible - $I->assertStringNotContainsString("bc", $text, "pass"); // stepKey: assertNotContains2BackwardCompatible + $I->assertStringNotContainsString("bc", "text", "pass"); // stepKey: assertNotContains2BackwardCompatible + $I->assertNotContains("bc", $arrayVar, "pass"); // stepKey: assertNotContains3BackwardCompatible + $I->assertStringNotContainsString("bc", $var, "pass"); // stepKey: assertNotContains4BackwardCompatible $I->assertNotEmpty([1, 2], "pass"); // stepKey: assertNotEmpty1BackwardCompatible $I->assertNotEmpty($text, "pass"); // stepKey: assertNotEmpty2BackwardCompatible $I->assertNotEqualsWithDelta(2, 5, 0, "pass"); // stepKey: assertNotEqualsBackwardCompatible @@ -128,8 +134,6 @@ class AssertTestCest $I->assertEquals($I->retrieveEntityField('createData1', 'lastname', 'test'), $I->retrieveEntityField('createData1', 'lastname', 'test'), "pass"); // stepKey: assert5 $I->comment("array type that use created data"); $I->comment("array type that use created data"); - $I->assertArraySubset([$I->retrieveEntityField('createData1', 'lastname', 'test'), $I->retrieveEntityField('createData1', 'firstname', 'test')], [$I->retrieveEntityField('createData1', 'lastname', 'test'), $I->retrieveEntityField('createData1', 'firstname', 'test'), "1"], "pass"); // stepKey: assert9 - $I->assertArraySubset([$I->retrieveEntityField('createData2', 'firstname', 'test'), $I->retrieveEntityField('createData2', 'lastname', 'test')], [$I->retrieveEntityField('createData2', 'firstname', 'test'), $I->retrieveEntityField('createData2', 'lastname', 'test'), "1"], "pass"); // stepKey: assert10 $I->assertArrayHasKey("lastname", ['lastname' => $I->retrieveEntityField('createData1', 'lastname', 'test'), 'firstname' => $I->retrieveEntityField('createData1', 'firstname', 'test')], "pass"); // stepKey: assert3 $I->assertArrayHasKey("lastname", ['lastname' => $I->retrieveEntityField('createData2', 'lastname', 'test'), 'firstname' => $I->retrieveEntityField('createData2', 'firstname', 'test')], "pass"); // stepKey: assert4 $I->comment("this section can only be generated and cannot run"); diff --git a/dev/tests/verification/Resources/BasicFunctionalTest.txt b/dev/tests/verification/Resources/BasicFunctionalTest.txt index 072b58261..f23fb5c6a 100644 --- a/dev/tests/verification/Resources/BasicFunctionalTest.txt +++ b/dev/tests/verification/Resources/BasicFunctionalTest.txt @@ -138,7 +138,7 @@ class BasicFunctionalTestCest $I->moveForward(); // stepKey: moveForwardKey1 $I->moveMouseOver(".functionalTestSelector"); // stepKey: moveMouseOverKey1 $I->openNewTab(); // stepKey: openNewTabKey1 - $I->pauseExecution(); // stepKey: pauseExecutionKey1 + $I->pause(); // stepKey: pauseExecutionKey1 $I->performOn("#selector", function(\WebDriverElement $el) {return $el->isDisplayed();}, 10); // stepKey: performOnKey1 $I->pressKey("#page", "a"); // stepKey: pressKey1 $I->pressKey("#page", ['ctrl', 'a'],'new'); // stepKey: pressKey2 diff --git a/dev/tests/verification/TestModule/Test/AssertTest.xml b/dev/tests/verification/TestModule/Test/AssertTest.xml index e0ba88c5d..86466c7de 100644 --- a/dev/tests/verification/TestModule/Test/AssertTest.xml +++ b/dev/tests/verification/TestModule/Test/AssertTest.xml @@ -31,10 +31,6 @@ kiwi ['orange' => 2, 'apple' => 1] - - [1, 2] - [1, 2, 3, 5] - ab ['item1' => 'a', 'item2' => 'ab'] @@ -43,6 +39,14 @@ ab abcde + + ab + var + + + ab + var + 2 ['a', 'b'] @@ -113,7 +117,15 @@ bc - text + text + + + bc + arrayVar + + + bc + var [1, 2] @@ -163,9 +175,10 @@ - + + @@ -183,7 +196,9 @@ - + + + @@ -221,14 +236,6 @@ - - [$$createData1.lastname$$, $$createData1.firstname$$] - [$$createData1.lastname$$, $$createData1.firstname$$, 1] - - - [$createData2.firstname$, $createData2.lastname$] - [$createData2.firstname$, $createData2.lastname$, 1] - lastname ['lastname' => $$createData1.lastname$$, 'firstname' => $$createData1.firstname$$] diff --git a/docs/test/assertions.md b/docs/test/assertions.md index 17a3d194a..cad01795f 100644 --- a/docs/test/assertions.md +++ b/docs/test/assertions.md @@ -117,22 +117,6 @@ Attribute|Type|Use|Description `before`|string|optional| `stepKey` of action that must be executed next. `after`|string|optional| `stepKey` of the preceding action. -### assertArraySubset - -See [assertArraySubset docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertArraySubset). - -Attribute|Type|Use|Description ----|---|---|--- -`expected`|string|required| A value of the expected result. -`expectedType`|string|optional| A type of the expected result. Possible values: `const` (default), `int`, `float`, `bool`, `string`, `variable`, `array`. -`actual`|string|required| A value of the actual result. -`actualType`|string|optional| A type of the actual result. Possible values: `const` (default), `int`, `float`, `bool`, `string`, `variable`, `array`. -`strict`|boolean|optional| -`message`|string|optional|Text of informational message about a cause of failure. -`stepKey`|string|required| A unique identifier of the text step. -`before`|string|optional| `stepKey` of action that must be executed next. -`after`|string|optional| `stepKey` of the preceding action. - ### assertContains See [assertContains docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertContains). @@ -142,7 +126,7 @@ Attribute|Type|Use|Description `expected`|string|required| A value of the expected result. `expectedType`|string|optional| A type of the expected result. Possible values: `const` (default), `int`, `float`, `bool`, `string`, `variable`, `array`. `actual`|string|required| A value of the actual result. -`actualType`|string|optional| A type of the actual result. Possible values: `const` (default), `int`, `float`, `bool`, `string`, `variable`, `array`. +`actualType`|string|optional| A type of the actual result. Possible values: `const` (default), `int`, `float`, `bool`, `string`, `variable`, `array`, `arrayVariable`. `message`|string|optional|Text of informational message about a cause of failure. `stepKey`|string|required| A unique identifier of the text step. `before`|string|optional| `stepKey` of action that must be executed next. @@ -373,7 +357,7 @@ Attribute|Type|Use|Description `expected`|string|required| A value of the expected result. `expectedType`|string|optional| A type of the expected result. Possible values: `const` (default), `int`, `float`, `bool`, `string`, `variable`, `array`. `actual`|string|required| A value of the actual result. -`actualType`|string|optional| A type of the actual result. Possible values: `const` (default), `int`, `float`, `bool`, `string`, `variable`, `array`. +`actualType`|string|optional| A type of the actual result. Possible values: `const` (default), `int`, `float`, `bool`, `string`, `variable`, `array`, `arrayVariable`. `message`|string|optional|Text of informational message about a cause of failure. `stepKey`|string|required| A unique identifier of the text step. `before`|string|optional| `stepKey` of action that must be executed next. diff --git a/etc/di.xml b/etc/di.xml index e5e31cf87..c8042456e 100644 --- a/etc/di.xml +++ b/etc/di.xml @@ -8,7 +8,7 @@ + ]> diff --git a/src/Magento/FunctionalTestingFramework/Allure/Adapter/MagentoAllureAdapter.php b/src/Magento/FunctionalTestingFramework/Allure/Adapter/MagentoAllureAdapter.php index 7d7a7bd44..489e8297a 100644 --- a/src/Magento/FunctionalTestingFramework/Allure/Adapter/MagentoAllureAdapter.php +++ b/src/Magento/FunctionalTestingFramework/Allure/Adapter/MagentoAllureAdapter.php @@ -12,8 +12,6 @@ use Magento\FunctionalTestingFramework\Test\Objects\ActionGroupObject; use Magento\FunctionalTestingFramework\Test\Objects\ActionObject; use Magento\FunctionalTestingFramework\Util\TestGenerator; -use Yandex\Allure\Adapter\Model\Failure; -use Yandex\Allure\Adapter\Model\Provider; use Yandex\Allure\Adapter\Model\Status; use Yandex\Allure\Adapter\Model\Step; use Yandex\Allure\Adapter\Allure; @@ -21,6 +19,7 @@ use Yandex\Allure\Adapter\Event\StepStartedEvent; use Yandex\Allure\Adapter\Event\StepFinishedEvent; use Yandex\Allure\Adapter\Event\StepFailedEvent; +use Yandex\Allure\Adapter\Model\TestCase; use Yandex\Allure\Adapter\Event\TestCaseFailedEvent; use Yandex\Allure\Adapter\Event\TestCaseFinishedEvent; use Yandex\Allure\Adapter\Event\TestCaseBrokenEvent; @@ -259,11 +258,8 @@ public function testError(FailEvent $failEvent) */ public function testEnd(TestEvent $testEvent) { - $test = $this->getLifecycle()->getTestCaseStorage()->get(); // update testClass label to consolidate re-try reporting - $this->formatAllureTestClassName($test); - // Peek top of testCaseStorage to check of failure - $testFailed = $test->getFailure(); + $this->formatAllureTestClassName($this->getLifecycle()->getTestCaseStorage()->get()); // Pops top of stepStorage, need to add it back in after processing $rootStep = $this->getLifecycle()->getStepStorage()->pollLast(); $formattedSteps = []; @@ -271,7 +267,6 @@ public function testEnd(TestEvent $testEvent) $actionGroupStepKey = null; foreach ($rootStep->getSteps() as $step) { - $this->removeAttachments($step, $testFailed); $stepKey = str_replace($actionGroupStepKey, '', $step->getName()); if ($stepKey !== '[]' && $stepKey !== null) { $step->setName($stepKey); @@ -389,23 +384,6 @@ private function retrieveStepKey($stepLine) return $stepKey; } - /** - * Removes attachments from step depending on MFTF configuration - * @param Step $step - * @param Failure $testFailed - * @return void - */ - private function removeAttachments($step, $testFailed) - { - //Remove Attachments if verbose flag is not true AND test did not fail - if (getenv('VERBOSE_ARTIFACTS') !== "true" && $testFailed === null) { - foreach ($step->getAttachments() as $index => $attachment) { - $step->removeAttachment($index); - unlink(Provider::getOutputDirectory() . DIRECTORY_SEPARATOR . $attachment->getSource()); - } - } - } - /** * Format testClass label to consolidate re-try reporting for groups split for parallel execution * @param TestCase $test diff --git a/src/Magento/FunctionalTestingFramework/Test/etc/Actions/assertActions.xsd b/src/Magento/FunctionalTestingFramework/Test/etc/Actions/assertActions.xsd index 4fdde9990..bb125b7e8 100644 --- a/src/Magento/FunctionalTestingFramework/Test/etc/Actions/assertActions.xsd +++ b/src/Magento/FunctionalTestingFramework/Test/etc/Actions/assertActions.xsd @@ -14,7 +14,6 @@ - @@ -171,25 +170,6 @@ - - - - Asserts that given array contains a subset array. - - - - - - - - - - - - - - - @@ -759,6 +739,7 @@ + diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 3d0b70440..e238bfc73 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -1311,8 +1311,10 @@ function () use ($actionObject, $replaceType) { ); break; case "assertContains": - if ((substr(trim($assertActual), 0, 1) !== '[') - || (substr(trim($assertActual), -1, 1) !== ']')) { + if ((!isset($customActionAttributes['actualType']) + || $customActionAttributes['actualType'] !== 'arrayVariable') + && ((substr(trim($assertActual), 0, 1) !== '[') + || (substr(trim($assertActual), -1, 1) !== ']'))) { $replaceType = 'assertStringContainsString'; call_user_func(\Closure::bind( function () use ($actionObject, $replaceType) { @@ -1331,8 +1333,10 @@ function () use ($actionObject, $replaceType) { ); break; case "assertNotContains": - if ((substr(trim($assertActual), 0, 1) !== '[') - || (substr(trim($assertActual), -1, 1) !== ']')) { + if ((!isset($customActionAttributes['actualType']) + || $customActionAttributes['actualType'] !== 'arrayVariable') + && ((substr(trim($assertActual), 0, 1) !== '[') + || (substr(trim($assertActual), -1, 1) !== ']'))) { $replaceType = 'assertStringNotContainsString'; call_user_func(\Closure::bind( function () use ($actionObject, $replaceType) { @@ -1401,16 +1405,6 @@ function () use ($actionObject, $replaceType) { $assertMessage ); break; - case "assertArraySubset": - $testSteps .= $this->wrapFunctionCall( - $actor, - $actionObject, - $assertExpected, - $assertActual, - $assertIsStrict, - $assertMessage - ); - break; case "fail": $testSteps .= $this->wrapFunctionCall( $actor, @@ -1482,6 +1476,23 @@ function () use ($actionObject, $replaceType) { case "skipReadinessCheck": $testSteps .= $this->wrapFunctionCall($actor, $actionObject, $customActionAttributes['state']); break; + case "pauseExecution": + $replaceType = 'pause'; + call_user_func(\Closure::bind( + function () use ($actionObject, $replaceType) { + $actionObject->type = $replaceType; + }, + null, + $actionObject + )); + $testSteps .= $this->wrapFunctionCall( + $actor, + $actionObject, + $selector, + $input, + $parameter + ); + break; case "comment": $input = $input === null ? strtr($value, ['$' => '\$', '{' => '\{', '}' => '\}']) : $input; // Combining userInput from native XML comment and action to fall-through 'default' case @@ -2166,6 +2177,7 @@ private function resolveValueByType($value = null, $type = null) $this->validateParameterArray($value); return $this->wrapParameterArray($this->addUniquenessToParamArray($value)); case 'variable': + case 'arrayVariable': return $this->addDollarSign($value); } @@ -2251,6 +2263,7 @@ private function validateXmlAttributesMutuallyExclusive($key, $tagName, $attribu 'url', 'userInput', 'variable', + 'arrayVariable', ], 'excludes' => [ 'dontSeeLink', @@ -2261,7 +2274,8 @@ private function validateXmlAttributesMutuallyExclusive($key, $tagName, $attribu 'attributes' => [ 'userInput', 'parameterArray', - 'variable' + 'variable', + 'arrayVariable', ], 'excludes' => [ 'dontSeeCookie', From ccdc23a466fc6c3c479dddb33ee5ddf68277adce Mon Sep 17 00:00:00 2001 From: Ji Lu Date: Wed, 10 Feb 2021 08:58:14 -0600 Subject: [PATCH 13/31] MQE-2501: PHP 7.4 Upgrade in MFTF 2.x --- bin/functional | 1 + .../MFTF/DevDocs/Test/FormatCurrencyTest.xml | 52 +++++++++++++++++++ .../Commenting/FunctionCommentSniff.php | 4 +- dev/tests/unit/Util/TestLoggingUtil.php | 2 +- .../ActionGroupWithStepKeyReferences.txt | 2 +- .../ActionGroup/FunctionalActionGroup.xml | 2 +- .../ActionGroup/XmlDuplicateActionGroup.xml | 6 +-- .../TestModule/Test/XmlDuplicateTest.xml | 15 +++--- docs/test/actions.md | 9 ++-- etc/di.xml | 2 +- .../Module/MagentoWebDriver.php | 30 ++++++----- .../Test/Objects/ActionGroupObject.php | 2 +- .../Test/etc/Actions/customActions.xsd | 36 +++++++------ .../Util/TestGenerator.php | 39 ++++++++++++-- 14 files changed, 150 insertions(+), 52 deletions(-) create mode 100644 dev/tests/functional/tests/MFTF/DevDocs/Test/FormatCurrencyTest.xml diff --git a/bin/functional b/bin/functional index 01efbda9f..63bb41197 100755 --- a/bin/functional +++ b/bin/functional @@ -9,3 +9,4 @@ echo "===============================" bin/mftf build:project bin/mftf run:test DeprecatedDevDocsTest -f bin/mftf run:test DevDocsTest -f +bin/mftf run:test FormatCurrencyTest -f \ No newline at end of file diff --git a/dev/tests/functional/tests/MFTF/DevDocs/Test/FormatCurrencyTest.xml b/dev/tests/functional/tests/MFTF/DevDocs/Test/FormatCurrencyTest.xml new file mode 100644 index 000000000..ab3d36c4e --- /dev/null +++ b/dev/tests/functional/tests/MFTF/DevDocs/Test/FormatCurrencyTest.xml @@ -0,0 +1,52 @@ + + + + + + + + + 1.234,57 € + $eurInDE + + + + 1.234,00 € + $eurInDEPos + + + + -1.234,56 € + $eurInDENeg + + + + + 1.234,57 $ + $usdInDE + + + + 1.234,00 $ + $usdInDEPos + + + + -1.234,56 $ + $usdInDENeg + + + + + + 10,50 € + $usingVariable + + + diff --git a/dev/tests/static/Magento/Sniffs/Commenting/FunctionCommentSniff.php b/dev/tests/static/Magento/Sniffs/Commenting/FunctionCommentSniff.php index 5050d5f03..8985f2407 100644 --- a/dev/tests/static/Magento/Sniffs/Commenting/FunctionCommentSniff.php +++ b/dev/tests/static/Magento/Sniffs/Commenting/FunctionCommentSniff.php @@ -214,7 +214,7 @@ protected function processThrows(File $phpcsFile, $stackPtr, $commentStart) } // Starts with a capital letter and ends with a fullstop. - $firstChar = $comment{0}; + $firstChar = $comment[0]; if (strtoupper($firstChar) !== $firstChar) { $error = '@throws tag comment must start with a capital letter'; $phpcsFile->addError($error, ($tag + 2), 'ThrowsNotCapital'); @@ -437,7 +437,7 @@ protected function processParams(File $phpcsFile, $stackPtr, $commentStart) }//end if }//end foreach - $suggestedType = implode($suggestedTypeNames, '|'); + $suggestedType = implode('|', $suggestedTypeNames); if ($param['type'] !== $suggestedType) { $error = 'Expected "%s" but found "%s" for parameter type'; $data = array( diff --git a/dev/tests/unit/Util/TestLoggingUtil.php b/dev/tests/unit/Util/TestLoggingUtil.php index 7becc609a..1b0bce1f9 100644 --- a/dev/tests/unit/Util/TestLoggingUtil.php +++ b/dev/tests/unit/Util/TestLoggingUtil.php @@ -93,7 +93,7 @@ public function validateMockLogStatmentRegex($type, $regex, $context) $records = $this->testLogHandler->getRecords(); $record = $records[count($records)-1]; // we assume the latest record is what requires validation $this->assertEquals(strtoupper($type), $record['level_name']); - $this->assertRegExp($regex, $record['message']); + $this->assertMatchesRegularExpression($regex, $record['message']); $this->assertEquals($context, $record['context']); } diff --git a/dev/tests/verification/Resources/ActionGroupWithStepKeyReferences.txt b/dev/tests/verification/Resources/ActionGroupWithStepKeyReferences.txt index 8098142fd..8a1c53d24 100644 --- a/dev/tests/verification/Resources/ActionGroupWithStepKeyReferences.txt +++ b/dev/tests/verification/Resources/ActionGroupWithStepKeyReferences.txt @@ -42,7 +42,7 @@ class ActionGroupWithStepKeyReferencesCest $date->setTimezone(new \DateTimeZone("America/Los_Angeles")); $action5ActionGroup = $date->format("H:i:s"); - $action6ActionGroup = $I->formatMoney($action6ActionGroup); // stepKey: action6ActionGroup + $action6ActionGroup = $I->formatCurrency($action6ActionGroup, "en_CA", "USD"); // stepKey: action6ActionGroup $I->deleteEntity("{$action7ActionGroupActionGroup}", "test"); // stepKey: action7ActionGroup $I->getEntity("action8ActionGroup", "test", "{$action8}", [], null); // stepKey: action8ActionGroup $I->updateEntity("1", "test", "{$action9}",[]); // stepKey: action9ActionGroup diff --git a/dev/tests/verification/TestModule/ActionGroup/FunctionalActionGroup.xml b/dev/tests/verification/TestModule/ActionGroup/FunctionalActionGroup.xml index 30cba3848..c55099dbd 100644 --- a/dev/tests/verification/TestModule/ActionGroup/FunctionalActionGroup.xml +++ b/dev/tests/verification/TestModule/ActionGroup/FunctionalActionGroup.xml @@ -56,7 +56,7 @@ - + diff --git a/dev/tests/verification/TestModule/ActionGroup/XmlDuplicateActionGroup.xml b/dev/tests/verification/TestModule/ActionGroup/XmlDuplicateActionGroup.xml index fcc22acca..b1663182f 100644 --- a/dev/tests/verification/TestModule/ActionGroup/XmlDuplicateActionGroup.xml +++ b/dev/tests/verification/TestModule/ActionGroup/XmlDuplicateActionGroup.xml @@ -6,7 +6,7 @@ */ --> + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd"> @@ -84,8 +84,8 @@ - - + + diff --git a/dev/tests/verification/TestModule/Test/XmlDuplicateTest.xml b/dev/tests/verification/TestModule/Test/XmlDuplicateTest.xml index 937c6edba..8ca8a956f 100644 --- a/dev/tests/verification/TestModule/Test/XmlDuplicateTest.xml +++ b/dev/tests/verification/TestModule/Test/XmlDuplicateTest.xml @@ -5,9 +5,8 @@ * See COPYING.txt for license details. */ --> - + xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd"> @@ -88,8 +87,8 @@ - - + + @@ -304,8 +303,8 @@ - - + + @@ -519,8 +518,8 @@ - - + + diff --git a/docs/test/actions.md b/docs/test/actions.md index 19ec3f43b..5af0c6439 100644 --- a/docs/test/actions.md +++ b/docs/test/actions.md @@ -1032,12 +1032,15 @@ Attribute|Type|Use|Description ``` -### formatMoney +### formatCurrency +Format input to specified currency according to the locale specified. Returns formatted string for test use. +Use NumberFormatter::formatCurrency(), see https://www.php.net/manual/en/numberformatter.formatcurrency.php Attribute|Type|Use|Description ---|---|---|--- -`userInput`|string|optional| Value for the money form field. -`locale`|string|optional| The PHP locale value for the store. +`userInput`|string|required| Number to be formatted. +`locale`|string|required| The locale to format to. +`currency`|string|required| The 3-letter ISO 4217 currency code indicating the currency to use. `stepKey`|string|required| A unique identifier of the action. `before`|string|optional| `stepKey` of action that must be executed next. `after`|string|optional| `stepKey` of preceding action. diff --git a/etc/di.xml b/etc/di.xml index c8042456e..b206976fe 100644 --- a/etc/di.xml +++ b/etc/di.xml @@ -8,7 +8,7 @@ + ]> diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php index f1c49c94d..eaa4be481 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoWebDriver.php @@ -49,6 +49,7 @@ * * @SuppressWarnings(PHPMD.CouplingBetweenObjects) * @SuppressWarnings(PHPMD.ExcessivePublicCount) + * @SuppressWarnings(PHPMD.ExcessiveClassComplexity) */ class MagentoWebDriver extends WebDriver { @@ -452,21 +453,26 @@ public function waitForLoadingMaskToDisappear($timeout = null) } /** - * @param float $money + * Format input to specified currency in locale specified + * @link https://php.net/manual/en/numberformatter.formatcurrency.php + * + * @param float $value * @param string $locale - * @return array + * @param string $currency + * @return string + * @throws TestFrameworkException */ - public function formatMoney(float $money, $locale = 'en_US.UTF-8') + public function formatCurrency(float $value, $locale, $currency) { - $this->mSetLocale(LC_MONETARY, $locale); - // @codingStandardsIgnoreStart - $money = money_format('%.2n', $money); - // @codingStandardsIgnoreEnd - $this->mResetLocale(); - $prefix = substr($money, 0, 1); - $number = substr($money, 1); - - return ['prefix' => $prefix, 'number' => $number]; + $formatter = \NumberFormatter::create($locale, \NumberFormatter::CURRENCY); + if ($formatter && !empty($formatter)) { + $result = $formatter->formatCurrency($value, $currency); + if ($result) { + return $result; + } + } + + throw new TestFrameworkException('Invalid attributes used in formatCurrency.'); } /** diff --git a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionGroupObject.php b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionGroupObject.php index dc1b158e1..0b0cb4527 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionGroupObject.php +++ b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionGroupObject.php @@ -25,7 +25,7 @@ class ActionGroupObject "executeJS", "magentoCLI", "generateDate", - "formatMoney", + "formatCurrency", "deleteData", "getData", "updateData", diff --git a/src/Magento/FunctionalTestingFramework/Test/etc/Actions/customActions.xsd b/src/Magento/FunctionalTestingFramework/Test/etc/Actions/customActions.xsd index 8670d9885..23ee931ea 100644 --- a/src/Magento/FunctionalTestingFramework/Test/etc/Actions/customActions.xsd +++ b/src/Magento/FunctionalTestingFramework/Test/etc/Actions/customActions.xsd @@ -16,7 +16,7 @@ - + @@ -158,25 +158,29 @@ - + - Formats given input to given locale. Returns formatted string for test use. + Format input to specified currency according to the locale specified. Returns formatted string for test use. + Use NumberFormatter::formatCurrency(), see https://www.php.net/manual/en/numberformatter.formatcurrency.php - - - - - - - Locale to format given input. Defaults to 'en_US.UTF-8' if nothing is given. - - - - - - + + + + + Locale in which the input would be formatted (e.g. en_US). + + + + + + + The 3-letter ISO 4217 currency code indicating the currency to use. + + + + diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index e238bfc73..c6fc60d6d 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -590,6 +590,7 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato $function = null; $time = null; $locale = null; + $currency = null; $username = null; $password = null; $width = null; @@ -634,7 +635,11 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato $sortOrder = $customActionAttributes['sortOrder']; } - if (isset($customActionAttributes['userInput']) && isset($customActionAttributes['url'])) { + if (isset($customActionAttributes['userInput']) + && isset($customActionAttributes['locale']) + && isset($customActionAttributes['currency'])) { + $input = $this->parseUserInput($customActionAttributes['userInput']); + } elseif (isset($customActionAttributes['userInput']) && isset($customActionAttributes['url'])) { $input = $this->addUniquenessFunctionCall($customActionAttributes['userInput']); $url = $this->addUniquenessFunctionCall($customActionAttributes['url']); } elseif (isset($customActionAttributes['userInput'])) { @@ -758,6 +763,10 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato $locale = $this->wrapWithDoubleQuotes($customActionAttributes['locale']); } + if (isset($customActionAttributes['currency'])) { + $currency = $this->wrapWithDoubleQuotes($customActionAttributes['currency']); + } + if (isset($customActionAttributes['username'])) { $username = $this->wrapWithDoubleQuotes($customActionAttributes['username']); } @@ -1126,13 +1135,14 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato $selector ); break; - case "formatMoney": + case "formatCurrency": $testSteps .= $this->wrapFunctionCallWithReturnValue( $stepKey, $actor, $actionObject, $input, - $locale + $locale, + $currency ); break; case "mSetLocale": @@ -2356,4 +2366,27 @@ private function getReplacement($func, $refVariable): string return "{$func}(\"{$refVariable}\")"; } + + /** + * Parse userInput for formatCurrency action + * + * @param string $userInput + * @return string + */ + private function parseUserInput($userInput) + { + $floatPattern = '/^\s*([+-]?[0-9]*\.?[0-9]+)\s*$/'; + preg_match($floatPattern, $userInput, $float); + if (isset($float[1])) { + return $float[1]; + } + + $intPattern = '/^\s*([+-]?[0-9]+)\s*$/'; + preg_match($intPattern, $userInput, $int); + if (isset($int[1])) { + return $int[1]; + } + + return $this->addUniquenessFunctionCall($userInput); + } } From e28b50119845f939ee527d24057fc5fedac7feba Mon Sep 17 00:00:00 2001 From: Ji Lu Date: Sat, 13 Feb 2021 18:47:28 -0600 Subject: [PATCH 14/31] MQE-2493: Update assert implementation in mftf 2.x to work with phpunit 9 --- bin/functional | 1 + .../tests/MFTF/DevDocs/Test/AssertTest.xml | 204 ++++++++++++++++++ .../verification/Resources/AssertTest.txt | 17 +- .../TestModule/Test/AssertTest.xml | 39 +++- .../Module/MagentoAssert.php | 2 +- .../Test/Objects/ActionObject.php | 11 + .../Util/TestGenerator.php | 55 +---- 7 files changed, 273 insertions(+), 56 deletions(-) create mode 100644 dev/tests/functional/tests/MFTF/DevDocs/Test/AssertTest.xml diff --git a/bin/functional b/bin/functional index 01efbda9f..80dee336c 100755 --- a/bin/functional +++ b/bin/functional @@ -9,3 +9,4 @@ echo "===============================" bin/mftf build:project bin/mftf run:test DeprecatedDevDocsTest -f bin/mftf run:test DevDocsTest -f +bin/mftf run:test AssertTest -f diff --git a/dev/tests/functional/tests/MFTF/DevDocs/Test/AssertTest.xml b/dev/tests/functional/tests/MFTF/DevDocs/Test/AssertTest.xml new file mode 100644 index 000000000..1deb813ba --- /dev/null +++ b/dev/tests/functional/tests/MFTF/DevDocs/Test/AssertTest.xml @@ -0,0 +1,204 @@ + + + + + + + + + [1,2,3,4,5] + + + + + + apple + ['orange' => 2, 'apple' => 1] + + + kiwi + ['orange' => 2, 'apple' => 1] + + + ab + ['item1' => 'a', 'item2' => 'ab'] + + + ab + abcde + + + 2 + ['a', 'b'] + + + [] + + + Copyright + Copyright + + + 1.56 + 1.56 + + + 1.55 + 1.56 + + + 2 + 2 + + + true + true + + + [1, 2] + [1,2] + + + 0 + + + /out.txt + + + 2 + 5 + + + 2 + 5 + + + 2 + 5 + + + string + xyz + + + int + 21 + + + float + 1.23 + + + bool + true + + + array + [1,2] + + + 5 + 2 + + + 5 + 2 + + + 5 + 2 + + + bc + ['item1' => 'a', 'item2' => 'ab'] + + + bc + text + + + [1, 2] + + + 2 + 5 + + + 2 + 5 + + + abc + + + /foo/ + bar + + + log + tag + + + /foo/ + foo + + + bar + bar + + + a + banana + + + a + apple + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dev/tests/verification/Resources/AssertTest.txt b/dev/tests/verification/Resources/AssertTest.txt index c030353c1..065f024e3 100644 --- a/dev/tests/verification/Resources/AssertTest.txt +++ b/dev/tests/verification/Resources/AssertTest.txt @@ -52,6 +52,10 @@ class AssertTestCest $I->assertEquals($text, "Copyright © 2013-2017 Magento, Inc. All rights reserved.", "pass"); // stepKey: assertEquals1 $I->assertEquals("Copyright © 2013-2017 Magento, Inc. All rights reserved.", $text, "pass"); // stepKey: assertEquals2 $I->assertEquals(1.5, $text, "pass"); // stepKey: assertFloatTypeIsCorrect + $I->assertEqualsWithDelta(1.55, 1.56, 0.1, "pass"); // stepKey: assertFloatTypeWithDelta + $I->assertEquals(2, $text, "pass"); // stepKey: assertInt + $I->assertEquals(true, $text, "pass"); // stepKey: assertBool + $I->assertEquals([1, 2], $text, "pass"); // stepKey: assertArray $I->assertFalse(false, "pass"); // stepKey: assertFalse1 $I->assertFileNotExists("/out.txt", "pass"); // stepKey: assertFileNotExists1 $I->assertFileNotExists($text, "pass"); // stepKey: assertFileNotExists2 @@ -61,6 +65,9 @@ class AssertTestCest $I->assertIsString("xyz", "pass"); // stepKey: assertInternalType1 $I->assertIsInt(21, "pass"); // stepKey: assertInternalType2 $I->assertIsString($text, "pass"); // stepKey: assertInternalType3 + $I->assertIsFloat(1.23, "pass"); // stepKey: assertFloat + $I->assertIsBool(true, "pass"); // stepKey: assertBoolType + $I->assertIsArray([1,2], "pass"); // stepKey: assertArrayType $I->assertLessOrEquals(5, 2, "pass"); // stepKey: assertLessOrEquals $I->assertLessThan(5, 2, "pass"); // stepKey: assertLessThan $I->assertLessThanOrEqual(5, 2, "pass"); // stepKey: assertLessThanOrEquals @@ -70,7 +77,7 @@ class AssertTestCest $I->assertStringNotContainsString("bc", $var, "pass"); // stepKey: assertStringNotContainsStringVar $I->assertNotEmpty([1, 2], "pass"); // stepKey: assertNotEmpty1 $I->assertNotEmpty($text, "pass"); // stepKey: assertNotEmpty2 - $I->assertNotEqualsWithDelta(2, 5, 0, "pass"); // stepKey: assertNotEquals + $I->assertNotEqualsWithDelta(2, 5, 1, "pass"); // stepKey: assertNotEquals $I->assertNotNull("abc", "pass"); // stepKey: assertNotNull1 $I->assertNotNull($text, "pass"); // stepKey: assertNotNull2 $I->assertNotRegExp("/foo/", "bar", "pass"); // stepKey: assertNotRegExp @@ -92,6 +99,7 @@ class AssertTestCest $I->assertEmpty([], "pass"); // stepKey: assertEmptyBackwardCompatible $I->assertEquals($text, "Copyright © 2013-2017 Magento, Inc. All rights reserved.", "pass"); // stepKey: assertEquals1BackwardCompatible $I->assertEquals("Copyright © 2013-2017 Magento, Inc. All rights reserved.", $text, "pass"); // stepKey: assertEquals2BackwardCompatible + $I->assertEqualsWithDelta(2, $text, 0.2, "pass"); // stepKey: assertEquals3BackwardCompatible $I->assertFalse(false, "pass"); // stepKey: assertFalse1BackwardCompatible $I->assertFileNotExists("/out.txt", "pass"); // stepKey: assertFileNotExists1BackwardCompatible $I->assertFileNotExists($text, "pass"); // stepKey: assertFileNotExists2BackwardCompatible @@ -99,8 +107,11 @@ class AssertTestCest $I->assertGreaterThan(2, 5, "pass"); // stepKey: assertGreaterThanBackwardCompatible $I->assertGreaterThanOrEqual(2, 5, "pass"); // stepKey: assertGreaterThanOrEqualBackwardCompatible $I->assertIsString("xyz", "pass"); // stepKey: assertInternalType1BackwardCompatible - $I->assertIsInt(21, "pass"); // stepKey: assertInternalType2BackwardCompatible - $I->assertIsString($text, "pass"); // stepKey: assertInternalType3BackwardCompatible + $I->assertIsString($text, "pass"); // stepKey: assertInternalType2BackwardCompatible + $I->assertIsInt(21, "pass"); // stepKey: assertInternalType3BackwardCompatible + $I->assertIsFloat(1.23, "pass"); // stepKey: assertInternalType4BackwardCompatible + $I->assertIsBool(false, "pass"); // stepKey: assertInternalType5BackwardCompatible + $I->assertIsArray([1,2], "pass"); // stepKey: assertInternalType6BackwardCompatible $I->assertLessOrEquals(5, 2, "pass"); // stepKey: assertLessOrEqualBackwardCompatibles $I->assertLessThan(5, 2, "pass"); // stepKey: assertLessThanBackwardCompatible $I->assertLessThanOrEqual(5, 2, "pass"); // stepKey: assertLessThanOrEqualBackwardCompatible diff --git a/dev/tests/verification/TestModule/Test/AssertTest.xml b/dev/tests/verification/TestModule/Test/AssertTest.xml index 86466c7de..9718f7304 100644 --- a/dev/tests/verification/TestModule/Test/AssertTest.xml +++ b/dev/tests/verification/TestModule/Test/AssertTest.xml @@ -15,7 +15,6 @@ - [1,2,3,4,5] @@ -66,6 +65,22 @@ 1.5 text + + 1.55 + 1.56 + + + 2 + text + + + true + text + + + [1, 2] + text + 0 @@ -99,6 +114,18 @@ string text + + float + 1.23 + + + bool + true + + + array + [1,2] + 5 2 @@ -133,7 +160,7 @@ text - + 2 5 @@ -183,6 +210,7 @@ + @@ -190,8 +218,11 @@ - - + + + + + diff --git a/src/Magento/FunctionalTestingFramework/Module/MagentoAssert.php b/src/Magento/FunctionalTestingFramework/Module/MagentoAssert.php index 3c6c08173..197091901 100644 --- a/src/Magento/FunctionalTestingFramework/Module/MagentoAssert.php +++ b/src/Magento/FunctionalTestingFramework/Module/MagentoAssert.php @@ -26,7 +26,7 @@ class MagentoAssert extends \Codeception\Module public function assertArrayIsSorted(array $data, $sortOrder = "asc") { $elementTotal = count($data); - $message = null; + $message = ''; // If value can be converted to a date and it isn't 1.1 number (strtotime is overzealous) if (strtotime($data[0]) !== false && !is_numeric($data[0])) { diff --git a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php index 38a5f450d..91add5b90 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php +++ b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php @@ -269,6 +269,17 @@ public function setTimeout($timeout) $this->timeout = $timeout; } + /** + * Set the type. This can be used to override action type for test generation. + * + * @param string $overrideType + * @return void + */ + public function setType($overrideType) + { + $this->type = $overrideType; + } + /** * Populate the resolved custom attributes array with lookup values for the following attributes: * selector diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index e238bfc73..54a9bf131 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -572,6 +572,7 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato $this->currentGenerationScope = $generationScope; $this->deprecationMessages = []; + /** @var $actionObject ActionObject */ foreach ($actionObjects as $actionObject) { $this->deprecationMessages = array_merge($this->deprecationMessages, $actionObject->getDeprecatedUsages()); $stepKey = $actionObject->getStepKey(); @@ -1229,14 +1230,7 @@ public function generateStepsPhp($actionObjects, $generationScope = TestGenerato break; case "assertEquals": if (isset($assertDelta)) { - $replaceType = 'assertEqualsWithDelta'; - call_user_func(\Closure::bind( - function () use ($actionObject, $replaceType) { - $actionObject->type = $replaceType; - }, - null, - $actionObject - )); + $actionObject->setType('assertEqualsWithDelta'); $testSteps .= $this->wrapFunctionCall( $actor, $actionObject, @@ -1257,14 +1251,7 @@ function () use ($actionObject, $replaceType) { break; case "assertNotEquals": if (isset($assertDelta)) { - $replaceType = 'assertNotEqualsWithDelta'; - call_user_func(\Closure::bind( - function () use ($actionObject, $replaceType) { - $actionObject->type = $replaceType; - }, - null, - $actionObject - )); + $actionObject->setType('assertNotEqualsWithDelta'); $testSteps .= $this->wrapFunctionCall( $actor, $actionObject, @@ -1315,14 +1302,7 @@ function () use ($actionObject, $replaceType) { || $customActionAttributes['actualType'] !== 'arrayVariable') && ((substr(trim($assertActual), 0, 1) !== '[') || (substr(trim($assertActual), -1, 1) !== ']'))) { - $replaceType = 'assertStringContainsString'; - call_user_func(\Closure::bind( - function () use ($actionObject, $replaceType) { - $actionObject->type = $replaceType; - }, - null, - $actionObject - )); + $actionObject->setType('assertStringContainsString'); } $testSteps .= $this->wrapFunctionCall( $actor, @@ -1337,14 +1317,7 @@ function () use ($actionObject, $replaceType) { || $customActionAttributes['actualType'] !== 'arrayVariable') && ((substr(trim($assertActual), 0, 1) !== '[') || (substr(trim($assertActual), -1, 1) !== ']'))) { - $replaceType = 'assertStringNotContainsString'; - call_user_func(\Closure::bind( - function () use ($actionObject, $replaceType) { - $actionObject->type = $replaceType; - }, - null, - $actionObject - )); + $actionObject->setType('assertStringNotContainsString'); } $testSteps .= $this->wrapFunctionCall( $actor, @@ -1357,14 +1330,7 @@ function () use ($actionObject, $replaceType) { case "assertInternalType": foreach (self::ASSERT_EQUAL_TYPES as $type) { if (stristr($assertExpected, $type) !== false) { - $replaceType = 'assertIs' . ucfirst($type); - call_user_func(\Closure::bind( - function () use ($actionObject, $replaceType) { - $actionObject->type = $replaceType; - }, - null, - $actionObject - )); + $actionObject->setType('assertIs' . ucfirst($type)); break; } } @@ -1477,14 +1443,7 @@ function () use ($actionObject, $replaceType) { $testSteps .= $this->wrapFunctionCall($actor, $actionObject, $customActionAttributes['state']); break; case "pauseExecution": - $replaceType = 'pause'; - call_user_func(\Closure::bind( - function () use ($actionObject, $replaceType) { - $actionObject->type = $replaceType; - }, - null, - $actionObject - )); + $actionObject->setType('pause'); $testSteps .= $this->wrapFunctionCall( $actor, $actionObject, From 5290c2f7683ec9a40c7a107a62119caa324fd087 Mon Sep 17 00:00:00 2001 From: Ji Lu Date: Tue, 23 Feb 2021 16:14:51 -0600 Subject: [PATCH 15/31] MQE-2501: release 2.7.0 documentation --- CHANGELOG.md | 13 + composer.json | 2 +- composer.lock | 655 +------------------------- docs/backward-incompatible-changes.md | 42 ++ docs/test/actions.md | 179 +++---- docs/test/assertions.md | 71 +-- 6 files changed, 186 insertions(+), 776 deletions(-) create mode 100644 docs/backward-incompatible-changes.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 60e0214d4..44998bcd3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ Magento Functional Testing Framework Changelog ================================================ + +2.7.0 +--------- + +* Maintainability + * Added support for PHP 7.4. + * Added support for PHPUnit 9. + * Dropped support for PHP 7.0, 7.1, 7.2. + * Removed action `formatMoney` and added `formatCurrency`. [See actions page for details](./docs/test/actions.md#formatcurrency) + * Updated in test generation to support PHPUnit 9 with the following assertion action changes: [See assertions page for details](./docs/test/assertions.md) + * Removed the action `assertArraySubset`. + * Added a new result type `arrayVariable`. + 2.6.6 --------- diff --git a/composer.json b/composer.json index fcf7350bb..c627850c8 100755 --- a/composer.json +++ b/composer.json @@ -2,7 +2,7 @@ "name": "magento/magento2-functional-testing-framework", "description": "Magento2 Functional Testing Framework", "type": "library", - "version": "2.6.6", + "version": "2.7.0", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 130b4fb23..ff01e96aa 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "64777caafb3e49509f5b3ea84bcde5f0", + "content-hash": "396690119bbc3267f2ce743d103ac96e", "packages": [ { "name": "allure-framework/allure-codeception", @@ -299,12 +299,6 @@ "brick", "math" ], - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/brick/math", - "type": "tidelift" - } - ], "time": "2021-01-20T22:51:39+00:00" }, { @@ -483,12 +477,6 @@ "functional testing", "unit testing" ], - "funding": [ - { - "url": "https://opencollective.com/codeception", - "type": "open_collective" - } - ], "time": "2021-02-01T07:30:47+00:00" }, { @@ -816,20 +804,6 @@ "ssl", "tls" ], - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], "time": "2021-01-12T12:10:35+00:00" }, { @@ -910,20 +884,6 @@ "dependency", "package" ], - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], "time": "2021-01-27T14:41:06+00:00" }, { @@ -985,20 +945,6 @@ "validation", "versioning" ], - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], "time": "2020-12-03T15:47:16+00:00" }, { @@ -1059,20 +1005,6 @@ "spdx", "validator" ], - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], "time": "2020-12-03T16:04:16+00:00" }, { @@ -1117,20 +1049,6 @@ "Xdebug", "performance" ], - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], "time": "2020-11-13T08:04:11+00:00" }, { @@ -1476,20 +1394,6 @@ "constructor", "instantiate" ], - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", - "type": "tidelift" - } - ], "time": "2020-11-10T18:47:58+00:00" }, { @@ -1552,20 +1456,6 @@ "parser", "php" ], - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", - "type": "tidelift" - } - ], "time": "2020-05-25T17:44:05+00:00" }, { @@ -2173,12 +2063,6 @@ "sftp", "storage" ], - "funding": [ - { - "url": "https://offset.earth/frankdejonge", - "type": "other" - } - ], "time": "2020-08-23T07:39:11+00:00" }, { @@ -2221,16 +2105,6 @@ } ], "description": "Mime-type detection for Flysystem", - "funding": [ - { - "url": "https://github.com/frankdejonge", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/league/flysystem", - "type": "tidelift" - } - ], "time": "2021-01-18T20:58:21+00:00" }, { @@ -2303,16 +2177,6 @@ "logging", "psr-3" ], - "funding": [ - { - "url": "https://github.com/Seldaek", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", - "type": "tidelift" - } - ], "time": "2020-12-14T12:56:38+00:00" }, { @@ -2464,12 +2328,6 @@ "object", "object graph" ], - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], "time": "2020-11-13T09:40:50+00:00" }, { @@ -2886,16 +2744,6 @@ "php", "type" ], - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", - "type": "tidelift" - } - ], "time": "2020-07-20T17:29:33+00:00" }, { @@ -3023,12 +2871,6 @@ "testing", "xunit" ], - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], "time": "2020-05-23T08:02:54+00:00" }, { @@ -3079,12 +2921,6 @@ "filesystem", "iterator" ], - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], "time": "2020-09-28T05:57:25+00:00" }, { @@ -3138,12 +2974,6 @@ "keywords": [ "process" ], - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], "time": "2020-09-28T05:58:55+00:00" }, { @@ -3193,12 +3023,6 @@ "keywords": [ "template" ], - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], "time": "2020-10-26T05:33:50+00:00" }, { @@ -3248,12 +3072,6 @@ "keywords": [ "timer" ], - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], "time": "2020-10-26T13:16:10+00:00" }, { @@ -3303,12 +3121,6 @@ "keywords": [ "tokenizer" ], - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], "abandoned": true, "time": "2020-08-04T08:28:15+00:00" }, @@ -3398,16 +3210,6 @@ "testing", "xunit" ], - "funding": [ - { - "url": "https://phpunit.de/donate.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], "time": "2020-07-13T17:55:55+00:00" }, { @@ -3751,16 +3553,6 @@ "queue", "set" ], - "funding": [ - { - "url": "https://github.com/ramsey", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", - "type": "tidelift" - } - ], "time": "2021-01-21T17:40:04+00:00" }, { @@ -3842,12 +3634,6 @@ "identifier", "uuid" ], - "funding": [ - { - "url": "https://github.com/ramsey", - "type": "github" - } - ], "time": "2020-08-18T17:17:46+00:00" }, { @@ -3894,12 +3680,6 @@ ], "description": "Collection of value objects that represent the PHP code units", "homepage": "https://github.com/sebastianbergmann/code-unit", - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], "time": "2020-10-26T13:08:54+00:00" }, { @@ -3945,12 +3725,6 @@ ], "description": "Looks up which function or method a line of code belongs to", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], "time": "2020-09-28T05:30:19+00:00" }, { @@ -4015,12 +3789,6 @@ "compare", "equality" ], - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], "time": "2020-10-26T15:49:45+00:00" }, { @@ -4077,12 +3845,6 @@ "unidiff", "unified diff" ], - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], "time": "2020-10-26T13:10:38+00:00" }, { @@ -4136,12 +3898,6 @@ "environment", "hhvm" ], - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], "time": "2020-09-28T05:52:38+00:00" }, { @@ -4209,12 +3965,6 @@ "export", "exporter" ], - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], "time": "2020-09-28T05:24:23+00:00" }, { @@ -4316,12 +4066,6 @@ ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], "time": "2020-10-26T13:12:34+00:00" }, { @@ -4367,12 +4111,6 @@ ], "description": "Allows reflection of object attributes, including inherited and non-public ones", "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], "time": "2020-10-26T13:14:26+00:00" }, { @@ -4426,12 +4164,6 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], "time": "2020-10-26T13:17:30+00:00" }, { @@ -4477,12 +4209,6 @@ ], "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], "time": "2020-09-28T06:45:17+00:00" }, { @@ -4529,12 +4255,6 @@ ], "description": "Collection of value objects that represent the types of the PHP type system", "homepage": "https://github.com/sebastianbergmann/type", - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], "time": "2020-10-26T13:18:59+00:00" }, { @@ -4578,12 +4298,6 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], "time": "2020-09-28T06:39:44+00:00" }, { @@ -4633,16 +4347,6 @@ "parser", "validator" ], - "funding": [ - { - "url": "https://github.com/Seldaek", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", - "type": "tidelift" - } - ], "time": "2020-11-11T09:19:24+00:00" }, { @@ -4759,20 +4463,6 @@ ], "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], "time": "2021-01-27T09:09:26+00:00" }, { @@ -4821,20 +4511,6 @@ ], "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], "time": "2021-01-27T10:01:46+00:00" }, { @@ -4885,20 +4561,6 @@ ], "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], "time": "2020-09-07T11:33:47+00:00" }, { @@ -4965,20 +4627,6 @@ ], "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], "time": "2021-01-27T09:09:26+00:00" }, { @@ -5041,20 +4689,6 @@ "interoperability", "standards" ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], "time": "2020-07-06T13:19:58+00:00" }, { @@ -5100,20 +4734,6 @@ ], "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], "time": "2021-01-27T10:01:46+00:00" }, { @@ -5158,20 +4778,6 @@ ], "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], "time": "2021-01-28T22:06:19+00:00" }, { @@ -5228,20 +4834,6 @@ ], "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], "time": "2021-02-03T04:42:09+00:00" }, { @@ -5307,20 +4899,6 @@ "mime", "mime-type" ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], "time": "2021-02-02T06:10:15+00:00" }, { @@ -5383,20 +4961,6 @@ "polyfill", "portable" ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], "time": "2021-01-07T16:49:33+00:00" }, { @@ -5467,20 +5031,6 @@ "portable", "shim" ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], "time": "2021-01-07T16:49:33+00:00" }, { @@ -5548,20 +5098,6 @@ "portable", "shim" ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], "time": "2021-01-07T17:09:11+00:00" }, { @@ -5625,20 +5161,6 @@ "portable", "shim" ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], "time": "2021-01-07T16:49:33+00:00" }, { @@ -5698,20 +5220,6 @@ "portable", "shim" ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], "time": "2021-01-07T16:49:33+00:00" }, { @@ -5774,20 +5282,6 @@ "portable", "shim" ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], "time": "2021-01-07T16:49:33+00:00" }, { @@ -5854,20 +5348,6 @@ "portable", "shim" ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], "time": "2021-01-07T16:49:33+00:00" }, { @@ -5912,20 +5392,6 @@ ], "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], "time": "2021-01-27T09:09:26+00:00" }, { @@ -5988,20 +5454,6 @@ "interoperability", "standards" ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], "time": "2020-09-07T11:33:47+00:00" }, { @@ -6056,20 +5508,6 @@ ], "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], "time": "2021-01-27T09:09:26+00:00" }, { @@ -6110,12 +5548,6 @@ } ], "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], "time": "2020-07-12T23:59:07+00:00" }, { @@ -6178,16 +5610,6 @@ "env", "environment" ], - "funding": [ - { - "url": "https://github.com/GrahamCampbell", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", - "type": "tidelift" - } - ], "time": "2021-01-20T14:39:13+00:00" }, { @@ -6496,12 +5918,6 @@ } ], "description": "Library for accessing git", - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/gitonomy/gitlib", - "type": "tidelift" - } - ], "time": "2020-12-29T16:48:45+00:00" }, { @@ -6868,12 +6284,6 @@ "BSD-3-Clause" ], "description": "Official version of pdepend to be handled with Composer", - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/pdepend/pdepend", - "type": "tidelift" - } - ], "time": "2020-06-20T10:53:13+00:00" }, { @@ -7007,12 +6417,6 @@ "phpmd", "pmd" ], - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/phpmd/phpmd", - "type": "tidelift" - } - ], "time": "2020-09-23T22:06:32+00:00" }, { @@ -7101,12 +6505,6 @@ ], "description": "Library for parsing CLI options", "homepage": "https://github.com/sebastianbergmann/cli-parser", - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], "time": "2020-09-28T06:08:49+00:00" }, { @@ -7158,12 +6556,6 @@ ], "description": "Copy/Paste Detector (CPD) for PHP code.", "homepage": "https://github.com/sebastianbergmann/phpcpd", - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], "time": "2020-12-07T05:39:23+00:00" }, { @@ -7274,20 +6666,6 @@ ], "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], "time": "2021-01-27T09:09:26+00:00" }, { @@ -7356,20 +6734,6 @@ ], "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], "time": "2021-01-27T09:09:26+00:00" }, { @@ -7414,20 +6778,6 @@ ], "description": "Symfony Stopwatch Component", "homepage": "https://symfony.com", - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], "time": "2020-10-24T10:57:07+00:00" } ], @@ -7443,6 +6793,5 @@ "ext-json": "*", "ext-openssl": "*" }, - "platform-dev": [], - "plugin-api-version": "1.1.0" + "platform-dev": [] } diff --git a/docs/backward-incompatible-changes.md b/docs/backward-incompatible-changes.md new file mode 100644 index 000000000..8ec54bd1b --- /dev/null +++ b/docs/backward-incompatible-changes.md @@ -0,0 +1,42 @@ +# MFTF 2.7.0 backward incompatible changes + +This page highlights backward incompatible changes from previous 2.6.x releases that have major impacts and require special instructions to ensure third-party tests continue working with Magento core tests. + +## Minimum supported PHP version changes + +We changed the minimum PHP version requirement from 7.0 to 7.3. Because of the PHP version requirement change, this MFTF version only supports Magento 2.3.x, where x is 7 or above. + +## XSD schema changes + +- `arrayVariable` is added as an additional supported result type in assertions. +This is used for `assertContains` and `assertNotContains` actions when the result type is a variable that contains an array. + + ```xml + + + ID + columns + + ``` + +## MFTF actions + +### `formatMoney` removed + +**Action**: `formatMoney` has been removed in favor of `formatCurrency`. + +**Reason**: PHP 7.4 has deprecated use of `formatMoney`. + +**Details**: Format input to specified currency according to the locale specified. + +Usage example: + +```xml + +``` + +### `assertArraySubset` removed + +**Action**: Assert action `assertArraySubset` has been removed. + +**Reason**: PHPUnit 9 has dropped support for this assertion. diff --git a/docs/test/actions.md b/docs/test/actions.md index 5af0c6439..7a99e04a3 100644 --- a/docs/test/actions.md +++ b/docs/test/actions.md @@ -1,7 +1,7 @@ # Test actions Actions in the MFTF allow you to automate different scenarios of Magento user's actions. -They are mostly XML implementations of [Codeception actions](http://codeception.com/docs/modules/WebDriver#Actions). +They are mostly XML implementations of [Codeception actions](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#Actions). Some actions drive browser elements, while others use REST APIs. ## Common attributes @@ -185,7 +185,7 @@ If the description of an element does not include a link to Codeception analogue Accepts the current popup visible on the page. -See [acceptPopup docs on codeception.com](http://codeception.com/docs/modules/WebDriver#acceptPopup). +See [acceptPopup docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#acceptPopup). Attribute|Type|Use|Description ---|---|---|--- @@ -204,7 +204,7 @@ Attribute|Type|Use|Description Opens the page by the URL relative to the one set in the `MAGENTO_BASE_URL` configuration variable. -See [amOnPage docs on codeception.com](http://codeception.com/docs/modules/WebDriver#amOnPage). +See [amOnPage docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#amOnPage). Attribute|Type|Use|Description ---|---|---|--- @@ -224,7 +224,7 @@ Attribute|Type|Use|Description Takes the base URL and changes the subdomain. -See [amOnSubdomain docs on codeception.com](http://codeception.com/docs/modules/WebDriver#amOnSubdomain). +See [amOnSubdomain docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#amOnSubdomain). Attribute|Type|Use|Description ---|---|---|--- @@ -248,7 +248,7 @@ Pre-condition: the current base URL is `https://www.magento.com`. Opens a page by the absolute URL. -See [amOnUrl docs on codeception.com](http://codeception.com/docs/modules/WebDriver#amOnUrl). +See [amOnUrl docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#amOnUrl). Attribute|Type|Use|Description ---|---|---|--- @@ -266,7 +266,7 @@ Attribute|Type|Use|Description ### appendField -See [appendField docs on codeception.com](http://codeception.com/docs/modules/WebDriver#appendField). +See [appendField docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#appendField). Attribute|Type|Use|Description ---|---|---|--- @@ -285,7 +285,7 @@ Attribute|Type|Use|Description ### attachFile -See [attachFile docs on codeception.com](http://codeception.com/docs/modules/WebDriver#attachFile). +See [attachFile docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#attachFile). Attribute|Type|Use|Description ---|---|---|--- @@ -304,7 +304,7 @@ Attribute|Type|Use|Description ### cancelPopup -See [cancelPopup docs on codeception.com](http://codeception.com/docs/modules/WebDriver#cancelPopup). +See [cancelPopup docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#cancelPopup). Attribute|Type|Use|Description ---|---|---|--- @@ -321,7 +321,7 @@ Attribute|Type|Use|Description ### checkOption -See [checkOption docs on codeception.com](http://codeception.com/docs/modules/WebDriver#checkOption). +See [checkOption docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#checkOption). Attribute|Type|Use|Description ---|---|---|--- @@ -358,12 +358,12 @@ Attribute|Type|Use|Description ### click -See [click docs on codeception.com](http://codeception.com/docs/modules/WebDriver#click). +See [click docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#click). Attribute|Type|Use|Description ---|---|---|--- `selector`|string|optional| The selector identifying the corresponding HTML element. -`selectorArray`|string|optional| Selects an element as a key value array. See [strict locator](http://codeception.com/docs/modules/WebDriver#locating-elements). +`selectorArray`|string|optional| Selects an element as a key value array. See [strict locator](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#locating-elements). `userInput`|string|optional| Data to be sent with the click. `stepKey`|string|required| A unique identifier of the action. `before`|string|optional| `stepKey` of action that must be executed next. @@ -383,7 +383,7 @@ Attribute|Type|Use|Description ### clickWithLeftButton -See [clickWithLeftButton docs on codeception.com](http://codeception.com/docs/modules/WebDriver#clickWithLeftButton). +See [clickWithLeftButton docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#clickWithLeftButton). Attribute|Type|Use|Description ---|---|---|--- @@ -414,7 +414,7 @@ Attribute|Type|Use|Description ### clickWithRightButton -See [clickWithRightButton docs on codeception.com](http://codeception.com/docs/modules/WebDriver#clickWithRightButton). +See [clickWithRightButton docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#clickWithRightButton). Attribute|Type|Use|Description ---|---|---|--- @@ -462,7 +462,7 @@ Attribute|Type|Use|Description ### closeTab -See [closeTab docs on codeception.com](http://codeception.com/docs/modules/WebDriver#closeTab). +See [closeTab docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#closeTab). Attribute|Type|Use|Description ---|---|---|--- @@ -620,7 +620,7 @@ Delete an entity using [REST API](https://devdocs.magento.com/redoc/2.3/) reques ### dontSee -See [the codeception.com documentation for more information about this action](http://codeception.com/docs/modules/WebDriver#dontSee). +See [the codeception.com documentation for more information about this action](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#dontSee). Attribute|Type|Use|Description ---|---|---|--- @@ -640,7 +640,7 @@ Attribute|Type|Use|Description ### dontSeeCheckboxIsChecked -See [dontSeeCheckboxIsChecked docs on codeception.com](http://codeception.com/docs/modules/WebDriver#dontSeeCheckboxIsChecked). +See [dontSeeCheckboxIsChecked docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#dontSeeCheckboxIsChecked). Attribute|Type|Use|Description ---|---|---|--- @@ -658,7 +658,7 @@ Attribute|Type|Use|Description ### dontSeeCookie -See [dontSeeCookie docs on codeception.com](http://codeception.com/docs/modules/WebDriver#dontSeeCookie). +See [dontSeeCookie docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#dontSeeCookie). Attribute|Type|Use|Description ---|---|---|--- @@ -682,7 +682,7 @@ Attribute|Type|Use|Description ### dontSeeCurrentUrlEquals -See [dontSeeCurrentUrlEquals docs on codeception.com](http://codeception.com/docs/modules/WebDriver#dontSeeCurrentUrlEquals). +See [dontSeeCurrentUrlEquals docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#dontSeeCurrentUrlEquals). Attribute|Type|Use|Description ---|---|---|--- @@ -700,7 +700,7 @@ Attribute|Type|Use|Description ### dontSeeCurrentUrlMatches -See [dontSeeCurrentUrlMatches docs on codeception.com](http://codeception.com/docs/modules/WebDriver#dontSeeCurrentUrlMatches) +See [dontSeeCurrentUrlMatches docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#dontSeeCurrentUrlMatches) Attribute|Type|Use|Description ---|---|---|--- @@ -718,7 +718,7 @@ Attribute|Type|Use|Description ### dontSeeElement -See [dontSeeElement docs on codeception.com](http://codeception.com/docs/modules/WebDriver#dontSeeElement). +See [dontSeeElement docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#dontSeeElement). Attribute|Type|Use|Description ---|---|---|--- @@ -737,7 +737,7 @@ Attribute|Type|Use|Description ### dontSeeElementInDOM -See [dontSeeElementInDOM docs on codeception.com](http://codeception.com/docs/modules/WebDriver#dontSeeElementInDOM). +See [dontSeeElementInDOM docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#dontSeeElementInDOM). Attribute|Type|Use|Description ---|---|---|--- @@ -756,7 +756,7 @@ Attribute|Type|Use|Description ### dontSeeInCurrentUrl -See [dontSeeInCurrentUrl docs on codeception.com](http://codeception.com/docs/modules/WebDriver#dontSeeInCurrentUrl). +See [dontSeeInCurrentUrl docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#dontSeeInCurrentUrl). Attribute|Type|Use|Description ---|---|---|--- @@ -774,7 +774,7 @@ Attribute|Type|Use|Description ### dontSeeInField -See [dontSeeInField docs on codeception.com](http://codeception.com/docs/modules/WebDriver#dontSeeInField). +See [dontSeeInField docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#dontSeeInField). Attribute|Type|Use|Description ---|---|---|--- @@ -794,7 +794,7 @@ Attribute|Type|Use|Description ### dontSeeInFormFields -See [dontSeeInFormFields docs on codeception.com](http://codeception.com/docs/modules/WebDriver#dontSeeInFormFields). +See [dontSeeInFormFields docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#dontSeeInFormFields). Attribute|Type|Use|Description ---|---|---|--- @@ -813,7 +813,7 @@ Attribute|Type|Use|Description ### dontSeeInPageSource -See [dontSeeInPageSource docs on codeception.com](http://codeception.com/docs/modules/WebDriver#dontSeeInPageSource). +See [dontSeeInPageSource docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#dontSeeInPageSource). Attribute|Type|Use|Description ---|---|---|--- @@ -831,7 +831,7 @@ Attribute|Type|Use|Description ### dontSeeInSource -See [dontSeeInSource docs on codeception.com](http://codeception.com/docs/modules/WebDriver#dontSeeInSource). +See [dontSeeInSource docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#dontSeeInSource). Attribute|Type|Use|Description ---|---|---|--- @@ -851,7 +851,7 @@ You must encode the `html` using a tool such as [CyberChef](https://gchq.github. ### dontSeeInTitle -See [dontSeeInTitle docs on codeception.com](http://codeception.com/docs/modules/WebDriver#dontSeeInTitle). +See [dontSeeInTitle docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#dontSeeInTitle). Attribute|Type|Use|Description ---|---|---|--- @@ -886,7 +886,7 @@ Attribute|Type|Use|Description ### dontSeeLink -See [dontSeeLink docs on codeception.com](http://codeception.com/docs/modules/WebDriver#dontSeeLink). +See [dontSeeLink docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#dontSeeLink). Attribute|Type|Use|Description ---|---|---|--- @@ -910,7 +910,7 @@ Attribute|Type|Use|Description ### dontSeeOptionIsSelected -See [dontSeeOptionIsSelected docs on codeception.com](http://codeception.com/docs/modules/WebDriver#dontSeeOptionIsSelected). +See [dontSeeOptionIsSelected docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#dontSeeOptionIsSelected). Attribute|Type|Use|Description ---|---|---|--- @@ -929,7 +929,7 @@ Attribute|Type|Use|Description ### doubleClick -See [doubleClick docs on codeception.com](http://codeception.com/docs/modules/WebDriver#doubleClick). +See [doubleClick docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#doubleClick). Attribute|Type|Use|Description ---|---|---|--- @@ -947,7 +947,7 @@ Attribute|Type|Use|Description ### dragAndDrop -See [dragAndDrop docs on codeception.com](http://codeception.com/docs/modules/WebDriver#dragAndDrop). +See [dragAndDrop docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#dragAndDrop). Attribute|Type|Use|Description ---|---|---|--- @@ -975,7 +975,7 @@ Attribute|Type|Use|Description #### NOTE: `executeInSelenium` action is DEPRECATED and will be removed in MFTF 3.0.0. -See [executeInSelenium docs on codeception.com](http://codeception.com/docs/modules/WebDriver#executeInSelenium). +See [executeInSelenium docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#executeInSelenium). Attribute|Type|Use|Description ---|---|---|--- @@ -993,7 +993,7 @@ Attribute|Type|Use|Description ### executeJS -See [executeJS docs on codeception.com](http://codeception.com/docs/modules/WebDriver#executeJS). +See [executeJS docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#executeJS). Attribute|Type|Use|Description ---|---|---|--- @@ -1014,7 +1014,7 @@ To access this value you would use `{$returnTime}` in later actions. ### fillField -See [fillField docs on codeception.com](http://codeception.com/docs/modules/WebDriver#fillField). +See [fillField docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#fillField). Attribute|Type|Use|Description ---|---|---|--- @@ -1094,7 +1094,7 @@ This action can optionally contain one or more [requiredEntity](#requiredentity) ### grabAttributeFrom -See [grabAttributeFrom docs on codeception.com](http://codeception.com/docs/modules/WebDriver#grabAttributeFrom). +See [grabAttributeFrom docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#grabAttributeFrom). Attribute|Type|Use|Description ---|---|---|--- @@ -1114,7 +1114,7 @@ To access this value, use `{$grabAttributeFromInput}` in later actions. --> ### grabCookie -See [grabCookie docs on codeception.com](http://codeception.com/docs/modules/WebDriver#grabCookie). +See [grabCookie docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#grabCookie). Attribute|Type|Use|Description ---|---|---|--- @@ -1140,7 +1140,7 @@ To access this value, use `{$grabCookieExampleDomain}` in later actions. --> ### grabFromCurrentUrl -See [grabFromCurrentUrl docs on codeception.com](http://codeception.com/docs/modules/WebDriver#grabFromCurrentUrl).. +See [grabFromCurrentUrl docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#grabFromCurrentUrl).. Attribute|Type|Use|Description ---|---|---|--- @@ -1159,7 +1159,7 @@ To access this value, use `{$grabFromCurrentUrl}` in later actions. --> ### grabMultiple -See [grabMultiple docs on codeception.com](http://codeception.com/docs/modules/WebDriver#grabMultiple).. +See [grabMultiple docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#grabMultiple).. Attribute|Type|Use|Description ---|---|---|--- @@ -1185,7 +1185,7 @@ To access this value, use `{$grabAllLinks}` in later actions. --> ### grabPageSource -See [grabPageSource docs on codeception.com](http://codeception.com/docs/modules/WebDriver#grabPageSource). +See [grabPageSource docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#grabPageSource). Attribute|Type|Use|Description ---|---|---|--- @@ -1203,7 +1203,7 @@ To access this value, use `{$grabPageSource}` in later actions. --> ### grabTextFrom -See [grabTextFrom docs on codeception.com](http://codeception.com/docs/modules/WebDriver#grabTextFrom). +See [grabTextFrom docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#grabTextFrom). Attribute|Type|Use|Description ---|---|---|--- @@ -1242,7 +1242,7 @@ To access this value, use `{$grabInputName}` in later actions. --> ### loadSessionSnapshot -See [loadSessionSnapshot docs on codeception.com](http://codeception.com/docs/modules/WebDriver#loadSessionSnapshot). +See [loadSessionSnapshot docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#loadSessionSnapshot). Attribute|Type|Use|Description ---|---|---|--- @@ -1303,7 +1303,7 @@ Attribute|Type|Use|Description ### makeScreenshot -See [makeScreenshot docs on codeception.com](http://codeception.com/docs/modules/WebDriver#makeScreenshot). +See [makeScreenshot docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#makeScreenshot). Attribute|Type|Use|Description ---|---|---|--- @@ -1326,7 +1326,7 @@ This action does not add a screenshot to the Allure [report](../reporting.md).` where you specify the options that must be ### setCookie -See [setCookie docs on codeception.com](http://codeception.com/docs/modules/WebDriver#setCookie). +See [setCookie docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#setCookie). Attribute|Type|Use|Description ---|---|---|--- @@ -2073,7 +2074,7 @@ Attribute|Type|Use|Description ### submitForm -See [submitForm docs on codeception.com](http://codeception.com/docs/modules/WebDriver#submitForm). +See [submitForm docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#submitForm). Attribute|Type|Use|Description ---|---|---|--- @@ -2093,7 +2094,7 @@ Attribute|Type|Use|Description ### switchToIFrame -See [switchToIFrame docs on codeception.com](http://codeception.com/docs/modules/WebDriver#switchToIFrame). +See [switchToIFrame docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#switchToIFrame). Attribute|Type|Use|Description ---|---|---|--- @@ -2112,7 +2113,7 @@ Attribute|Type|Use|Description ### switchToNextTab -See [switchToNextTab docs on codeception.com](http://codeception.com/docs/modules/WebDriver#switchToNextTab). +See [switchToNextTab docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#switchToNextTab). Attribute|Type|Use|Description ---|---|---|--- @@ -2135,7 +2136,7 @@ Attribute|Type|Use|Description ### switchToPreviousTab -See [switchToPreviousTab docs on codeception.com](http://codeception.com/docs/modules/WebDriver#switchToPreviousTab). +See [switchToPreviousTab docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#switchToPreviousTab). Attribute|Type|Use|Description ---|---|---|--- @@ -2158,7 +2159,7 @@ Attribute|Type|Use|Description ### switchToWindow -See [switchToWindow docs on codeception.com](http://codeception.com/docs/modules/WebDriver#switchToWindow). +See [switchToWindow docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#switchToWindow). Attribute|Type|Use|Description ---|---|---|--- @@ -2176,7 +2177,7 @@ Attribute|Type|Use|Description ### typeInPopup -See [typeInPopup docs on codeception.com](http://codeception.com/docs/modules/WebDriver#typeInPopup). +See [typeInPopup docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#typeInPopup). Attribute|Type|Use|Description ---|---|---|--- @@ -2194,7 +2195,7 @@ Attribute|Type|Use|Description ### uncheckOption -See [uncheckOption docs on codeception.com](http://codeception.com/docs/modules/WebDriver#uncheckOption). +See [uncheckOption docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#uncheckOption). Attribute|Type|Use|Description ---|---|---|--- @@ -2212,7 +2213,7 @@ Attribute|Type|Use|Description ### unselectOption -See [unselectOption docs on codeception.com](http://codeception.com/docs/modules/WebDriver#unselectOption). +See [unselectOption docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#unselectOption). Attribute|Type|Use|Description ---|---|---|--- @@ -2264,7 +2265,7 @@ This action can optionally contain one or more [requiredEntity](#requiredentity) ### wait -See [wait docs on codeception.com](http://codeception.com/docs/modules/WebDriver#wait). +See [wait docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#wait). Attribute|Type|Use|Description ---|---|---|--- @@ -2300,7 +2301,7 @@ Attribute|Type|Use|Description ### waitForElementChange -See [waitForElementChange docs on codeception.com](http://codeception.com/docs/modules/WebDriver#waitForElementChange). +See [waitForElementChange docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#waitForElementChange). Attribute|Type|Use|Description ---|---|---|--- @@ -2320,7 +2321,7 @@ Attribute|Type|Use|Description ### waitForElement -See [waitForElement docs on codeception.com](http://codeception.com/docs/modules/WebDriver#waitForElement). +See [waitForElement docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#waitForElement). Attribute|Type|Use|Description ---|---|---|--- @@ -2339,7 +2340,7 @@ Attribute|Type|Use|Description ### waitForElementNotVisible -See [waitForElementNotVisible docs on codeception.com](http://codeception.com/docs/modules/WebDriver#waitForElementNotVisible). +See [waitForElementNotVisible docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#waitForElementNotVisible). Attribute|Type|Use|Description ---|---|---|--- @@ -2358,7 +2359,7 @@ Attribute|Type|Use|Description ### waitForElementVisible -See [waitForElementVisible docs on codeception.com](http://codeception.com/docs/modules/WebDriver#waitForElementVisible). +See [waitForElementVisible docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#waitForElementVisible). Attribute|Type|Use|Description ---|---|---|--- @@ -2377,7 +2378,7 @@ Attribute|Type|Use|Description ### waitForJS -See [waitForJS docs on codeception.com](http://codeception.com/docs/modules/WebDriver#waitForJS). +See [waitForJS docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#waitForJS). Attribute|Type|Use|Description ---|---|---|--- @@ -2483,7 +2484,7 @@ Attribute|Type|Use|Description ### waitForText -See [waitForText docs on codeception.com](http://codeception.com/docs/modules/WebDriver#waitForText). +See [waitForText docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#waitForText). Attribute|Type|Use|Description ---|---|---|--- diff --git a/docs/test/assertions.md b/docs/test/assertions.md index cad01795f..62f3e2ab3 100644 --- a/docs/test/assertions.md +++ b/docs/test/assertions.md @@ -89,7 +89,7 @@ It must be in typical array format like `[1,2,3,4,5]` or `[alpha, brontosaurus, ### assertArrayHasKey -See [assertArrayHasKey docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertArrayHasKey) +See [assertArrayHasKey docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/Asserts.md#assertArrayHasKey) Attribute|Type|Use|Description ---|---|---|--- @@ -104,7 +104,7 @@ Attribute|Type|Use|Description ### assertArrayNotHasKey -See [assertArrayNotHasKey docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertArrayNotHasKey). +See [assertArrayNotHasKey docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/Asserts.md#assertArrayNotHasKey). Attribute|Type|Use|Description ---|---|---|--- @@ -119,7 +119,8 @@ Attribute|Type|Use|Description ### assertContains -See [assertContains docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertContains). +See [assertContains docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/Asserts.md#assertContains). +MFTF will map and generate `assertContains` action to PHPUnit 9 compatible assertContains() or assertStringContainsString() accordingly. Attribute|Type|Use|Description ---|---|---|--- @@ -134,7 +135,7 @@ Attribute|Type|Use|Description ### assertCount -See [assertCount docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertCount). +See [assertCount docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/Asserts.md#assertCount). Attribute|Type|Use|Description ---|---|---|--- @@ -149,7 +150,7 @@ Attribute|Type|Use|Description ### assertEmpty -See [assertEmpty docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertEmpty). +See [assertEmpty docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/Asserts.md#assertEmpty). Attribute|Type|Use|Description ---|---|---|--- @@ -162,7 +163,8 @@ Attribute|Type|Use|Description ### assertEquals -See [assertEquals docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertEquals). +See [assertEquals docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/Asserts.md#assertEquals). +MFTF will map and generate `assertEquals` action to PHPUnit 9 compatible assertEquals() or assertEqualsWithDelta() accordingly. Attribute|Type|Use|Description ---|---|---|--- @@ -178,7 +180,7 @@ Attribute|Type|Use|Description ### assertFalse -See [assertFalse docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertFalse). +See [assertFalse docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/Asserts.md#assertFalse). Attribute|Type|Use|Description ---|---|---|--- @@ -191,7 +193,7 @@ Attribute|Type|Use|Description ### assertFileExists -See [assertFileExists docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertFileExists). +See [assertFileExists docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/Asserts.md#assertFileExists). Attribute|Type|Use|Description ---|---|---|--- @@ -204,7 +206,7 @@ Attribute|Type|Use|Description ### assertFileNotExists -See [assertFileNotExists docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertFileNotExists). +See [assertFileNotExists docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/Asserts.md#assertFileNotExists). Attribute|Type|Use|Description ---|---|---|--- @@ -217,7 +219,7 @@ Attribute|Type|Use|Description ### assertGreaterOrEquals -See [assertGreaterOrEquals docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertGreaterOrEquals). +See [assertGreaterOrEquals docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/Asserts.md#assertGreaterOrEquals). Attribute|Type|Use|Description ---|---|---|--- @@ -232,7 +234,7 @@ Attribute|Type|Use|Description ### assertGreaterThan -See [assertGreaterThan docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertGreaterThan). +See [assertGreaterThan docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/Asserts.md#assertGreaterThan). Attribute|Type|Use|Description ---|---|---|--- @@ -247,7 +249,7 @@ Attribute|Type|Use|Description ### assertGreaterThanOrEqual -See [assertGreaterThanOrEqual docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertGreaterThanOrEqual). +See [assertGreaterThanOrEqual docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/Asserts.md#assertGreaterThanOrEqual). Attribute|Type|Use|Description ---|---|---|--- @@ -262,7 +264,7 @@ Attribute|Type|Use|Description ### assertInstanceOf -See [assertInstanceOf docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertInstanceOf). +See [assertInstanceOf docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/Asserts.md#assertInstanceOf). Attribute|Type|Use|Description ---|---|---|--- @@ -277,7 +279,8 @@ Attribute|Type|Use|Description ### assertInternalType -See [assertInternalType docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertInternalType). +See [assertInternalType docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/Asserts.md#assertInternalType). +MFTF will map and generate `assertInternalType` action to PHPUnit 9 compatible assertIsInt(), assertIsFloat(), assertIsBool(), assertIsString() or assertIsArray() accordingly. Attribute|Type|Use|Description ---|---|---|--- @@ -292,7 +295,7 @@ Attribute|Type|Use|Description ### assertIsEmpty -See [assertIsEmpty docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertIsEmpty). +See [assertIsEmpty docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/Asserts.md#assertIsEmpty). Attribute|Type|Use|Description ---|---|---|--- @@ -305,7 +308,7 @@ Attribute|Type|Use|Description ### assertLessOrEquals -See [assertLessOrEquals docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertLessOrEquals). +See [assertLessOrEquals docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/Asserts.md#assertLessOrEquals). Attribute|Type|Use|Description ---|---|---|--- @@ -320,7 +323,7 @@ Attribute|Type|Use|Description ### assertLessThan -See [assertLessThan docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertLessThan). +See [assertLessThan docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/Asserts.md#assertLessThan). Attribute|Type|Use|Description ---|---|---|--- @@ -335,7 +338,7 @@ Attribute|Type|Use|Description ### assertLessThanOrEqual -See [assertLessThanOrEqual docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertLessThanOrEqual). +See [assertLessThanOrEqual docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/Asserts.md#assertLessThanOrEqual). Attribute|Type|Use|Description ---|---|---|--- @@ -350,7 +353,8 @@ Attribute|Type|Use|Description ### assertNotContains -See [assertNotContains docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertNotContains). +See [assertNotContains docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/Asserts.md#assertNotContains). +MFTF will map and generate `assertNotContains` action to PHPUnit 9 compatible assertNotContains() or assertStringNotContainsString() accordingly. Attribute|Type|Use|Description ---|---|---|--- @@ -365,7 +369,7 @@ Attribute|Type|Use|Description ### assertNotEmpty -See [assertNotEmpty docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertNotEmpty). +See [assertNotEmpty docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/Asserts.md#assertNotEmpty). Attribute|Type|Use|Description ---|---|---|--- @@ -378,7 +382,8 @@ Attribute|Type|Use|Description ### assertNotEquals -See [assertNotEquals docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertNotEquals). +See [assertNotEquals docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/Asserts.md#assertNotEquals). +MFTF will map and generate `assertNotEquals` action to PHPUnit 9 compatible assertNotEquals() or assertNotEqualsWithDelta() accordingly. Attribute|Type|Use|Description ---|---|---|--- @@ -394,7 +399,7 @@ Attribute|Type|Use|Description ### assertNotInstanceOf -See [assertNotInstanceOf docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertNotInstanceOf). +See [assertNotInstanceOf docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/Asserts.md#assertNotInstanceOf). Attribute|Type|Use|Description ---|---|---|--- @@ -409,7 +414,7 @@ Attribute|Type|Use|Description ### assertNotNull -See [assertNotNull docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertNotNull). +See [assertNotNull docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/Asserts.md#assertNotNull). Attribute|Type|Use|Description ---|---|---|--- @@ -422,7 +427,7 @@ Attribute|Type|Use|Description ### assertNotRegExp -See [assertNotRegExp docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertNotRegExp). +See [assertNotRegExp docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/Asserts.md#assertNotRegExp). Attribute|Type|Use|Description ---|---|---|--- @@ -437,7 +442,7 @@ Attribute|Type|Use|Description ### assertNotSame -See [assertNotSame docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertNotSame). +See [assertNotSame docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/Asserts.md#assertNotSame). Attribute|Type|Use|Description ---|---|---|--- @@ -452,7 +457,7 @@ Attribute|Type|Use|Description ### assertNull -See [assertNull docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertNull). +See [assertNull docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/Asserts.md#assertNull). Attribute|Type|Use|Description ---|---|---|--- @@ -465,7 +470,7 @@ Attribute|Type|Use|Description ### assertRegExp -See [assertRegExp docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertRegExp). +See [assertRegExp docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/Asserts.md#assertRegExp). Attribute|Type|Use|Description ---|---|---|--- @@ -480,7 +485,7 @@ Attribute|Type|Use|Description ### assertSame -See [assertSame docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertSame). +See [assertSame docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/Asserts.md#assertSame). Attribute|Type|Use|Description ---|---|---|--- @@ -495,7 +500,7 @@ Attribute|Type|Use|Description ### assertStringStartsNotWith -See [assertStringStartsNotWith docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertStringStartsNotWith). +See [assertStringStartsNotWith docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/Asserts.md#assertStringStartsNotWith). Attribute|Type|Use|Description ---|---|---|--- @@ -510,7 +515,7 @@ Attribute|Type|Use|Description ### assertStringStartsWith -See [assertStringStartsWith docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertStringStartsWith). +See [assertStringStartsWith docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/Asserts.md#assertStringStartsWith). Attribute|Type|Use|Description ---|---|---|--- @@ -525,7 +530,7 @@ Attribute|Type|Use|Description ### assertTrue -See [assertTrue docs on codeception.com](http://codeception.com/docs/modules/Asserts#assertTrue). +See [assertTrue docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/Asserts.md#assertTrue). Attribute|Type|Use|Description ---|---|---|--- @@ -538,7 +543,7 @@ Attribute|Type|Use|Description ### expectException -See [expectException docs on codeception.com](http://codeception.com/docs/modules/WebDriver#expectException). +See [expectException docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#expectException). Attribute|Type|Use|Description ---|---|---|--- @@ -552,7 +557,7 @@ Attribute|Type|Use|Description ### fail -See [fail docs on codeception.com](http://codeception.com/docs/modules/WebDriver#fail). +See [fail docs on codeception.com](https://github.com/Codeception/Codeception/blob/2.5/docs/modules/WebDriver#fail). Attribute|Type|Use|Description ---|---|---|--- From 90dd740dda4c5b1a8dbcf283a976c2a10ffde43e Mon Sep 17 00:00:00 2001 From: Ji Lu Date: Wed, 24 Feb 2021 09:50:48 -0600 Subject: [PATCH 16/31] MQE-2501: release 2.7.0 documentation --- composer.json | 2 +- composer.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index c627850c8..46c7f86eb 100755 --- a/composer.json +++ b/composer.json @@ -20,7 +20,7 @@ "codeception/module-asserts": "^1.1", "codeception/module-sequence": "^1.0", "codeception/module-webdriver": "^1.0", - "composer/composer": "^1.6", + "composer/composer": "^1.9||^2.0", "csharpru/vault-php": "~3.5.3", "csharpru/vault-php-guzzle6-transport": "^2.0", "flow/jsonpath": ">0.2", diff --git a/composer.lock b/composer.lock index ff01e96aa..54d803eba 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "396690119bbc3267f2ce743d103ac96e", + "content-hash": "75fac2b26086ad6fdb92dced96484e3a", "packages": [ { "name": "allure-framework/allure-codeception", From 07230939509006bd59cdbb2262eaa11f1625a825 Mon Sep 17 00:00:00 2001 From: Donald Booth Date: Wed, 24 Feb 2021 12:26:52 -0500 Subject: [PATCH 17/31] markdown formatting --- docs/test/actions.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/test/actions.md b/docs/test/actions.md index 7a99e04a3..2a029638b 100644 --- a/docs/test/actions.md +++ b/docs/test/actions.md @@ -1033,6 +1033,7 @@ Attribute|Type|Use|Description ``` ### formatCurrency + Format input to specified currency according to the locale specified. Returns formatted string for test use. Use NumberFormatter::formatCurrency(), see https://www.php.net/manual/en/numberformatter.formatcurrency.php From 89d222c2fa29548d6bc91a3a6747eac4fc6ba505 Mon Sep 17 00:00:00 2001 From: Ji Lu Date: Wed, 24 Mar 2021 15:20:32 -0500 Subject: [PATCH 18/31] MQE-2585: use --no-sandbox chrome options for functional suite. --- etc/config/functional.suite.dist.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etc/config/functional.suite.dist.yml b/etc/config/functional.suite.dist.yml index 319804d7a..7d9d077e5 100644 --- a/etc/config/functional.suite.dist.yml +++ b/etc/config/functional.suite.dist.yml @@ -35,4 +35,4 @@ modules: path: "%SELENIUM_PATH%" capabilities: chromeOptions: - args: ["--window-size=1280,1024", "--disable-extensions", "--enable-automation", "--disable-gpu", "--enable-Passthrough"] + args: ["--no-sandbox", "--window-size=1280,1024", "--disable-extensions", "--enable-automation", "--disable-gpu", "--enable-Passthrough"] From 79d5c7a5105c7679657b43624909f4a3bbdb3fcc Mon Sep 17 00:00:00 2001 From: Ji Lu Date: Mon, 29 Mar 2021 17:14:29 -0500 Subject: [PATCH 19/31] MQE-2607: changelog.md and version bump for 2.7.1 --- CHANGELOG.md | 6 ++++ composer.json | 2 +- composer.lock | 97 +++++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 102 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 44998bcd3..065f3f5dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ Magento Functional Testing Framework Changelog ================================================ +2.7.1 +--------- + +### Fixes +* Added --no-sandbox chrome option in functional suite configuration. + 2.7.0 --------- diff --git a/composer.json b/composer.json index 46c7f86eb..38962a4da 100755 --- a/composer.json +++ b/composer.json @@ -2,7 +2,7 @@ "name": "magento/magento2-functional-testing-framework", "description": "Magento2 Functional Testing Framework", "type": "library", - "version": "2.7.0", + "version": "2.7.1", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 54d803eba..c1c8398bd 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "75fac2b26086ad6fdb92dced96484e3a", + "content-hash": "3ac0b79474545d8c624f57748b2ec187", "packages": [ { "name": "allure-framework/allure-codeception", @@ -477,6 +477,12 @@ "functional testing", "unit testing" ], + "funding": [ + { + "url": "https://opencollective.com/codeception", + "type": "open_collective" + } + ], "time": "2021-02-01T07:30:47+00:00" }, { @@ -2063,6 +2069,12 @@ "sftp", "storage" ], + "funding": [ + { + "url": "https://offset.earth/frankdejonge", + "type": "other" + } + ], "time": "2020-08-23T07:39:11+00:00" }, { @@ -2105,6 +2117,16 @@ } ], "description": "Mime-type detection for Flysystem", + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], "time": "2021-01-18T20:58:21+00:00" }, { @@ -4511,6 +4533,20 @@ ], "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-01-27T10:01:46+00:00" }, { @@ -4734,6 +4770,20 @@ ], "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-01-27T10:01:46+00:00" }, { @@ -4778,6 +4828,20 @@ ], "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-01-28T22:06:19+00:00" }, { @@ -4834,6 +4898,20 @@ ], "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-02-03T04:42:09+00:00" }, { @@ -4899,6 +4977,20 @@ "mime", "mime-type" ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-02-02T06:10:15+00:00" }, { @@ -6793,5 +6885,6 @@ "ext-json": "*", "ext-openssl": "*" }, - "platform-dev": [] + "platform-dev": [], + "plugin-api-version": "1.1.0" } From 113b5cafd8fe291eb39e380d99cc7f89cff78cb2 Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Thu, 26 Aug 2021 11:24:46 -0500 Subject: [PATCH 20/31] MQE-2873: allure dependency - repo name change --- composer.lock | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/composer.lock b/composer.lock index c1c8398bd..ab52a4ab1 100644 --- a/composer.lock +++ b/composer.lock @@ -62,12 +62,12 @@ "version": "1.2.1", "source": { "type": "git", - "url": "https://github.com/allure-framework/allure-php-commons.git", + "url": "https://github.com/allure-framework/allure-php-api.git", "reference": "13ef45d83ce4f5ef70499ff87ed0c3d1c192ab80" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/allure-framework/allure-php-commons/zipball/13ef45d83ce4f5ef70499ff87ed0c3d1c192ab80", + "url": "https://api.github.com/repos/allure-framework/allure-php-api/zipball/13ef45d83ce4f5ef70499ff87ed0c3d1c192ab80", "reference": "13ef45d83ce4f5ef70499ff87ed0c3d1c192ab80", "shasum": "" }, @@ -108,6 +108,11 @@ "php", "report" ], + "support": { + "email": "allure@yandex-team.ru", + "issues": "https://github.com/allure-framework/allure-php-api/issues", + "source": "https://github.com/allure-framework/allure-php-api" + }, "time": "2020-11-26T09:20:44+00:00" }, { @@ -6886,5 +6891,5 @@ "ext-openssl": "*" }, "platform-dev": [], - "plugin-api-version": "1.1.0" + "plugin-api-version": "2.1.0" } From 5aa6cbc0e76673da3f4c206a0148db1887dcff5a Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Thu, 26 Aug 2021 13:49:25 -0500 Subject: [PATCH 21/31] MQE-2873: allure dependency - repo name change --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 065f3f5dd..4a7bfbf4c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ Magento Functional Testing Framework Changelog ================================================ +2.7.2 +--------- + +### Enhancements + +* Maintainability + * Updated allure dependencies to pull package from new repo `allure-framework/allure-php-api`. + 2.7.1 --------- From c9511f5a815558e7a6e465137e67093e9f536471 Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Thu, 26 Aug 2021 13:54:04 -0500 Subject: [PATCH 22/31] MQE-2873: allure dependency - repo name change --- composer.json | 2 +- composer.lock | 1025 ++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 1024 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 38962a4da..20b25044c 100755 --- a/composer.json +++ b/composer.json @@ -2,7 +2,7 @@ "name": "magento/magento2-functional-testing-framework", "description": "Magento2 Functional Testing Framework", "type": "library", - "version": "2.7.1", + "version": "2.7.2", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index ab52a4ab1..968efbb27 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "3ac0b79474545d8c624f57748b2ec187", + "content-hash": "371c700b804b68afc0fb87ae9c0b7c8f", "packages": [ { "name": "allure-framework/allure-codeception", @@ -55,6 +55,11 @@ "steps", "testing" ], + "support": { + "email": "allure@yandex-team.ru", + "issues": "https://github.com/allure-framework/allure-codeception/issues", + "source": "https://github.com/allure-framework/allure-codeception" + }, "time": "2020-11-26T11:41:53+00:00" }, { @@ -198,6 +203,11 @@ "s3", "sdk" ], + "support": { + "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", + "issues": "https://github.com/aws/aws-sdk-php/issues", + "source": "https://github.com/aws/aws-sdk-php/tree/3.173.2" + }, "time": "2021-02-03T21:12:51+00:00" }, { @@ -258,6 +268,10 @@ "gherkin", "parser" ], + "support": { + "issues": "https://github.com/Behat/Gherkin/issues", + "source": "https://github.com/Behat/Gherkin/tree/v4.8.0" + }, "time": "2021-02-04T12:44:21+00:00" }, { @@ -304,6 +318,16 @@ "brick", "math" ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.9.2" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/brick/math", + "type": "tidelift" + } + ], "time": "2021-01-20T22:51:39+00:00" }, { @@ -397,6 +421,9 @@ "cache", "psr6" ], + "support": { + "source": "https://github.com/php-cache/cache/tree/master" + }, "time": "2017-03-28T16:08:48+00:00" }, { @@ -482,6 +509,10 @@ "functional testing", "unit testing" ], + "support": { + "issues": "https://github.com/Codeception/Codeception/issues", + "source": "https://github.com/Codeception/Codeception/tree/4.1.17" + }, "funding": [ { "url": "https://opencollective.com/codeception", @@ -538,6 +569,10 @@ "keywords": [ "codeception" ], + "support": { + "issues": "https://github.com/Codeception/lib-asserts/issues", + "source": "https://github.com/Codeception/lib-asserts/tree/1.13.2" + }, "time": "2020-10-21T16:26:20+00:00" }, { @@ -591,6 +626,10 @@ "asserts", "codeception" ], + "support": { + "issues": "https://github.com/Codeception/module-asserts/issues", + "source": "https://github.com/Codeception/module-asserts/tree/1.3.1" + }, "time": "2020-10-21T16:48:15+00:00" }, { @@ -631,6 +670,10 @@ "keywords": [ "codeception" ], + "support": { + "issues": "https://github.com/Codeception/module-sequence/issues", + "source": "https://github.com/Codeception/module-sequence/tree/1.0.1" + }, "time": "2020-10-31T18:36:26+00:00" }, { @@ -683,6 +726,10 @@ "browser-testing", "codeception" ], + "support": { + "issues": "https://github.com/Codeception/module-webdriver/issues", + "source": "https://github.com/Codeception/module-webdriver/tree/1.2.0" + }, "time": "2021-01-17T19:23:20+00:00" }, { @@ -728,6 +775,10 @@ } ], "description": "PHPUnit classes used by Codeception", + "support": { + "issues": "https://github.com/Codeception/phpunit-wrapper/issues", + "source": "https://github.com/Codeception/phpunit-wrapper/tree/9.0.6" + }, "time": "2020-12-28T13:59:47+00:00" }, { @@ -758,6 +809,10 @@ "MIT" ], "description": "Flexible Stub wrapper for PHPUnit's Mock Builder", + "support": { + "issues": "https://github.com/Codeception/Stub/issues", + "source": "https://github.com/Codeception/Stub/tree/3.7.0" + }, "time": "2020-07-03T15:54:43+00:00" }, { @@ -815,6 +870,25 @@ "ssl", "tls" ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/ca-bundle/issues", + "source": "https://github.com/composer/ca-bundle/tree/1.2.9" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], "time": "2021-01-12T12:10:35+00:00" }, { @@ -895,6 +969,25 @@ "dependency", "package" ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/composer/issues", + "source": "https://github.com/composer/composer/tree/1.10.20" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], "time": "2021-01-27T14:41:06+00:00" }, { @@ -956,6 +1049,25 @@ "validation", "versioning" ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/1.7.2" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], "time": "2020-12-03T15:47:16+00:00" }, { @@ -1016,6 +1128,25 @@ "spdx", "validator" ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/spdx-licenses/issues", + "source": "https://github.com/composer/spdx-licenses/tree/1.5.5" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], "time": "2020-12-03T16:04:16+00:00" }, { @@ -1060,6 +1191,25 @@ "Xdebug", "performance" ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/1.4.5" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], "time": "2020-11-13T08:04:11+00:00" }, { @@ -1108,6 +1258,10 @@ } ], "description": "Best Vault client for PHP that you can find", + "support": { + "issues": "https://github.com/CSharpRU/vault-php/issues", + "source": "https://github.com/CSharpRU/vault-php/tree/3.5.3" + }, "time": "2018-04-28T04:52:17+00:00" }, { @@ -1146,6 +1300,11 @@ } ], "description": "Guzzle6 transport for Vault PHP client", + "support": { + "issues": "https://github.com/CSharpRU/vault-php-guzzle6-transport/issues", + "source": "https://github.com/CSharpRU/vault-php-guzzle6-transport/tree/master" + }, + "abandoned": true, "time": "2019-03-10T06:17:37+00:00" }, { @@ -1217,6 +1376,10 @@ "docblock", "parser" ], + "support": { + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/1.11.1" + }, "time": "2020-10-26T10:28:16+00:00" }, { @@ -1287,6 +1450,10 @@ "cache", "caching" ], + "support": { + "issues": "https://github.com/doctrine/cache/issues", + "source": "https://github.com/doctrine/cache/tree/1.6.x" + }, "time": "2017-07-22T12:49:21+00:00" }, { @@ -1354,6 +1521,9 @@ "singularize", "string" ], + "support": { + "source": "https://github.com/doctrine/inflector/tree/master" + }, "time": "2015-11-06T14:35:42+00:00" }, { @@ -1405,6 +1575,24 @@ "constructor", "instantiate" ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.4.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], "time": "2020-11-10T18:47:58+00:00" }, { @@ -1467,6 +1655,24 @@ "parser", "php" ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/1.2.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], "time": "2020-05-25T17:44:05+00:00" }, { @@ -1508,6 +1714,10 @@ } ], "description": "JSONPath implementation for parsing, searching and flattening arrays", + "support": { + "issues": "https://github.com/FlowCommunications/JSONPath/issues", + "source": "https://github.com/FlowCommunications/JSONPath/tree/0.5.0" + }, "abandoned": "softcreatr/jsonpath", "time": "2019-07-15T17:23:22+00:00" }, @@ -1559,6 +1769,10 @@ "faker", "fixtures" ], + "support": { + "issues": "https://github.com/fzaninotto/Faker/issues", + "source": "https://github.com/fzaninotto/Faker/tree/v1.9.2" + }, "abandoned": true, "time": "2020-12-11T09:56:16+00:00" }, @@ -1627,6 +1841,10 @@ "rest", "web service" ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/6.5" + }, "time": "2020-06-16T21:01:06+00:00" }, { @@ -1678,6 +1896,10 @@ "keywords": [ "promise" ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/1.4.0" + }, "time": "2020-09-30T07:37:28+00:00" }, { @@ -1749,6 +1971,10 @@ "uri", "url" ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/1.7.0" + }, "time": "2020-09-30T07:37:11+00:00" }, { @@ -1804,6 +2030,10 @@ "xml", "yaml" ], + "support": { + "issues": "https://github.com/schmittjoh/metadata/issues", + "source": "https://github.com/schmittjoh/metadata/tree/1.x" + }, "time": "2018-10-26T12:40:10+00:00" }, { @@ -1839,6 +2069,10 @@ "Apache2" ], "description": "A library for easily creating recursive-descent parsers.", + "support": { + "issues": "https://github.com/schmittjoh/parser-lib/issues", + "source": "https://github.com/schmittjoh/parser-lib/tree/1.0.0" + }, "time": "2012-11-18T18:08:43+00:00" }, { @@ -1923,6 +2157,10 @@ "serialization", "xml" ], + "support": { + "issues": "https://github.com/schmittjoh/serializer/issues", + "source": "https://github.com/schmittjoh/serializer/tree/1.14.1" + }, "time": "2020-02-22T20:59:37+00:00" }, { @@ -1989,6 +2227,10 @@ "json", "schema" ], + "support": { + "issues": "https://github.com/justinrainbow/json-schema/issues", + "source": "https://github.com/justinrainbow/json-schema/tree/5.2.10" + }, "time": "2020-05-27T16:41:55+00:00" }, { @@ -2074,6 +2316,10 @@ "sftp", "storage" ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/1.x" + }, "funding": [ { "url": "https://offset.earth/frankdejonge", @@ -2122,6 +2368,10 @@ } ], "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.7.0" + }, "funding": [ { "url": "https://github.com/frankdejonge", @@ -2204,6 +2454,20 @@ "logging", "psr-3" ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/1.26.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], "time": "2020-12-14T12:56:38+00:00" }, { @@ -2261,6 +2525,10 @@ "json", "jsonpath" ], + "support": { + "issues": "https://github.com/jmespath/jmespath.php/issues", + "source": "https://github.com/jmespath/jmespath.php/tree/2.6.0" + }, "time": "2020-07-31T21:01:56+00:00" }, { @@ -2307,6 +2575,10 @@ "mustache", "templating" ], + "support": { + "issues": "https://github.com/bobthecow/mustache.php/issues", + "source": "https://github.com/bobthecow/mustache.php/tree/master" + }, "time": "2019-11-23T21:40:31+00:00" }, { @@ -2355,6 +2627,16 @@ "object", "object graph" ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], "time": "2020-11-13T09:40:50+00:00" }, { @@ -2410,6 +2692,10 @@ } ], "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/master" + }, "time": "2018-07-08T19:23:20+00:00" }, { @@ -2457,6 +2743,10 @@ } ], "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/master" + }, "time": "2018-07-08T19:19:57+00:00" }, { @@ -2522,6 +2812,10 @@ "selenium", "webdriver" ], + "support": { + "issues": "https://github.com/php-webdriver/php-webdriver/issues", + "source": "https://github.com/php-webdriver/php-webdriver/tree/1.8.2" + }, "time": "2020-03-04T14:40:12+00:00" }, { @@ -2570,6 +2864,10 @@ "sequence", "set" ], + "support": { + "issues": "https://github.com/schmittjoh/php-collection/issues", + "source": "https://github.com/schmittjoh/php-collection/tree/master" + }, "time": "2015-05-17T12:39:23+00:00" }, { @@ -2619,6 +2917,10 @@ "reflection", "static analysis" ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, "time": "2020-06-27T09:03:43+00:00" }, { @@ -2671,6 +2973,10 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master" + }, "time": "2020-09-03T19:13:55+00:00" }, { @@ -2716,6 +3022,10 @@ } ], "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.4.0" + }, "time": "2020-09-17T18:55:26+00:00" }, { @@ -2771,6 +3081,20 @@ "php", "type" ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.7.5" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], "time": "2020-07-20T17:29:33+00:00" }, { @@ -2834,6 +3158,10 @@ "spy", "stub" ], + "support": { + "issues": "https://github.com/phpspec/prophecy/issues", + "source": "https://github.com/phpspec/prophecy/tree/1.12.2" + }, "time": "2020-12-19T10:15:11+00:00" }, { @@ -2898,6 +3226,16 @@ "testing", "xunit" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/8.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-05-23T08:02:54+00:00" }, { @@ -2948,6 +3286,16 @@ "filesystem", "iterator" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-09-28T05:57:25+00:00" }, { @@ -3001,6 +3349,16 @@ "keywords": [ "process" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-09-28T05:58:55+00:00" }, { @@ -3050,6 +3408,16 @@ "keywords": [ "template" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-10-26T05:33:50+00:00" }, { @@ -3099,6 +3467,16 @@ "keywords": [ "timer" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-10-26T13:16:10+00:00" }, { @@ -3148,6 +3526,16 @@ "keywords": [ "tokenizer" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-token-stream/issues", + "source": "https://github.com/sebastianbergmann/php-token-stream/tree/master" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "abandoned": true, "time": "2020-08-04T08:28:15+00:00" }, @@ -3237,6 +3625,20 @@ "testing", "xunit" ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.2.6" + }, + "funding": [ + { + "url": "https://phpunit.de/donate.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-07-13T17:55:55+00:00" }, { @@ -3283,6 +3685,9 @@ "psr", "psr-6" ], + "support": { + "source": "https://github.com/php-fig/cache/tree/master" + }, "time": "2016-08-06T20:24:11+00:00" }, { @@ -3332,6 +3737,10 @@ "container-interop", "psr" ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/master" + }, "time": "2017-02-14T16:28:37+00:00" }, { @@ -3382,7 +3791,10 @@ "request", "response" ], - "time": "2016-08-06T14:39:51+00:00" + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, + "time": "2016-08-06T14:39:51+00:00" }, { "name": "psr/log", @@ -3429,6 +3841,9 @@ "psr", "psr-3" ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.3" + }, "time": "2020-03-23T09:12:05+00:00" }, { @@ -3477,6 +3892,9 @@ "psr-16", "simple-cache" ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/master" + }, "time": "2017-10-23T01:57:42+00:00" }, { @@ -3517,6 +3935,10 @@ } ], "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, "time": "2019-03-08T08:55:37+00:00" }, { @@ -3580,6 +4002,20 @@ "queue", "set" ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/1.1.3" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" + } + ], "time": "2021-01-21T17:40:04+00:00" }, { @@ -3661,6 +4097,17 @@ "identifier", "uuid" ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "rss": "https://github.com/ramsey/uuid/releases.atom", + "source": "https://github.com/ramsey/uuid" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + } + ], "time": "2020-08-18T17:17:46+00:00" }, { @@ -3707,6 +4154,16 @@ ], "description": "Collection of value objects that represent the PHP code units", "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-10-26T13:08:54+00:00" }, { @@ -3752,6 +4209,16 @@ ], "description": "Looks up which function or method a line of code belongs to", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-09-28T05:30:19+00:00" }, { @@ -3816,6 +4283,16 @@ "compare", "equality" ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-10-26T15:49:45+00:00" }, { @@ -3872,6 +4349,16 @@ "unidiff", "unified diff" ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-10-26T13:10:38+00:00" }, { @@ -3925,6 +4412,16 @@ "environment", "hhvm" ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-09-28T05:52:38+00:00" }, { @@ -3992,6 +4489,16 @@ "export", "exporter" ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-09-28T05:24:23+00:00" }, { @@ -4046,6 +4553,10 @@ "keywords": [ "global state" ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/master" + }, "time": "2020-02-07T06:11:37+00:00" }, { @@ -4093,6 +4604,16 @@ ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-10-26T13:12:34+00:00" }, { @@ -4138,6 +4659,16 @@ ], "description": "Allows reflection of object attributes, including inherited and non-public ones", "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-10-26T13:14:26+00:00" }, { @@ -4191,6 +4722,16 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-10-26T13:17:30+00:00" }, { @@ -4236,6 +4777,16 @@ ], "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "issues": "https://github.com/sebastianbergmann/resource-operations/issues", + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-09-28T06:45:17+00:00" }, { @@ -4282,6 +4833,16 @@ ], "description": "Collection of value objects that represent the types of the PHP type system", "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/2.3.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-10-26T13:18:59+00:00" }, { @@ -4325,6 +4886,16 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-09-28T06:39:44+00:00" }, { @@ -4374,6 +4945,20 @@ "parser", "validator" ], + "support": { + "issues": "https://github.com/Seldaek/jsonlint/issues", + "source": "https://github.com/Seldaek/jsonlint/tree/1.8.3" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", + "type": "tidelift" + } + ], "time": "2020-11-11T09:19:24+00:00" }, { @@ -4418,6 +5003,10 @@ "keywords": [ "phar" ], + "support": { + "issues": "https://github.com/Seldaek/phar-utils/issues", + "source": "https://github.com/Seldaek/phar-utils/tree/master" + }, "time": "2020-07-07T18:42:57+00:00" }, { @@ -4490,6 +5079,23 @@ ], "description": "Eases the creation of beautiful and testable command line interfaces", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/console/tree/v4.4.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-01-27T09:09:26+00:00" }, { @@ -4538,6 +5144,9 @@ ], "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v5.2.3" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -4602,6 +5211,23 @@ ], "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/master" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-09-07T11:33:47+00:00" }, { @@ -4668,6 +5294,23 @@ ], "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v4.4.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-01-27T09:09:26+00:00" }, { @@ -4730,6 +5373,23 @@ "interoperability", "standards" ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v1.1.9" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-07-06T13:19:58+00:00" }, { @@ -4775,6 +5435,9 @@ ], "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v5.2.3" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -4833,6 +5496,9 @@ ], "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v5.2.3" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -4903,6 +5569,9 @@ ], "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v5.2.3" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -4982,6 +5651,9 @@ "mime", "mime-type" ], + "support": { + "source": "https://github.com/symfony/mime/tree/v5.2.3" + }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -5058,6 +5730,23 @@ "polyfill", "portable" ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.22.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-01-07T16:49:33+00:00" }, { @@ -5128,6 +5817,23 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.22.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-01-07T16:49:33+00:00" }, { @@ -5195,6 +5901,23 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.22.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-01-07T17:09:11+00:00" }, { @@ -5258,6 +5981,23 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.22.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-01-07T16:49:33+00:00" }, { @@ -5317,6 +6057,23 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.22.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-01-07T16:49:33+00:00" }, { @@ -5379,6 +6136,23 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.22.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-01-07T16:49:33+00:00" }, { @@ -5445,6 +6219,23 @@ "portable", "shim" ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.22.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-01-07T16:49:33+00:00" }, { @@ -5489,6 +6280,23 @@ ], "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v4.4.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-01-27T09:09:26+00:00" }, { @@ -5551,6 +6359,23 @@ "interoperability", "standards" ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/master" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-09-07T11:33:47+00:00" }, { @@ -5605,6 +6430,23 @@ ], "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v4.4.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-01-27T09:09:26+00:00" }, { @@ -5645,6 +6487,16 @@ } ], "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/master" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], "time": "2020-07-12T23:59:07+00:00" }, { @@ -5707,6 +6559,20 @@ "env", "environment" ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v2.6.7" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], "time": "2021-01-20T14:39:13+00:00" }, { @@ -5756,6 +6622,10 @@ "check", "validate" ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.9.1" + }, "time": "2020-07-08T17:02:28+00:00" }, { @@ -5793,6 +6663,10 @@ } ], "description": "Useful collection of php array helpers.", + "support": { + "issues": "https://github.com/weew/helpers-array/issues", + "source": "https://github.com/weew/helpers-array/tree/master" + }, "time": "2016-07-21T11:18:01+00:00" } ], @@ -5864,6 +6738,10 @@ "composer", "git" ], + "support": { + "issues": "https://github.com/BrainMaestro/composer-git-hooks/issues", + "source": "https://github.com/BrainMaestro/composer-git-hooks/tree/v2.8.4" + }, "time": "2021-01-26T14:47:34+00:00" }, { @@ -5910,6 +6788,10 @@ ], "description": "Sends PHP test coverage information to Codacy.", "homepage": "https://github.com/codacy/php-codacy-coverage", + "support": { + "issues": "https://github.com/codacy/php-codacy-coverage/issues", + "source": "https://github.com/codacy/php-codacy-coverage/tree/master" + }, "abandoned": true, "time": "2020-01-10T10:52:12+00:00" }, @@ -5955,6 +6837,10 @@ } ], "description": "Experimental Mocking Framework powered by Aspects", + "support": { + "issues": "https://github.com/Codeception/AspectMock/issues", + "source": "https://github.com/Codeception/AspectMock/tree/master" + }, "time": "2020-02-29T15:39:49+00:00" }, { @@ -6015,6 +6901,16 @@ } ], "description": "Library for accessing git", + "support": { + "issues": "https://github.com/gitonomy/gitlib/issues", + "source": "https://github.com/gitonomy/gitlib/tree/v1.2.3" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/gitonomy/gitlib", + "type": "tidelift" + } + ], "time": "2020-12-29T16:48:45+00:00" }, { @@ -6083,6 +6979,10 @@ "library", "php" ], + "support": { + "issues": "https://github.com/goaop/framework/issues", + "source": "https://github.com/goaop/framework/tree/2.3.4" + }, "time": "2020-04-06T09:46:21+00:00" }, { @@ -6134,6 +7034,10 @@ } ], "description": "Provides reflection information, based on raw source", + "support": { + "issues": "https://github.com/goaop/parser-reflection/issues", + "source": "https://github.com/goaop/parser-reflection/tree/2.x" + }, "time": "2020-08-13T21:02:42+00:00" }, { @@ -6226,6 +7130,10 @@ "rest", "web service" ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/master" + }, "abandoned": "guzzlehttp/guzzle", "time": "2014-01-28T22:29:15+00:00" }, @@ -6282,6 +7190,10 @@ "parser", "parsing" ], + "support": { + "issues": "https://github.com/jakubledl/dissect/issues", + "source": "https://github.com/jakubledl/dissect/tree/v1.0.1" + }, "time": "2013-01-29T21:29:14+00:00" }, { @@ -6334,6 +7246,10 @@ "parser", "php" ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.6.0" + }, "time": "2020-07-02T17:12:47+00:00" }, { @@ -6381,6 +7297,16 @@ "BSD-3-Clause" ], "description": "Official version of pdepend to be handled with Composer", + "support": { + "issues": "https://github.com/pdepend/pdepend/issues", + "source": "https://github.com/pdepend/pdepend/tree/master" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/pdepend/pdepend", + "type": "tidelift" + } + ], "time": "2020-06-20T10:53:13+00:00" }, { @@ -6442,6 +7368,10 @@ "github", "test" ], + "support": { + "issues": "https://github.com/php-coveralls/php-coveralls/issues", + "source": "https://github.com/php-coveralls/php-coveralls/tree/1.1" + }, "time": "2017-12-06T23:17:56+00:00" }, { @@ -6514,6 +7444,17 @@ "phpmd", "pmd" ], + "support": { + "irc": "irc://irc.freenode.org/phpmd", + "issues": "https://github.com/phpmd/phpmd/issues", + "source": "https://github.com/phpmd/phpmd/tree/2.9.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/phpmd/phpmd", + "type": "tidelift" + } + ], "time": "2020-09-23T22:06:32+00:00" }, { @@ -6556,6 +7497,10 @@ "testing", "unittest" ], + "support": { + "issues": "https://github.com/richardregeer/phpunit-coverage-check/issues", + "source": "https://github.com/richardregeer/phpunit-coverage-check/tree/master" + }, "time": "2018-07-29T13:27:58+00:00" }, { @@ -6602,6 +7547,16 @@ ], "description": "Library for parsing CLI options", "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-09-28T06:08:49+00:00" }, { @@ -6653,6 +7608,16 @@ ], "description": "Copy/Paste Detector (CPD) for PHP code.", "homepage": "https://github.com/sebastianbergmann/phpcpd", + "support": { + "issues": "https://github.com/sebastianbergmann/phpcpd/issues", + "source": "https://github.com/sebastianbergmann/phpcpd/tree/6.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "time": "2020-12-07T05:39:23+00:00" }, { @@ -6704,6 +7669,11 @@ "phpcs", "standards" ], + "support": { + "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", + "source": "https://github.com/squizlabs/PHP_CodeSniffer", + "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" + }, "time": "2020-10-23T02:01:07+00:00" }, { @@ -6763,6 +7733,23 @@ ], "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/config/tree/v4.4.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-01-27T09:09:26+00:00" }, { @@ -6831,6 +7818,23 @@ ], "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dependency-injection/tree/v4.4.19" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2021-01-27T09:09:26+00:00" }, { @@ -6875,6 +7879,23 @@ ], "description": "Symfony Stopwatch Component", "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v3.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], "time": "2020-10-24T10:57:07+00:00" } ], From 5049d7568761eb9d4cdb32d4a23720122743391c Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Mon, 8 Nov 2021 17:25:35 -0600 Subject: [PATCH 23/31] MQE-2677: Add filter for groups --- .../Filter/Test/ExcludeGroup.php | 58 +++++++++++++++++++ .../Filter/Test/IncludeGroup.php | 58 +++++++++++++++++++ 2 files changed, 116 insertions(+) create mode 100644 src/Magento/FunctionalTestingFramework/Filter/Test/ExcludeGroup.php create mode 100644 src/Magento/FunctionalTestingFramework/Filter/Test/IncludeGroup.php diff --git a/src/Magento/FunctionalTestingFramework/Filter/Test/ExcludeGroup.php b/src/Magento/FunctionalTestingFramework/Filter/Test/ExcludeGroup.php new file mode 100644 index 000000000..38a3bf8f2 --- /dev/null +++ b/src/Magento/FunctionalTestingFramework/Filter/Test/ExcludeGroup.php @@ -0,0 +1,58 @@ +filterValues = $filterValues; + } + + /** + * Filter tests by group. + * + * @param TestObject[] $tests + * @return void + */ + public function filter(array &$tests) + { + if ($this->filterValues === []) { + return; + } + /** @var TestObject $test */ + foreach ($tests as $testName => $test) { + $groups = $test->getAnnotationByName(self::ANNOTATION_TAG); + $testExcludeGroup = !empty(array_intersect($groups, $this->filterValues)); + if ($testExcludeGroup) { + unset($tests[$testName]); + } + } + } +} diff --git a/src/Magento/FunctionalTestingFramework/Filter/Test/IncludeGroup.php b/src/Magento/FunctionalTestingFramework/Filter/Test/IncludeGroup.php new file mode 100644 index 000000000..b84a48e55 --- /dev/null +++ b/src/Magento/FunctionalTestingFramework/Filter/Test/IncludeGroup.php @@ -0,0 +1,58 @@ +filterValues = $filterValues; + } + + /** + * Filter tests by group. + * + * @param TestObject[] $tests + * @return void + */ + public function filter(array &$tests) + { + if ($this->filterValues === []) { + return; + } + /** @var TestObject $test */ + foreach ($tests as $testName => $test) { + $groups = $test->getAnnotationByName(self::ANNOTATION_TAG); + $testIncludeGroup = empty(array_intersect($groups, $this->filterValues)); + if ($testIncludeGroup) { + unset($tests[$testName]); + } + } + } +} From d773983ce43f2089d007c18c7f43bd07c7e2b4f6 Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Tue, 9 Nov 2021 10:02:55 -0600 Subject: [PATCH 24/31] MQE-2677: Add filter for groups --- .../Util/TestGeneratorTest.php | 102 +++++++++++++++++- docs/commands/mftf.md | 2 +- 2 files changed, 102 insertions(+), 2 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php index 9eefbd94a..17f5670d0 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php @@ -116,7 +116,7 @@ public function testAllowSkipped() * * @throws \Magento\FunctionalTestingFramework\Exceptions\TestReferenceException */ - public function testFilter() + public function testSeverityFilter() { // Mock filters for TestGenerator AspectMock::double( @@ -160,4 +160,104 @@ public function testFilter() $this->assertArrayHasKey('test1Cest', $generatedTests); $this->assertArrayNotHasKey('test2Cest', $generatedTests); } + + /** + * Tests that TestGenerator createAllTestFiles correctly filters based on group included. + * + * @throws \Magento\FunctionalTestingFramework\Exceptions\TestReferenceException + */ + public function testIncludeGroupFilter() + { + // Mock filters for TestGenerator + AspectMock::double( + MftfApplicationConfig::class, + ['getFilterList' => new FilterList(['includeGroup' => ["someGroupValue"]])] + ); + + $actionInput = 'fakeInput'; + $actionObject = new ActionObject('fakeAction', 'comment', [ + 'userInput' => $actionInput + ]); + + $annotation1 = ['group' => ['someGroupValue']]; + $annotation2 = ['group' => ['someOtherGroupValue']]; + $test1 = new TestObject( + "test1", + ["fakeAction" => $actionObject], + $annotation1, + [], + "filename" + ); + $test2 = new TestObject( + "test2", + ["fakeAction" => $actionObject], + $annotation2, + [], + "filename" + ); + AspectMock::double(TestGenerator::class, ['loadAllTestObjects' => ["sampleTest" => $test1, "test2" => $test2]]); + + // Mock createCestFile to return name of tests that testGenerator tried to create + $generatedTests = []; + AspectMock::double(TestGenerator::class, ['createCestFile' => function ($arg1, $arg2) use (&$generatedTests) { + $generatedTests[$arg2] = true; + }]); + + $testGeneratorObject = TestGenerator::getInstance("", ["sampleTest" => $test1, "test2" => $test2]); + $testGeneratorObject->createAllTestFiles(null, []); + + // Ensure Test1 was Generated but not Test 2 + $this->assertArrayHasKey('test1Cest', $generatedTests); + $this->assertArrayNotHasKey('test2Cest', $generatedTests); + } + + /** + * Tests that TestGenerator createAllTestFiles correctly filters based on group not included. + * + * @throws \Magento\FunctionalTestingFramework\Exceptions\TestReferenceException + */ + public function testExcludeGroupFilter() + { + // Mock filters for TestGenerator + AspectMock::double( + MftfApplicationConfig::class, + ['getFilterList' => new FilterList(['excludeGroup' => ['someGroupValue']])] + ); + + $actionInput = 'fakeInput'; + $actionObject = new ActionObject('fakeAction', 'comment', [ + 'userInput' => $actionInput + ]); + + $annotation1 = ['group' => ['someGroupValue']]; + $annotation2 = ['group' => ['someOtherGroupValue']]; + $test1 = new TestObject( + "test1", + ["fakeAction" => $actionObject], + $annotation1, + [], + "filename" + ); + $test2 = new TestObject( + "test2", + ["fakeAction" => $actionObject], + $annotation2, + [], + "filename" + ); + AspectMock::double(TestGenerator::class, ['loadAllTestObjects' => ["sampleTest" => $test1, "test2" => $test2]]); + + // Mock createCestFile to return name of tests that testGenerator tried to create + $generatedTests = []; + AspectMock::double(TestGenerator::class, ['createCestFile' => function ($arg1, $arg2) use (&$generatedTests) { + $generatedTests[$arg2] = true; + }]); + + $testGeneratorObject = TestGenerator::getInstance("", ["sampleTest" => $test1, "test2" => $test2]); + $testGeneratorObject->createAllTestFiles(null, []); + + // Ensure Test2 was Generated but not Test 1 + $this->assertArrayNotHasKey('test1Cest', $generatedTests); + $this->assertArrayHasKey('test2Cest', $generatedTests); + } } diff --git a/docs/commands/mftf.md b/docs/commands/mftf.md index 00924671f..5bef359cd 100644 --- a/docs/commands/mftf.md +++ b/docs/commands/mftf.md @@ -159,7 +159,7 @@ vendor/bin/mftf generate:tests [option] [] [] [--remove] | Option | Description| | ---| --- | | `--config=[ or or ]` | Creates a single manifest file with a list of all tests. The default location is `tests/functional/Magento/FunctionalTest/_generated/testManifest.txt`.
You can split the list into multiple groups using `--config=parallel`; the groups will be generated in `_generated/groups/` like `_generated/groups/group1.txt, group2.txt, ...`.
Available values: `default` (default), `singleRun`(same as `default`), and `parallel`.
Example: `generate:tests --config=parallel`. | -| `--filter` | Option to filter tests to be generated.
Template: '<filterName>:<filterValue>'.
Existing filter types: severity.
Existing severity values: BLOCKER, CRITICAL, MAJOR, AVERAGE, MINOR.
Example: --filter=severity:CRITICAL| +| `--filter` | Option to filter tests to be generated.
Template: '<filterName>:<filterValue>'.
Existing filter types: severity, includeGroup, excludeGroup.
Existing severity values: BLOCKER, CRITICAL, MAJOR, AVERAGE, MINOR.
Example: `--filter=severity:CRITICAL`, `--filter=includeGroup:customer`| | `--force` | Forces test generation, regardless of the module merge order defined in the Magento instance. Example: `generate:tests --force`. | | `-i,--time` | Set time in minutes to determine the group size when `--config=parallel` is used. The __default value__ is `10`. Example: `generate:tests --config=parallel --time=15`| | `--tests` | Defines the test configuration as a JSON string.| From f4813511919b17b1aa74cf7ca35054765dc7bb0b Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Sat, 13 Nov 2021 14:52:08 -0600 Subject: [PATCH 25/31] MQE-2677: Add filter for groups - update docs as discussed in code review --- docs/commands/mftf.md | 2 +- .../Console/GenerateTestsCommand.php | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/commands/mftf.md b/docs/commands/mftf.md index 5bef359cd..7d3e8bbbb 100644 --- a/docs/commands/mftf.md +++ b/docs/commands/mftf.md @@ -159,7 +159,7 @@ vendor/bin/mftf generate:tests [option] [] [] [--remove] | Option | Description| | ---| --- | | `--config=[ or or ]` | Creates a single manifest file with a list of all tests. The default location is `tests/functional/Magento/FunctionalTest/_generated/testManifest.txt`.
You can split the list into multiple groups using `--config=parallel`; the groups will be generated in `_generated/groups/` like `_generated/groups/group1.txt, group2.txt, ...`.
Available values: `default` (default), `singleRun`(same as `default`), and `parallel`.
Example: `generate:tests --config=parallel`. | -| `--filter` | Option to filter tests to be generated.
Template: '<filterName>:<filterValue>'.
Existing filter types: severity, includeGroup, excludeGroup.
Existing severity values: BLOCKER, CRITICAL, MAJOR, AVERAGE, MINOR.
Example: `--filter=severity:CRITICAL`, `--filter=includeGroup:customer`| +| `--filter` | Option to filter tests to be generated.
Template: '<filterName>:<filterValue>'.
Existing filter types: severity, includeGroup, excludeGroup.
Existing severity values: BLOCKER, CRITICAL, MAJOR, AVERAGE, MINOR.
Example: `vendor/bin/mftf generate:tests --filter=severity:CRITICAL --filter=severity:BLOCKER --filter=includeGroup:customer`| | `--force` | Forces test generation, regardless of the module merge order defined in the Magento instance. Example: `generate:tests --force`. | | `-i,--time` | Set time in minutes to determine the group size when `--config=parallel` is used. The __default value__ is `10`. Example: `generate:tests --config=parallel --time=15`| | `--tests` | Defines the test configuration as a JSON string.| diff --git a/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php b/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php index 3ca53f8f6..445f58c66 100644 --- a/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/GenerateTestsCommand.php @@ -59,7 +59,8 @@ protected function configure() . 'Template: :' . PHP_EOL . 'Existing filter types: severity.' . PHP_EOL . 'Existing severity values: BLOCKER, CRITICAL, MAJOR, AVERAGE, MINOR.' . PHP_EOL - . 'Example: --filter=severity:CRITICAL' . PHP_EOL + . 'Example: --filter=severity:CRITICAL' + . ' --filter=includeGroup:customer --filter=excludeGroup:customerAnalytics' . PHP_EOL ); parent::configure(); From 3182ca4515514cf8c1f16092034b69c5a5da46fd Mon Sep 17 00:00:00 2001 From: Dmytro Shevtsov Date: Fri, 7 Jan 2022 16:39:37 -0600 Subject: [PATCH 26/31] Delete unused images --- docs/img/issue.png | Bin 13879 -> 0 bytes docs/img/pull-request.png | Bin 7649 -> 0 bytes docs/img/switching-the-base.png | Bin 7064 -> 0 bytes docs/img/trouble-chrome232.png | Bin 25375 -> 0 bytes 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/img/issue.png delete mode 100644 docs/img/pull-request.png delete mode 100644 docs/img/switching-the-base.png delete mode 100644 docs/img/trouble-chrome232.png diff --git a/docs/img/issue.png b/docs/img/issue.png deleted file mode 100644 index 1dcf78ce23b222e7ccf4ea7003f87314383f6cbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13879 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 diff --git a/docs/img/pull-request.png b/docs/img/pull-request.png deleted file mode 100644 index c492350d8d280bd0830e9480fbcb00127c0ba4ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7649 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 aj+CNV$eFO_%|sjo0<_ij)v6xYMgAAWTMpm= diff --git a/docs/img/switching-the-base.png b/docs/img/switching-the-base.png deleted file mode 100644 index 412ab1624a72af887f3a793b21c14c39a2fd35e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7064 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 diff --git a/docs/img/trouble-chrome232.png b/docs/img/trouble-chrome232.png deleted file mode 100644 index 1dc44f6a4d41c522bac726b972c639db13cc0f0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25375 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

*BLPmhnr)(xQw83tZU4LSV& zlT&$mv0$Va$Djf2!8nJ@hVb)&3=3u4A;_OGHX zvgC-#&9VBNJeF%uMk@ry2)VW9ysA4F^HU@hqX8@A;)^0$o zao3T@&}0fib3}F-PDZXp)P|Ao?WGscFg7aQi=nlZlwTJ}jtNI4(&R@E_4qFA0vr4H zj`0!ql64boK7YTWv-P5(nTmeSK~$h!18{>}7yTG)XL8a(-$?3d!3*t zD~MAqFvE4c^+;Lyj~Y%?#i|MIY@be}G2uNbQf4z0Et9|FOcd$|Zgza>drYA)W7T+F zqpxUYSVW_3pbbZ{19?!8Qyr!|*d-IgjW%J*lJP}dT0Q@>#{+EgfoDZT6fIX^RdGkLNj?u zrP}soA9JE%4=%k3S1DaHYfpn|Dd)AiSmVSl$fqR*FzQS=Cz%w(G+zd?d4I$bsTz=J zQR1)6q&a_EYT4?JY~zDn@}bVPDx2f&y^-{#?{Ge=6@ zxxh2y#;)5ZwmCLssm44-uOX4GtbF6|qzssphpt+Yxqp{^zk~7#I7vT?x!g7L3Hjb( zdK;3*yb62B@AZ0WTX029JPS-qz@0;@tUNe8KpO%nwflkABN()CZs~w6tOzE5P7kTk z)YC(2RKW|WoEdX@uhe@!QE9Wkc+2+y;C$JH8BVUDbor+tnmr7hen`?wWrJ4Zat>!k zYx84nw@#`xgi|b!xoN_leY$T#*oX4dE$^gqs)$g$d8rYD`UY8={jSBZYt;#O&6L)O zFq7u+htr3aU~OR^a_e<4!^~E%@D{-Ymt7IN3f2`zW|m;=D_bQ4rX4_DKIr&2Oj^P+ zBobU>pMQT+(+^r4(aR!rA|~H!+mJ^fV|=Lb9{Lbdaed57z%iR7!_7k=-w$L4VCz)k zX}QT=W%4T@akFAlqM+A;?E(8HS1zlT_O<*A#|C?_C+h+0Efb(Kx&A2^aDkUj|5p*I z4r#^;F+v|Xfcvget_8Zhxz(R~y^RB-c8_aY>Niwn@q|>nO51eHfAiWwvVT73;5)wY zo&O~p;Y1mkz5r=XV674{?@jyW@S5l${D6`sZU{T?iN=IA328g*Nkukqye&}&(eH@A zx;%j3TF=dCR-lhwl|D#obUg4#v#j!N=vx9#oFa4MkI2(-Ddg_g{<6>>`<0cqb+HbI zykTXK0d@9&OT0PJbsad_^gx!@Vs{MB58v{Wk%{V!5&FDB?)(A+3W2L#T+IJ-)SuCS zv|+5{1E_{5>ij3=fz{Siww4>ee!mQsgi(Qcvzk73K*H;Y#XkfSB>rhNoUInintD?rg>tD_hS;X8805%WyIZ@d}=BMX= z$LGi=JD@t3`B-slR9jNfelZufxF^kKk9!nzEBhxv`2WdO!LqSRDbqzuh;!Dtz12N? z>U)wET~O#3zAzrVlIngdSQw6OG|X5O3DtAmXz@ZYcp?ht&tak+M1R3H!DKuWAb0fG7QoJ+G)I$;LO!4guy|T9a0)d z{i%U~xEkfY)lbB4O*7P4f)l9EUjSFd2QcID5g>LRAOd<~yjDg~`NLICS*Q&)KcW6X2r7 zXk)eBaoZu8dgqJUEd(EBlnF%cfE;0CxKIWHm>EL9Nz_d)yslf^#aSYTAEiKhZLYHg zVbGNBl37NGdt-%(*=&W$?AH5^qL!ygKvj~1wQ(c_&r?t`QusbsUmNeaK((1sJCvl_ zJ{y!S5d|mP9amRxTqCib(aIL2*-Gi@V=FZ5q7yr5Fzp4%^(!T4!*!aTQ z?NMo})1}wZnogM_nF6mtXGmMG{8z@fqHZ96@RR-M0IMqcd~cO{DZ?!;SF-ZrhooD@ z3sF1QYCoeQrFH8O2BG1)Tq006K_KKEB7xlxG3OdwAR~3XQEqcd$emP+(f=z9^DVcT z+qc3jk7EcJV^w%uIUsh=L-aEN8{1#o*fd>?8i85Fo4~t0xmLZx=^V#G;6N}0VS>6nMM zuQ(>7vwqoii@EOPsQ=dqFof+b8TO*3`oWHQw`e~+(%|!}IeUs^F(qKQv`pj1^YBSi z_z^GqXIiMk$-{~nny1GYB0j96s+A4nWYKZHcOq6l30?BAK7F18@vIq93A8kvpvYr@NP%hlf>TGSLQd%vrGeXr)!3_+`qFi!X)vvXIw; zrDLfRh{A{T^Z8WiOdY)ptwz9WuP6OS)8zJ^R9sgTYyD*_RLlJ4S$PS;qBc!W)yXL= z!Cz%?j`5SCtSJwiEfm?E)Qf$l$0usz6jwMc+_}ZwXvRNE)HxqFK$gqr$YPnNY4`98 zI-~>+dbwW`>nhTPd!sF$8NBH0co~J2-EOMg`c+g zNzlMU;sIBvrOpT{ix@#z=>^|62aA}mmA_=uWpU;_?y_l)LDNJt->)LUl`!arFZHfd z=!Jz#OCWO_k@@7IV=bXz)yy;bVw4aN!2MD5u)XDj_h_OpvhHP!(h1EQF z#O>pBNRWy>flx`9OP1GZ9R)4m=-xk$zW+L}ab<~`&{HdC!^$eniKt-QgD5?$54ri> z$=p4beT>85ThrYb=5gA+h<_d3GjgbwHJ~$=4Jft}kG_>@EX_Qg{IZ(yJaasSSmmp5 zI|{k77boCZL{G{8sGyTTQn{xCSs)ejDf%(v8|HCiQqp1Ow~6b^*7c%tH#$>6qru!f z!Cz^5kH44IERtn1asKlD;DPr0wR7DtW|cGaJCtW&BgX%GlGv;P0RAC|O1 zQUd&p_C|o-eU4C}9s~I#!qe+lRW!Cw?LXEhl@4pPp~=2%vsixHf%GF{c=(|#B)Pn# zR!vVcv2%{nruY5V4+651fhG!2pK2k>%qAx1O*(z1Qc-u|jGuzA4ub>VREG6Eu@Sb9 zkjG2KF;1y(7hEpN1R`#9Zh!89j)(!cJA+n))x98~v;@BgoEMQ4_3oP`Qvh6XWR?vP zChY8yhG*uC*cNpd>^)1_-qd{fBW4;0#Qp`*f(lQ78Rq;F3F>3aOubHMr9VkIeTXA# zMCQ}=g*L+Bng=fA9a8ark$%<9-=(W=&nr*TKHURVvmLU2|4<&y56$;cOrP_bMMS`o z+d%Y)uh%e43M|~dybPM@YOwZ!VTrPqru!oY%ZUhr)By4^LVleEPP)F#>F3y$Q4~Jcvy(KV6Q*4^KC23@4Mp`Tn5~QBJ^d{y zNx56FThGC6>Zh1=Gfn&CQIp=L2p=AHh0-(KM_zu>dBoZZq!t*K@SPlsve{@&JH(O~gW17WLXwJLk2 z+aA^Qg~mG@`L(e%cZiq7cEltx{d)@g>>$IKsm*3}GUE}As&g~2NW}ErL26Feu zA|=r0W+lc)jp}*W6C^kcJu{*KRgZko?N*WNTZX4r zG(%g@^akn$j-+CQu8tOv4pd&-9BOG|cjwupbY>-bLN>P-x zg+1xMrcAlsQ=BB1Rzy2U3v~(c3Dwn@QKr+KC84nW9IH;zORO+vj7-~gHrVuJpAyMxk4%^}Lm6JLt8&GM?3FkC<>{U_1>ad?{wX#XYh*}3)n2RDI{axd&H}mK=hLU(Z5M1SlT}XuG}&#VV^NGw(~&iY94r#TL~cjhMl_HrR}0ZNj332 z4Lkpfdy_k=ZUkoqFRW-|)Q(*5INia2LDRM}+%OH-7XD9wA4aJ>hV4!|HW;0)nSK9& z+SMuKQOYl+bNL#qE%s5m2~iO;Kdn!;AMuewX2q-tE95K^iz1a(b!4Y0YMRFGCbX&iS)!KmW!_)Wz2OJa*^RVSo2eGxUtt@Ii27 z9BZ08DUr3+!+@nMy!V!J4{!ISS&bO9%--u>a_fD`sclaRm@7LHDo5M^Y>CRn+ zrC`=c)+pwule|n$bP%ZRPE`9PzS{jJ~6So*7r=vGwtZD4-Bd`INb2Rel84sIKCf zl5U7&5nNtWHx9=yAf%dR*A+}er&LPbP1!dYqeNEIzVAM&c235WZMFjCM1S2fCvrnU z7B32@C-x%>7Nu?;cv;vnda@)Lf65_uppUW~XZLVEo5nX`x*z?}mg^3d)LLm!K2B^@ zBG8tuuJPgdWnA^?!uI5$=xWkCd zLI~-%R70*M0JA#$?|=D!ve@VlxJ;IY^(tm%H-vt!GU*fJAyx0J>B*W54i{Bs@XG}u z80beN0V(6e&bF{r+w(mQhA%>t(4Iyy6>}Ghz5${4H>Jbg(R#xp5VffO zl)p>d*=!M$ohi*ek#aqGt8af-8m7k8x1orOCu_TfSbzzxUCKo9;d(7x}j zRtog&Ump#)?!dpk8u|M6;~RfIJpA+g-z$-a|2+TuqsI1s-=rSE16Y8&lS?`OZ&(*% pRr;{>KSNV4@Qucm6<~aJgME`{g}^z7`TF>RlAOA13D`X7{{hD;`e6V7 From db4218a04ffb68397185fe45a1bf4f12ac53aa7e Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Thu, 10 Feb 2022 16:09:41 -0600 Subject: [PATCH 27/31] Release MFTF 2.7.3 --- CHANGELOG.md | 6 +++++ composer.json | 2 +- composer.lock | 75 ++++++++++++++++++++++++++------------------------- 3 files changed, 45 insertions(+), 38 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a7bfbf4c..c1a55f029 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ Magento Functional Testing Framework Changelog ================================================ +2.7.3 +--------- + +### Enhancements + +* Add filter for groups, now we can generate tests with specific group annotation 2.7.2 --------- diff --git a/composer.json b/composer.json index 20b25044c..b218fe46b 100755 --- a/composer.json +++ b/composer.json @@ -2,7 +2,7 @@ "name": "magento/magento2-functional-testing-framework", "description": "Magento2 Functional Testing Framework", "type": "library", - "version": "2.7.2", + "version": "2.7.3", "license": "AGPL-3.0", "keywords": ["magento", "automation", "functional", "testing"], "config": { diff --git a/composer.lock b/composer.lock index 968efbb27..971e62297 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "371c700b804b68afc0fb87ae9c0b7c8f", + "content-hash": "1231abaa16981d649aa8f9ffed3d77fe", "packages": [ { "name": "allure-framework/allure-codeception", @@ -174,12 +174,12 @@ } }, "autoload": { - "psr-4": { - "Aws\\": "src/" - }, "files": [ "src/functions.php" - ] + ], + "psr-4": { + "Aws\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1938,12 +1938,12 @@ } }, "autoload": { - "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" - }, "files": [ "src/functions_include.php" - ] + ], + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2598,9 +2598,6 @@ "require": { "php": "^7.1 || ^8.0" }, - "replace": { - "myclabs/deep-copy": "self.version" - }, "require-dev": { "doctrine/collections": "^1.0", "doctrine/common": "^2.6", @@ -2608,12 +2605,12 @@ }, "type": "library", "autoload": { - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - }, "files": [ "src/DeepCopy/deep_copy.php" - ] + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3600,11 +3597,11 @@ } }, "autoload": { - "classmap": [ - "src/" - ], "files": [ "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -4106,6 +4103,10 @@ { "url": "https://github.com/ramsey", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" } ], "time": "2020-08-18T17:17:46+00:00" @@ -5782,12 +5783,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Idn\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5867,12 +5868,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, "files": [ "bootstrap.php" ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, "classmap": [ "Resources/stubs" ] @@ -6028,12 +6029,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -6104,12 +6105,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, "files": [ "bootstrap.php" ], + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, "classmap": [ "Resources/stubs" ] @@ -6183,12 +6184,12 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, "files": [ "bootstrap.php" ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, "classmap": [ "Resources/stubs" ] @@ -7912,5 +7913,5 @@ "ext-openssl": "*" }, "platform-dev": [], - "plugin-api-version": "2.1.0" + "plugin-api-version": "2.2.0" } From 387cef3fe477e136ec200e22ebaf1b36268468f9 Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Fri, 11 Feb 2022 12:40:13 -0600 Subject: [PATCH 28/31] MQE-3251: Release MFTF 2.7.3 to allow filters functionality for Magento 2.3.x --- .../Console/StaticChecksCommand.php | 114 +++++-- .../StaticCheck/PrExcludeGroupStaticCheck.php | 199 ++++++++++++ .../StaticCheck/StaticChecksList.php | 25 ++ .../Util/Script/ScriptUtil.php | 296 ++++++++++++++++++ 4 files changed, 609 insertions(+), 25 deletions(-) create mode 100644 src/Magento/FunctionalTestingFramework/StaticCheck/PrExcludeGroupStaticCheck.php create mode 100644 src/Magento/FunctionalTestingFramework/Util/Script/ScriptUtil.php diff --git a/src/Magento/FunctionalTestingFramework/Console/StaticChecksCommand.php b/src/Magento/FunctionalTestingFramework/Console/StaticChecksCommand.php index 30c9cd600..309aafd1b 100644 --- a/src/Magento/FunctionalTestingFramework/Console/StaticChecksCommand.php +++ b/src/Magento/FunctionalTestingFramework/Console/StaticChecksCommand.php @@ -15,11 +15,20 @@ use Symfony\Component\Console\Exception\InvalidArgumentException; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Exception; +use Symfony\Component\Console\Style\SymfonyStyle; class StaticChecksCommand extends Command { + /** + * Associative array containing static ruleset properties. + * + * @var array + */ + private $ruleSet; + /** * Pool of all existing static check objects * @@ -34,6 +43,13 @@ class StaticChecksCommand extends Command */ private $staticCheckObjects; + /** + * Console output style + * + * @var SymfonyStyle + */ + protected $ioStyle; + /** * Configures the current command. * @@ -44,14 +60,20 @@ protected function configure() $list = new StaticChecksList(); $this->allStaticCheckObjects = $list->getStaticChecks(); $staticCheckNames = implode(', ', array_keys($this->allStaticCheckObjects)); - $description = "This command will run all static checks on xml test materials. " - . "Available static check scripts are:\n{$staticCheckNames}"; + $description = 'This command will run all static checks on xml test materials. ' + . 'Available static check scripts are:' . PHP_EOL . $staticCheckNames; $this->setName('static-checks') ->setDescription($description) ->addArgument( 'names', InputArgument::OPTIONAL | InputArgument::IS_ARRAY, 'name(s) of specific static check script(s) to run' + )->addOption( + 'path', + 'p', + InputOption::VALUE_OPTIONAL, + 'Path to a MFTF test module to run "deprecatedEntityUsage" static check script. ' . PHP_EOL + . 'Option is ignored by other static check scripts.' . PHP_EOL ); } @@ -65,32 +87,41 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output) { + $this->ioStyle = new SymfonyStyle($input, $output); try { - $this->validateInputArguments($input, $output); + $this->validateInput($input); } catch (InvalidArgumentException $e) { LoggingUtil::getInstance()->getLogger(StaticChecksCommand::class)->error($e->getMessage()); - $output->writeln($e->getMessage() . " Please fix input arguments and rerun."); + $this->ioStyle->error($e->getMessage() . ' Please fix input argument(s) or option(s) and rerun.'); return 1; } + $cmdFailed = false; $errors = []; foreach ($this->staticCheckObjects as $name => $staticCheck) { LoggingUtil::getInstance()->getLogger(get_class($staticCheck))->info( - "\nRunning static check script for: " . $name - ); - $output->writeln( - "\nRunning static check script for: " . $name + 'Running static check script for: ' . $name . PHP_EOL ); - $staticCheck->execute($input); + $this->ioStyle->text(PHP_EOL . 'Running static check script for: ' . $name . PHP_EOL); + $start = microtime(true); + try { + $staticCheck->execute($input); + } catch (Exception $e) { + $cmdFailed = true; + LoggingUtil::getInstance()->getLogger(get_class($staticCheck))->error($e->getMessage() . PHP_EOL); + $this->ioStyle->error($e->getMessage()); + } + $end = microtime(true); + $errors += $staticCheck->getErrors(); $staticOutput = $staticCheck->getOutput(); LoggingUtil::getInstance()->getLogger(get_class($staticCheck))->info($staticOutput); - $output->writeln($staticOutput); - $errors += $staticCheck->getErrors(); - } + $this->ioStyle->text($staticOutput); - if (empty($errors)) { + $this->ioStyle->text('Total execution time is ' . (string)($end - $start) . ' seconds.' . PHP_EOL); + } + if (!$cmdFailed && empty($errors)) { return 0; } else { return 1; @@ -104,30 +135,63 @@ protected function execute(InputInterface $input, OutputInterface $output) * @return void * @throws InvalidArgumentException */ - private function validateInputArguments(InputInterface $input) + private function validateInput(InputInterface $input) { $this->staticCheckObjects = []; $requiredChecksNames = $input->getArgument('names'); - $invalidCheckNames = []; - // Found user required static check script(s) to run, - // If no static check name is supplied, run all static check scripts + // Build list of static check names to run. + if (empty($requiredChecksNames)) { + $this->parseRulesetJson(); + $requiredChecksNames = $this->ruleSet['tests'] ?? null; + } if (empty($requiredChecksNames)) { $this->staticCheckObjects = $this->allStaticCheckObjects; } else { - for ($index = 0; $index < count($requiredChecksNames); $index++) { - if (in_array($requiredChecksNames[$index], array_keys($this->allStaticCheckObjects))) { - $this->staticCheckObjects[$requiredChecksNames[$index]] = - $this->allStaticCheckObjects[$requiredChecksNames[$index]]; - } else { - $invalidCheckNames[] = $requiredChecksNames[$index]; - } + $this->validateTestNames($requiredChecksNames); + } + } + + /** + * Validates that all passed in static-check names match an existing static check + * @param string[] $requiredChecksNames + * @return void + */ + private function validateTestNames($requiredChecksNames) + { + $invalidCheckNames = []; + for ($index = 0; $index < count($requiredChecksNames); $index++) { + if (in_array($requiredChecksNames[$index], array_keys($this->allStaticCheckObjects))) { + $this->staticCheckObjects[$requiredChecksNames[$index]] = + $this->allStaticCheckObjects[$requiredChecksNames[$index]]; + } else { + $invalidCheckNames[] = $requiredChecksNames[$index]; } } if (!empty($invalidCheckNames)) { throw new InvalidArgumentException( - "Invalid static check script(s): " . implode(', ', $invalidCheckNames) . "." + 'Invalid static check script(s): ' . implode(', ', $invalidCheckNames) . '.' ); } } + + /** + * Parses and sets local ruleSet. If not found, simply returns and lets script continue. + * @return void; + */ + private function parseRulesetJson() + { + $pathAddition = "/dev/tests/acceptance/"; + // MFTF is both NOT attached and no MAGENTO_BP defined in .env + if (MAGENTO_BP === FW_BP) { + $pathAddition = "/dev/"; + } + $pathToRuleset = MAGENTO_BP . $pathAddition . "staticRuleset.json"; + if (!file_exists($pathToRuleset)) { + $this->ioStyle->text("No ruleset under $pathToRuleset" . PHP_EOL); + return; + } + $this->ioStyle->text("Using ruleset under $pathToRuleset" . PHP_EOL); + $this->ruleSet = json_decode(file_get_contents($pathToRuleset), true); + } } diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/PrExcludeGroupStaticCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/PrExcludeGroupStaticCheck.php new file mode 100644 index 000000000..038f126bc --- /dev/null +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/PrExcludeGroupStaticCheck.php @@ -0,0 +1,199 @@ +scriptUtil = new ScriptUtil(); + $modulePaths = []; + $path = $input->getOption('path'); + if ($path) { + if (!realpath($path)) { + throw new \InvalidArgumentException('Invalid --path option: ' . $path); + } + $modulePaths[] = realpath($path); + } else { + $modulePaths = $this->scriptUtil->getAllModulePaths(); + } + + $this->testXmlFiles = $this->scriptUtil->getModuleXmlFilesByScope($modulePaths, 'Test'); + $this->errors = []; + $this->errors += $this->validatePrExcludeGroupUsageInTests($this->testXmlFiles); + + $this->output = $this->scriptUtil->printErrorsToFile( + $this->errors, + StaticChecksList::getErrorFilesPath() . DIRECTORY_SEPARATOR . self::ERROR_LOG_FILENAME . '.txt', + self::ERROR_LOG_MESSAGE + ); + } + + /** + * Finds usages of pr_exclude group in test files + * @param array $testXmlFiles + * @return array + */ + private function validatePrExcludeGroupUsageInTests($testXmlFiles) + { + $testErrors = []; + foreach ($testXmlFiles as $filePath) { + $domDocument = new \DOMDocument(); + $domDocument->load($filePath); + $test = $domDocument->getElementsByTagName('test')->item(0); + if ($this->isViolatingPrExcludeTests($test)) { + $testErrors = array_merge($testErrors, $this->setErrorOutput($filePath)); + } + } + return $testErrors; + } + + /** + * Finds violating pr_exclude group + * @param \DomNode $entity + * @return bool + */ + private function isViolatingPrExcludeTests($entity) + { + $violation = false; + $references = $entity->getElementsByTagName('group'); + + foreach ($references as $reference) { + $groupValue = $reference->getAttribute('value'); + if ($groupValue === self::GROUP_NAME) { + $violation = true; + break; + } + } + + return $violation; + } + + /** + * Return array containing all errors found after running the execute() function. + * @return array + */ + public function getErrors() + { + return $this->errors; + } + + /** + * Return string of a short human readable result of the check. For example: "No errors found." + * @return string + */ + public function getOutput() + { + return $this->output; + } + + /** + * Build and return error output + * + * @param SplFileInfo $path + * @return mixed + */ + private function setErrorOutput($path) + { + $testErrors = []; + + $filePath = $this->getFilePath($path->getRealPath()); + + // Build error output + $errorOutput = "\nFile \"{$filePath}\""; + $errorOutput .= "\ncontains group 'pr_exclude' which is not allowed.\n"; + $testErrors[$filePath][] = $errorOutput; + + return $testErrors; + } + + /** + * Return relative path to files. + * @param string $fileNames + * @return string + */ + private function getFilePath($fileNames) + { + if (!empty($fileNames)) { + $relativeFileNames = ltrim( + str_replace(MAGENTO_BP, '', $fileNames) + ); + if (!empty($relativeFileNames)) { + return $relativeFileNames; + } + } + return $fileNames; + } +} diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/StaticChecksList.php b/src/Magento/FunctionalTestingFramework/StaticCheck/StaticChecksList.php index ffa63389d..3cba7f6d4 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/StaticChecksList.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/StaticChecksList.php @@ -7,12 +7,16 @@ namespace Magento\FunctionalTestingFramework\StaticCheck; +use Magento\FunctionalTestingFramework\Util\Path\FilePathFormatter; + /** * Class StaticChecksList has a list of static checks to run on test xml * @codingStandardsIgnoreFile */ class StaticChecksList implements StaticCheckListInterface { + const STATIC_RESULTS = 'tests' . DIRECTORY_SEPARATOR .'_output' . DIRECTORY_SEPARATOR . 'static-results'; + /** * Property contains all static check scripts. * @@ -20,6 +24,13 @@ class StaticChecksList implements StaticCheckListInterface */ private $checks; + /** + * Directory path for static checks error files + * + * @var string + */ + private static $errorFilesPath = null; + /** * Constructor * @@ -30,7 +41,21 @@ public function __construct(array $checks = []) $this->checks = [ 'testDependencies' => new TestDependencyCheck(), 'actionGroupArguments' => new ActionGroupArgumentsCheck(), + 'prExcludeGroup' => new PrExcludeGroupStaticCheck(), ] + $checks; + + // Static checks error files directory + if (null === self::$errorFilesPath) { + self::$errorFilesPath = FilePathFormatter::format(TESTS_BP) . self::STATIC_RESULTS; + } + } + + /** + * Return the directory path for the static check error files + */ + public static function getErrorFilesPath() + { + return self::$errorFilesPath; } /** diff --git a/src/Magento/FunctionalTestingFramework/Util/Script/ScriptUtil.php b/src/Magento/FunctionalTestingFramework/Util/Script/ScriptUtil.php new file mode 100644 index 000000000..745ab53fe --- /dev/null +++ b/src/Magento/FunctionalTestingFramework/Util/Script/ScriptUtil.php @@ -0,0 +1,296 @@ +]*name="([^"\']*)/'; + const ROOT_SUITE_DIR = 'tests/_suite'; + const DEV_TESTS_DIR = 'dev/tests/acceptance/'; + + /** + * Return all installed Magento module paths + * + * @return array + * @throws TestFrameworkException + */ + public function getAllModulePaths() + { + MftfApplicationConfig::create( + true, + MftfApplicationConfig::UNIT_TEST_PHASE, + false, + MftfApplicationConfig::LEVEL_DEFAULT, + true + ); + + return ModuleResolver::getInstance()->getModulesPath(); + } + + /** + * Prints out given errors to file, and returns summary result string + * @param array $errors + * @param string $filePath + * @param string $message + * @return string + */ + public function printErrorsToFile($errors, $filePath, $message) + { + if (empty($errors)) { + return $message . ": No errors found."; + } + + $dirname = dirname($filePath); + if (!file_exists($dirname)) { + mkdir($dirname, 0777, true); + } + + $fileResource = fopen($filePath, 'w'); + + foreach ($errors as $test => $error) { + fwrite($fileResource, $error[0] . PHP_EOL); + } + + fclose($fileResource); + $errorCount = count($errors); + $output = $message . ": Errors found across {$errorCount} file(s). Error details output to {$filePath}"; + + return $output; + } + + /** + * Return all XML files for $scope in given module paths, empty array if no path is valid + * + * @param array $modulePaths + * @param string $scope + * @return Finder|array + */ + public function getModuleXmlFilesByScope($modulePaths, $scope) + { + $found = false; + $scopePath = DIRECTORY_SEPARATOR . ucfirst($scope) . DIRECTORY_SEPARATOR; + $finder = new Finder(); + + foreach ($modulePaths as $modulePath) { + if (!realpath($modulePath . $scopePath)) { + continue; + } + $finder->files()->followLinks()->in($modulePath . $scopePath)->name("*.xml")->sortByName(); + $found = true; + } + return $found ? $finder->files() : []; + } + + /** + * Return suite XML files in TESTS_BP/ROOT_SUITE_DIR directory + * + * @return Finder|array + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + */ + public function getRootSuiteXmlFiles() + { + $rootSuitePaths = []; + $defaultTestPath = null; + $devTestsPath = null; + + try { + $defaultTestPath = FilePathFormatter::format(TESTS_BP); + } catch (TestFrameworkException $e) { + } + + try { + $devTestsPath = FilePathFormatter::format(MAGENTO_BP) . self::DEV_TESTS_DIR; + } catch (TestFrameworkException $e) { + } + + if ($defaultTestPath) { + $rootSuitePaths[] = $defaultTestPath . self::ROOT_SUITE_DIR; + } + + if ($devTestsPath && realpath($devTestsPath) && $devTestsPath !== $defaultTestPath) { + $rootSuitePaths[] = $devTestsPath . self::ROOT_SUITE_DIR; + } + + $found = false; + $finder = new Finder(); + foreach ($rootSuitePaths as $rootSuitePath) { + if (!realpath($rootSuitePath)) { + continue; + } + $finder->files()->followLinks()->in($rootSuitePath)->name("*.xml"); + $found = true; + } + + return $found ? $finder->files() : []; + } + + /** + * Resolve entity reference in {{entity.field}} or {{entity.field('param')}} + * + * @param array $braceReferences + * @param string $contents + * @param boolean $resolveSectionElement + * @return array + * @throws XmlException + */ + public function resolveEntityReferences($braceReferences, $contents, $resolveSectionElement = false) + { + $entities = []; + foreach ($braceReferences as $reference) { + // trim `{{data.field}}` to `data` + preg_match('/{{([^.]+)/', $reference, $entityName); + // Double check that {{data.field}} isn't an argument for an ActionGroup + $entity = $this->findEntity($entityName[1]); + preg_match_all(self::ACTIONGROUP_ARGUMENT_REGEX_PATTERN, $contents, $possibleArgument); + if (array_search($entityName[1], $possibleArgument[1]) !== false) { + continue; + } + if ($entity !== null) { + $entities[$entity->getName()] = $entity; + if ($resolveSectionElement) { + if (get_class($entity) === SectionObject::class) { + // trim `{{data.field}}` to `field` + preg_match('/.([^.]+)}}/', $reference, $elementName); + /** @var ElementObject $element */ + /** @var SectionObject $entity */ + $element = $entity->getElement($elementName[1]); + if ($element) { + $entities[$entity->getName() . '.' . $elementName[1]] = $element; + } + } + } + } + } + return $entities; + } + + /** + * Drill down into params in {{ref.params('string', $data.key$, entity.reference)}} to resolve entity reference + * + * @param array $braceReferences + * @param string $contents + * @param boolean $resolveSectionElement + * @return array + * @throws XmlException + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + */ + public function resolveParametrizedReferences($braceReferences, $contents, $resolveSectionElement = false) + { + $entities = []; + foreach ($braceReferences as $parameterizedReference) { + preg_match( + ActionObject::ACTION_ATTRIBUTE_VARIABLE_REGEX_PARAMETER, + $parameterizedReference, + $arguments + ); + $splitArguments = explode(',', ltrim(rtrim($arguments[0], ")"), "(")); + foreach ($splitArguments as $argument) { + // Do nothing for 'string' or $persisted.data$ + if (preg_match(ActionObject::STRING_PARAMETER_REGEX, $argument)) { + continue; + } elseif (preg_match(TestGenerator::PERSISTED_OBJECT_NOTATION_REGEX, $argument)) { + continue; + } + // trim `data.field` to `data` + preg_match('/([^.]+)/', $argument, $entityName); + // Double check that {{data.field}} isn't an argument for an ActionGroup + $entity = $this->findEntity($entityName[1]); + preg_match_all(self::ACTIONGROUP_ARGUMENT_REGEX_PATTERN, $contents, $possibleArgument); + if (array_search($entityName[1], $possibleArgument[1]) !== false) { + continue; + } + if ($entity !== null) { + $entities[$entity->getName()] = $entity; + if ($resolveSectionElement) { + if (get_class($entity) === SectionObject::class) { + // trim `data.field` to `field` + preg_match('/.([^.]+)/', $argument, $elementName); + /** @var ElementObject $element */ + /** @var SectionObject $entity */ + $element = $entity->getElement($elementName[1]); + if ($element) { + $entities[$entity->getName() . '.' . $elementName[1]] = $element; + } + } + } + } + } + } + return $entities; + } + + /** + * Resolve entity by names + * + * @param array $references + * @return array + * @throws XmlException + */ + public function resolveEntityByNames($references) + { + $entities = []; + foreach ($references as $reference) { + $entity = $this->findEntity($reference); + if ($entity !== null) { + $entities[$entity->getName()] = $entity; + } + } + return $entities; + } + + /** + * Attempts to find any MFTF entity by its name. Returns null if none are found + * + * @param string $name + * @return mixed + * @throws XmlException + */ + public function findEntity($name) + { + if ($name === '_ENV' || $name === '_CREDS') { + return null; + } + + if (DataObjectHandler::getInstance()->getObject($name)) { + return DataObjectHandler::getInstance()->getObject($name); + } elseif (PageObjectHandler::getInstance()->getObject($name)) { + return PageObjectHandler::getInstance()->getObject($name); + } elseif (SectionObjectHandler::getInstance()->getObject($name)) { + return SectionObjectHandler::getInstance()->getObject($name); + } elseif (ActionGroupObjectHandler::getInstance()->getObject($name)) { + return ActionGroupObjectHandler::getInstance()->getObject($name); + } + + try { + return TestObjectHandler::getInstance()->getObject($name); + } catch (TestReferenceException $e) { + } + return null; + } +} From c48a0285cc79e75cabbe1d163aaa925deca1243c Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Fri, 11 Feb 2022 12:46:42 -0600 Subject: [PATCH 29/31] MQE-3251: Release MFTF 2.7.3 to allow filters functionality for Magento 2.3.x --- .../StaticCheck/PrExcludeGroupStaticCheck.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/PrExcludeGroupStaticCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/PrExcludeGroupStaticCheck.php index 038f126bc..f7ba2cfeb 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/PrExcludeGroupStaticCheck.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/PrExcludeGroupStaticCheck.php @@ -123,7 +123,7 @@ private function validatePrExcludeGroupUsageInTests($testXmlFiles) /** * Finds violating pr_exclude group * @param \DomNode $entity - * @return bool + * @return boolean */ private function isViolatingPrExcludeTests($entity) { From f3f009cd20f00c5e5007ec711336f7be8193d8e5 Mon Sep 17 00:00:00 2001 From: Alex Kolesnyk Date: Mon, 14 Feb 2022 13:10:28 -0600 Subject: [PATCH 30/31] MQE-3251: Release MFTF 2.7.3 to allow filters functionality for Magento 2.3.x --- .../StaticCheck/PrExcludeGroupStaticCheck.php | 21 ------------------- 1 file changed, 21 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/StaticCheck/PrExcludeGroupStaticCheck.php b/src/Magento/FunctionalTestingFramework/StaticCheck/PrExcludeGroupStaticCheck.php index f7ba2cfeb..52b0d7bba 100644 --- a/src/Magento/FunctionalTestingFramework/StaticCheck/PrExcludeGroupStaticCheck.php +++ b/src/Magento/FunctionalTestingFramework/StaticCheck/PrExcludeGroupStaticCheck.php @@ -48,27 +48,6 @@ class PrExcludeGroupStaticCheck implements StaticCheckInterface */ private $testXmlFiles = []; - /** - * Action group xml files to scan - * - * @var Finder|array - */ - private $actionGroupXmlFiles = []; - - /** - * Suite xml files to scan - * - * @var Finder|array - */ - private $suiteXmlFiles = []; - - /** - * Root suite xml files to scan - * - * @var Finder|array - */ - private $rootSuiteXmlFiles = []; - /** * Checks usage of pause action in action groups, tests and suites and prints out error to file. * From a1533bbfa174a9cd616506847debee830e2659e8 Mon Sep 17 00:00:00 2001 From: Dmytro Shevtsov Date: Mon, 1 Aug 2022 16:47:08 -0500 Subject: [PATCH 31/31] Fix links in docs --- docs/configuration.md | 2 +- docs/data.md | 2 +- docs/getting-started.md | 4 ++-- docs/reporting.md | 2 +- docs/section/locator-functions.md | 2 +- docs/test/annotations.md | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/configuration.md b/docs/configuration.md index a7b81c7c9..40a1523cf 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -340,4 +340,4 @@ WAIT_TIMEOUT=30 [`MAGENTO_CLI_COMMAND_PATH`]: #magento_cli_command_path [generateDate]: test/actions.md#generatedate [mftf]: commands/mftf.md -[timezones]: http://php.net/manual/en/timezones.php +[timezones]: https://php.net/manual/en/timezones.php diff --git a/docs/data.md b/docs/data.md index fa4c90dcf..d9ee58865 100644 --- a/docs/data.md +++ b/docs/data.md @@ -283,6 +283,6 @@ Attributes|Type|Use|Description [``]: #requiredentity-tag [``]: #var-tag [Actions]: ./test/actions.md -[category creation]: http://docs.magento.com/m2/ce/user_guide/catalog/category-create.html +[category creation]: https://docs.magento.com/user-guide/catalog/category-create.html [Credentials]: ./credentials.md [test actions]: ./test/actions.md#actions-returning-a-variable diff --git a/docs/getting-started.md b/docs/getting-started.md index a51f2f4d2..3a6e63cc8 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -340,7 +340,7 @@ allure serve dev/tests/_output/allure-results/ [`MAGENTO_BP`]: configuration.html#magento_bp [`mftf`]: commands/mftf.html [allure docs]: https://docs.qameta.io/allure/ -[Allure Framework]: http://allure.qatools.ru/ +[Allure Framework]: https://github.com/allure-framework [basic configuration]: configuration.html#basic-configuration [chrome driver]: https://sites.google.com/a/chromium.org/chromedriver/downloads [Codeception Test execution]: https://blog.jetbrains.com/phpstorm/2017/03/codeception-support-comes-to-phpstorm-2017-1/ @@ -348,7 +348,7 @@ allure serve dev/tests/_output/allure-results/ [Configuration]: configuration.html [contributing]: https://github.com/magento/magento2-functional-testing-framework/blob/develop/.github/CONTRIBUTING.md [install Allure]: https://github.com/allure-framework/allure2#download -[java]: http://www.oracle.com/technetwork/java/javase/downloads/index.html +[java]: https://www.oracle.com/java/technologies/downloads/ [mftf tests]: introduction.html#mftf-tests [php]: https://devdocs.magento.com/guides/v2.3/install-gde/system-requirements.html [PhpStorm]: https://www.jetbrains.com/phpstorm/ diff --git a/docs/reporting.md b/docs/reporting.md index 59a8617ba..1ddee1d1c 100644 --- a/docs/reporting.md +++ b/docs/reporting.md @@ -341,7 +341,7 @@ Refer to the [Reporting section][] for more Allure CLI details. [`run:group`]: commands/mftf.md#rungroup [`run:test`]: commands/mftf.md#runtest [Allure Framework]: https://docs.qameta.io/allure/ -[Allure Test Report]: http://allure.qatools.ru/ +[Allure Test Report]: https://github.com/allure-framework [codecept]: commands/codeception.md [codeception]: https://codeception.com/docs/reference/Commands [mftf]: commands/mftf.md diff --git a/docs/section/locator-functions.md b/docs/section/locator-functions.md index 1e3dffd24..171cb3669 100644 --- a/docs/section/locator-functions.md +++ b/docs/section/locator-functions.md @@ -40,6 +40,6 @@ Given the above element definitions, you call the elements in a test just like a -[Locator functions]: http://codeception.com/docs/reference/Locator +[Locator functions]: https://codeception.com/docs/reference/Locator [section]: ../section.md [parameterized selectors]: ./parameterized-selectors.md \ No newline at end of file diff --git a/docs/test/annotations.md b/docs/test/annotations.md index f30b8104e..6f70b03e9 100644 --- a/docs/test/annotations.md +++ b/docs/test/annotations.md @@ -215,8 +215,8 @@ Attribute|Type|Use [`@Description`]: https://devhub.io/zh/repos/allure-framework-allure-phpunit#extended-test-class-or-test-method-description [`@Features`]: https://devhub.io/zh/repos/allure-framework-allure-phpunit#map-test-classes-and-test-methods-to-features-and-stories -[`@group`]: http://codeception.com/docs/07-AdvancedUsage#Groups -[`@return`]: http://codeception.com/docs/07-AdvancedUsage#Examples +[`@group`]: https://codeception.com/docs/07-AdvancedUsage#Groups +[`@return`]: https://codeception.com/docs/07-AdvancedUsage#Examples [`@Severity`]: https://devhub.io/zh/repos/allure-framework-allure-phpunit#set-test-severity [`@Stories`]: https://devhub.io/zh/repos/allure-framework-allure-phpunit#map-test-classes-and-test-methods-to-features-and-stories [`@TestCaseId`]: https://github.com/allure-framework/allure1/wiki/Test-Case-ID